From 2f9a4e1618463b45ffd3df4e43d6c3c64d50b3a7 Mon Sep 17 00:00:00 2001 From: mrhblfx Date: Sun, 16 Apr 2023 23:00:45 +0800 Subject: [PATCH 01/13] Add parsing arbitrary code items --- crazy_functional.py | 12 ++++++-- crazy_functions/解析项目源代码.py | 49 +++++++++++++++++++++++++------ main.py | 27 ++++++++++++++--- toolbox.py | 21 ++++++------- 4 files changed, 84 insertions(+), 25 deletions(-) diff --git a/crazy_functional.py b/crazy_functional.py index af308b7..afc3217 100644 --- a/crazy_functional.py +++ b/crazy_functional.py @@ -162,7 +162,7 @@ def get_crazy_functions(): "AsButton": False, # 加入下拉菜单中 "Function": HotReload(Markdown英译中) }, - + }) ###################### 第三组插件 ########################### @@ -179,8 +179,16 @@ def get_crazy_functions(): except Exception as err: print(f'[下载arxiv论文并翻译摘要] 插件导入失败 {str(err)}') - + from crazy_functions.解析项目源代码 import 解析任意code项目 + function_plugins.update({ + "解析任意code项目": { + "Color": "stop", + "AsButton": False, + "Function": HotReload(解析任意code项目) + }, + }) + ###################### 第n组插件 ########################### return function_plugins diff --git a/crazy_functions/解析项目源代码.py b/crazy_functions/解析项目源代码.py index 04e5128..283f103 100644 --- a/crazy_functions/解析项目源代码.py +++ b/crazy_functions/解析项目源代码.py @@ -11,7 +11,7 @@ def 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, history_array = [] sys_prompt_array = [] report_part_1 = [] - + assert len(file_manifest) <= 1024, "源文件太多(超过1024个), 请缩减输入文件的数量。或者,您也可以选择删除此行警告,并修改代码拆分file_manifest列表,从而实现分批次处理。" ############################## <第一步,逐个文件分析,多线程> ################################## for index, fp in enumerate(file_manifest): @@ -63,10 +63,10 @@ def 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, current_iteration_focus = ', '.join([os.path.relpath(fp, project_folder) for index, fp in enumerate(this_iteration_file_manifest)]) i_say = f'根据以上分析,对程序的整体功能和构架重新做出概括。然后用一张markdown表格整理每个文件的功能(包括{previous_iteration_files_string})。' inputs_show_user = f'根据以上分析,对程序的整体功能和构架重新做出概括,由于输入长度限制,可能需要分组处理,本组文件为 {current_iteration_focus} + 已经汇总的文件组。' - this_iteration_history = copy.deepcopy(this_iteration_gpt_response_collection) + this_iteration_history = copy.deepcopy(this_iteration_gpt_response_collection) this_iteration_history.append(last_iteration_result) result = yield from request_gpt_model_in_new_thread_with_ui_alive( - inputs=i_say, inputs_show_user=inputs_show_user, llm_kwargs=llm_kwargs, chatbot=chatbot, + inputs=i_say, inputs_show_user=inputs_show_user, llm_kwargs=llm_kwargs, chatbot=chatbot, history=this_iteration_history, # 迭代之前的分析 sys_prompt="你是一个程序架构分析师,正在分析一个项目的源代码。") report_part_2.extend([i_say, result]) @@ -222,8 +222,8 @@ def 解析一个Golang项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 return yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt) - - + + @CatchException def 解析一个Lua项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port): history = [] # 清空历史,以免输入溢出 @@ -243,9 +243,9 @@ def 解析一个Lua项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, syst report_execption(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何lua文件: {txt}") yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 return - yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt) - - + yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt) + + @CatchException def 解析一个CSharp项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port): history = [] # 清空历史,以免输入溢出 @@ -263,4 +263,35 @@ def 解析一个CSharp项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s report_execption(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何CSharp文件: {txt}") yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 return - yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt) + yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt) + + +@CatchException +def 解析任意code项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port): + txt_include = plugin_kwargs.get("txt_include") + txt_except = plugin_kwargs.get("txt_except") + # 将要匹配的后缀 + pattern_include = [_.lstrip(" .,,").rstrip(" ,,") for _ in txt_include.split(" ") if _ != ""] + pattern_include = [_.lstrip(" .,,").rstrip(" ,,") for __ in pattern_include for _ in __.split(",") if _ != ""] + pattern_include = [_.lstrip(" .,,").rstrip(" ,,") for __ in pattern_include for _ in __.split(",") if _ != ""] + # 将要忽略匹配的后缀 + pattern_except = [_.lstrip(" .,,").rstrip(" ,,") for _ in txt_except.split(" ") if _ != ""] + pattern_except = [_.lstrip(" .,,").rstrip(" ,,") for __ in pattern_except for _ in __.split(",") if _ != ""] + pattern_except = [_.lstrip(" .,,").rstrip(" ,,") for __ in pattern_except for _ in __.split(",") if _ != ""] + pattern_except += ['zip', 'rar', '7z', 'tar', 'gz'] # 避免解析上传的压缩文件 + history = [] # 清空历史,以免输入溢出 + import glob, os + if os.path.exists(txt): + project_folder = txt + else: + if txt == "": txt = '空空如也的输入栏' + report_execption(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}") + yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 + return + file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.*', recursive=True) if os.path.isfile(f) and \ + ([] == pattern_include or f.split(".")[-1] in pattern_include) and f.split(".")[-1] not in pattern_except] + if len(file_manifest) == 0: + report_execption(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何文件: {txt}") + yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 + return + yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt) \ No newline at end of file diff --git a/main.py b/main.py index 2e4e275..73646dc 100644 --- a/main.py +++ b/main.py @@ -44,7 +44,7 @@ proxy_info = check_proxy(proxies) gr_L1 = lambda: gr.Row().style() gr_L2 = lambda scale: gr.Column(scale=scale) -if LAYOUT == "TOP-DOWN": +if LAYOUT == "TOP-DOWN": gr_L1 = lambda: DummyWith() gr_L2 = lambda scale: gr.Row() CHATBOT_HEIGHT /= 2 @@ -83,9 +83,23 @@ with gr.Blocks(title="ChatGPT 学术优化", theme=set_theme, analytics_enabled= variant = crazy_fns[k]["Color"] if "Color" in crazy_fns[k] else "secondary" crazy_fns[k]["Button"] = gr.Button(k, variant=variant) crazy_fns[k]["Button"].style(size="sm") + with gr.Row(): + with gr.Accordion("解析任意code项目", open=True): + gr.Markdown("输入的文件后缀用空格或逗号隔开, 可混合使用空格逗号") + with gr.Row(): + gr.Markdown("将要匹配文件的后缀, 不输入则代表解析所有文件") + txt_pattern_include = gr.Textbox(show_label=False, placeholder="例如: .c .cpp .py").style(container=False) + with gr.Row(): + gr.Markdown("将要忽略匹配文件的后缀") + txt_pattern_except = gr.Textbox(show_label=False, placeholder="例如: .png, .jpg wav flac").style(container=False) + code_plugin_name = "解析任意code项目" + variant = crazy_fns[code_plugin_name]["Color"] if "Color" in crazy_fns[code_plugin_name] else "secondary" + crazy_fns[code_plugin_name]["Button"] = gr.Button(code_plugin_name, variant=variant) + crazy_fns[code_plugin_name]["Button"].style(size="sm") with gr.Row(): with gr.Accordion("更多函数插件", open=True): dropdown_fn_list = [k for k in crazy_fns.keys() if not crazy_fns[k].get("AsButton", True)] + dropdown_fn_list.remove(code_plugin_name) with gr.Column(scale=1): dropdown = gr.Dropdown(dropdown_fn_list, value=r"打开插件列表", label="").style(container=False) with gr.Column(scale=1): @@ -118,7 +132,8 @@ with gr.Blocks(title="ChatGPT 学术优化", theme=set_theme, analytics_enabled= return ret checkboxes.select(fn_area_visibility, [checkboxes], [area_basic_fn, area_crazy_fn, area_input_primary, area_input_secondary, txt, txt2] ) # 整理反复出现的控件句柄组合 - input_combo = [cookies, txt, txt2, top_p, temperature, chatbot, history, system_prompt] + add_input_combo = (txt_pattern_include, txt_pattern_except) + input_combo = [cookies, txt, txt2, top_p, temperature, chatbot, history, system_prompt, *add_input_combo] output_combo = [cookies, chatbot, history, status] predict_args = dict(fn=ArgsGeneralWrapper(predict), inputs=input_combo, outputs=output_combo) # 提交按钮、重置按钮 @@ -140,6 +155,10 @@ with gr.Blocks(title="ChatGPT 学术优化", theme=set_theme, analytics_enabled= click_handle = crazy_fns[k]["Button"].click(ArgsGeneralWrapper(crazy_fns[k]["Function"]), [*input_combo, gr.State(PORT)], output_combo) click_handle.then(on_report_generated, [file_upload, chatbot], [file_upload, chatbot]) cancel_handles.append(click_handle) + # 函数插件-解析任意code项目 + click_handle = crazy_fns[code_plugin_name]["Button"].click(ArgsGeneralWrapper(crazy_fns[code_plugin_name]["Function"]), [*input_combo, gr.State(PORT)], output_combo) + click_handle.then(on_report_generated, [file_upload, chatbot], [file_upload, chatbot]) + cancel_handles.append(click_handle) # 函数插件-下拉菜单与随变按钮的互动 def on_dropdown_changed(k): variant = crazy_fns[k]["Color"] if "Color" in crazy_fns[k] else "secondary" @@ -147,7 +166,7 @@ with gr.Blocks(title="ChatGPT 学术优化", theme=set_theme, analytics_enabled= dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt] ) # 随变按钮的回调函数注册 def route(k, *args, **kwargs): - if k in [r"打开插件列表", r"请先从插件列表中选择"]: return + if k in [r"打开插件列表", r"请先从插件列表中选择"]: return yield from ArgsGeneralWrapper(crazy_fns[k]["Function"])(*args, **kwargs) click_handle = switchy_bt.click(route,[switchy_bt, *input_combo, gr.State(PORT)], output_combo) click_handle.then(on_report_generated, [file_upload, chatbot], [file_upload, chatbot]) @@ -164,7 +183,7 @@ def auto_opentab_delay(): print(f"如果浏览器没有自动打开,请复制并转到以下URL:") print(f"\t(亮色主题): http://localhost:{PORT}") print(f"\t(暗色主题): http://localhost:{PORT}/?__dark-theme=true") - def open(): + def open(): time.sleep(2) # 打开浏览器 webbrowser.open_new_tab(f"http://localhost:{PORT}/?__dark-theme=true") threading.Thread(target=open, name="open-browser", daemon=True).start() diff --git a/toolbox.py b/toolbox.py index 3ced653..8de3a8d 100644 --- a/toolbox.py +++ b/toolbox.py @@ -27,23 +27,24 @@ def ArgsGeneralWrapper(f): """ 装饰器函数,用于重组输入参数,改变输入参数的顺序与结构。 """ - def decorated(cookies, txt, txt2, top_p, temperature, chatbot, history, system_prompt, *args): + def decorated(cookies, txt, txt2, top_p, temperature, chatbot, history, system_prompt, txt_include, txt_except, *args): txt_passon = txt if txt == "" and txt2 != "": txt_passon = txt2 # 引入一个有cookie的chatbot cookies.update({ - 'top_p':top_p, + 'top_p':top_p, 'temperature':temperature, }) llm_kwargs = { 'api_key': cookies['api_key'], 'llm_model': cookies['llm_model'], - 'top_p':top_p, + 'top_p':top_p, 'temperature':temperature, } - plugin_kwargs = { - # 目前还没有 - } + # plugin_kwargs = { + # # 目前还没有 + # } + plugin_kwargs = dict(txt_include = txt_include, txt_except = txt_except) chatbot_with_cookie = ChatBotWithCookies(cookies) chatbot_with_cookie.write_list(chatbot) yield from f(txt_passon, llm_kwargs, plugin_kwargs, chatbot_with_cookie, history, system_prompt, *args) @@ -279,7 +280,7 @@ def markdown_convertion(txt): return content else: return tex2mathml_catch_exception(content) - + def markdown_bug_hunt(content): """ 解决一个mdx_math的bug(单$包裹begin命令时多余\n', '') return content - + if ('$' in txt) and ('```' not in txt): # 有$标识的公式符号,且没有代码段```的标识 # convert everything to html format @@ -308,7 +309,7 @@ def markdown_convertion(txt): def close_up_code_segment_during_stream(gpt_reply): """ 在gpt输出代码的中途(输出了前面的```,但还没输出完后面的```),补上后面的``` - + Args: gpt_reply (str): GPT模型返回的回复字符串。 @@ -518,7 +519,7 @@ class DummyWith(): 它的作用是……额……没用,即在代码结构不变得情况下取代其他的上下文管理器。 上下文管理器是一种Python对象,用于与with语句一起使用, 以确保一些资源在代码块执行期间得到正确的初始化和清理。 - 上下文管理器必须实现两个方法,分别为 __enter__()和 __exit__()。 + 上下文管理器必须实现两个方法,分别为 __enter__()和 __exit__()。 在上下文执行开始的情况下,__enter__()方法会在代码块被执行前被调用, 而在上下文执行结束时,__exit__()方法则会被调用。 """ From d1926725d3c9dd7d5d8540303f67069f04e7a3d5 Mon Sep 17 00:00:00 2001 From: mrhblfx Date: Sun, 16 Apr 2023 23:33:43 +0800 Subject: [PATCH 02/13] Add parsing arbitrary code items --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 73646dc..7db7052 100644 --- a/main.py +++ b/main.py @@ -85,7 +85,7 @@ with gr.Blocks(title="ChatGPT 学术优化", theme=set_theme, analytics_enabled= crazy_fns[k]["Button"].style(size="sm") with gr.Row(): with gr.Accordion("解析任意code项目", open=True): - gr.Markdown("输入的文件后缀用空格或逗号隔开, 可混合使用空格逗号") + gr.Markdown("输入的文件后缀用空格或逗号隔开,可混合使用空格逗号, 其中`.`可省略
例如:`.c, cpp py .go, .toml, json`") with gr.Row(): gr.Markdown("将要匹配文件的后缀, 不输入则代表解析所有文件") txt_pattern_include = gr.Textbox(show_label=False, placeholder="例如: .c .cpp .py").style(container=False) From 11e33ec657aecdacda3f0f64834f65519493da8c Mon Sep 17 00:00:00 2001 From: mrhblfx Date: Tue, 18 Apr 2023 23:29:18 +0800 Subject: [PATCH 03/13] Reduced one input box --- main.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/main.py b/main.py index 7db7052..1b76783 100644 --- a/main.py +++ b/main.py @@ -85,13 +85,9 @@ with gr.Blocks(title="ChatGPT 学术优化", theme=set_theme, analytics_enabled= crazy_fns[k]["Button"].style(size="sm") with gr.Row(): with gr.Accordion("解析任意code项目", open=True): - gr.Markdown("输入的文件后缀用空格或逗号隔开,可混合使用空格逗号, 其中`.`可省略
例如:`.c, cpp py .go, .toml, json`") + gr.Markdown("输入时用逗号隔开, `*`代表通配符, 加了`^`代表不匹配
例如: `*.c, ^*.cpp, config.toml, ^README.md`") with gr.Row(): - gr.Markdown("将要匹配文件的后缀, 不输入则代表解析所有文件") - txt_pattern_include = gr.Textbox(show_label=False, placeholder="例如: .c .cpp .py").style(container=False) - with gr.Row(): - gr.Markdown("将要忽略匹配文件的后缀") - txt_pattern_except = gr.Textbox(show_label=False, placeholder="例如: .png, .jpg wav flac").style(container=False) + txt_pattern = gr.Textbox(show_label=False, placeholder="输入框为空则代表匹配所有文件").style(container=False) code_plugin_name = "解析任意code项目" variant = crazy_fns[code_plugin_name]["Color"] if "Color" in crazy_fns[code_plugin_name] else "secondary" crazy_fns[code_plugin_name]["Button"] = gr.Button(code_plugin_name, variant=variant) @@ -132,8 +128,7 @@ with gr.Blocks(title="ChatGPT 学术优化", theme=set_theme, analytics_enabled= return ret checkboxes.select(fn_area_visibility, [checkboxes], [area_basic_fn, area_crazy_fn, area_input_primary, area_input_secondary, txt, txt2] ) # 整理反复出现的控件句柄组合 - add_input_combo = (txt_pattern_include, txt_pattern_except) - input_combo = [cookies, txt, txt2, top_p, temperature, chatbot, history, system_prompt, *add_input_combo] + input_combo = [cookies, txt, txt2, top_p, temperature, chatbot, history, system_prompt, txt_pattern] output_combo = [cookies, chatbot, history, status] predict_args = dict(fn=ArgsGeneralWrapper(predict), inputs=input_combo, outputs=output_combo) # 提交按钮、重置按钮 From 3a561a70db63e0e8ece844eb420e63859ba0b521 Mon Sep 17 00:00:00 2001 From: mrhblfx Date: Tue, 18 Apr 2023 23:30:19 +0800 Subject: [PATCH 04/13] Reduced one parameter --- toolbox.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toolbox.py b/toolbox.py index 8de3a8d..e3e75ce 100644 --- a/toolbox.py +++ b/toolbox.py @@ -27,7 +27,7 @@ def ArgsGeneralWrapper(f): """ 装饰器函数,用于重组输入参数,改变输入参数的顺序与结构。 """ - def decorated(cookies, txt, txt2, top_p, temperature, chatbot, history, system_prompt, txt_include, txt_except, *args): + def decorated(cookies, txt, txt2, top_p, temperature, chatbot, history, system_prompt, txt_pattern, *args): txt_passon = txt if txt == "" and txt2 != "": txt_passon = txt2 # 引入一个有cookie的chatbot @@ -44,7 +44,7 @@ def ArgsGeneralWrapper(f): # plugin_kwargs = { # # 目前还没有 # } - plugin_kwargs = dict(txt_include = txt_include, txt_except = txt_except) + plugin_kwargs = dict(txt_pattern = txt_pattern) chatbot_with_cookie = ChatBotWithCookies(cookies) chatbot_with_cookie.write_list(chatbot) yield from f(txt_passon, llm_kwargs, plugin_kwargs, chatbot_with_cookie, history, system_prompt, *args) From 9b5f0887939a2e8de21628733b2150f3638ccf8b Mon Sep 17 00:00:00 2001 From: mrhblfx Date: Tue, 18 Apr 2023 23:31:12 +0800 Subject: [PATCH 05/13] Changed matching rules --- crazy_functions/解析项目源代码.py | 38 +++++++++++++++++++------------ 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/crazy_functions/解析项目源代码.py b/crazy_functions/解析项目源代码.py index 283f103..6eb67a3 100644 --- a/crazy_functions/解析项目源代码.py +++ b/crazy_functions/解析项目源代码.py @@ -268,19 +268,22 @@ def 解析一个CSharp项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s @CatchException def 解析任意code项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port): - txt_include = plugin_kwargs.get("txt_include") - txt_except = plugin_kwargs.get("txt_except") - # 将要匹配的后缀 - pattern_include = [_.lstrip(" .,,").rstrip(" ,,") for _ in txt_include.split(" ") if _ != ""] - pattern_include = [_.lstrip(" .,,").rstrip(" ,,") for __ in pattern_include for _ in __.split(",") if _ != ""] - pattern_include = [_.lstrip(" .,,").rstrip(" ,,") for __ in pattern_include for _ in __.split(",") if _ != ""] - # 将要忽略匹配的后缀 - pattern_except = [_.lstrip(" .,,").rstrip(" ,,") for _ in txt_except.split(" ") if _ != ""] - pattern_except = [_.lstrip(" .,,").rstrip(" ,,") for __ in pattern_except for _ in __.split(",") if _ != ""] - pattern_except = [_.lstrip(" .,,").rstrip(" ,,") for __ in pattern_except for _ in __.split(",") if _ != ""] - pattern_except += ['zip', 'rar', '7z', 'tar', 'gz'] # 避免解析上传的压缩文件 - history = [] # 清空历史,以免输入溢出 - import glob, os + txt_pattern = plugin_kwargs.get("txt_pattern") + txt_pattern = txt_pattern.replace(",", ",") + # 将要匹配的模式(例如: *.c, *.cpp, *.py, config.toml) + pattern_include = [_.lstrip(" ,").rstrip(" ,") for _ in txt_pattern.split(",") if _ != "" and not _.strip().startswith("^")] + if not pattern_include: pattern_include = ["*"] # 不输入即全部匹配 + # 将要忽略匹配的文件后缀(例如: ^*.c, ^*.cpp, ^*.py) + pattern_except_suffix = [_.lstrip(" ^*.,").rstrip(" ,") for _ in txt_pattern.split(" ") if _ != "" and _.strip().startswith("^*.")] + pattern_except_suffix += ['zip', 'rar', '7z', 'tar', 'gz'] # 避免解析压缩文件 + # 将要忽略匹配的文件名(例如: ^README.md) + pattern_except_name = [_.lstrip(" ^*,").rstrip(" ,").replace(".", "\.") for _ in txt_pattern.split(" ") if _ != "" and _.strip().startswith("^") and not _.strip().startswith("^*.")] + # 生成正则表达式 + pattern_except = '/[^/]+\.(' + "|".join(pattern_except_suffix) + ')$' + pattern_except += '|/(' + "|".join(pattern_except_name) + ')$' if pattern_except_name != [] else '' + + history.clear() + import glob, os, re if os.path.exists(txt): project_folder = txt else: @@ -288,8 +291,13 @@ def 解析任意code项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, sys report_execption(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}") yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 return - file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.*', recursive=True) if os.path.isfile(f) and \ - ([] == pattern_include or f.split(".")[-1] in pattern_include) and f.split(".")[-1] not in pattern_except] + # 若上传压缩文件, 先寻找到解压的文件夹路径, 从而避免解析压缩文件 + maybe_dir = [f for f in glob.glob(f'{project_folder}/**') if os.path.isdir(f)] + extract_folder_path = maybe_dir[0].replace('\\', '/') if len(maybe_dir) != 0 else "" + # 按输入的匹配模式寻找上传的非压缩文件和已解压的文件 + file_manifest = [f for f in glob.glob(f'{project_folder}/**') if os.path.isfile(f) and not re.search(pattern_except, f)] + \ + [f for _ in pattern_include for f in glob.glob(f'{extract_folder_path}/**/{_}', recursive=True) if \ + "" != extract_folder_path and os.path.isfile(f) and not re.search(pattern_except, f)] if len(file_manifest) == 0: report_execption(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何文件: {txt}") yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 From 0ff838443ea5d5c3fbab70261c042c9fb0c2d9af Mon Sep 17 00:00:00 2001 From: mrhblfx Date: Thu, 20 Apr 2023 21:44:35 +0800 Subject: [PATCH 06/13] fix a bug --- crazy_functions/解析项目源代码.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crazy_functions/解析项目源代码.py b/crazy_functions/解析项目源代码.py index 9218fa5..64af5ec 100644 --- a/crazy_functions/解析项目源代码.py +++ b/crazy_functions/解析项目源代码.py @@ -296,8 +296,9 @@ def 解析任意code项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, sys extract_folder_path = maybe_dir[0].replace('\\', '/') if len(maybe_dir) != 0 else "" # 按输入的匹配模式寻找上传的非压缩文件和已解压的文件 file_manifest = [f for f in glob.glob(f'{project_folder}/**') if os.path.isfile(f) and not re.search(pattern_except, f)] + \ - [f for _ in pattern_include for f in glob.glob(f'{extract_folder_path}/**/{_}', recursive=True) if \ - "" != extract_folder_path and os.path.isfile(f) and not re.search(pattern_except, f)] + [f for _ in pattern_include for f in glob.glob(f'{extract_folder_path}/**/{_}', recursive=True) if "" != extract_folder_path and \ + os.path.isfile(f) and (not re.search(pattern_except, f) or _.endswith('.' + re.search(pattern_except, f).group().split('.')[-1]))] + if len(file_manifest) == 0: report_execption(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何文件: {txt}") yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 From de0ed4a6f535bf4f6d7b0b251d902f46ede03550 Mon Sep 17 00:00:00 2001 From: mrhblfx Date: Thu, 20 Apr 2023 22:01:27 +0800 Subject: [PATCH 07/13] =?UTF-8?q?style:accordion=20of=20=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E4=BB=BB=E6=84=8Fcode=E9=A1=B9=E7=9B=AE=20is=20closed=20by=20d?= =?UTF-8?q?efault?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 44fe06a..a0b0b04 100644 --- a/main.py +++ b/main.py @@ -86,7 +86,7 @@ def main(): crazy_fns[k]["Button"] = gr.Button(k, variant=variant) crazy_fns[k]["Button"].style(size="sm") with gr.Row(): - with gr.Accordion("解析任意code项目", open=True): + with gr.Accordion("解析任意code项目", open=False): gr.Markdown("输入时用逗号隔开, `*`代表通配符, 加了`^`代表不匹配
例如: `*.c, ^*.cpp, config.toml, ^README.md`") with gr.Row(): txt_pattern = gr.Textbox(show_label=False, placeholder="输入框为空则代表匹配所有文件").style(container=False) From 1139d395f27167a6785c4b42e69d75bb894573c8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 22 Apr 2023 15:06:54 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E5=B0=86=E9=AB=98=E7=BA=A7=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E8=BE=93=E5=85=A5=E9=80=9A=E7=94=A8=E5=8C=96=EF=BC=88?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E9=9A=90=E8=97=8F=EF=BC=89=EF=BC=8C=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E5=88=B0=E6=89=80=E6=9C=89=E7=9A=84=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=87=BD=E6=95=B0=E6=8F=92=E4=BB=B6=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crazy_functional.py | 2 ++ crazy_functions/解析项目源代码.py | 2 +- main.py | 36 ++++++++++++++----------------- toolbox.py | 9 ++++---- 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/crazy_functional.py b/crazy_functional.py index ccaed45..6453af8 100644 --- a/crazy_functional.py +++ b/crazy_functional.py @@ -196,6 +196,8 @@ def get_crazy_functions(): "解析任意code项目": { "Color": "stop", "AsButton": False, + "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False) + "ArgsReminder": "输入时用逗号隔开, `*`代表通配符, 加了`^`代表不匹配
例如: `*.c, ^*.cpp, config.toml, ^README.md`", # 高级参数输入区的显示提示 "Function": HotReload(解析任意code项目) }, }) diff --git a/crazy_functions/解析项目源代码.py b/crazy_functions/解析项目源代码.py index 64af5ec..60de1cb 100644 --- a/crazy_functions/解析项目源代码.py +++ b/crazy_functions/解析项目源代码.py @@ -268,7 +268,7 @@ def 解析一个CSharp项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s @CatchException def 解析任意code项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port): - txt_pattern = plugin_kwargs.get("txt_pattern") + txt_pattern = plugin_kwargs.get("advanced_arg") txt_pattern = txt_pattern.replace(",", ",") # 将要匹配的模式(例如: *.c, *.cpp, *.py, config.toml) pattern_include = [_.lstrip(" ,").rstrip(" ,") for _ in txt_pattern.split(",") if _ != "" and not _.strip().startswith("^")] diff --git a/main.py b/main.py index a0b0b04..9d16b85 100644 --- a/main.py +++ b/main.py @@ -85,21 +85,15 @@ def main(): variant = crazy_fns[k]["Color"] if "Color" in crazy_fns[k] else "secondary" crazy_fns[k]["Button"] = gr.Button(k, variant=variant) crazy_fns[k]["Button"].style(size="sm") - with gr.Row(): - with gr.Accordion("解析任意code项目", open=False): - gr.Markdown("输入时用逗号隔开, `*`代表通配符, 加了`^`代表不匹配
例如: `*.c, ^*.cpp, config.toml, ^README.md`") - with gr.Row(): - txt_pattern = gr.Textbox(show_label=False, placeholder="输入框为空则代表匹配所有文件").style(container=False) - code_plugin_name = "解析任意code项目" - variant = crazy_fns[code_plugin_name]["Color"] if "Color" in crazy_fns[code_plugin_name] else "secondary" - crazy_fns[code_plugin_name]["Button"] = gr.Button(code_plugin_name, variant=variant) - crazy_fns[code_plugin_name]["Button"].style(size="sm") with gr.Row(): with gr.Accordion("更多函数插件", open=True): dropdown_fn_list = [k for k in crazy_fns.keys() if not crazy_fns[k].get("AsButton", True)] - with gr.Column(scale=1): + with gr.Row(): dropdown = gr.Dropdown(dropdown_fn_list, value=r"打开插件列表", label="").style(container=False) - with gr.Column(scale=1): + with gr.Row(): + with gr.Accordion("高级函数插件参数区:", open=True, visible=False) as area_fn_kwargs: + plugin_advanced_arg = gr.Textbox(show_label=False, placeholder="输入框为空则代表匹配所有文件").style(container=False) + with gr.Row(): switchy_bt = gr.Button(r"请先从插件列表中选择", variant="secondary") with gr.Row(): with gr.Accordion("点击展开“文件上传区”。上传本地文件可供红色函数插件调用。", open=False) as area_file_up: @@ -109,7 +103,7 @@ def main(): top_p = gr.Slider(minimum=-0, maximum=1.0, value=1.0, step=0.01,interactive=True, label="Top-p (nucleus sampling)",) temperature = gr.Slider(minimum=-0, maximum=2.0, value=1.0, step=0.01, interactive=True, label="Temperature",) max_length_sl = gr.Slider(minimum=256, maximum=4096, value=512, step=1, interactive=True, label="Local LLM MaxLength",) - checkboxes = gr.CheckboxGroup(["基础功能区", "函数插件区", "底部输入区", "输入清除键"], value=["基础功能区", "函数插件区"], label="显示/隐藏功能区") + checkboxes = gr.CheckboxGroup(["基础功能区", "函数插件区", "底部输入区", "输入清除键", "插件参数区"], value=["基础功能区", "函数插件区"], label="显示/隐藏功能区") md_dropdown = gr.Dropdown(AVAIL_LLM_MODELS, value=LLM_MODEL, label="更换LLM模型/请求源").style(container=False) gr.Markdown(description) @@ -131,11 +125,12 @@ def main(): ret.update({area_input_secondary: gr.update(visible=("底部输入区" in a))}) ret.update({clearBtn: gr.update(visible=("输入清除键" in a))}) ret.update({clearBtn2: gr.update(visible=("输入清除键" in a))}) + ret.update({area_fn_kwargs: gr.update(visible=("插件参数区" in a))}) if "底部输入区" in a: ret.update({txt: gr.update(value="")}) return ret - checkboxes.select(fn_area_visibility, [checkboxes], [area_basic_fn, area_crazy_fn, area_input_primary, area_input_secondary, txt, txt2, clearBtn, clearBtn2] ) + checkboxes.select(fn_area_visibility, [checkboxes], [area_basic_fn, area_crazy_fn, area_input_primary, area_input_secondary, txt, txt2, clearBtn, clearBtn2, area_fn_kwargs] ) # 整理反复出现的控件句柄组合 - input_combo = [cookies, max_length_sl, md_dropdown, txt, txt2, top_p, temperature, chatbot, history, system_prompt, txt_pattern] + input_combo = [cookies, max_length_sl, md_dropdown, txt, txt2, top_p, temperature, chatbot, history, system_prompt, plugin_advanced_arg] output_combo = [cookies, chatbot, history, status] predict_args = dict(fn=ArgsGeneralWrapper(predict), inputs=input_combo, outputs=output_combo) # 提交按钮、重置按钮 @@ -159,15 +154,16 @@ def main(): click_handle = crazy_fns[k]["Button"].click(ArgsGeneralWrapper(crazy_fns[k]["Function"]), [*input_combo, gr.State(PORT)], output_combo) click_handle.then(on_report_generated, [file_upload, chatbot], [file_upload, chatbot]) cancel_handles.append(click_handle) - # 函数插件-解析任意code项目 - click_handle = crazy_fns[code_plugin_name]["Button"].click(ArgsGeneralWrapper(crazy_fns[code_plugin_name]["Function"]), [*input_combo, gr.State(PORT)], output_combo) - click_handle.then(on_report_generated, [file_upload, chatbot], [file_upload, chatbot]) - cancel_handles.append(click_handle) # 函数插件-下拉菜单与随变按钮的互动 def on_dropdown_changed(k): variant = crazy_fns[k]["Color"] if "Color" in crazy_fns[k] else "secondary" - return {switchy_bt: gr.update(value=k, variant=variant)} - dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt] ) + ret = {switchy_bt: gr.update(value=k, variant=variant)} + if crazy_fns[k].get("AdvancedArgs", False): # 是否唤起高级插件参数区 + ret.update({area_fn_kwargs: gr.update(visible=True, label=f"插件{k}的高级参数说明:" + crazy_fns[k].get("ArgsReminder", [f"没有提供高级参数功能说明"]))}) + else: + ret.update({area_fn_kwargs: gr.update(visible=False, label=f"插件{k}不需要高级参数。")}) + return ret + dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt, area_fn_kwargs] ) def on_md_dropdown_changed(k): return {chatbot: gr.update(label="当前模型:"+k)} md_dropdown.select(on_md_dropdown_changed, [md_dropdown], [chatbot] ) diff --git a/toolbox.py b/toolbox.py index 2fd5da2..53bb882 100644 --- a/toolbox.py +++ b/toolbox.py @@ -24,7 +24,7 @@ def ArgsGeneralWrapper(f): """ 装饰器函数,用于重组输入参数,改变输入参数的顺序与结构。 """ - def decorated(cookies, max_length, llm_model, txt, txt2, top_p, temperature, chatbot, history, system_prompt, txt_pattern, *args): + def decorated(cookies, max_length, llm_model, txt, txt2, top_p, temperature, chatbot, history, system_prompt, plugin_advanced_arg, *args): txt_passon = txt if txt == "" and txt2 != "": txt_passon = txt2 # 引入一个有cookie的chatbot @@ -39,10 +39,9 @@ def ArgsGeneralWrapper(f): 'max_length': max_length, 'temperature':temperature, } - # plugin_kwargs = { - # # 目前还没有 - # } - plugin_kwargs = dict(txt_pattern = txt_pattern) + plugin_kwargs = { + "advanced_arg": plugin_advanced_arg, + } chatbot_with_cookie = ChatBotWithCookies(cookies) chatbot_with_cookie.write_list(chatbot) yield from f(txt_passon, llm_kwargs, plugin_kwargs, chatbot_with_cookie, history, system_prompt, *args) From 89a75e26c3872ecce59842a454fc23229e7c3f03 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 22 Apr 2023 15:36:49 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dextract=5Ffolder=5Fpath?= =?UTF-8?q?=E8=A2=AB=E5=AE=9A=E4=BD=8D=E5=88=B0=E6=A0=B9=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crazy_functions/解析项目源代码.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/crazy_functions/解析项目源代码.py b/crazy_functions/解析项目源代码.py index 60de1cb..5563d3b 100644 --- a/crazy_functions/解析项目源代码.py +++ b/crazy_functions/解析项目源代码.py @@ -292,13 +292,14 @@ def 解析任意code项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, sys yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 return # 若上传压缩文件, 先寻找到解压的文件夹路径, 从而避免解析压缩文件 - maybe_dir = [f for f in glob.glob(f'{project_folder}/**') if os.path.isdir(f)] - extract_folder_path = maybe_dir[0].replace('\\', '/') if len(maybe_dir) != 0 else "" + maybe_dir = [f for f in glob.glob(f'{project_folder}/*') if os.path.isdir(f)] + if maybe_dir[0].endswith('.extract'): + extract_folder_path = maybe_dir[0] + else: + extract_folder_path = project_folder # 按输入的匹配模式寻找上传的非压缩文件和已解压的文件 - file_manifest = [f for f in glob.glob(f'{project_folder}/**') if os.path.isfile(f) and not re.search(pattern_except, f)] + \ - [f for _ in pattern_include for f in glob.glob(f'{extract_folder_path}/**/{_}', recursive=True) if "" != extract_folder_path and \ - os.path.isfile(f) and (not re.search(pattern_except, f) or _.endswith('.' + re.search(pattern_except, f).group().split('.')[-1]))] - + file_manifest = [f for pattern in pattern_include for f in glob.glob(f'{extract_folder_path}/**/{pattern}', recursive=True) if "" != extract_folder_path and \ + os.path.isfile(f) and (not re.search(pattern_except, f) or pattern.endswith('.' + re.search(pattern_except, f).group().split('.')[-1]))] if len(file_manifest) == 0: report_execption(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何文件: {txt}") yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 From e9a6efef7fb5b53e4616bd8e3d346348aaad640c Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 22 Apr 2023 15:39:51 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9D=9E=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=E7=9A=84=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crazy_functions/解析项目源代码.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crazy_functions/解析项目源代码.py b/crazy_functions/解析项目源代码.py index 5563d3b..bfa473a 100644 --- a/crazy_functions/解析项目源代码.py +++ b/crazy_functions/解析项目源代码.py @@ -293,7 +293,7 @@ def 解析任意code项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, sys return # 若上传压缩文件, 先寻找到解压的文件夹路径, 从而避免解析压缩文件 maybe_dir = [f for f in glob.glob(f'{project_folder}/*') if os.path.isdir(f)] - if maybe_dir[0].endswith('.extract'): + if len(maybe_dir)>0 and maybe_dir[0].endswith('.extract'): extract_folder_path = maybe_dir[0] else: extract_folder_path = project_folder From c3cafd8d6f807031ebc7521f73a309703041f930 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 22 Apr 2023 15:52:21 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E5=BE=AE=E8=B0=83=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crazy_functional.py | 4 ++-- main.py | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/crazy_functional.py b/crazy_functional.py index 6453af8..1904140 100644 --- a/crazy_functional.py +++ b/crazy_functional.py @@ -193,11 +193,11 @@ def get_crazy_functions(): from crazy_functions.解析项目源代码 import 解析任意code项目 function_plugins.update({ - "解析任意code项目": { + "解析项目源代码(手动指定和筛选源代码文件类型)": { "Color": "stop", "AsButton": False, "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False) - "ArgsReminder": "输入时用逗号隔开, `*`代表通配符, 加了`^`代表不匹配
例如: `*.c, ^*.cpp, config.toml, ^README.md`", # 高级参数输入区的显示提示 + "ArgsReminder": "输入时用逗号隔开, *代表通配符, 加了^代表不匹配。例如: \"*.c, ^*.cpp, config.toml, ^README.md\"", # 高级参数输入区的显示提示 "Function": HotReload(解析任意code项目) }, }) diff --git a/main.py b/main.py index 9d16b85..d3efcad 100644 --- a/main.py +++ b/main.py @@ -91,8 +91,8 @@ def main(): with gr.Row(): dropdown = gr.Dropdown(dropdown_fn_list, value=r"打开插件列表", label="").style(container=False) with gr.Row(): - with gr.Accordion("高级函数插件参数区:", open=True, visible=False) as area_fn_kwargs: - plugin_advanced_arg = gr.Textbox(show_label=False, placeholder="输入框为空则代表匹配所有文件").style(container=False) + plugin_advanced_arg = gr.Textbox(show_label=True, label="高级参数输入区", visible=False, + placeholder="这里是特殊函数插件的高级参数输入区").style(container=False) with gr.Row(): switchy_bt = gr.Button(r"请先从插件列表中选择", variant="secondary") with gr.Row(): @@ -125,10 +125,10 @@ def main(): ret.update({area_input_secondary: gr.update(visible=("底部输入区" in a))}) ret.update({clearBtn: gr.update(visible=("输入清除键" in a))}) ret.update({clearBtn2: gr.update(visible=("输入清除键" in a))}) - ret.update({area_fn_kwargs: gr.update(visible=("插件参数区" in a))}) + ret.update({plugin_advanced_arg: gr.update(visible=("插件参数区" in a))}) if "底部输入区" in a: ret.update({txt: gr.update(value="")}) return ret - checkboxes.select(fn_area_visibility, [checkboxes], [area_basic_fn, area_crazy_fn, area_input_primary, area_input_secondary, txt, txt2, clearBtn, clearBtn2, area_fn_kwargs] ) + checkboxes.select(fn_area_visibility, [checkboxes], [area_basic_fn, area_crazy_fn, area_input_primary, area_input_secondary, txt, txt2, clearBtn, clearBtn2, plugin_advanced_arg] ) # 整理反复出现的控件句柄组合 input_combo = [cookies, max_length_sl, md_dropdown, txt, txt2, top_p, temperature, chatbot, history, system_prompt, plugin_advanced_arg] output_combo = [cookies, chatbot, history, status] @@ -159,11 +159,11 @@ def main(): variant = crazy_fns[k]["Color"] if "Color" in crazy_fns[k] else "secondary" ret = {switchy_bt: gr.update(value=k, variant=variant)} if crazy_fns[k].get("AdvancedArgs", False): # 是否唤起高级插件参数区 - ret.update({area_fn_kwargs: gr.update(visible=True, label=f"插件{k}的高级参数说明:" + crazy_fns[k].get("ArgsReminder", [f"没有提供高级参数功能说明"]))}) + ret.update({plugin_advanced_arg: gr.update(visible=True, label=f"插件[{k}]的高级参数说明:" + crazy_fns[k].get("ArgsReminder", [f"没有提供高级参数功能说明"]))}) else: - ret.update({area_fn_kwargs: gr.update(visible=False, label=f"插件{k}不需要高级参数。")}) + ret.update({plugin_advanced_arg: gr.update(visible=False, label=f"插件[{k}]不需要高级参数。")}) return ret - dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt, area_fn_kwargs] ) + dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt, plugin_advanced_arg] ) def on_md_dropdown_changed(k): return {chatbot: gr.update(label="当前模型:"+k)} md_dropdown.select(on_md_dropdown_changed, [md_dropdown], [chatbot] ) From 4575046ce1cd27f8cb9c2e4e7d1208cbe4b28e3f Mon Sep 17 00:00:00 2001 From: mrhblfx Date: Sat, 22 Apr 2023 18:08:27 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E4=BD=BF=E6=8F=90=E7=A4=BA=E6=9B=B4?= =?UTF-8?q?=E4=BD=B3=E5=85=A8=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crazy_functional.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crazy_functional.py b/crazy_functional.py index 6d2192b..8a76100 100644 --- a/crazy_functional.py +++ b/crazy_functional.py @@ -203,7 +203,7 @@ def get_crazy_functions(): "Color": "stop", "AsButton": False, "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False) - "ArgsReminder": "输入时用逗号隔开, *代表通配符, 加了^代表不匹配。例如: \"*.c, ^*.cpp, config.toml, ^README.md\"", # 高级参数输入区的显示提示 + "ArgsReminder": "输入时用逗号隔开, *代表通配符, 加了^代表不匹配; 不输入代表全部匹配。例如: \"*.c, ^*.cpp, config.toml, ^*.json\"", # 高级参数输入区的显示提示 "Function": HotReload(解析任意code项目) }, }) From bd62c6be68ee406af1321391ee35db1b79d26a01 Mon Sep 17 00:00:00 2001 From: mrhblfx Date: Sat, 22 Apr 2023 18:20:01 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E4=BD=BF=E6=8F=90=E7=A4=BA=E6=9B=B4?= =?UTF-8?q?=E4=BD=B3=E5=85=A8=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crazy_functional.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crazy_functional.py b/crazy_functional.py index 8a76100..04ebaa5 100644 --- a/crazy_functional.py +++ b/crazy_functional.py @@ -203,7 +203,7 @@ def get_crazy_functions(): "Color": "stop", "AsButton": False, "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False) - "ArgsReminder": "输入时用逗号隔开, *代表通配符, 加了^代表不匹配; 不输入代表全部匹配。例如: \"*.c, ^*.cpp, config.toml, ^*.json\"", # 高级参数输入区的显示提示 + "ArgsReminder": "输入时用逗号隔开, *代表通配符, 加了^代表不匹配; 不输入代表全部匹配。例如: \"*.c, ^*.cpp, config.toml, ^*.toml\"", # 高级参数输入区的显示提示 "Function": HotReload(解析任意code项目) }, })