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'); // TODO #12071 // Put a zero width space after every @ symbol to prevent unintended hyperlinking res = res.replace(regEx(/@/g), '@​'); // TODO #12071 res = res.replace(regEx(/(`\[?@)​/g), '$1'); // TODO #12071 res = res.replace(regEx(/([a-z]@)​/gi), '$1'); // TODO #12071 res = res.replace(regEx(/\/compare\/@​/g), '/compare/@'); // TODO #12071 res = res.replace(regEx(/(\(https:\/\/[^)]*?)\.\.\.@​/g), '$1...@'); // TODO #12071 res = res.replace(regEx(/([\s(])#(\d+)([)\s]?)/g), '$1#​$2$3'); // TODO #12071 // convert escaped backticks back to ` const backTickRe = regEx(/`([^/]*?)`/g); // TODO #12071 res = res.replace(backTickRe, '`$1`'); res = res.replace(regEx(/`#​(\d+)`/g), '`#$1`'); // TODO #12071 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(); }