From 7792e9633431ab918aee0a33483b6b16bce4069d Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Sat, 25 Apr 2026 11:34:41 +0100 Subject: factor out renderGemtextToHtml() --- website/src/renderGemtextToHtml.ts | 72 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 website/src/renderGemtextToHtml.ts (limited to 'website/src/renderGemtextToHtml.ts') diff --git a/website/src/renderGemtextToHtml.ts b/website/src/renderGemtextToHtml.ts new file mode 100644 index 0000000..f934f1e --- /dev/null +++ b/website/src/renderGemtextToHtml.ts @@ -0,0 +1,72 @@ +import * as Gemtext from "gemtext"; + +export function renderGemtextToHtml(gemtext: string, title: string): string { + return postProcessGemtextToHtml( + Gemtext.parse(gemtext.replace(`# ${title}`, "")).generate( + GemtextHTMLRenderer, + ), + ); +} + +const GemtextHTMLRenderer: Gemtext.Renderer = { + preamble: function (): string { + return ""; + }, + + postamble: function (): string { + return ""; + }, + + text: function (content: string): string { + content = content.trim(); + if (content === "") { + return ""; + } + return `

${htmlEscape(content)}

`; + }, + + link: function (url: string, alt: string): string { + const imgExtensions: (string | undefined)[] = [ + "webp", + "png", + "svg", + "gif", + "jpg", + "jpeg", + "apng", + ]; + if (imgExtensions.includes(url.split(".").at(-1)?.toLowerCase())) { + return `${alt}`; + } + return `

=> ${alt}

`; + }, + + preformatted: function (content: string[], alt: string): string { + return `
${htmlEscape(content.join("\n"))}
`; + }, + + heading: function (level: number, text: string): string { + return `${htmlEscape(text)}`; + }, + + unorderedList: function (content: string[]): string { + return ``; + }, + + quote: function (content: string): string { + return `
${htmlEscape(content)}
`; + }, +}; + +function htmlEscape(str: string) { + return str.replace(/&/g, "&").replace(//g, ">"); +} + +function postProcessGemtextToHtml(html: string): string { + html = mergeAdjacentBlockquotes(html); + return html; +} + +function mergeAdjacentBlockquotes(html: string): string { + return html.replaceAll(/\<\/blockquote\>\/gm, "
"); +} -- cgit v1.2.3