summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Michael Brummer <jan.brummer@tabos.org>2021-04-03 19:54:12 +0200
committerJan-Michael Brummer <jan.brummer@tabos.org>2021-04-03 19:54:12 +0200
commitcdb728617083efec35aee0923de6ddfb52dcd4f8 (patch)
treec66b4ef353af2073064a6af7379453da8579e171
parentd263d593c5075725e9623f8a855c79eb7aa40326 (diff)
downloadepiphany-cdb728617083efec35aee0923de6ddfb52dcd4f8.tar.gz
Update to highlightjs 10.7.1
Fixes: https://gitlab.gnome.org/GNOME/epiphany/-/issues/1480
-rw-r--r--third-party/highlightjs/highlight.js217
1 files changed, 153 insertions, 64 deletions
diff --git a/third-party/highlightjs/highlight.js b/third-party/highlightjs/highlight.js
index 7ba6c4f29..4dbbae9d4 100644
--- a/third-party/highlightjs/highlight.js
+++ b/third-party/highlightjs/highlight.js
@@ -1,7 +1,7 @@
/*
- Highlight.js 10.6.0 (eb122d3b)
+ Highlight.js 10.7.1 (421b23b0)
License: BSD-3-Clause
- Copyright (c) 2006-2020, Ivan Sagalaev
+ Copyright (c) 2006-2021, Ivan Sagalaev
*/
var hljs = (function () {
'use strict';
@@ -36,17 +36,21 @@ var hljs = (function () {
var _default = deepFreeze;
deepFreezeEs6.default = _default;
+
class Response {
-
+ /**
+ * @param {CompiledMode} mode
+ */
constructor(mode) {
// eslint-disable-next-line no-undefined
if (mode.data === undefined) mode.data = {};
this.data = mode.data;
+ this.isMatchIgnored = false;
}
ignoreMatch() {
- this.ignore = true;
+ this.isMatchIgnored = true;
}
}
@@ -393,6 +397,15 @@ var hljs = (function () {
return match && match.index === 0;
}
+ // BACKREF_RE matches an open parenthesis or backreference. To avoid
+ // an incorrect parse, it additionally matches the following:
+ // - [...] elements, where the meaning of parentheses and escapes change
+ // - other escape sequences, so we do not misparse escape sequences as
+ // interesting elements
+ // - non-matching or lookahead parentheses, which do not capture. These
+ // follow the '(' with a '?'.
+ const BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;
+
// join logically computes regexps.join(separator), but fixes the
// backreferences so they continue to match.
// it also places each individual regular expression into it's own
@@ -404,45 +417,34 @@ var hljs = (function () {
* @returns {string}
*/
function join(regexps, separator = "|") {
- // backreferenceRe matches an open parenthesis or backreference. To avoid
- // an incorrect parse, it additionally matches the following:
- // - [...] elements, where the meaning of parentheses and escapes change
- // - other escape sequences, so we do not misparse escape sequences as
- // interesting elements
- // - non-matching or lookahead parentheses, which do not capture. These
- // follow the '(' with a '?'.
- const backreferenceRe = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;
let numCaptures = 0;
- let ret = '';
- for (let i = 0; i < regexps.length; i++) {
+
+ return regexps.map((regex) => {
numCaptures += 1;
const offset = numCaptures;
- let re = source(regexps[i]);
- if (i > 0) {
- ret += separator;
- }
- ret += "(";
+ let re = source(regex);
+ let out = '';
+
while (re.length > 0) {
- const match = backreferenceRe.exec(re);
- if (match == null) {
- ret += re;
+ const match = BACKREF_RE.exec(re);
+ if (!match) {
+ out += re;
break;
}
- ret += re.substring(0, match.index);
+ out += re.substring(0, match.index);
re = re.substring(match.index + match[0].length);
if (match[0][0] === '\\' && match[1]) {
// Adjust the backreference.
- ret += '\\' + String(Number(match[1]) + offset);
+ out += '\\' + String(Number(match[1]) + offset);
} else {
- ret += match[0];
+ out += match[0];
if (match[0] === '(') {
numCaptures++;
}
}
}
- ret += ")";
- }
- return ret;
+ return out;
+ }).map(re => `(${re})`).join(separator);
}
// Common regexps
@@ -1093,7 +1095,7 @@ var hljs = (function () {
*/
function compileMode(mode, parent) {
const cmode = /** @type CompiledMode */ (mode);
- if (mode.compiled) return cmode;
+ if (mode.isCompiled) return cmode;
[
// do this early so compiler extensions generally don't have to worry about
@@ -1115,7 +1117,7 @@ var hljs = (function () {
compileRelevance
].forEach(ext => ext(mode, parent));
- mode.compiled = true;
+ mode.isCompiled = true;
let keywordPattern = null;
if (typeof mode.keywords === "object") {
@@ -1234,7 +1236,7 @@ var hljs = (function () {
return mode;
}
- var version = "10.6.0";
+ var version = "10.7.1";
// @ts-nocheck
@@ -1308,8 +1310,8 @@ var hljs = (function () {
/** @type {HLJSPlugin} */
const mergeHTMLPlugin = {
- "after:highlightBlock": ({ block, result, text }) => {
- const originalStream = nodeStream(block);
+ "after:highlightElement": ({ el, result, text }) => {
+ const originalStream = nodeStream(el);
if (!originalStream.length) return;
const resultNode = document.createElement('div');
@@ -1571,8 +1573,14 @@ var hljs = (function () {
/**
* Core highlighting function.
*
- * @param {string} languageName - the language to use for highlighting
- * @param {string} code - the code to highlight
+ * OLD API
+ * highlight(lang, code, ignoreIllegals, continuation)
+ *
+ * NEW API
+ * highlight(code, {lang, ignoreIllegals})
+ *
+ * @param {string} codeOrlanguageName - the language to use for highlighting
+ * @param {string | HighlightOptions} optionsOrCode - the code to highlight
* @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail
* @param {CompiledMode} [continuation] - current continuation mode, if any
*
@@ -1584,7 +1592,24 @@ var hljs = (function () {
* @property {CompiledMode} top - top of the current mode stack
* @property {boolean} illegal - indicates whether any illegal matches were found
*/
- function highlight(languageName, code, ignoreIllegals, continuation) {
+ function highlight(codeOrlanguageName, optionsOrCode, ignoreIllegals, continuation) {
+ let code = "";
+ let languageName = "";
+ if (typeof optionsOrCode === "object") {
+ code = codeOrlanguageName;
+ ignoreIllegals = optionsOrCode.ignoreIllegals;
+ languageName = optionsOrCode.language;
+ // continuation not supported at all via the new API
+ // eslint-disable-next-line no-undefined
+ continuation = undefined;
+ } else {
+ // old API
+ deprecated("10.7.0", "highlight(lang, code, ...args) has been deprecated.");
+ deprecated("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277");
+ languageName = codeOrlanguageName;
+ code = optionsOrCode;
+ }
+
/** @type {BeforeHighlightContext} */
const context = {
code,
@@ -1611,14 +1636,12 @@ var hljs = (function () {
* private highlight that's used internally and does not fire callbacks
*
* @param {string} languageName - the language to use for highlighting
- * @param {string} code - the code to highlight
- * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail
- * @param {CompiledMode} [continuation] - current continuation mode, if any
+ * @param {string} codeToHighlight - the code to highlight
+ * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail
+ * @param {CompiledMode?} [continuation] - current continuation mode, if any
* @returns {HighlightResult} - result of the highlight operation
*/
- function _highlight(languageName, code, ignoreIllegals, continuation) {
- const codeToHighlight = code;
-
+ function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) {
/**
* Return keyword data if a match is a keyword
* @param {CompiledMode} mode - current mode
@@ -1650,8 +1673,14 @@ var hljs = (function () {
buf = "";
relevance += keywordRelevance;
- const cssClass = language.classNameAliases[kind] || kind;
- emitter.addKeyword(match[0], cssClass);
+ if (kind.startsWith("_")) {
+ // _ implied for relevance only, do not highlight
+ // by applying a class name
+ buf += match[0];
+ } else {
+ const cssClass = language.classNameAliases[kind] || kind;
+ emitter.addKeyword(match[0], cssClass);
+ }
} else {
buf += match[0];
}
@@ -1721,7 +1750,7 @@ var hljs = (function () {
if (mode["on:end"]) {
const resp = new Response(mode);
mode["on:end"](match, resp);
- if (resp.ignore) matched = false;
+ if (resp.isMatchIgnored) matched = false;
}
if (matched) {
@@ -1773,7 +1802,7 @@ var hljs = (function () {
for (const cb of beforeCallbacks) {
if (!cb) continue;
cb(match, resp);
- if (resp.ignore) return doIgnore(lexeme);
+ if (resp.isMatchIgnored) return doIgnore(lexeme);
}
if (newMode && newMode.endSameAsBegin) {
@@ -2137,12 +2166,12 @@ var hljs = (function () {
/** @type {HLJSPlugin} */
const brPlugin = {
- "before:highlightBlock": ({ block }) => {
+ "before:highlightElement": ({ el }) => {
if (options.useBR) {
- block.innerHTML = block.innerHTML.replace(/\n/g, '').replace(/<br[ /]*>/g, '\n');
+ el.innerHTML = el.innerHTML.replace(/\n/g, '').replace(/<br[ /]*>/g, '\n');
}
},
- "after:highlightBlock": ({ result }) => {
+ "after:highlightElement": ({ result }) => {
if (options.useBR) {
result.value = result.value.replace(/\n/g, "<br>");
}
@@ -2152,7 +2181,7 @@ var hljs = (function () {
const TAB_REPLACE_RE = /^(<[^>]+>|\t)+/gm;
/** @type {HLJSPlugin} */
const tabReplacePlugin = {
- "after:highlightBlock": ({ result }) => {
+ "after:highlightElement": ({ result }) => {
if (options.tabReplace) {
result.value = result.value.replace(TAB_REPLACE_RE, (m) =>
m.replace(/\t/g, options.tabReplace)
@@ -2167,21 +2196,23 @@ var hljs = (function () {
*
* @param {HighlightedHTMLElement} element - the HTML element to highlight
*/
- function highlightBlock(element) {
+ function highlightElement(element) {
/** @type HTMLElement */
let node = null;
const language = blockLanguage(element);
if (shouldNotHighlight(language)) return;
- fire("before:highlightBlock",
- { block: element, language: language });
+ // support for v10 API
+ fire("before:highlightElement",
+ { el: element, language: language });
node = element;
const text = node.textContent;
- const result = language ? highlight(language, text, true) : highlightAuto(text);
+ const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text);
- fire("after:highlightBlock", { block: element, result, text });
+ // support for v10 API
+ fire("after:highlightElement", { el: element, result, text });
element.innerHTML = result.value;
updateClassName(element, language, result.language);
@@ -2227,7 +2258,7 @@ var hljs = (function () {
deprecated("10.6.0", "initHighlighting() is deprecated. Use highlightAll() instead.");
const blocks = document.querySelectorAll('pre code');
- blocks.forEach(highlightBlock);
+ blocks.forEach(highlightElement);
};
// Higlights all when DOMContentLoaded fires
@@ -2238,21 +2269,22 @@ var hljs = (function () {
}
let wantsHighlight = false;
- let domLoaded = false;
/**
* auto-highlights all pre>code elements on the page
*/
function highlightAll() {
// if we are called too early in the loading process
- if (!domLoaded) { wantsHighlight = true; return; }
+ if (document.readyState === "loading") {
+ wantsHighlight = true;
+ return;
+ }
const blocks = document.querySelectorAll('pre code');
- blocks.forEach(highlightBlock);
+ blocks.forEach(highlightElement);
}
function boot() {
- domLoaded = true;
// if a highlight was requested before DOM was loaded, do now
if (wantsHighlight) highlightAll();
}
@@ -2293,6 +2325,20 @@ var hljs = (function () {
}
/**
+ * Remove a language grammar module
+ *
+ * @param {string} languageName
+ */
+ function unregisterLanguage(languageName) {
+ delete languages[languageName];
+ for (const alias of Object.keys(aliases)) {
+ if (aliases[alias] === languageName) {
+ delete aliases[alias];
+ }
+ }
+ }
+
+ /**
* @returns {string[]} List of language internal names
*/
function listLanguages() {
@@ -2337,7 +2383,7 @@ var hljs = (function () {
if (typeof aliasList === 'string') {
aliasList = [aliasList];
}
- aliasList.forEach(alias => { aliases[alias] = languageName; });
+ aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; });
}
/**
@@ -2350,9 +2396,33 @@ var hljs = (function () {
}
/**
+ * Upgrades the old highlightBlock plugins to the new
+ * highlightElement API
+ * @param {HLJSPlugin} plugin
+ */
+ function upgradePluginAPI(plugin) {
+ // TODO: remove with v12
+ if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) {
+ plugin["before:highlightElement"] = (data) => {
+ plugin["before:highlightBlock"](
+ Object.assign({ block: data.el }, data)
+ );
+ };
+ }
+ if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) {
+ plugin["after:highlightElement"] = (data) => {
+ plugin["after:highlightBlock"](
+ Object.assign({ block: data.el }, data)
+ );
+ };
+ }
+ }
+
+ /**
* @param {HLJSPlugin} plugin
*/
function addPlugin(plugin) {
+ upgradePluginAPI(plugin);
plugins.push(plugin);
}
@@ -2383,17 +2453,31 @@ var hljs = (function () {
return fixMarkup(arg);
}
+ /**
+ *
+ * @param {HighlightedHTMLElement} el
+ */
+ function deprecateHighlightBlock(el) {
+ deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0");
+ deprecated("10.7.0", "Please use highlightElement now.");
+
+ return highlightElement(el);
+ }
+
/* Interface definition */
Object.assign(hljs, {
highlight,
highlightAuto,
highlightAll,
fixMarkup: deprecateFixMarkup,
- highlightBlock,
+ highlightElement,
+ // TODO: Remove with v12 API
+ highlightBlock: deprecateHighlightBlock,
configure,
initHighlighting,
initHighlightingOnLoad,
registerLanguage,
+ unregisterLanguage,
listLanguages,
getLanguage,
registerAliases,
@@ -2757,6 +2841,7 @@ hljs.registerLanguage('css', function () {
'font-language-override',
'font-size',
'font-size-adjust',
+ 'font-smoothing',
'font-stretch',
'font-style',
'font-variant',
@@ -3137,7 +3222,10 @@ hljs.registerLanguage('javascript', function () {
"Array",
"Uint8Array",
"Uint8ClampedArray",
- "ArrayBuffer"
+ "ArrayBuffer",
+ "BigInt64Array",
+ "BigUint64Array",
+ "BigInt"
];
const ERROR_TYPES = [
@@ -3939,7 +4027,8 @@ hljs.registerLanguage('xml', function () {
},
{
begin: />/,
- relevance: 0
+ relevance: 0,
+ endsParent: true
}
]
}