import remark from 'remark'; import github from 'remark-github'; import { regEx } from './regex'; // Generic replacements/link-breakers export function sanitizeMarkdown(markdown: string): string { let res = markdown; // Put a zero width space after every # followed by a digit res = res.replace(regEx(/#(\d)/gi), '#​$1'); // Put a zero width space after every @ symbol to prevent unintended hyperlinking res = res.replace(regEx(/@/g), '@​'); res = res.replace(regEx(/(`\[?@)​/g), '$1'); res = res.replace(regEx(/([a-z]@)​/gi), '$1'); res = res.replace(regEx(/\/compare\/@​/g), '/compare/@'); res = res.replace(regEx(/(\(https:\/\/[^)]*?)\.\.\.@​/g), '$1...@'); res = res.replace(regEx(/([\s(])#(\d+)([)\s]?)/g), '$1#​$2$3'); // convert escaped backticks back to ` const backTickRe = regEx(/`([^/]*?)`/g); res = res.replace(backTickRe, '`$1`'); res = res.replace(regEx(/`#​(\d+)`/g), '`#$1`'); return res; } /** * * @param content content to process * @param options github options * @returns linkified content */ export async function linkify( content: string, options: github.RemarkGithubOptions ): Promise { // https://github.com/syntax-tree/mdast-util-to-markdown#optionsbullet const output = await remark() .use({ settings: { bullet: '-' } }) .use(github, { mentionStrong: false, ...options }) .process(content); return output.toString(); }