""" Theme file handling. """ import logging import os import random import sys from .settings import CONF_DIR, MODULE_DIR from . import util def list_out(): """List all themes in a pretty format.""" dark_themes = [theme.name.replace(".json", "") for theme in list_themes()] ligh_themes = [theme.name.replace(".json", "") for theme in list_themes(dark=False)] user_themes = [theme.name.replace(".json", "") for theme in list_themes_user()] if user_themes: print("\033[1;32mUser Themes\033[0m:") print(" -", "\n - ".join(sorted(user_themes))) print("\033[1;32mDark Themes\033[0m:") print(" -", "\n - ".join(sorted(dark_themes))) print("\033[1;32mLight Themes\033[0m:") print(" -", "\n - ".join(sorted(ligh_themes))) print("\033[1;32mExtra\033[0m:") print(" - random (select a random dark theme)") print(" - random_dark (select a random dark theme)") print(" - random_light (select a random light theme)") def list_themes(dark=True): """List all installed theme files.""" dark = "dark" if dark else "light" themes = os.scandir(os.path.join(MODULE_DIR, "colorschemes", dark)) return [t for t in themes if os.path.isfile(t.path)] def list_themes_user(): """List user theme files.""" themes = [*os.scandir(os.path.join(CONF_DIR, "colorschemes/dark/")), *os.scandir(os.path.join(CONF_DIR, "colorschemes/light/"))] return [t for t in themes if os.path.isfile(t.path)] def terminal_sexy_to_wal(data): """Convert terminal.sexy json schema to wal.""" data["colors"] = {} data["special"] = { "foreground": data["foreground"], "background": data["background"], "cursor": data["color"][9] } for i, color in enumerate(data["color"]): data["colors"]["color%s" % i] = color return data def parse(theme_file): """Parse the theme file.""" data = util.read_file_json(theme_file) if "wallpaper" not in data: data["wallpaper"] = "None" if "alpha" not in data: data["alpha"] = util.Color.alpha_num # Terminal.sexy format. if "color" in data: data = terminal_sexy_to_wal(data) return data def get_random_theme(dark=True): """Get a random theme file.""" themes = [theme.path for theme in list_themes(dark)] random.shuffle(themes) return themes[0] def file(input_file, light=False): """Import colorscheme from json file.""" util.create_dir(os.path.join(CONF_DIR, "colorschemes/light/")) util.create_dir(os.path.join(CONF_DIR, "colorschemes/dark/")) theme_name = ".".join((input_file, "json")) bri = "light" if light else "dark" user_theme_file = os.path.join(CONF_DIR, "colorschemes", bri, theme_name) theme_file = os.path.join(MODULE_DIR, "colorschemes", bri, theme_name) # Find the theme file. if input_file in ("random", "random_dark"): theme_file = get_random_theme() elif input_file == "random_light": theme_file = get_random_theme(light) elif os.path.isfile(user_theme_file): theme_file = user_theme_file elif os.path.isfile(input_file): theme_file = input_file # Parse the theme file. if os.path.isfile(theme_file): logging.info("Set theme to \033[1;37m%s\033[0m.", os.path.basename(theme_file)) return parse(theme_file) logging.error("No %s colorscheme file found.", bri) logging.error("Try adding '-l' to set light themes.") logging.error("Try removing '-l' to set dark themes.") sys.exit(1)