diff --git a/home/modules/color/applyColors.py b/home/modules/color/applyColors.py index 7f8461ec..50954a54 100644 --- a/home/modules/color/applyColors.py +++ b/home/modules/color/applyColors.py @@ -1,16 +1,96 @@ import fileinput +import re +from typing import Callable -colors: dict[str, str] +# This dict gets defined before. +# The code is templated by nix to fill the color values automatically. # colors: dict[str, str] = { # "rosewater": "f5e0dc", # "flamingo": "f2cdcd", # } +colors: dict[str, str] -def applyColorToLine(line: str) -> None: - print(f"{line} # piped") +def getRule( + line: str, + value: str, +) -> Callable[[str, str, str], str] | None: + """Obtain a substitution rule for a line""" + + # This contains each rule assigned to a pattern + rules: dict[str, Callable[[str, str, str], str]] = { + # "#ffffff" -> ${color.hexS.white} + f'"#{value}"': lambda line, name, value: line.replace( + f'"#{value}"', f"${{color.hexS.{name}}}" + ), + # '#ffffff' -> ${color.hexS.white} + f"'#{value}'": lambda line, name, value: line.replace( + f"'#{value}'", f"${{color.hexS.{name}}}" + ), + # #ffffff -> ${color.hexS.white} + f"#{value}": lambda line, name, value: line.replace( + f"#{value}", f"${{color.hexS.{name}}}" + ), + # "ffffff" -> ${color.hex.white} + f'"{value}"': lambda line, name, value: line.replace( + f'"{value}"', f"${{color.hex.{name}}}" + ), + # 'ffffff' -> ${color.hex.white} + f"'{value}'": lambda line, name, value: line.replace( + f"'{value}'", f"${{color.hex.{name}}}" + ), + # ffffff -> ${color.hex.white} + f"{value}": lambda line, name, value: line.replace( + f"{value}", f"${{color.hex.{name}}}" + ), + # "#${color.hex.white}" -> ${color.hexS.white} + '"#${color.hex."': lambda line, name, value: line.replace( + '"#${color.hex."', "${color.hexS.}" + ), + # ff,ff,ff -> ${color.rgbS.white} + f"{value[0:2]},{value[2:4]},{value[4:6]}": lambda line, name, value: line.replace( + f"{value[0:2]},{value[2:4]},{value[4:6]}", f"${{color.rgbS.{name}}}" + ), + } + + for pattern, rule in rules.items(): + # If the line matches the pattern, use this rule + if len(re.findall(pattern, line, re.IGNORECASE)) > 0: + return rule + + return None + + +def applyColorToLine( + line: str, + name: str, + value: str, +) -> str: + """Apply a single color to a single line""" + result: str = line + + rule: Callable[[str, str, str], str] | None = getRule(result, value) + while rule is not None: + result = rule(line, name, value) + + # We apply rules until no rule can be applied anymore + rule = getRule(result, value) + + return result + + +def applyColorsToLine( + line: str, +) -> None: + """Apply all defined colors to a single line""" + result: str = line + for name, value in colors.items(): + result = applyColorToLine(result, name, value) + + # Print to stdout + print(result) # Apply transformation to every line from stdin for line in fileinput.input(): - applyColorToLine(line) + applyColorsToLine(line.rstrip())