Cleanup for stow ---STOW
[dotfiles/.git] / .local / lib / python3.9 / site-packages / pywal / theme.py
diff --git a/.local/lib/python3.9/site-packages/pywal/theme.py b/.local/lib/python3.9/site-packages/pywal/theme.py
new file mode 100644 (file)
index 0000000..fcd1dd1
--- /dev/null
@@ -0,0 +1,124 @@
+"""
+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)