diff --git a/lib/index.js b/lib/index.js index c5ca771c24dd914e342f791716a822431ee32b3a..457d9f8c4625f7d9c7ea1e9ffc13616db1fc6fef 100644 --- a/lib/index.js +++ b/lib/index.js @@ -126,8 +126,37 @@ function exitLiteralAutolink(token) { this.exit(token) } -/** @type {FromMarkdownTransform} */ +// Regex support detector, for backward compatibility +// Ref: https://github.com/syntax-tree/mdast-util-gfm-autolink-literal/pull/14 +const regexSupport = { + lookbehind: (() => { + try { + // Using regex literal instead of RegExp constructor + ;/(?<=x)/.test('x') + return true + } catch { + return false + } + })() +} + +/** + * Main transform function that uses the appropriate version based on regex support + * @type {FromMarkdownTransform} + */ function transformGfmAutolinkLiterals(tree) { + if (regexSupport.lookbehind) { + modernAutolinkTransform(tree) + } else { + legacyAutolinkTransform(tree) + } +} + +/** + * Modern version of autolink transform using lookbehind + * @type {FromMarkdownTransform} + */ +function modernAutolinkTransform(tree) { findAndReplace( tree, [ @@ -138,6 +167,35 @@ function transformGfmAutolinkLiterals(tree) { ) } + +/** + * Legacy version of autolink transform for older Node.js versions + * @type {FromMarkdownTransform} + */ +function legacyAutolinkTransform(tree) { + findAndReplace( + tree, + [ + [/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/gi, findUrl], + // [/([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/g, findEmail] # NOTE: original regex in 2.0.0 + [/(^|\s|\p{P}|\p{S})([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/gu, findEmailLegacy] + ], + {ignore: ['link', 'linkReference']} + ) +} + +/** + * Helper function for legacy email matching + * @param {string} _ - Unused parameter + * @param {string} prefix - Email prefix + * @param {string} name - Email name + * @param {string} domain - Email domain + * @returns {*} The processed email + */ +function findEmailLegacy(_, prefix, name, domain) { + return findEmail(name + '@' + domain) +} + /** * @type {ReplaceFunction} * @param {string} _