computer-scienceangular-roadmapbackend-roadmapblockchain-roadmapdba-roadmapdeveloper-roadmapdevops-roadmapfrontend-roadmapgo-roadmaphactoberfestjava-roadmapjavascript-roadmapnodejs-roadmappython-roadmapqa-roadmapreact-roadmaproadmapstudy-planvue-roadmapweb3-roadmap
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.4 KiB
47 lines
1.4 KiB
// @ts-ignore |
|
import MarkdownIt from 'markdown-it'; |
|
|
|
export function markdownToHtml(markdown: string, isInline = true): string { |
|
try { |
|
const md = new MarkdownIt({ |
|
html: true, |
|
linkify: true, |
|
}); |
|
|
|
// Solution to open links in new tab in markdown |
|
// otherwise default behaviour is to open in same tab |
|
// |
|
// SOURCE: https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer |
|
// |
|
const defaultRender = |
|
md.renderer.rules.link_open || |
|
// @ts-ignore |
|
function (tokens, idx, options, env, self) { |
|
return self.renderToken(tokens, idx, options); |
|
}; |
|
|
|
// @ts-ignore |
|
md.renderer.rules.link_open = function (tokens, idx, options, env, self) { |
|
// Add a new `target` attribute, or replace the value of the existing one. |
|
tokens[idx].attrSet('target', '_blank'); |
|
|
|
// Pass the token to the default renderer. |
|
return defaultRender(tokens, idx, options, env, self); |
|
}; |
|
|
|
if (isInline) { |
|
return md.renderInline(markdown); |
|
} else { |
|
return md.render(markdown); |
|
} |
|
} catch (e) { |
|
return markdown; |
|
} |
|
} |
|
|
|
// This is a workaround for the issue with tiptap-markdown extension |
|
// It doesn't support links with escaped brackets like this: |
|
// \\[link\\](https://example.com) -> [link](https://example.com) |
|
export function sanitizeMarkdown(markdown: string) { |
|
return markdown.replace(/\\\[([^\\]+)\\\]\(([^\\]+)\)/g, '[$1]($2)'); |
|
}
|
|
|