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 += '
'; + } else 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 = [