diff --git a/__main__.py b/__main__.py index 6e5a3b2..19dfd34 100644 --- a/__main__.py +++ b/__main__.py @@ -79,7 +79,7 @@ class ChatBot(ChatBotFrame): with gr.Box(elem_id='chat_box'): with gr.Row(): gr.Button(elem_classes='sm_btn').style(size='sm', full_width=False) - gr.HTML(func_box.get_html("appearance_switcher.html").format(label=""), elem_classes="insert_block") + gr.HTML(func_box.get_html("appearance_switcher.html").format(label=""), elem_id='user_input_tb', elem_classes="insert_block") with gr.Row(): self.txt = gr.Textbox(show_label=False, placeholder="Input question here.", elem_classes='chat_input').style(container=False) self.input_copy = gr.State('') @@ -186,7 +186,7 @@ class ChatBot(ChatBotFrame): self.pro_func_prompt, self.pro_fp_state]) self.pro_reuse_btn.click( fn=func_box.reuse_chat, - inputs=[self.pro_results, self.chatbot, self.history, self.pro_name_txt], + inputs=[self.pro_results, self.chatbot, self.history, self.pro_name_txt, self.txt], outputs=[self.chatbot, self.history, self.txt, self.tabs_chatbot, self.pro_name_txt, self.examples_column] ) @@ -312,7 +312,7 @@ class ChatBot(ChatBotFrame): self.cancel_handles.append(self.txt.submit(**self.clear_agrs).then(**self.predict_args)) self.cancel_handles.append(self.submitBtn.click(**self.clear_agrs).then(**self.predict_args)) # self.cpopyBtn.click(fn=func_box.copy_result, inputs=[self.history], outputs=[self.status]) - self.resetBtn.click(lambda: ([], [], "已重置"), None, [self.chatbot, self.history, self.status]) + self.resetBtn.click(lambda: ([], [], "已重置"), None, [self.chatbot, self.history, self.status], _js='()=>{clearHistoryHtml();}') def signals_function(self): # 基础功能区的回调函数注册 diff --git a/docs/assets/custom.js b/docs/assets/custom.js index 84e0068..3a0a889 100644 --- a/docs/assets/custom.js +++ b/docs/assets/custom.js @@ -58,8 +58,8 @@ function gradioLoaded(mutations) { chat_txt = document.getElementById('chat_txt'); userInfoDiv = document.getElementById("user_info"); appTitleDiv = document.getElementById("app_title"); - chatbot = document.querySelector('#main_chatbot'); - chatbotWrap = document.querySelector('#main_chatbot > .wrap'); + chatbot = document.querySelector('#废弃'); + chatbotWrap = document.querySelector('#废弃 > .wrap'); apSwitch = document.querySelector('.apSwitch input[type="checkbox"]'); if (loginUserForm) { @@ -414,7 +414,7 @@ var mObserver = new MutationObserver(function (mutationsList) { for (var node of mmutation.addedNodes) { if (node.nodeType === 1 && node.classList.contains('message') && node.getAttribute('data-testid') === 'bot') { saveHistoryHtml(); - document.querySelectorAll('#main_chatbot>.wrap>.message-wrap .message.bot').forEach(addChuanhuButton); + document.querySelectorAll('#废弃>.wrap>.message-wrap .message.bot').forEach(addChuanhuButton); } if (node.tagName === 'INPUT' && node.getAttribute('type') === 'range') { setSlider(); @@ -423,7 +423,7 @@ var mObserver = new MutationObserver(function (mutationsList) { for (var node of mmutation.removedNodes) { if (node.nodeType === 1 && node.classList.contains('message') && node.getAttribute('data-testid') === 'bot') { saveHistoryHtml(); - document.querySelectorAll('#main_chatbot>.wrap>.message-wrap .message.bot').forEach(addChuanhuButton); + document.querySelectorAll('#废弃>.wrap>.message-wrap .message.bot').forEach(addChuanhuButton); } } } else if (mmutation.type === 'attributes') { @@ -433,7 +433,7 @@ var mObserver = new MutationObserver(function (mutationsList) { clearTimeout(timeoutId); timeoutId = setTimeout(() => { isThrottled = false; - document.querySelectorAll('#main_chatbot>.wrap>.message-wrap .message.bot').forEach(addChuanhuButton); + document.querySelectorAll('#废弃>.wrap>.message-wrap .message.bot').forEach(addChuanhuButton); saveHistoryHtml(); }, 500); } @@ -442,59 +442,6 @@ var mObserver = new MutationObserver(function (mutationsList) { }); mObserver.observe(document.documentElement, { attributes: true, childList: true, subtree: true }); -var loadhistorytime = 0; // for debugging -function saveHistoryHtml() { - var historyHtml = document.querySelector('#main_chatbot > .wrap'); - localStorage.setItem('chatHistory', historyHtml.innerHTML); - // console.log("History Saved") - historyLoaded = false; -} -function loadHistoryHtml() { - var historyHtml = localStorage.getItem('chatHistory'); - if (!historyHtml) { - historyLoaded = true; - return; // no history, do nothing - } - userLogged = localStorage.getItem('userLogged'); - if (userLogged){ - historyLoaded = true; - return; // logged in, do nothing - } - if (!historyLoaded) { - var tempDiv = document.createElement('div'); - tempDiv.innerHTML = historyHtml; - var buttons = tempDiv.querySelectorAll('button.chuanhu-btn'); - var gradioCopyButtons = tempDiv.querySelectorAll('button.copy_code_button'); - for (var i = 0; i < buttons.length; i++) { - buttons[i].parentNode.removeChild(buttons[i]); - } - for (var i = 0; i < gradioCopyButtons.length; i++) { - gradioCopyButtons[i].parentNode.removeChild(gradioCopyButtons[i]); - } - var fakeHistory = document.createElement('div'); - fakeHistory.classList.add('history-message'); - fakeHistory.innerHTML = tempDiv.innerHTML; - webLocale(); - chatbotWrap.insertBefore(fakeHistory, chatbotWrap.firstChild); - // var fakeHistory = document.createElement('div'); - // fakeHistory.classList.add('history-message'); - // fakeHistory.innerHTML = historyHtml; - // chatbotWrap.insertBefore(fakeHistory, chatbotWrap.firstChild); - historyLoaded = true; - console.log("History Loaded"); - loadhistorytime += 1; // for debugging - } else { - historyLoaded = false; - } -} -function clearHistoryHtml() { - localStorage.removeItem("chatHistory"); - historyMessages = chatbotWrap.querySelector('.history-message'); - if (historyMessages) { - chatbotWrap.removeChild(historyMessages); - console.log("History Cleared"); - } -} // 监视页面内部 DOM 变动 var observer = new MutationObserver(function (mutations) { diff --git a/func_box.py b/func_box.py index 6113e28..a6df439 100644 --- a/func_box.py +++ b/func_box.py @@ -32,6 +32,7 @@ import random import gradio as gr import toolbox from prompt_generator import SqliteHandle +from bs4 import BeautifulSoup """contextlib 是 Python 标准库中的一个模块,提供了一些工具函数和装饰器,用于支持编写上下文管理器和处理上下文的常见任务,例如资源管理、异常处理等。 官网:https://docs.python.org/3/library/contextlib.html""" @@ -500,19 +501,22 @@ def show_prompt_result(index, data: gr.Dataset, chatbot): return chatbot -pattern_markdown = re.compile(r'^

