Files
icon-color-tool/svg_parser.py
T
2026-08-03 16:52:16 -04:00

57 lines
2.1 KiB
Python

import re
from pathlib import Path
class SvgColorParser:
def __init__(self, filepath):
self.filepath = Path(filepath)
self.content = self.filepath.read_text(encoding="utf-8")
self.colors = {} # tag -> hex
self.history = [] # list of contents for undo
self.redo_history = []
self._parse()
def _parse(self):
# Find the <style id="current-color-scheme">...</style> regardless of attribute order
style_match = re.search(r'<style[^>]*?id="current-color-scheme"[^>]*>(.*?)</style>', self.content, re.DOTALL)
if style_match:
style_content = style_match.group(1)
# Find classes e.g. .ColorScheme-Text { color:#232629; }
class_matches = re.finditer(r'\.(ColorScheme-[a-zA-Z0-9]+)\s*\{\s*color:\s*(#[a-fA-F0-9]{3,6})', style_content)
self.colors = {m.group(1): m.group(2) for m in class_matches}
def update_color(self, tag, new_hex):
if tag not in self.colors: return
old_hex = self.colors[tag]
self.history.append(self.content)
self.redo_history.clear()
# Globally replace the exact hex string, case insensitive
# We need to compile a regex for the old hex.
hex_pattern = re.compile(re.escape(old_hex), re.IGNORECASE)
self.content = hex_pattern.sub(new_hex, self.content)
self.colors[tag] = new_hex
self.save()
self._parse() # re-parse to ensure consistency
def save(self):
self.filepath.write_text(self.content, encoding="utf-8")
def undo(self):
if self.history:
self.redo_history.append(self.content)
self.content = self.history.pop()
self.save()
self._parse()
return True
return False
def redo(self):
if self.redo_history:
self.history.append(self.content)
self.content = self.redo_history.pop()
self.save()
self._parse()
return True
return False