import gradio as gr import os import json import glob import pandas as pd # Directory to store JSON list files LISTS_DIR = "lists" # Ensure the lists directory exists os.makedirs(LISTS_DIR, exist_ok=True) # Get list of available JSON files def get_list_files(): files = glob.glob(os.path.join(LISTS_DIR, "*.json")) return [os.path.basename(f)[:-5] for f in files] # Remove .json extension # Load data from a JSON file def load_list_data(list_name): file_path = os.path.join(LISTS_DIR, f"{list_name}.json") if os.path.exists(file_path): with open(file_path, "r") as f: return json.load(f) return {"name": "Empty List", "items": []} # Create HTML table with clickable links def get_list_items_html(list_name): data = load_list_data(list_name) html = "" html += "" html += "" html += "" for item in data["items"]: html += "" html += f"" html += f"" html += f"" html += "" html += "
NameDescriptionLink
{item['name']}{item['description']}{item['link']}
" return html # Get list items in table format (for backup/alternative view) def get_list_items(list_name): data = load_list_data(list_name) return [[item["name"], item["description"], item["link"]] for item in data["items"]] # Get list title def get_list_title(list_name): data = load_list_data(list_name) return data["name"] # Function to switch between lists def switch_list(list_name): return get_list_title(list_name), get_list_items_html(list_name) # Build the Gradio interface with gr.Blocks(title="Useful Things Archive") as app: gr.Markdown(""" ## Useful Things Archive """) # Get available lists list_names = get_list_files() if not list_names: list_names = ["learn"] # Fallback to default # Current list state current_list = gr.State(value=list_names[0]) with gr.Row(): # Create tabs for each list with gr.Tabs() as tabs: tab_list = [] for list_name in list_names: tab = gr.Tab(label=get_list_title(list_name)) tab_list.append((tab, list_name)) list_title = gr.Markdown(f"## {get_list_title(list_names[0])}") # Use HTML component instead of Dataframe to enable clickable links items_html = gr.HTML(value=get_list_items_html(list_names[0])) # Connect tab events to switch lists for i, (tab, list_name) in enumerate(tab_list): tab.select( lambda name=list_name: switch_list(name), inputs=[], outputs=[list_title, items_html] ) # Launch the app app.launch()