diff --git a/js/marked.js b/js/marked.js new file mode 100644 index 0000000..d5b3763 --- /dev/null +++ b/js/marked.js @@ -0,0 +1,48 @@ +export const marked = { + parse(markdown = '') { + const lines = markdown.split('\n'); + let html = ''; + let inCode = false; + let codeLines = []; + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + if (line.startsWith('```')) { + if (inCode) { + html += `
${escapeHtml(codeLines.join('\n'))}`;
+ inCode = false;
+ codeLines = [];
+ } else {
+ inCode = true;
+ }
+ continue;
+ }
+ if (inCode) {
+ codeLines.push(line);
+ continue;
+ }
+ if (line.trim() === '---') {
+ html += '${escapeHtml(line.trim())}
`; + } + } + if (inCode) { + html += `${escapeHtml(codeLines.join('\n'))}`;
+ }
+ return html;
+ }
+};
+
+function escapeHtml(str) {
+ return str.replace(/[&<>"']/g, ch => {
+ switch (ch) {
+ case '&': return '&';
+ case '<': return '<';
+ case '>': return '>';
+ case '"': return '"';
+ case "'": return ''';
+ default: return ch;
+ }
+ });
+}
+
diff --git a/tests/site-ai-response.mjs b/tests/site-ai-response.mjs
index d463013..d1c913c 100644
--- a/tests/site-ai-response.mjs
+++ b/tests/site-ai-response.mjs
@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
-import { marked } from 'marked';
+import { marked } from '../js/marked.js';
import { sanitizeMarkdown } from '../js/chat/markdown-sanitizer.js';
import { PolliClientWeb } from '../js/polliLib/src/client.js';
import { generateImageUrl } from '../js/polliLib/src/mcp.js';
diff --git a/tests/site-markdown-sanitization.mjs b/tests/site-markdown-sanitization.mjs
index e9c2dac..5e24257 100644
--- a/tests/site-markdown-sanitization.mjs
+++ b/tests/site-markdown-sanitization.mjs
@@ -1,5 +1,5 @@
import { strict as assert } from 'node:assert';
-import { marked } from 'marked';
+import { marked } from '../js/marked.js';
import { sanitizeMarkdown } from '../js/chat/markdown-sanitizer.js';
const input = [