diff options
Diffstat (limited to 'pywal/export.py')
| -rw-r--r-- | pywal/export.py | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/pywal/export.py b/pywal/export.py index c67cca0..0c71a76 100644 --- a/pywal/export.py +++ b/pywal/export.py @@ -3,17 +3,60 @@ Export colors in various formats. """ import logging import os +import re -from .settings import CACHE_DIR, MODULE_DIR, CONF_DIR from . import util +from .settings import CACHE_DIR, CONF_DIR, MODULE_DIR def template(colors, input_file, output_file=None): """Read template file, substitute markers and save the file elsewhere.""" template_data = util.read_file_raw(input_file) - template_data = "".join(template_data).format(**colors) - + for i, l in enumerate(template_data): + for match in re.finditer(r"(?<=(?<!\{))(\{([^{}]+)\})(?=(?!\}))", l): + # Get the color, and the functions associated with it + cname, _, funcs = match.group(2).partition(".") + # Check that functions are needed for this color + if len(funcs) == 0: + continue + # Build up a string which will be replaced with the new color + replace_str = cname + # Color to be modified copied into new one + new_color = util.Color(colors[cname].hex_color) + # Execute each function to be done + for func in filter(None, funcs.split(")")): + # Get function name and arguments + func = func.split("(") + fname = func[0] + if fname[0] == '.': + fname = fname[1:] + if not hasattr(new_color, fname): + logging.error( + "Syntax error in template file '%s' on line '%s'", + input_file, i) + function = getattr(new_color, fname) + + # If the function is callable, call it + if callable(function): + if len(func) > 1: + new_color = function(*func[1].split(",")) + else: + new_color = function() + # string to replace generated colors + if func[0] != '.': + replace_str += "." + replace_str += "(".join(func) + ")" + # If the color was changed, replace with a unique identifier. + if new_color is not colors[cname]: + template_data[i] = l.replace( + replace_str, "color" + new_color.strip) + colors["color" + new_color.strip] = new_color + try: + template_data = "".join(template_data).format(**colors) + except ValueError: + logging.error("Syntax error in template file '%s'.", input_file) + return util.save_file(template_data, output_file) @@ -31,21 +74,26 @@ def get_export_type(export_type): """Convert template type to the right filename.""" return { "css": "colors.css", + "dmenu": "colors-wal-dmenu.h", "dwm": "colors-wal-dwm.h", "st": "colors-wal-st.h", "tabbed": "colors-wal-tabbed.h", "gtk2": "colors-gtk2.rc", "json": "colors.json", "konsole": "colors-konsole.colorscheme", + "kitty": "colors-kitty.conf", "plain": "colors", "putty": "colors-putty.reg", "rofi": "colors-rofi.Xresources", "scss": "colors.scss", "shell": "colors.sh", + "speedcrunch": "colors-speedcrunch.json", "sway": "colors-sway", "tty": "colors-tty.sh", "vscode": "colors-vscode.json", + "waybar": "colors-waybar.css", "xresources": "colors.Xresources", + "xmonad": "colors.hs", "yaml": "colors.yml", }.get(export_type, export_type) @@ -60,7 +108,7 @@ def every(colors, output_dir=CACHE_DIR): join = os.path.join # Minor optimization. for file in [*os.scandir(template_dir), *os.scandir(template_dir_user)]: - if file.name != ".DS_Store": + if file.name != ".DS_Store" and not file.name.endswith(".swp"): template(colors, file.path, join(output_dir, file.name)) logging.info("Exported all files.") |
