[epiphany/mcatanzaro/highlightjs-10.2.1] Update to highlight.js 10.2.1
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/mcatanzaro/highlightjs-10.2.1] Update to highlight.js 10.2.1
- Date: Mon, 21 Sep 2020 14:15:15 +0000 (UTC)
commit a348898ff811c61b33e38071f9a03570eedd2aa0
Author: Michael Catanzaro <mcatanzaro gnome org>
Date: Mon Sep 21 09:13:00 2020 -0500
Update to highlight.js 10.2.1
Another day, another highlight.js release.
third-party/highlightjs/highlight.js | 69 ++++++++++++++++++++++++------------
1 file changed, 47 insertions(+), 22 deletions(-)
---
diff --git a/third-party/highlightjs/highlight.js b/third-party/highlightjs/highlight.js
index cb421eea3..08b11e98c 100644
--- a/third-party/highlightjs/highlight.js
+++ b/third-party/highlightjs/highlight.js
@@ -1,5 +1,5 @@
/*
- Highlight.js 10.2.0 (da7d149b)
+ Highlight.js 10.2.0 (519f7798)
License: BSD-3-Clause
Copyright (c) 2006-2020, Ivan Sagalaev
*/
@@ -913,7 +913,7 @@ var hljs = (function () {
}
resumingScanAtSamePosition() {
- return this.regexIndex != 0;
+ return this.regexIndex !== 0;
}
considerAll() {
@@ -930,15 +930,55 @@ var hljs = (function () {
exec(s) {
const m = this.getMatcher(this.regexIndex);
m.lastIndex = this.lastIndex;
- const result = m.exec(s);
+ let result = m.exec(s);
+
+ // The following is because we have no easy way to say "resume scanning at the
+ // existing position but also skip the current rule ONLY". What happens is
+ // all prior rules are also skipped which can result in matching the wrong
+ // thing. Example of matching "booger":
+
+ // our matcher is [string, "booger", number]
+ //
+ // ....booger....
+
+ // if "booger" is ignored then we'd really need a regex to scan from the
+ // SAME position for only: [string, number] but ignoring "booger" (if it
+ // was the first match), a simple resume would scan ahead who knows how
+ // far looking only for "number", ignoring potential string matches (or
+ // future "booger" matches that might be valid.)
+
+ // So what we do: We execute two matchers, one resuming at the same
+ // position, but the second full matcher starting at the position after:
+
+ // /--- resume first regex match here (for [number])
+ // |/---- full match here for [string, "booger", number]
+ // vv
+ // ....booger....
+
+ // Which ever results in a match first is then used. So this 3-4 step
+ // process essentially allows us to say "match at this position, excluding
+ // a prior rule that was ignored".
+ //
+ // 1. Match "booger" first, ignore. Also proves that [string] does non match.
+ // 2. Resume matching for [number]
+ // 3. Match at index + 1 for [string, "booger", number]
+ // 4. If #2 and #3 result in matches, which came first?
+ if (this.resumingScanAtSamePosition()) {
+ if (result && result.index === this.lastIndex) ; else { // use the second matcher result
+ const m2 = this.getMatcher(0);
+ m2.lastIndex = this.lastIndex + 1;
+ result = m2.exec(s);
+ }
+ }
+
if (result) {
this.regexIndex += result.position + 1;
- if (this.regexIndex === this.count) { // wrap-around
- this.regexIndex = 0;
+ if (this.regexIndex === this.count) {
+ // wrap-around to considering all matches again
+ this.considerAll();
}
}
- // this.regexIndex = 0;
return result;
}
}
@@ -1541,14 +1581,6 @@ var hljs = (function () {
}
}
- /**
- * Advance a single character
- */
- function advanceOne() {
- mode_buffer += codeToHighlight[index];
- index += 1;
- }
-
/**
* Handle matching but then ignoring a sequence of text
*
@@ -1778,20 +1810,13 @@ var hljs = (function () {
// considered for a potential match
resumeScanAtSamePosition = false;
} else {
- top.matcher.lastIndex = index;
top.matcher.considerAll();
}
+ top.matcher.lastIndex = index;
const match = top.matcher.exec(codeToHighlight);
// console.log("match", match[0], match.rule && match.rule.begin)
- // if our failure to match was the result of a "resumed scan" then we
- // need to advance one position and revert to full scanning before we
- // decide there are truly no more matches at all to be had
- if (!match && top.matcher.resumingScanAtSamePosition()) {
- advanceOne();
- continue;
- }
if (!match) break;
const beforeMatch = codeToHighlight.substring(index, match.index);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]