@@ -126,8 +126,24 @@ function exitLiteralAutolink(token) {
126126 this . exit ( token )
127127}
128128
129- /** @type {FromMarkdownTransform } */
130- function transformGfmAutolinkLiterals ( tree ) {
129+ // Regex support detector
130+ const regexSupport = {
131+ lookbehind : ( ( ) => {
132+ try {
133+ // Using regex literal instead of RegExp constructor
134+ ; / (?< = x ) / . test ( 'x' )
135+ return true
136+ } catch {
137+ return false
138+ }
139+ } ) ( )
140+ }
141+
142+ /**
143+ * Modern version of autolink transform using lookbehind
144+ * @type {FromMarkdownTransform }
145+ */
146+ function modernAutolinkTransform ( tree ) {
131147 findAndReplace (
132148 tree ,
133149 [
@@ -138,6 +154,45 @@ function transformGfmAutolinkLiterals(tree) {
138154 )
139155}
140156
157+ /**
158+ * Legacy version of autolink transform for older Node.js versions
159+ * @type {FromMarkdownTransform }
160+ */
161+ function legacyAutolinkTransform ( tree ) {
162+ findAndReplace (
163+ tree ,
164+ [
165+ [ / ( h t t p s ? : \/ \/ | w w w (? = \. ) ) ( [ - . \w ] + ) ( [ ^ \t \r \n ] * ) / gi, findUrl ] ,
166+ [ / ( ^ | \s | \p{ P} | \p{ S} ) ( [ - . \w + ] + ) @ ( [ - \w ] + (?: \. [ - \w ] + ) + ) / gu, findEmailLegacy ]
167+ ] ,
168+ { ignore : [ 'link' , 'linkReference' ] }
169+ )
170+ }
171+
172+ /**
173+ * Helper function for legacy email matching
174+ * @param {string } _ - Unused parameter
175+ * @param {string } prefix - Email prefix
176+ * @param {string } name - Email name
177+ * @param {string } domain - Email domain
178+ * @returns {* } The processed email
179+ */
180+ function findEmailLegacy ( _ , prefix , name , domain ) {
181+ return findEmail ( name + '@' + domain )
182+ }
183+
184+ /**
185+ * Main transform function that uses the appropriate version based on regex support
186+ * @type {FromMarkdownTransform }
187+ */
188+ function transformGfmAutolinkLiterals ( tree ) {
189+ if ( regexSupport . lookbehind ) {
190+ modernAutolinkTransform ( tree )
191+ } else {
192+ legacyAutolinkTransform ( tree )
193+ }
194+ }
195+
141196/**
142197 * @type {ReplaceFunction }
143198 * @param {string } _
0 commit comments