diff --git a/public/index.html b/public/index.html index da38f57f9..88bf1643c 100644 --- a/public/index.html +++ b/public/index.html @@ -1343,6 +1343,13 @@ Auto-scroll Chat +

Send on Enter diff --git a/public/notes/content.md b/public/notes/content.md index 6449661d7..0a0b4d4f0 100644 --- a/public/notes/content.md +++ b/public/notes/content.md @@ -541,4 +541,22 @@ To play your own custom sound on receiving a new message from bot, replace the f Plays at 80% volume. -If "Background Sound Only" option is enabled, the sound plays only if SillyTavern window is **unfocused**. \ No newline at end of file +If "Background Sound Only" option is enabled, the sound plays only if SillyTavern window is **unfocused**. + +### Formulas Rendering + +Enables math formulas rendering using the [showdown-katex](https://obedm503.github.io/showdown-katex/) package. + +The following formatting rules are supported: + +#### LaTeX syntax +``` +$$ formula goes here $$ +``` + +#### Asciimath syntax +``` +$ formula goes here $ +``` + +More information: [KaTeX](https://katex.org/) \ No newline at end of file diff --git a/public/script.js b/public/script.js index 87f4c0d03..1bdb53450 100644 --- a/public/script.js +++ b/public/script.js @@ -39,6 +39,7 @@ import { select_group_chats, regenerateGroup, group_generation_id, + getGroupChat, } from "./scripts/group-chats.js"; import { @@ -147,6 +148,7 @@ export { getThumbnailUrl, getStoppingStrings, getStatus, + reloadMarkdownProcessor, chat, this_chid, selected_button, @@ -177,19 +179,11 @@ window["SillyTavern"] = {}; const gpt3 = new GPT3BrowserTokenizer({ type: 'gpt3' }); hljs.addPlugin({ "before:highlightElement": ({ el }) => { el.textContent = el.innerText } }); -let converter = new showdown.Converter({ - emoji: "true", - underline: "true", - extensions: [ - showdownKatex( - { - delimiters: [ - { left: '$$', right: '$$', display: true, asciimath: false }, - { left: '$', right: '$', display: false, asciimath: true }, - ] - } - )], -}); + +// Markdown converter +let converter; +reloadMarkdownProcessor(); + /* let bg_menu_toggle = false; */ const systemUserName = "SillyTavern System"; let default_user_name = "You"; @@ -389,6 +383,31 @@ function getTokenCount(str, padding = 0) { } } +function reloadMarkdownProcessor(render_formulas = false) { + if (render_formulas) { + converter = new showdown.Converter({ + emoji: "true", + underline: "true", + extensions: [ + showdownKatex( + { + delimiters: [ + { left: '$$', right: '$$', display: true, asciimath: false }, + { left: '$', right: '$', display: false, asciimath: true }, + ] + } + )], + }); + } + else { + converter = new showdown.Converter({ + emoji: "true", + }); + } + + return converter; +} + const CHARACTERS_PER_TOKEN_RATIO = 3.35; const talkativeness_default = 0.5; @@ -518,16 +537,6 @@ $.get("/csrf-token").then((data) => { getUserAvatars(); }); -///////////// UNUSED FUNCTIONS MOVED TO TOP /////////////// - -function newMesPattern(name) { - //Patern which denotes a new message - name = name + ":"; - return name; -} - -////////////////////////////////////////// - function checkOnlineStatus() { ///////// REMOVED LINES THAT DUPLICATE RA_CHeckOnlineStatus FEATURES @@ -907,6 +916,22 @@ function deleteLastMessage() { $('#chat').children('.mes').last().remove(); } +export async function reloadCurrentChat() { + clearChat(); + chat.length = 0; + + if (selected_group) { + await getGroupChat(selected_group); + } + else if (this_chid) { + await getChat(); + } + else { + resetChatState(); + printMessages(); + } +} + function messageFormating(mes, ch_name, isSystem, forceAvatar) { if (!mes) { mes = ''; diff --git a/public/scripts/RossAscends-mods.js b/public/scripts/RossAscends-mods.js index a635ca450..d0bdc3774 100644 --- a/public/scripts/RossAscends-mods.js +++ b/public/scripts/RossAscends-mods.js @@ -122,6 +122,10 @@ function isMobile() { } function shouldSendOnEnter() { + if (!power_user) { + return false; + } + switch (power_user.send_on_enter) { case send_on_enter_options.DISABLED: return false; @@ -708,10 +712,9 @@ $("document").ready(function () { //Additional hotkeys CTRL+ENTER and CTRL+UPARROW function processHotkeys(event) { - const sendOnEnter = shouldSendOnEnter(); - //Enter to send when send_textarea in focus if ($(':focus').attr('id') === 'send_textarea') { + const sendOnEnter = shouldSendOnEnter(); if (!event.shiftKey && !event.ctrlKey && event.key == "Enter" && is_send_press == false && sendOnEnter) { event.preventDefault(); Generate(); diff --git a/public/scripts/group-chats.js b/public/scripts/group-chats.js index b3a5411c0..4f7fd96ca 100644 --- a/public/scripts/group-chats.js +++ b/public/scripts/group-chats.js @@ -115,7 +115,7 @@ async function regenerateGroup() { generateGroupWrapper(); } -async function getGroupChat(id) { +export async function getGroupChat(id) { const response = await fetch("/getgroupchat", { method: "POST", headers: { diff --git a/public/scripts/power-user.js b/public/scripts/power-user.js index 6b38968a7..f7a33f42b 100644 --- a/public/scripts/power-user.js +++ b/public/scripts/power-user.js @@ -5,6 +5,8 @@ import { callPopup, token, getStatus, + reloadMarkdownProcessor, + reloadCurrentChat, } from "../script.js"; export { @@ -97,6 +99,7 @@ let power_user = { auto_scroll_chat_to_bottom: true, auto_fix_generated_markdown: true, send_on_enter: send_on_enter_options.AUTO, + render_formulas: false, }; let themes = []; @@ -117,7 +120,6 @@ const storage_keys = { shadow_color: "TavernAI_shadow_color", shadow_width: "TavernAI_shadow_width", - waifuMode: "TavernAI_waifuMode", movingUI: "TavernAI_movingUI", noShadows: "TavernAI_noShadows", @@ -358,6 +360,7 @@ function loadPowerUserSettings(settings, data) { $("#always-force-name2-checkbox").prop("checked", power_user.always_force_name2); $("#disable-examples-formatting-checkbox").prop("checked", power_user.disable_examples_formatting); $('#disable-start-formatting-checkbox').prop("checked", power_user.disable_start_formatting); + $('#render_formulas').prop("checked", power_user.render_formulas); $("#custom_chat_separator").val(power_user.custom_chat_separator); $("#fast_ui_mode").prop("checked", power_user.fast_ui_mode); $("#waifuMode").prop("checked", power_user.waifuMode); @@ -399,6 +402,7 @@ function loadPowerUserSettings(settings, data) { $(`#character_sort_order option[data-order="${power_user.sort_order}"][data-field="${power_user.sort_field}"]`).prop("selected", true); sortCharactersList(); + reloadMarkdownProcessor(power_user.render_formulas); } function sortCharactersList(selector = '.character_select') { @@ -727,6 +731,13 @@ $(document).ready(() => { saveSettingsDebounced(); }); + $("#render_formulas").on("input", function () { + power_user.render_formulas = !!$(this).prop('checked'); + reloadMarkdownProcessor(power_user.render_formulas); + reloadCurrentChat(); + saveSettingsDebounced(); + }) + $(window).on('focus', function () { browser_has_focus = true; });