1

Modules/Color: Implement transformation rules for applyColor script

This commit is contained in:
2025-07-19 22:37:06 +02:00
parent 9e8b160087
commit b05f868b2b

View File

@ -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())