diff --git a/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte b/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte index cd6fe2f809..3be2828073 100644 --- a/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte +++ b/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte @@ -76,118 +76,128 @@ html: string; }; - function enhanceLinks(html: string): string { - if (!browser || !html.includes(' boolean + ): string { + if (!browser || !html.includes(tagCheck)) { return html; } const tempDiv = document.createElement('div'); tempDiv.innerHTML = html; - // Make all links open in new tabs - const linkElements = tempDiv.querySelectorAll('a[href]'); - let mutated = false; - - for (const link of linkElements) { - const target = link.getAttribute('target'); - const rel = link.getAttribute('rel'); - - if (target !== '_blank' || rel !== 'noopener noreferrer') { - mutated = true; - } - - link.setAttribute('target', '_blank'); - link.setAttribute('rel', 'noopener noreferrer'); - } + const mutated = processor(tempDiv); return mutated ? tempDiv.innerHTML : html; } - function enhanceCodeBlocks(html: string): string { - if (!browser || !html.includes(' { + const linkElements = tempDiv.querySelectorAll('a[href]'); + let mutated = false; - const tempDiv = document.createElement('div'); - tempDiv.innerHTML = html; + for (const link of linkElements) { + const target = link.getAttribute('target'); + const rel = link.getAttribute('rel'); - const preElements = tempDiv.querySelectorAll('pre'); - let mutated = false; - - for (const [index, pre] of Array.from(preElements).entries()) { - const codeElement = pre.querySelector('code'); - - if (!codeElement) { - continue; - } - - mutated = true; - - let language = 'text'; - const classList = Array.from(codeElement.classList); - - for (const className of classList) { - if (className.startsWith('language-')) { - language = className.replace('language-', ''); - break; + if (target !== '_blank' || rel !== 'noopener noreferrer') { + mutated = true; } + + link.setAttribute('target', '_blank'); + link.setAttribute('rel', 'noopener noreferrer'); } - const rawCode = codeElement.textContent || ''; - const codeId = `code-${uuid()}-${index}`; - codeElement.setAttribute('data-code-id', codeId); - codeElement.setAttribute('data-raw-code', rawCode); + return mutated; + }); + } - const wrapper = document.createElement('div'); - wrapper.className = 'code-block-wrapper'; + function enhanceCodeBlocks(html: string): string { + return processHtml(html, ' { + const preElements = tempDiv.querySelectorAll('pre'); + let mutated = false; - const header = document.createElement('div'); - header.className = 'code-block-header'; + for (const [index, pre] of Array.from(preElements).entries()) { + const codeElement = pre.querySelector('code'); - const languageLabel = document.createElement('span'); - languageLabel.className = 'code-language'; - languageLabel.textContent = language; + if (!codeElement) { + continue; + } - const copyButton = document.createElement('button'); - copyButton.className = 'copy-code-btn'; - copyButton.setAttribute('data-code-id', codeId); - copyButton.setAttribute('title', 'Copy code'); - copyButton.setAttribute('type', 'button'); + mutated = true; - copyButton.innerHTML = ` + let language = 'text'; + const classList = Array.from(codeElement.classList); + + for (const className of classList) { + if (className.startsWith('language-')) { + language = className.replace('language-', ''); + break; + } + } + + const rawCode = codeElement.textContent || ''; + const codeId = `code-${uuid()}-${index}`; + codeElement.setAttribute('data-code-id', codeId); + codeElement.setAttribute('data-raw-code', rawCode); + + const wrapper = document.createElement('div'); + wrapper.className = 'code-block-wrapper'; + + const header = document.createElement('div'); + header.className = 'code-block-header'; + + const languageLabel = document.createElement('span'); + languageLabel.className = 'code-language'; + languageLabel.textContent = language; + + const copyButton = document.createElement('button'); + copyButton.className = 'copy-code-btn'; + copyButton.setAttribute('data-code-id', codeId); + copyButton.setAttribute('title', 'Copy code'); + copyButton.setAttribute('type', 'button'); + + copyButton.innerHTML = ` `; - const actions = document.createElement('div'); - actions.className = 'code-block-actions'; + const actions = document.createElement('div'); + actions.className = 'code-block-actions'; - actions.appendChild(copyButton); + actions.appendChild(copyButton); - if (language.toLowerCase() === 'html') { - const previewButton = document.createElement('button'); - previewButton.className = 'preview-code-btn'; - previewButton.setAttribute('data-code-id', codeId); - previewButton.setAttribute('title', 'Preview code'); - previewButton.setAttribute('type', 'button'); + if (language.toLowerCase() === 'html') { + const previewButton = document.createElement('button'); + previewButton.className = 'preview-code-btn'; + previewButton.setAttribute('data-code-id', codeId); + previewButton.setAttribute('title', 'Preview code'); + previewButton.setAttribute('type', 'button'); - previewButton.innerHTML = ` + previewButton.innerHTML = ` `; - actions.appendChild(previewButton); + actions.appendChild(previewButton); + } + + header.appendChild(languageLabel); + header.appendChild(actions); + wrapper.appendChild(header); + + const clonedPre = pre.cloneNode(true) as HTMLElement; + wrapper.appendChild(clonedPre); + + pre.parentNode?.replaceChild(wrapper, pre); } - header.appendChild(languageLabel); - header.appendChild(actions); - wrapper.appendChild(header); - - const clonedPre = pre.cloneNode(true) as HTMLElement; - wrapper.appendChild(clonedPre); - - pre.parentNode?.replaceChild(wrapper, pre); - } - - return mutated ? tempDiv.innerHTML : html; + return mutated; + }); } function getCodeInfoFromTarget(target: HTMLElement) {