Fix: now combineTranslation will Apply markdown

This commit is contained in:
sub-hub
2024-05-06 13:30:38 +09:00
parent cca749caa3
commit e1eaf08df8
3 changed files with 45 additions and 10 deletions

View File

@@ -437,4 +437,5 @@ export const languageKorean = {
modules: "모듈",
useAdvancedEditor: "고급 에디터 사용",
hanuraiMemory: "하느라이메모리",
combineTranslation: "결합 번역",
}

View File

@@ -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,7 +318,7 @@ export async function translateHTML(html: string, reverse:boolean, charArg:simpl
node.textContent = translated;
return;
}
const { data: processedTranslated } = await processScriptFull(
alwaysExistChar,
translated,
@@ -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 <br> 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;

View File

@@ -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 <br> 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<br>World';
* const text = getNodetextWithNewline(div);
* console.log(text); // Output: "Hello\nWorld"
* div.innerHTML = 'Hello<br>World<del>Deleted</del>';
* 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,32 @@ 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;
}
export function applyMarkdownToNode(node: Node) {
if (node.nodeType === Node.TEXT_NODE) {
const text = node.textContent;
if (text) {
let markdown = mconverted.parseInline(text);
markdown = mconverted.parseInline(markdown)
if (markdown !== text) {
const span = document.createElement('span');
span.innerHTML = markdown;
(node as Element)?.replaceWith(span);
return
}
}
} else {
for (const child of node.childNodes) {
applyMarkdownToNode(child);
}
}
}