diff --git a/src/lib/Setting/Pages/AdvancedSettings.svelte b/src/lib/Setting/Pages/AdvancedSettings.svelte index bd8617ba..8e7d2f90 100644 --- a/src/lib/Setting/Pages/AdvancedSettings.svelte +++ b/src/lib/Setting/Pages/AdvancedSettings.svelte @@ -78,6 +78,11 @@ +
+ + + +
{ // access code is "tendo" diff --git a/src/styles.css b/src/styles.css index b84cd0ac..f309373b 100644 --- a/src/styles.css +++ b/src/styles.css @@ -65,6 +65,12 @@ html, body{ color: var(--FontColorItalicBold); } +.chattext x-em{ + color: var(--FontColorItalicBold); + font-style: italic; + font-weight: bold; +} + ::-webkit-scrollbar { width: 5px; height: 5px; diff --git a/src/ts/parser.ts b/src/ts/parser.ts index 815469ae..f729d269 100644 --- a/src/ts/parser.ts +++ b/src/ts/parser.ts @@ -12,6 +12,7 @@ import { calcString } from './process/infunctions'; import { findCharacterbyId } from './util'; import { getInlayImage } from './image'; import { cloneDeep } from 'lodash'; +import { autoMarkNew } from './plugins/automark'; const convertora = new showdown.Converter({ simpleLineBreaks: true, @@ -134,7 +135,7 @@ export interface simpleCharacterArgument{ export async function ParseMarkdown(data:string, charArg:(simpleCharacterArgument | groupChat | string) = null, mode:'normal'|'back' = 'normal', chatID=-1) { let firstParsed = '' const orgDat = data - + const db = get(DataBase) let char = (typeof(charArg) === 'string') ? (findCharacterbyId(charArg)) : (charArg) if(char && char.type !== 'group'){ data = await parseAdditionalAssets(data, char, mode, 'pre') @@ -147,11 +148,31 @@ export async function ParseMarkdown(data:string, charArg:(simpleCharacterArgumen data = await parseAdditionalAssets(data, char, mode, 'post') } data = await parseInlayImages(data) - return decodeStyle(DOMPurify.sanitize(mconverted.parse(encodeStyle(data)), { - ADD_TAGS: ["iframe", "style", "risu-style"], - ADD_ATTR: ["allow", "allowfullscreen", "frameborder", "scrolling", "risu-btn"], - FORBID_ATTR: ["href"] - })) + if(db.automark){ + // data = autoMarkNew(DOMPurify.sanitize(data, { + // ADD_TAGS: ["iframe", "style", "risu-style", "x-em"], + // ADD_ATTR: ["allow", "allowfullscreen", "frameborder", "scrolling", "risu-btn"], + // FORBID_ATTR: ["href"] + // })) + // return data + // data = autoMarkNew(data) + // data = encodeStyle(data) + // data = mconverted.parse(data) + return (DOMPurify.sanitize(autoMarkNew(data), { + ADD_TAGS: ["iframe", "style", "risu-style", "x-em"], + ADD_ATTR: ["allow", "allowfullscreen", "frameborder", "scrolling", "risu-btn"], + FORBID_ATTR: ["href"] + })) + } + else{ + data = encodeStyle(data) + data = mconverted.parse(data) + return decodeStyle(DOMPurify.sanitize(data, { + ADD_TAGS: ["iframe", "style", "risu-style", "x-em"], + ADD_ATTR: ["allow", "allowfullscreen", "frameborder", "scrolling", "risu-btn"], + FORBID_ATTR: ["href"] + })) + } } export function parseMarkdownSafe(data:string) { diff --git a/src/ts/plugins/automark.ts b/src/ts/plugins/automark.ts index 8f3ddb7b..9ded4aab 100644 --- a/src/ts/plugins/automark.ts +++ b/src/ts/plugins/automark.ts @@ -26,4 +26,134 @@ export function autoMarkPlugin(data:string){ return data +} + +export function autoMarkNew(dat:string){ + const excludeTexts = ["#","1.","2.","3.","4.","5.","6.","7.","8.","9.","0."] + const mark = (data:string) => { + for(const text of excludeTexts){ + if(data.startsWith(text)){ + return document.createTextNode(data) + } + } + + let index = 0 + let stacks:Node[] = [document.createElement('p')] + let stackText = [""] + let stackType:number[] = [0] + function isAlpha(str:string) { + //check if string is alphabet, including extended latin by charcode. string.length === 1 + const code = str.charCodeAt(0) + return (code > 64 && code < 91) || (code > 96 && code < 123) || (code > 127 && code < 256) + } + let stackIndex = 0 + while(index < data.length){ + switch(data[index]){ + case '"': + case '“': + case '”':{ + if(stackType[stackIndex] === 1){ + const stack = stacks.pop() + stackText[stackIndex] += data[index] + stack.appendChild(document.createTextNode(stackText.pop())) + stackType.pop() + stackIndex-- + stacks[stackIndex].appendChild(stack) + } + else{ + stacks[stackIndex].appendChild(document.createTextNode(stackText[stackIndex])) + stackText[stackIndex] = "" + stacks.push(document.createElement('x-placeholder')) + stackText.push(data[index]) + stackType.push(1) + stackIndex++ + } + break + } + case "'": + case "‘": + case "’":{ + if(stackType[stackIndex] === 2){ + if(data[index+1] === undefined || !isAlpha(data[index+1])){ + const stack = stacks.pop() + stackText[stackIndex] += data[index] + stack.appendChild(document.createTextNode(stackText.pop())) + stackType.pop() + stackIndex-- + stacks[stackIndex].appendChild(stack) + } + else{ + stackText[stackIndex] += data[index] + } + } + else{ + if(data[index-1] === ' ' || data[index-1] === '\n' || data[index-1] === undefined){ + stacks[stackIndex].appendChild(document.createTextNode(stackText[stackIndex])) + stackText[stackIndex] = "" + stacks.push(document.createElement('x-em')) + stackText.push(data[index]) + stackType.push(2) + stackIndex++ + } + else{ + stackText[stackIndex] += data[index] + } + + } + break + } + case '\n':{ + stacks[stackIndex].appendChild(document.createTextNode(stackText[stackIndex])) + stackText[stackIndex] = "" + stacks[stackIndex].appendChild(document.createElement('br')) + } + default:{ + stackText[stackIndex] += data[index] + } + } + index++ + } + for(let i=stackIndex;i>0;i--){ + stacks[i-1].appendChild(document.createTextNode(stackText[i])) + stacks[i-1].appendChild(stacks[i]) + } + stacks[0].appendChild(document.createTextNode(stackText[0])) + const childs = stacks[0].childNodes + for(let i=0;i${dat}`, 'text/html') + const body = doc.body + console.log(body.innerHTML) + let newChilds:Node[] = [] + for(let i=0;i