Modules/Color: Implement transformation rules for applyColor script
This commit is contained in:
@ -1,16 +1,96 @@
|
|||||||
import fileinput
|
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] = {
|
# colors: dict[str, str] = {
|
||||||
# "rosewater": "f5e0dc",
|
# "rosewater": "f5e0dc",
|
||||||
# "flamingo": "f2cdcd",
|
# "flamingo": "f2cdcd",
|
||||||
# }
|
# }
|
||||||
|
colors: dict[str, str]
|
||||||
|
|
||||||
|
|
||||||
def applyColorToLine(line: str) -> None:
|
def getRule(
|
||||||
print(f"{line} # piped")
|
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
|
# Apply transformation to every line from stdin
|
||||||
for line in fileinput.input():
|
for line in fileinput.input():
|
||||||
applyColorToLine(line)
|
applyColorsToLine(line.rstrip())
|
||||||
|
Reference in New Issue
Block a user