| import json |
| import os |
| import importlib |
| import gradio as gr |
| import sys |
|
|
| now_dir = os.getcwd() |
| folder = os.path.join( |
| os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), |
| "assets", |
| "themes", |
| ) |
| config_file = os.path.join(now_dir, "assets", "config.json") |
|
|
| sys.path.append(folder) |
|
|
|
|
| def read_json_file(filename): |
| """Helper function to read a JSON file and return its contents.""" |
| with open(filename, "r", encoding="utf8") as json_file: |
| return json.load(json_file) |
|
|
|
|
| def get_class(filename): |
| """Retrieve the name of the first class found in the specified Python file.""" |
| with open(filename, "r", encoding="utf8") as file: |
| for line in file: |
| if "class " in line: |
| class_name = line.split("class ")[1].split(":")[0].split("(")[0].strip() |
| return class_name |
| return None |
|
|
|
|
| def get_theme_list(): |
| """Compile a list of available themes from Python files and a JSON file.""" |
| themes_from_files = [ |
| os.path.splitext(name)[0] |
| for root, _, files in os.walk(folder) |
| for name in files |
| if name.endswith(".py") and root == folder |
| ] |
|
|
| json_file_path = os.path.join(folder, "theme_list.json") |
| themes_from_url = [] |
|
|
| try: |
| themes_from_url = [item["id"] for item in read_json_file(json_file_path)] |
| except FileNotFoundError: |
| print("theme_list.json not found, proceeding with available files only.") |
|
|
| return list(set(themes_from_files + themes_from_url)) |
|
|
|
|
| def select_theme(name): |
| """Select a theme by its name, updating the configuration file accordingly.""" |
| selected_file = f"{name}.py" |
| full_path = os.path.join(folder, selected_file) |
|
|
| config_data = read_json_file(config_file) |
|
|
| if not os.path.exists(full_path): |
| config_data["theme"]["file"] = None |
| config_data["theme"]["class"] = name |
| else: |
| class_found = get_class(full_path) |
| if class_found: |
| config_data["theme"]["file"] = selected_file |
| config_data["theme"]["class"] = class_found |
| else: |
| print(f"Theme class not found in {selected_file}.") |
| return |
|
|
| with open(config_file, "w", encoding="utf8") as json_file: |
| json.dump(config_data, json_file, indent=2) |
|
|
| message = f"Theme {name} successfully selected. Restart the application." |
| print(message) |
| gr.Info(message) |
|
|
|
|
| def load_theme(): |
| """Load the selected theme based on the configuration file.""" |
| try: |
| config_data = read_json_file(config_file) |
| selected_file = config_data["theme"]["file"] |
| class_name = config_data["theme"]["class"] |
|
|
| if class_name: |
| if selected_file: |
| module = importlib.import_module(selected_file[:-3]) |
| obtained_class = getattr(module, class_name) |
| return obtained_class() |
| else: |
| return class_name |
| else: |
| print("No valid theme class found.") |
| return None |
|
|
| except Exception as error: |
| print(f"An error occurred while loading the theme: {error}") |
| return None |
|
|
|
|
| def read_current_theme(): |
| """Read the current theme class from the configuration file.""" |
| try: |
| config_data = read_json_file(config_file) |
| selected_file = config_data["theme"]["file"] |
| class_name = config_data["theme"]["class"] |
|
|
| return class_name if class_name else "ParityError/Interstellar" |
|
|
| except Exception as error: |
| print(f"An error occurred loading the theme: {error}") |
| return "ParityError/Interstellar" |
|
|