@@ -126,8 +126,24 @@ function exitLiteralAutolink(token) {
126
126
this . exit ( token )
127
127
}
128
128
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 ) {
131
147
findAndReplace (
132
148
tree ,
133
149
[
@@ -138,6 +154,45 @@ function transformGfmAutolinkLiterals(tree) {
138
154
)
139
155
}
140
156
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
+
141
196
/**
142
197
* @type {ReplaceFunction }
143
198
* @param {string } _
0 commit comments