From 05842b5143072e7334f205850848718e565d8b96 Mon Sep 17 00:00:00 2001 From: Rex Date: Mon, 7 Aug 2023 11:43:24 -0700 Subject: [PATCH] Only use regexes supported by Safari (#38) --- __test__/slackify-markdown.test.js | 8 ++++++++ package.json | 2 +- src/slackify.js | 19 +++++++++++++++---- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/__test__/slackify-markdown.test.js b/__test__/slackify-markdown.test.js index ea69d36..21ce784 100644 --- a/__test__/slackify-markdown.test.js +++ b/__test__/slackify-markdown.test.js @@ -1,3 +1,5 @@ +const fsPromises = require('fs/promises'); + const slackifyMarkdown = require('..'); const zws = String.fromCharCode(0x200B); // zero-width-space @@ -242,3 +244,9 @@ test('User mention', () => { expect(slackifyMarkdown(mrkdown)).toBe(slack); }); + +test('code does not use negative lookarounds', async () => { + const sourceCode = await fsPromises.readFile('./src/slackify.js', 'utf8'); + const usesNegativeLookaround = /\/\(\? { + const escaped = text + .replace('&', '&') + .replace(/<([^@]|$)/g, (_, m) => `<${m}`) + .replace(/^(.*)>/g, (_, m) => { + const isEndOfUserMention = Boolean(m.match(/<@[A-Z0-9]+$/)); + if (isEndOfUserMention) { + return `${m}>`; + } + return `${m}>`; + }); + return escaped; +}; + /** * Creates custom `mdast-util-to-markdown` handlers that tailor the output for * Slack Markdown. @@ -120,10 +134,7 @@ const createHandlers = definitions => ({ text: (node, _parent, context) => { const exit = context.enter('text'); // https://api.slack.com/reference/surfaces/formatting#escaping - const text = node.value - .replace(/&/g, '&') - .replace(/<(?!@)/g, '<') - .replace(/(?/g, '>'); + const text = escapeSpecials(node.value); exit(); // Do we need more escaping like the default handler uses?