diff src/site.js @ 44:007856fd62c0

ruby fix
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 13 Aug 2025 08:50:33 +0900
parents 1d9d9786d76f
children fef7a5c65cfb
line wrap: on
line diff
--- a/src/site.js	Mon Aug 11 10:34:01 2025 +0900
+++ b/src/site.js	Wed Aug 13 08:50:33 2025 +0900
@@ -130,18 +130,37 @@
 
 let mdDiv = document.createElement('div');
 
+function toRuby(node) {
+	let type = node.nodeType;
+	if( type === Node.ELEMENT_NODE ) {
+		let name = node.tagName;
+		if( name === "PRE" || name === "CODE" )
+			return;
+		for( let child of node.childNodes ) {
+			toRuby(child);
+		}
+	} else if( type === Node.TEXT_NODE ) {
+		let text = node.nodeValue.replace(/\{([^{|}]+)\|([^{|}]+)\}/g, '<ruby>$1<rt>$2</rt></ruby>');
+		if( text !== node.nodeValue ) {
+			mdDiv.innerHTML = text;
+			while(mdDiv.firstChild) {
+				node.parentNode.insertBefore(mdDiv.firstChild, node);
+			}
+			node.remove();
+		}
+	}
+}
+
 function handleMarkdown(lang,voice) {
-	let converter = window.markdownit({html: true});
+	let converter = window.markdownit();
 	let divs = document.querySelectorAll('[markdown]');
 	for( let div of divs ) {
-		let text = div.textContent;
-		text = text.replace(/\{([^{|}]+)\|([^{|}]+)\}/g, '<ruby>$1<rt>$2</rt></ruby>');
-		text = converter.render(text);
-		div.innerHTML = text;
+		div.innerHTML = converter.render(div.textContent);
+		toRuby(div);
 		div.removeAttribute('markdown');
 		let parent = div.parentNode;
 		if( parent.getAttribute('role')==='assistant' ) {
-			mdDiv.innerHTML = text;
+			mdDiv.innerHTML = div.textContent;
 			let rts = mdDiv.querySelectorAll('rt');
 			for( let rt of rts ) {
 				rt.remove();