"use strict"; import { parse, Renderer, type Tokens } from "marked"; import htmlSanitizer from "../html_sanitizer.js"; import importUtils from "./utils.js"; import { getMimeTypeFromMarkdownName, MIME_TYPE_AUTO } from "@triliumnext/commons"; import { ADMONITION_TYPE_MAPPINGS } from "../export/markdown.js"; import utils from "../utils.js"; import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons"; /** * Keep renderer code up to date with https://github.com/markedjs/marked/blob/master/src/Renderer.ts. */ class CustomMarkdownRenderer extends Renderer { override heading(data: Tokens.Heading): string { // Treat h1 as raw text. if (data.depth === 1) { return `

${data.text}

`; } return super.heading(data).trimEnd(); } override paragraph(data: Tokens.Paragraph): string { return super.paragraph(data).trimEnd(); } override code({ text, lang }: Tokens.Code): string { if (!text) { return ""; } // Escape the HTML. text = utils.escapeHtml(text); // Unescape " text = text.replace(/"/g, '"'); const ckEditorLanguage = getNormalizedMimeFromMarkdownLanguage(lang); return `
${text}
`; } override list(token: Tokens.List): string { let result = super.list(token) .replace("\n", "") // we replace the first one only. .trimEnd(); // Handle todo-list in the CKEditor format. if (token.items.some(item => item.task)) { result = result.replace(/^