From 9b0b4e5ef52c5e4383d6c4a2041ca1a73ea4bc44 Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Fri, 26 Jun 2026 22:21:55 +0900 Subject: style: switch from tabs to 2-space indentation (incl. svelte) --- src/features/markdown/logic/markdown.ts | 174 ++++++++++++++++---------------- 1 file changed, 87 insertions(+), 87 deletions(-) (limited to 'src/features/markdown/logic/markdown.ts') diff --git a/src/features/markdown/logic/markdown.ts b/src/features/markdown/logic/markdown.ts index 3a6e5a6..ad8a8bd 100644 --- a/src/features/markdown/logic/markdown.ts +++ b/src/features/markdown/logic/markdown.ts @@ -39,88 +39,88 @@ import { markedHighlight } from "marked-highlight"; // Hot set: registered eagerly so common code blocks highlight on first paint. const HOT_LANGUAGES: Record = { - bash, - c, - cpp, - csharp, - css, - go, - java, - javascript, - json, - markdown: markdownLang, - php, - plaintext, - python, - ruby, - rust, - shell, - sql, - typescript, - xml, - yaml, + bash, + c, + cpp, + csharp, + css, + go, + java, + javascript, + json, + markdown: markdownLang, + php, + plaintext, + python, + ruby, + rust, + shell, + sql, + typescript, + xml, + yaml, }; for (const [name, lang] of Object.entries(HOT_LANGUAGES)) { - hljs.registerLanguage(name, lang); + hljs.registerLanguage(name, lang); } // Normalize common fence aliases to canonical highlight.js names. const ALIASES: Record = { - js: "javascript", - jsx: "javascript", - mjs: "javascript", - cjs: "javascript", - ts: "typescript", - tsx: "typescript", - py: "python", - py3: "python", - rb: "ruby", - sh: "bash", - zsh: "bash", - yml: "yaml", - "c++": "cpp", - cxx: "cpp", - "c#": "csharp", - cs: "csharp", - htm: "xml", - html: "xml", - svg: "xml", - md: "markdown", - mdx: "markdown", - golang: "go", - rs: "rust", + js: "javascript", + jsx: "javascript", + mjs: "javascript", + cjs: "javascript", + ts: "typescript", + tsx: "typescript", + py: "python", + py3: "python", + rb: "ruby", + sh: "bash", + zsh: "bash", + yml: "yaml", + "c++": "cpp", + cxx: "cpp", + "c#": "csharp", + cs: "csharp", + htm: "xml", + html: "xml", + svg: "xml", + md: "markdown", + mdx: "markdown", + golang: "go", + rs: "rust", }; function normalizeLang(lang: string): string { - const lower = lang.toLowerCase().trim(); - return ALIASES[lower] ?? lower; + const lower = lang.toLowerCase().trim(); + return ALIASES[lower] ?? lower; } function escapeHtml(s: string): string { - return s - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); + return s + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); } const md = new Marked( - markedHighlight({ - emptyLangClass: "hljs", - langPrefix: "hljs language-", - highlight(code: string, lang: string): string { - if (!lang) return escapeHtml(code); - const name = normalizeLang(lang); - if (!hljs.getLanguage(name)) return escapeHtml(code); - try { - return hljs.highlight(code, { language: name, ignoreIllegals: true }).value; - } catch { - return escapeHtml(code); - } - }, - }), - { gfm: true, breaks: true }, + markedHighlight({ + emptyLangClass: "hljs", + langPrefix: "hljs language-", + highlight(code: string, lang: string): string { + if (!lang) return escapeHtml(code); + const name = normalizeLang(lang); + if (!hljs.getLanguage(name)) return escapeHtml(code); + try { + return hljs.highlight(code, { language: name, ignoreIllegals: true }).value; + } catch { + return escapeHtml(code); + } + }, + }), + { gfm: true, breaks: true }, ); /** @@ -128,14 +128,14 @@ const md = new Marked( * partial text renders cleanly instead of flashing raw markers. */ function closeOpenDelimiters(src: string): string { - let out = src; - const fenceCount = (out.match(/^```/gm) ?? []).length; - if (fenceCount % 2 !== 0) out += "\n```"; - const boldCount = (out.match(/\*\*/g) ?? []).length; - if (boldCount % 2 !== 0) out += "**"; - const inlineCode = (out.match(/(?…`) in a positioned container with a @@ -144,22 +144,22 @@ function closeOpenDelimiters(src: string): string { // `data-copy` is the delegation hook the component listens for; DOMPurify keeps // `'; + ''; function addCopyButtons(html: string): string { - return html - .replace(/
/g, `
${COPY_BUTTON}
`)
-		.replace(/<\/pre>/g, "
"); + return html + .replace(/
/g, `
${COPY_BUTTON}
`)
+    .replace(/<\/pre>/g, "
"); } /** Render Markdown to sanitized HTML. Returns `""` if parsing ever throws. */ export function renderMarkdown(text: string, opts?: { streaming?: boolean }): string { - const src = opts?.streaming === true ? closeOpenDelimiters(text) : text; - try { - const raw = md.parse(src) as string; - return DOMPurify.sanitize(addCopyButtons(raw)); - } catch { - return ""; - } + const src = opts?.streaming === true ? closeOpenDelimiters(text) : text; + try { + const raw = md.parse(src) as string; + return DOMPurify.sanitize(addCopyButtons(raw)); + } catch { + return ""; + } } -- cgit v1.2.3