|<\/p><\/div>$') -pattern_markdown_p = re.compile(r'^

|<\/div>$') + +def pattern_html(html): + bs = BeautifulSoup(html, 'html.parser') + return bs.get_text(separator='') + def thread_write_chat(chatbot, history): """ 对话记录写入数据库 """ private_key = toolbox.get_conf('private_key')[0] chat_title = chatbot[0][1].split() - i_say = pattern_markdown.sub('', chatbot[-1][0]) + i_say = pattern_html(chatbot[-1][0]) if history: gpt_result = history else: # 如果历史对话不存在,那么读取对话框 - gpt_result = [pattern_markdown.sub('', v) for i in chatbot for v in i] + gpt_result = [pattern_html(v) for i in chatbot for v in i] if private_key in chat_title: SqliteHandle(f'ai_private_{chat_title[-2]}').inset_prompt({i_say: gpt_result}) else: @@ -522,20 +526,19 @@ def thread_write_chat(chatbot, history): base_path = os.path.dirname(__file__) prompt_path = os.path.join(base_path, 'prompt_users') -def reuse_chat(result, chatbot, history, pro_numb): +def reuse_chat(result, chatbot, history, pro_numb, say): """复用对话记录""" if result is None or result == []: return chatbot, history, gr.update(), gr.update(), '', gr.Column.update() else: if pro_numb: chatbot += result - history += [pattern_markdown.sub('', _) for i in result for _ in i] + history += [pattern_html(_) for i in result for _ in i] else: chatbot.append(result[-1]) - history += [pattern_markdown.sub('', _) for i in result[-2:] for _ in i] + history += [pattern_html(_) for i in result[-2:] for _ in i] print(chatbot[-1][0]) - i_say = pattern_markdown.sub('', chatbot[-1][0]) - return chatbot, history, i_say, gr.Tabs.update(selected='chatbot'), '', gr.Column.update(visible=False) + return chatbot, history, say, gr.Tabs.update(selected='chatbot'), '', gr.Column.update(visible=False) def num_tokens_from_string(listing: list, encoding_name: str = 'cl100k_base') -> int: @@ -551,10 +554,8 @@ def spinner_chatbot_loading(chatbot): # 将元组转换为列表并修改元素 loading_msg = copy.deepcopy(chatbot) temp_list = list(loading_msg[-1]) - if pattern_markdown.match(temp_list[1]): - temp_list[1] = pattern_markdown.sub('', temp_list[1]) + f'{random.choice(loading)}' - else: - temp_list[1] = pattern_markdown_p.sub('', temp_list[1]) + f'{random.choice(loading)}' + + temp_list[1] = pattern_html(temp_list[1]) + f'{random.choice(loading)}' # 将列表转换回元组并替换原始元组 loading_msg[-1] = tuple(temp_list) return loading_msg diff --git a/toolbox.py b/toolbox.py index f780bbc..3407c7a 100644 --- a/toolbox.py +++ b/toolbox.py @@ -1,3 +1,5 @@ +import html + import markdown import importlib import inspect @@ -291,8 +293,9 @@ def markdown_convertion(txt): """ 将Markdown格式的文本转换为HTML格式。如果包含数学公式,则先将公式转换为HTML格式。 """ - pre = '
' + pre = '
' suf = '
' + raw_hide = f'
%s
' if txt.startswith(pre) and txt.endswith(suf): # print('警告,输入了已经经过转化的字符串,二次转化可能出问题') return txt # 已经被转化过,不需要再次转化 @@ -363,9 +366,11 @@ def markdown_convertion(txt): # 2. convert to rendered equation convert_stage_2_2, n = re.subn(find_equation_pattern, replace_math_render, convert_stage_1, flags=re.DOTALL) # cat them together - return pre + convert_stage_2_1 + f'{split}' + convert_stage_2_2 + suf + context = convert_stage_2_1 + f'{split}' + convert_stage_2_2 + return raw_hide.replace('%s', func_box.pattern_html(context)) + pre + context + suf else: - return pre + markdown.markdown(txt, extensions=['fenced_code', 'codehilite', 'tables', 'sane_lists']) + suf + context = markdown.markdown(txt, extensions=['fenced_code', 'codehilite', 'tables', 'sane_lists']) + return raw_hide.replace('%s', func_box.pattern_html(context)) + pre + context + suf def close_up_code_segment_during_stream(gpt_reply):