import * as Gemtext from "gemtext"; export function renderGemtextToHtml(gemtext: string, title?: string): string { gemtext = title ? gemtext.replace(`# ${title}`, "") : gemtext; return postProcessGemtextToHtml( Gemtext.parse(gemtext).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, "
"); }