diff --git a/src/lang/ko.ts b/src/lang/ko.ts
index 509b4aa5..8d86369e 100644
--- a/src/lang/ko.ts
+++ b/src/lang/ko.ts
@@ -437,4 +437,5 @@ export const languageKorean = {
modules: "모듈",
useAdvancedEditor: "고급 에디터 사용",
hanuraiMemory: "하느라이메모리",
+ combineTranslation: "결합 번역",
}
\ No newline at end of file
diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts
index 3be3050e..aaa1bb25 100644
--- a/src/ts/translator/translator.ts
+++ b/src/ts/translator/translator.ts
@@ -8,7 +8,7 @@ import { doingChat } from "../process"
import type { simpleCharacterArgument } from "../parser"
import { selectedCharID } from "../stores"
import { getModuleRegexScripts } from "../process/modules"
-import { getNodetextWithNewline, sleep } from "../util"
+import { getNodetextToSentence, sleep, applyMarkdownToNode } from "../util"
import { processScriptFull } from "../process/scripts"
let cache={
@@ -318,17 +318,17 @@ export async function translateHTML(html: string, reverse:boolean, charArg:simpl
node.textContent = translated;
return;
}
-
+
const { data: processedTranslated } = await processScriptFull(
alwaysExistChar,
translated,
"editdisplay",
chatID
);
-
// If the translation is the same, don't replace the node
if (translated == processedTranslated) {
node.textContent = processedTranslated;
+ applyMarkdownToNode(node)
return;
}
@@ -338,6 +338,7 @@ export async function translateHTML(html: string, reverse:boolean, charArg:simpl
);
newNode.innerHTML = processedTranslated;
node.parentNode.replaceChild(newNode, node);
+ applyMarkdownToNode(newNode);
}
}
@@ -374,7 +375,7 @@ export async function translateHTML(html: string, reverse:boolean, charArg:simpl
blacklist.includes(child.nodeName.toLowerCase())
);
if (!hasBlacklistChild && (node as Element)?.getAttribute('translate') !== 'no'){
- const text = getNodetextWithNewline(node);
+ const text = getNodetextToSentence(node);
const sentences = text.split("\n");
if (sentences.length > 1) {
// Multiple sentences seperated by
tags
@@ -389,6 +390,7 @@ export async function translateHTML(html: string, reverse:boolean, charArg:simpl
}
} else {
// Single sentence
+ node.innerHTML = sentences[0];
await translateNodeText(node, true);
}
return;
diff --git a/src/ts/util.ts b/src/ts/util.ts
index c3a596f3..ca3dd7f0 100644
--- a/src/ts/util.ts
+++ b/src/ts/util.ts
@@ -8,6 +8,16 @@ import { basename } from "@tauri-apps/api/path"
import { createBlankChar, getCharImage } from "./characters"
import { appWindow } from '@tauri-apps/api/window';
import { isTauri } from "./storage/globalApi"
+import { Marked } from "marked"
+
+const mconverted = new Marked({
+ gfm: true,
+ breaks: true,
+ silent: true,
+ tokenizer: {
+
+ }
+})
export interface Messagec extends Message{
index: number
@@ -525,18 +535,18 @@ export function appendLastPath(url, lastPath) {
}
/**
- * Retrieves the text content of a given Node object, including line breaks represented by
elements.
+ * Converts the text content of a given Node object, including HTML elements, into a plain text sentence.
*
* @param {Node} node - The Node object from which the text content will be extracted.
- * @returns {string} The text content of the Node, with line breaks represented by newline characters ('\n').
+ * @returns {string} The plain text sentence representing the content of the Node object.
*
* @example
* const div = document.createElement('div');
- * div.innerHTML = 'Hello
World';
- * const text = getNodetextWithNewline(div);
- * console.log(text); // Output: "Hello\nWorld"
+ * div.innerHTML = 'Hello
WorldDeleted';
+ * const sentence = getNodetextToSentence(div);
+ * console.log(sentence); // Output: "Hello\nWorld~Deleted~"
*/
-export function getNodetextWithNewline(node: Node) {
+export function getNodetextToSentence(node: Node): string {
let result = '';
for (const child of node.childNodes) {
if (child.nodeType === Node.TEXT_NODE) {
@@ -544,10 +554,39 @@ export function getNodetextWithNewline(node: Node) {
} else if (child.nodeType === Node.ELEMENT_NODE) {
if (child.nodeName === 'BR') {
result += '\n';
+ } else if (child.nodeName === 'DEL') {
+ result += '~' + getNodetextToSentence(child) + '~';
} else {
- result += getNodetextWithNewline(child);
+ result += getNodetextToSentence(child);
}
}
}
return result;
-}
\ No newline at end of file
+}
+
+export function applyMarkdownToNode(node: Node) {
+ if (node.nodeType === Node.TEXT_NODE) {
+ const text = node.textContent;
+ if (text) {
+ let markdown = mconverted.parseInline(text);
+ if (markdown !== text) {
+ const span = document.createElement('span');
+ span.innerHTML = markdown;
+
+ // inherit inline style from the parent node
+ const parentStyle = (node.parentNode as HTMLElement)?.style;
+ if(parentStyle){
+ for(let i=0;i