Skip to content

Commit d85e30d

Browse files
Updated refa + fixed 2 cases of exp backtracking (#2774)
1 parent 42d24fa commit d85e30d

7 files changed

+34
-14
lines changed

components/prism-asciidoc.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@
129129
'function': /^[a-z\d-]+(?=:)/,
130130
'punctuation': /^::?/,
131131
'attributes': {
132-
pattern: /(?:\[(?:[^\]\\"]|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
132+
pattern: /(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
133133
inside: attributes.inside
134134
}
135135
}
@@ -149,7 +149,7 @@
149149
Those do not have the restrictions of the constrained quotes.
150150
They are, in order: __emphasis__, **strong**, ++monospace++, +++passthrough+++, ##unquoted##, $$passthrough$$, ~subscript~, ^superscript^, {attribute-reference}, [[anchor]], [[[bibliography anchor]]], <<xref>>, (((indexes))) and ((indexes))
151151
*/
152-
pattern: /(^|[^\\])(?:(?:\B\[(?:[^\]\\"]|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"]|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,
152+
pattern: /(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,
153153
lookbehind: true,
154154
inside: {
155155
'attributes': attributes,

components/prism-asciidoc.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/prism-perl.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ Prism.languages.perl = {
161161
// ${...}
162162
/[&*$@%]#?(?=\{)/,
163163
// $foo
164-
/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+)+(?:::)*/i,
164+
/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/i,
165165
// $1
166166
/[&*$@%]\d+/,
167167
// $_, @_, %!

components/prism-perl.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package-lock.json

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
"jsdom": "^13.0.0",
5151
"mocha": "^6.2.0",
5252
"pump": "^3.0.0",
53-
"refa": "0.5.0",
53+
"refa": "^0.7.0",
5454
"regexpp": "^2.0.1",
5555
"scslre": "^0.1.1",
5656
"simple-git": "^1.107.0",

tests/pattern-tests.js

+25-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const PrismLoader = require('./helper/prism-loader');
55
const { BFS, parseRegex } = require('./helper/util');
66
const { languages } = require('../components.json');
77
const { visitRegExpAST } = require('regexpp');
8-
const { JS, Words, NFA } = require('refa');
8+
const { transform, combineTransformers, JS, Words, NFA, Transformers } = require('refa');
99
const scslre = require('scslre');
1010

1111
/**
@@ -383,6 +383,22 @@ function testPatterns(Prism) {
383383
});
384384

385385
it('- should not cause exponential backtracking', function () {
386+
/** @type {Transformers.CreationOptions} */
387+
const options = {
388+
ignoreOrder: true,
389+
ignoreAmbiguity: true
390+
};
391+
const transformer = combineTransformers([
392+
Transformers.inline(options),
393+
Transformers.removeDeadBranches(options),
394+
Transformers.unionCharacters(options),
395+
Transformers.moveUpEmpty(options),
396+
Transformers.nestedQuantifiers(options),
397+
Transformers.sortAssertions(options),
398+
Transformers.removeUnnecessaryAssertions(options),
399+
Transformers.applyAssertions(options),
400+
]);
401+
386402
forEachPattern(({ pattern, ast, tokenPath }) => {
387403
const patternStr = String(pattern);
388404
if (expoSafeRegexes.has(patternStr)) {
@@ -398,11 +414,15 @@ function testPatterns(Prism) {
398414
* @returns {NFA}
399415
*/
400416
function toNFA(element) {
401-
const { expression, maxCharacter } = parser.parseElement(element, {
402-
backreferences: "resolve",
403-
lookarounds: "disable",
417+
let { expression, maxCharacter } = parser.parseElement(element, {
418+
maxBackreferenceWords: 1000,
419+
backreferences: "disable"
404420
});
405-
return NFA.fromRegex(expression, { maxCharacter });
421+
422+
// try to remove assertions
423+
expression = transform(transformer, expression);
424+
425+
return NFA.fromRegex(expression, { maxCharacter }, { assertions: "disable" });
406426
}
407427

408428
/**

0 commit comments

Comments
 (0)