File size: 2,785 Bytes
0f43f8a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import shutil
import gradio as gr
from mysite.libs.utilities import chat_with_interpreter, completion, process_file
from interpreter import interpreter
import mysite.interpreter.interpreter_config  # インポートするだけで設定が適用されます
import importlib
import os
import pkgutil
import async_timeout
import asyncio


def list_files_in_directory(directory):
    tree = []
    for root, dirs, files in os.walk(directory):
        path = root.split(os.sep)
        for dir_name in dirs:
            tree.append((os.path.join(root, dir_name), '/'.join(path + [dir_name])))
        for file_name in files:
            tree.append((os.path.join(root, file_name), '/'.join(path + [file_name])))
    return tree

def read_file(file_path):
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            return file.read()
    except UnicodeDecodeError:
        with open(file_path, 'rb') as file:
            content = file.read()
        try:
            return content.decode('utf-8')
        except UnicodeDecodeError:
            try:
                return content.decode('latin-1')
            except UnicodeDecodeError:
                return "Cannot decode file content with utf-8 or latin-1 encoding."

def save_file(file_path, content):
    with open(file_path, 'w', encoding='utf-8') as file:
        file.write(content)
    return "File saved successfully"

def on_file_select(selected_file):
    if os.path.isfile(selected_file):
        return read_file(selected_file)
    return ""

def build_interface(base_directory):
    file_list = list_files_in_directory(base_directory)
    file_display = [f[1] for f in file_list]
    file_paths = {f[1]: f[0] for f in file_list}

    with gr.Blocks() as demo:
        gr.Markdown("## File Explorer and Editor")

        file_dropdown = gr.Dropdown(label="Select a file or folder", choices=file_display)
        file_editor = gr.Textbox(label="File Editor", lines=20)
        save_button = gr.Button("Save File")

        def update_editor(selected_display):
            selected_file = file_paths.get(selected_display, "")
            return on_file_select(selected_file)

        def on_edit_button_click(selected_display, new_content):
            selected_file = file_paths.get(selected_display, "")
            if os.path.isfile(selected_file):
                return save_file(selected_file, new_content)
            return "File not found"

        file_dropdown.change(fn=update_editor, inputs=file_dropdown, outputs=file_editor)
        save_button.click(fn=on_edit_button_click, inputs=[file_dropdown, file_editor], outputs=None)

    return demo




base_directory = "/home/user/app/routers"  # Here you can specify any directory you want to explore
demo = build_interface(base_directory)