From 95c15ee027f34000b153c1febb36ae3bcde5f00b Mon Sep 17 00:00:00 2001 From: James Brumond Date: Thu, 18 May 2023 21:20:39 -0700 Subject: [PATCH] updated marked to v5; better baseurl handling --- package-lock.json | 30 +++++++++++++++--------------- package.json | 4 ++-- src/base-url.ts | 11 +++++++++++ src/render.ts | 18 +++++++----------- 4 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 src/base-url.ts diff --git a/package-lock.json b/package-lock.json index 67675f2..62bca11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dompurify": "^2.3.6", "jsdom": "^20.0.1", "katex": "^0.16.7", - "marked": "^4.1.1", + "marked": "^5.0.2", "nomnoml": "^1.5.2", "pikchr": "^0.0.5", "prismjs": "^1.29.0", @@ -28,7 +28,7 @@ "@types/jsdom": "^20.0.0", "@types/katex": "^0.16.0", "@types/luxon": "^3.1.0", - "@types/marked": "^4.0.3", + "@types/marked": "^5.0.0", "@types/node": "^18.11.18", "@types/prismjs": "^1.26.0", "@types/qrcode": "^1.5.0", @@ -86,9 +86,9 @@ "dev": true }, "node_modules/@types/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-zK4gSFMjgslsv5Lyvr3O1yCjgmnE4pr8jbG8qVn4QglMwtpvPCf4YT2Wma7Nk95OxUUJI8Z+kzdXohbM7mVpGw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-5.0.0.tgz", + "integrity": "sha512-YcZe50jhltsCq7rc9MNZC/4QB/OnA2Pd6hrOSTOFajtabN+38slqgDDCeE/0F83SjkKBQcsZUj7VLWR0H5cKRA==", "dev": true }, "node_modules/@types/node": { @@ -954,14 +954,14 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-5.0.2.tgz", + "integrity": "sha512-TXksm9GwqXCRNbFUZmMtqNLvy3K2cQHuWmyBDLOrY1e6i9UvZpOTJXoz7fBjYkJkaUFzV9hBFxMuZSyQt8R6KQ==", "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 12" + "node": ">= 18" } }, "node_modules/mime-db": { @@ -2015,9 +2015,9 @@ "dev": true }, "@types/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-zK4gSFMjgslsv5Lyvr3O1yCjgmnE4pr8jbG8qVn4QglMwtpvPCf4YT2Wma7Nk95OxUUJI8Z+kzdXohbM7mVpGw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-5.0.0.tgz", + "integrity": "sha512-YcZe50jhltsCq7rc9MNZC/4QB/OnA2Pd6hrOSTOFajtabN+38slqgDDCeE/0F83SjkKBQcsZUj7VLWR0H5cKRA==", "dev": true }, "@types/node": { @@ -2651,9 +2651,9 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-5.0.2.tgz", + "integrity": "sha512-TXksm9GwqXCRNbFUZmMtqNLvy3K2cQHuWmyBDLOrY1e6i9UvZpOTJXoz7fBjYkJkaUFzV9hBFxMuZSyQt8R6KQ==" }, "mime-db": { "version": "1.52.0", diff --git a/package.json b/package.json index e3f2b87..f312c28 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@types/jsdom": "^20.0.0", "@types/katex": "^0.16.0", "@types/luxon": "^3.1.0", - "@types/marked": "^4.0.3", + "@types/marked": "^5.0.0", "@types/node": "^18.11.18", "@types/prismjs": "^1.26.0", "@types/qrcode": "^1.5.0", @@ -28,7 +28,7 @@ "dompurify": "^2.3.6", "jsdom": "^20.0.1", "katex": "^0.16.7", - "marked": "^4.1.1", + "marked": "^5.0.2", "nomnoml": "^1.5.2", "pikchr": "^0.0.5", "prismjs": "^1.29.0", diff --git a/src/base-url.ts b/src/base-url.ts new file mode 100644 index 0000000..73ff815 --- /dev/null +++ b/src/base-url.ts @@ -0,0 +1,11 @@ + +import { marked } from 'marked'; +import { MarkdownOptions } from './render'; + +export function base_url_walk_tokens(token: marked.Token, options: MarkdownOptions) { + if (options.base_url) { + if (token.type === 'link' || token.type === 'image') { + token.href = (new URL(token.href, options.base_url)).toString(); + } + } +} diff --git a/src/render.ts b/src/render.ts index 9bb8134..db11d23 100644 --- a/src/render.ts +++ b/src/render.ts @@ -10,6 +10,7 @@ import { footnote_list_ext, footnote_ref_ext } from './footnotes'; import { description_list_ext } from './description-list'; import { resolve_async_bindings } from './async-steps'; import { breadcrumb_nav_ext } from './breadcrumb-nav'; +import { base_url_walk_tokens } from './base-url'; export interface MarkdownOptions { base_url?: string; @@ -25,13 +26,16 @@ export interface MarkdownExtension { } export async function render_markdown_to_html(markdown: string, options: MarkdownOptions = { }) { - const marked_options: marked.MarkedOptions = { - baseUrl: options.base_url, + const marked_options: marked.MarkedOptions & { async: true } = { + async: true, breaks: options.breaks || false, renderer: create_renderer(options), }; marked.use({ + walkTokens(token) { + base_url_walk_tokens(token, options); + }, extensions: [ katex_block_ext(marked_options.renderer, options), katex_inline_ext(marked_options.renderer, options), @@ -57,15 +61,7 @@ export async function render_markdown_to_html(markdown: string, options: Markdow const unsafe_html = options.inline ? marked.parseInline(markdown, marked_options) - : await new Promise((resolve, reject) => { - marked.parse(markdown, marked_options, (error, unsafe_html) => { - if (error) { - return reject(error); - } - - resolve_async_bindings(unsafe_html).then(resolve, reject); - }); - }); + : await marked.parse(markdown, marked_options).then(resolve_async_bindings); return sanitize_html(unsafe_html, options.custom_elements); }