Markdown: Add ability to exclude specific strings

A comma-separated list of markdown strings provided by the user can
be excluded as needed. This is combined with the set chat separator
to provide a seamless experience when chatting.

Signed-off-by: kingbri <bdashore3@proton.me>
This commit is contained in:
kingbri
2023-06-22 21:01:59 -04:00
parent fa9df8f22e
commit e7af6892fb
5 changed files with 46 additions and 38 deletions

View File

@ -1628,7 +1628,6 @@
<input id="custom_chat_separator" class="text_pole textarea_compact" type="text" placeholder="&lt;START&gt;" maxlength="100" /> <input id="custom_chat_separator" class="text_pole textarea_compact" type="text" placeholder="&lt;START&gt;" maxlength="100" />
</div> </div>
</div> </div>
<!--
<div> <div>
<h4 data-i18n="Non-markdown strings"> <h4 data-i18n="Non-markdown strings">
Non-markdown strings Non-markdown strings
@ -1637,7 +1636,6 @@
<input id="markdown_escape_strings" class="text_pole textarea_compact" type="text" placeholder="separate with commas w/o space between" maxlength="100" /> <input id="markdown_escape_strings" class="text_pole textarea_compact" type="text" placeholder="separate with commas w/o space between" maxlength="100" />
</div> </div>
</div> </div>
-->
<div> <div>
<h4 data-i18n="Instruct mode">Instruct mode <h4 data-i18n="Instruct mode">Instruct mode

View File

@ -150,7 +150,7 @@ import {
} from "./scripts/secrets.js"; } from "./scripts/secrets.js";
import { EventEmitter } from './scripts/eventemitter.js'; import { EventEmitter } from './scripts/eventemitter.js';
import { context_settings, loadContextTemplatesFromSettings } from "./scripts/context-template.js"; import { context_settings, loadContextTemplatesFromSettings } from "./scripts/context-template.js";
import { dinkusExtension } from "./scripts/showdown-dinkus.js"; import { markdownExclusionExt } from "./scripts/showdown-exclusion.js";
import { setFloatingPrompt } from "./scripts/extensions/floating-prompt/index.js"; import { setFloatingPrompt } from "./scripts/extensions/floating-prompt/index.js";
//exporting functions and vars for mods //exporting functions and vars for mods
@ -545,7 +545,7 @@ function reloadMarkdownProcessor(render_formulas = false) {
// Maybe move this into power_user init? // Maybe move this into power_user init?
setTimeout(() => { setTimeout(() => {
if (power_user) { if (power_user) {
converter.addExtension(dinkusExtension(), 'dinkus'); converter.addExtension(markdownExclusionExt(), 'exclusion');
} }
}, 1) }, 1)

View File

@ -93,7 +93,7 @@ let power_user = {
multigen_first_chunk: 50, multigen_first_chunk: 50,
multigen_next_chunks: 30, multigen_next_chunks: 30,
custom_chat_separator: '', custom_chat_separator: '',
// markdown_escape_strings: '', markdown_escape_strings: '',
fast_ui_mode: true, fast_ui_mode: true,
avatar_style: avatar_styles.ROUND, avatar_style: avatar_styles.ROUND,
chat_display: chat_styles.DEFAULT, chat_display: chat_styles.DEFAULT,
@ -562,7 +562,7 @@ function loadPowerUserSettings(settings, data) {
$("#include_newline_checkbox").prop("checked", power_user.include_newline); $("#include_newline_checkbox").prop("checked", power_user.include_newline);
$('#render_formulas').prop("checked", power_user.render_formulas); $('#render_formulas').prop("checked", power_user.render_formulas);
$("#custom_chat_separator").val(power_user.custom_chat_separator); $("#custom_chat_separator").val(power_user.custom_chat_separator);
//$("#markdown_escape_strings").val(power_user.markdown_escape_strings); $("#markdown_escape_strings").val(power_user.markdown_escape_strings);
$("#fast_ui_mode").prop("checked", power_user.fast_ui_mode); $("#fast_ui_mode").prop("checked", power_user.fast_ui_mode);
$("#waifuMode").prop("checked", power_user.waifuMode); $("#waifuMode").prop("checked", power_user.waifuMode);
$("#movingUImode").prop("checked", power_user.movingUI); $("#movingUImode").prop("checked", power_user.movingUI);
@ -1009,13 +1009,13 @@ $(document).ready(() => {
saveSettingsDebounced(); saveSettingsDebounced();
reloadMarkdownProcessor(power_user.render_formulas); reloadMarkdownProcessor(power_user.render_formulas);
}); });
/*
$("#markdown_escape_strings").on('input', function () { $("#markdown_escape_strings").on('input', function () {
power_user.markdown_escape_strings = $(this).val(); power_user.markdown_escape_strings = $(this).val();
saveSettingsDebounced(); saveSettingsDebounced();
reloadMarkdownProcessor(power_user.render_formulas); reloadMarkdownProcessor(power_user.render_formulas);
}); });
*/
$("#multigen").change(function () { $("#multigen").change(function () {
power_user.multigen = $(this).prop("checked"); power_user.multigen = $(this).prop("checked");
saveSettingsDebounced(); saveSettingsDebounced();

View File

@ -1,25 +0,0 @@
import { power_user } from './power-user.js';
// Showdown extension to make chat separators (dinkuses) ignore markdown formatting
export const dinkusExtension = () => {
if (!power_user) {
console.log("Showdown-dinkus extension: power_user wasn't found! Returning.");
return []
}
// Create an escaped sequence so the regex can work with any character
const savedDinkus = power_user.custom_chat_separator
// No dinkus? No extension!
if (!savedDinkus || savedDinkus.trim().length === 0) {
return []
}
const escapedDinkus = savedDinkus.split('').map((e) => `\\${e}`).join('');
const replaceRegex = new RegExp(`^(${escapedDinkus})\n`, "gm")
return [{
type: "lang",
regex: replaceRegex,
replace: (match) => match.replace(replaceRegex, `\u0000${savedDinkus} \n`)
}];
}

View File

@ -0,0 +1,35 @@
import { power_user } from './power-user.js';
// Showdown extension to make chat separators (dinkuses) ignore markdown formatting
export const markdownExclusionExt = () => {
if (!power_user) {
console.log("Showdown-dinkus extension: power_user wasn't found! Returning.");
return []
}
let combinedExcludeString = '';
if (power_user.custom_chat_separator) {
combinedExcludeString += `${power_user.custom_chat_separator},`;
}
if (power_user.markdown_escape_strings) {
combinedExcludeString += power_user.markdown_escape_strings;
}
const escapedExclusions = combinedExcludeString
.split(",")
.map((element) => `(${element.split('').map((char) => `\\${char}`).join('')})`);
// No exclusions? No extension!
if (!combinedExcludeString || combinedExcludeString.length === 0 || escapedExclusions.length === 0) {
return [];
}
const replaceRegex = new RegExp(`^(${escapedExclusions.join("|")})\n`, "gm");
return [{
type: "lang",
regex: replaceRegex,
replace: ((match) => match.replace(replaceRegex, `\u0000${match} \n`))
}];
}