Skip to main content
Module

x/gfm/mod.ts

Server-side GitHub Flavored Markdown rendering for Deno
Go to Latest
File
import { emojify, marked, Prism, sanitizeHtml } from "./deps.ts";import { CSS } from "./style.js";export { CSS };
class Renderer extends marked.Renderer { heading( text: string, level: 1 | 2 | 3 | 4 | 5 | 6, raw: string, slugger: marked.Slugger, ): string { const slug = slugger.slug(raw); return `<h${level} id="${slug}"><a class="anchor" aria-hidden="true" tabindex="-1" href="#${slug}"><svg class="octicon octicon-link" viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>${text}</h${level}>`; }
code(code: string, language: string) { const grammar = Object.hasOwnProperty.call(Prism.languages, language) ? Prism.languages[language] : undefined; if (grammar === undefined) { return `<pre><code>${code}</code></pre>`; } const html = Prism.highlight(code, grammar, language); return `<div class="highlight highlight-source-${language}"><pre>${html}</pre></div>`; }}
export function render(markdown: string, baseUrl: string | undefined): string { markdown = emojify(markdown);
const html = marked(markdown, { baseUrl, gfm: true, renderer: new Renderer(), });
return sanitizeHtml(html, { allowedTags: sanitizeHtml.defaults.allowedTags.concat([ "img", "svg", "path", ]), allowedAttributes: { ...sanitizeHtml.defaults.allowedAttributes, img: ["src", "alt", "height", "width", "align"], a: ["id", "aria-hidden", "href", "tabindex"], svg: ["viewbox", "width", "height", "aria-hidden"], path: ["fill-rule", "d"], }, allowedClasses: { div: ["highlight"], span: [ "token", "keyword", "operator", "number", "boolean", "function", "string", "comment", "class-name", "regex", "regex-delimiter", ], a: ["anchor"], svg: ["octicon", "octicon-link"], }, allowProtocolRelative: false, });}