From 8c0f72dc76e1a7cf77f8d952d8f070ec0da4a2fd Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Tue, 28 May 2019 20:05:03 +0200 Subject: [PATCH 1/5] Revert "Added support for $$ equations" This reverts commit d4736f08add9456c34b22982643262aef74ac864. --- components/prism-latex.js | 4 ++-- components/prism-latex.min.js | 2 +- tests/languages/latex/equation_feature.test | 13 +------------ 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/components/prism-latex.js b/components/prism-latex.js index 239be55623..695317325b 100644 --- a/components/prism-latex.js +++ b/components/prism-latex.js @@ -15,12 +15,12 @@ lookbehind: true }, /* - * equations can be between $$ $$ or $ $ or \( \) or \[ \] + * equations can be between $ $ or \( \) or \[ \] * (all are multiline) */ 'equation': [ { - pattern: /\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/, + pattern: /\$(?:\\[\s\S]|[^\\$])*\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/, inside: insideEqu, alias: 'string' }, diff --git a/components/prism-latex.min.js b/components/prism-latex.min.js index 9cbc3ff477..fa943e9f74 100644 --- a/components/prism-latex.min.js +++ b/components/prism-latex.min.js @@ -1 +1 @@ -!function(a){var e=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:e,alias:"regex"}};Prism.languages.latex={comment:/%.*/m,cdata:{pattern:/(\\begin\{((?:verbatim|lstlisting)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:equation|math|eqnarray|align|multline|gather)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\}(?:\[[^\]]+\])?)/,lookbehind:!0,alias:"class-name"},function:{pattern:e,alias:"selector"},punctuation:/[[\]{}&]/}}(); \ No newline at end of file +!function(a){var e=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:e,alias:"regex"}};Prism.languages.latex={comment:/%.*/m,cdata:{pattern:/(\\begin\{((?:verbatim|lstlisting)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$(?:\\[\s\S]|[^\\$])*\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:equation|math|eqnarray|align|multline|gather)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\}(?:\[[^\]]+\])?)/,lookbehind:!0,alias:"class-name"},function:{pattern:e,alias:"selector"},punctuation:/[[\]{}&]/}}(); \ No newline at end of file diff --git a/tests/languages/latex/equation_feature.test b/tests/languages/latex/equation_feature.test index 60191b3f20..40caeebe89 100644 --- a/tests/languages/latex/equation_feature.test +++ b/tests/languages/latex/equation_feature.test @@ -1,9 +1,6 @@ $foo$ $a \dots b$ -$$foo$$ -$$a \dots -b$$ \(foo\) \(a \dots b\) @@ -39,14 +36,6 @@ b\end{gather} ["equation-command", "\\dots"], "\r\nb$" ]], - ["equation", [ - "$$foo$$" - ]], - ["equation", [ - "$$a ", - ["equation-command", "\\dots"], - "\r\nb$$" - ]], ["equation", ["\\(foo\\)"]], ["equation", [ "\\(a ", @@ -129,4 +118,4 @@ b\end{gather} ---------------------------------------------------- -Checks for equations. +Checks for equations. \ No newline at end of file From 57f575116cbdf011e136606bff1fb46bc7d551ee Mon Sep 17 00:00:00 2001 From: Michael Schmidt Date: Sat, 8 Jun 2019 19:33:10 +0200 Subject: [PATCH 2/5] Fixed greedy target bug --- components/prism-core.js | 14 +++++++------- components/prism-core.min.js | 2 +- prism.js | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/components/prism-core.js b/components/prism-core.js index 18961e7180..15c6c9eb22 100644 --- a/components/prism-core.js +++ b/components/prism-core.js @@ -279,18 +279,18 @@ var _ = { matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) { for (var token in grammar) { - if(!grammar.hasOwnProperty(token) || !grammar[token]) { + if (!grammar.hasOwnProperty(token) || !grammar[token]) { continue; } - if (token == target) { - return; - } - var patterns = grammar[token]; - patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns]; + patterns = Array.isArray(patterns) ? patterns : [patterns]; for (var j = 0; j < patterns.length; ++j) { + if (target && target == token + ',' + j) { + return; + } + var pattern = patterns[j], inside = pattern.inside, lookbehind = !!pattern.lookbehind, @@ -394,7 +394,7 @@ var _ = { Array.prototype.splice.apply(strarr, args); if (delNum != 1) - _.matchGrammar(text, strarr, grammar, i, pos, true, token); + _.matchGrammar(text, strarr, grammar, i, pos, true, token + ',' + j); if (oneshot) break; diff --git a/components/prism-core.min.js b/components/prism-core.min.js index 3cb415ebf0..7cd601d9c0 100644 --- a/components/prism-core.min.js +++ b/components/prism-core.min.js @@ -1 +1 @@ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(g){var c=/\blang(?:uage)?-([\w-]+)\b/i,a=0,C={manual:g.Prism&&g.Prism.manual,disableWorkerMessageHandler:g.Prism&&g.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof M?new M(e.type,C.util.encode(e.content),e.alias):Array.isArray(e)?e.map(C.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(k instanceof M)){if(f&&y!=a.length-1){if(c.lastIndex=v,!(x=c.exec(e)))break;for(var b=x.index+(h?x[1].length:0),w=x.index+x[0].length,A=y,P=v,O=a.length;A"+n.content+""},!g.document)return g.addEventListener&&(C.disableWorkerMessageHandler||g.addEventListener("message",function(e){var a=JSON.parse(e.data),n=a.language,t=a.code,r=a.immediateClose;g.postMessage(C.highlight(t,C.languages[n],n)),r&&g.close()},!1)),C;var e=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return e&&(C.filename=e.src,C.manual||e.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(C.highlightAll):window.setTimeout(C.highlightAll,16):document.addEventListener("DOMContentLoaded",C.highlightAll))),C}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); \ No newline at end of file +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(g){var c=/\blang(?:uage)?-([\w-]+)\b/i,a=0,C={manual:g.Prism&&g.Prism.manual,disableWorkerMessageHandler:g.Prism&&g.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof M?new M(e.type,C.util.encode(e.content),e.alias):Array.isArray(e)?e.map(C.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(k instanceof M)){if(f&&y!=a.length-1){if(c.lastIndex=v,!(x=c.exec(e)))break;for(var b=x.index+(h?x[1].length:0),w=x.index+x[0].length,A=y,P=v,O=a.length;A"+n.content+""},!g.document)return g.addEventListener&&(C.disableWorkerMessageHandler||g.addEventListener("message",function(e){var a=JSON.parse(e.data),n=a.language,t=a.code,r=a.immediateClose;g.postMessage(C.highlight(t,C.languages[n],n)),r&&g.close()},!1)),C;var e=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return e&&(C.filename=e.src,C.manual||e.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(C.highlightAll):window.setTimeout(C.highlightAll,16):document.addEventListener("DOMContentLoaded",C.highlightAll))),C}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); \ No newline at end of file diff --git a/prism.js b/prism.js index 38340f28e4..28cdde1f58 100644 --- a/prism.js +++ b/prism.js @@ -284,18 +284,18 @@ var _ = { matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) { for (var token in grammar) { - if(!grammar.hasOwnProperty(token) || !grammar[token]) { + if (!grammar.hasOwnProperty(token) || !grammar[token]) { continue; } - if (token == target) { - return; - } - var patterns = grammar[token]; - patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns]; + patterns = Array.isArray(patterns) ? patterns : [patterns]; for (var j = 0; j < patterns.length; ++j) { + if (target && target == token + ',' + j) { + return; + } + var pattern = patterns[j], inside = pattern.inside, lookbehind = !!pattern.lookbehind, @@ -399,7 +399,7 @@ var _ = { Array.prototype.splice.apply(strarr, args); if (delNum != 1) - _.matchGrammar(text, strarr, grammar, i, pos, true, token); + _.matchGrammar(text, strarr, grammar, i, pos, true, token + ',' + j); if (oneshot) break; From 8be7280193383b18d6445b22e66500000105e742 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Wed, 12 Jun 2019 16:00:48 +0200 Subject: [PATCH 3/5] Fixed greedy target bug --- components/prism-core.js | 14 +++++++------- components/prism-core.min.js | 2 +- prism.js | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/components/prism-core.js b/components/prism-core.js index 18961e7180..15c6c9eb22 100644 --- a/components/prism-core.js +++ b/components/prism-core.js @@ -279,18 +279,18 @@ var _ = { matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) { for (var token in grammar) { - if(!grammar.hasOwnProperty(token) || !grammar[token]) { + if (!grammar.hasOwnProperty(token) || !grammar[token]) { continue; } - if (token == target) { - return; - } - var patterns = grammar[token]; - patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns]; + patterns = Array.isArray(patterns) ? patterns : [patterns]; for (var j = 0; j < patterns.length; ++j) { + if (target && target == token + ',' + j) { + return; + } + var pattern = patterns[j], inside = pattern.inside, lookbehind = !!pattern.lookbehind, @@ -394,7 +394,7 @@ var _ = { Array.prototype.splice.apply(strarr, args); if (delNum != 1) - _.matchGrammar(text, strarr, grammar, i, pos, true, token); + _.matchGrammar(text, strarr, grammar, i, pos, true, token + ',' + j); if (oneshot) break; diff --git a/components/prism-core.min.js b/components/prism-core.min.js index 3cb415ebf0..7cd601d9c0 100644 --- a/components/prism-core.min.js +++ b/components/prism-core.min.js @@ -1 +1 @@ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(g){var c=/\blang(?:uage)?-([\w-]+)\b/i,a=0,C={manual:g.Prism&&g.Prism.manual,disableWorkerMessageHandler:g.Prism&&g.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof M?new M(e.type,C.util.encode(e.content),e.alias):Array.isArray(e)?e.map(C.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(k instanceof M)){if(f&&y!=a.length-1){if(c.lastIndex=v,!(x=c.exec(e)))break;for(var b=x.index+(h?x[1].length:0),w=x.index+x[0].length,A=y,P=v,O=a.length;A"+n.content+""},!g.document)return g.addEventListener&&(C.disableWorkerMessageHandler||g.addEventListener("message",function(e){var a=JSON.parse(e.data),n=a.language,t=a.code,r=a.immediateClose;g.postMessage(C.highlight(t,C.languages[n],n)),r&&g.close()},!1)),C;var e=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return e&&(C.filename=e.src,C.manual||e.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(C.highlightAll):window.setTimeout(C.highlightAll,16):document.addEventListener("DOMContentLoaded",C.highlightAll))),C}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); \ No newline at end of file +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(g){var c=/\blang(?:uage)?-([\w-]+)\b/i,a=0,C={manual:g.Prism&&g.Prism.manual,disableWorkerMessageHandler:g.Prism&&g.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof M?new M(e.type,C.util.encode(e.content),e.alias):Array.isArray(e)?e.map(C.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(k instanceof M)){if(f&&y!=a.length-1){if(c.lastIndex=v,!(x=c.exec(e)))break;for(var b=x.index+(h?x[1].length:0),w=x.index+x[0].length,A=y,P=v,O=a.length;A"+n.content+""},!g.document)return g.addEventListener&&(C.disableWorkerMessageHandler||g.addEventListener("message",function(e){var a=JSON.parse(e.data),n=a.language,t=a.code,r=a.immediateClose;g.postMessage(C.highlight(t,C.languages[n],n)),r&&g.close()},!1)),C;var e=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return e&&(C.filename=e.src,C.manual||e.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(C.highlightAll):window.setTimeout(C.highlightAll,16):document.addEventListener("DOMContentLoaded",C.highlightAll))),C}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); \ No newline at end of file diff --git a/prism.js b/prism.js index 38340f28e4..28cdde1f58 100644 --- a/prism.js +++ b/prism.js @@ -284,18 +284,18 @@ var _ = { matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) { for (var token in grammar) { - if(!grammar.hasOwnProperty(token) || !grammar[token]) { + if (!grammar.hasOwnProperty(token) || !grammar[token]) { continue; } - if (token == target) { - return; - } - var patterns = grammar[token]; - patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns]; + patterns = Array.isArray(patterns) ? patterns : [patterns]; for (var j = 0; j < patterns.length; ++j) { + if (target && target == token + ',' + j) { + return; + } + var pattern = patterns[j], inside = pattern.inside, lookbehind = !!pattern.lookbehind, @@ -399,7 +399,7 @@ var _ = { Array.prototype.splice.apply(strarr, args); if (delNum != 1) - _.matchGrammar(text, strarr, grammar, i, pos, true, token); + _.matchGrammar(text, strarr, grammar, i, pos, true, token + ',' + j); if (oneshot) break; From 0d92050682bea180a88d0b0b542ccf0dea9a0705 Mon Sep 17 00:00:00 2001 From: Michael Schmidt Date: Sun, 30 Jun 2019 13:01:38 +0200 Subject: [PATCH 4/5] Extended tests --- package.json | 3 +- tests/core/greedy.js | 69 ++++++++++++++++++++++++ tests/helper/test-case.js | 40 +++++++++----- tests/helper/token-stream-transformer.js | 2 +- 4 files changed, 99 insertions(+), 15 deletions(-) create mode 100644 tests/core/greedy.js diff --git a/package.json b/package.json index 1a3fcb6637..29b5471d9d 100755 --- a/package.json +++ b/package.json @@ -6,11 +6,12 @@ "style": "themes/prism.css", "scripts": { "test:aliases": "mocha tests/aliases-test.js", + "test:core": "mocha tests/core/**/*.js", "test:languages": "mocha tests/run.js", "test:plugins": "mocha tests/plugins/**/*.js", "test:regex": "mocha tests/regex-tests.js", "test:runner": "mocha tests/testrunner-tests.js", - "test": "npm run test:runner && npm run test:languages && npm run test:plugins && npm run test:aliases && npm run test:regex" + "test": "npm run test:runner && npm run test:core && npm run test:languages && npm run test:plugins && npm run test:aliases && npm run test:regex" }, "repository": { "type": "git", diff --git a/tests/core/greedy.js b/tests/core/greedy.js new file mode 100644 index 0000000000..3e0a11ecc0 --- /dev/null +++ b/tests/core/greedy.js @@ -0,0 +1,69 @@ +"use strict"; + +const { assert } = require('chai'); +const PrismLoader = require('../helper/prism-loader'); +const TestCase = require('../helper/test-case'); + + +function testTokens({ grammar, code, expected }) { + const Prism = PrismLoader.createEmptyPrism(); + Prism.languages.test = grammar; + + const simpleTokens = TestCase.simpleTokenize(Prism, code, 'test'); + + assert.deepStrictEqual(simpleTokens, expected); +} + +describe('Greedy matching', function () { + + it('should correctly handle tokens with the same name', function () { + testTokens({ + grammar: { + 'comment': [ + /\/\/.*/, + { + pattern: /\/\*[\s\S]*?(?:\*\/|$)/, + greedy: true + } + ] + }, + code: '// /*\n/* comment */', + expected: [ + ["comment", "// /*"], + ["comment", "/* comment */"] + ] + }); + }); + + // https://github.com/PrismJS/prism/issues/1492 + /* + it('should correctly rematch tokens', function () { + testTokens({ + grammar: { + 'a': { + pattern: /'[^'\r\n]*'/, + }, + 'b': { + pattern: /"[^"\r\n]*"/, + greedy: true, + }, + 'c': { + pattern: /<[^>\r\n]*>/, + greedy: true, + } + }, + code: `<'> '' ''\n<"> "" ""`, + expected: [ + ["c", "<'>"], + ["a", "''"], + ["a", "''"], + + ["c", "<\">"], + ["b", "\"\""], + ["b", "\"\""], + ] + }); + }); + */ +}); + diff --git a/tests/helper/test-case.js b/tests/helper/test-case.js index 8ba4dc60fc..4f14cee08a 100644 --- a/tests/helper/test-case.js +++ b/tests/helper/test-case.js @@ -60,19 +60,9 @@ module.exports = { } const Prism = PrismLoader.createInstance(usedLanguages.languages); - // the first language is the main language to highlight - const mainLanguageGrammar = Prism.languages[usedLanguages.mainLanguage]; - const env = { - code: testCase.testSource, - grammar: mainLanguageGrammar, - language: usedLanguages.mainLanguage - }; - Prism.hooks.run('before-tokenize', env); - env.tokens = Prism.tokenize(env.code, env.grammar); - Prism.hooks.run('after-tokenize', env); - const compiledTokenStream = env.tokens; - const simplifiedTokenStream = TokenStreamTransformer.simplify(compiledTokenStream); + // the first language is the main language to highlight + const simplifiedTokenStream = this.simpleTokenize(Prism, testCase.testSource, usedLanguages.mainLanguage); const tzd = JSON.stringify(simplifiedTokenStream); const exp = JSON.stringify(testCase.expectedTokenStream); @@ -93,7 +83,31 @@ module.exports = { "Expected Token Stream: \n" + exp + "\n-----------------------------------------\n" + diff; - const result = assert.deepEqual(simplifiedTokenStream, testCase.expectedTokenStream, testCase.comment + message); + assert.deepEqual(simplifiedTokenStream, testCase.expectedTokenStream, testCase.comment + message); + }, + + /** + * Returns the simplified token stream of the given code highlighted with `language`. + * + * The `before-tokenize` and `after-tokenize` hooks will also be executed. + * + * @param {any} Prism The Prism instance which will tokenize `code`. + * @param {string} code The code to tokenize. + * @param {string} language The language id. + * @returns {Array>} + */ + simpleTokenize(Prism, code, language) { + const env = { + code, + grammar: Prism.languages[language], + language + }; + + Prism.hooks.run('before-tokenize', env); + env.tokens = Prism.tokenize(env.code, env.grammar); + Prism.hooks.run('after-tokenize', env); + + return TokenStreamTransformer.simplify(env.tokens); }, diff --git a/tests/helper/token-stream-transformer.js b/tests/helper/token-stream-transformer.js index 35ee96cafc..5c46e89b0f 100644 --- a/tests/helper/token-stream-transformer.js +++ b/tests/helper/token-stream-transformer.js @@ -6,7 +6,7 @@ module.exports = { * @typedef TokenStreamItem * @property {string} type * @property {string | TokenStreamItem | Array} content - */ + */ /** * Simplifies the token stream to ease the matching with the expected token stream. From 78e02282e8bf731f9c5f1506872290a4ad1e9fb9 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Mon, 26 Aug 2019 22:00:22 +0200 Subject: [PATCH 5/5] Fixed latex changes --- components/prism-latex.js | 4 ++-- components/prism-latex.min.js | 2 +- tests/languages/latex/equation_feature.test | 13 ++++++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/components/prism-latex.js b/components/prism-latex.js index 4ccbd72298..68a45b611c 100644 --- a/components/prism-latex.js +++ b/components/prism-latex.js @@ -15,12 +15,12 @@ lookbehind: true }, /* - * equations can be between $ $ or \( \) or \[ \] + * equations can be between $$ $$ or $ $ or \( \) or \[ \] * (all are multiline) */ 'equation': [ { - pattern: /\$(?:\\[\s\S]|[^\\$])*\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/, + pattern: /\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/, inside: insideEqu, alias: 'string' }, diff --git a/components/prism-latex.min.js b/components/prism-latex.min.js index bab30c2e91..261cae4e39 100644 --- a/components/prism-latex.min.js +++ b/components/prism-latex.min.js @@ -1 +1 @@ -!function(a){var e=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:e,alias:"regex"}};a.languages.latex={comment:/%.*/m,cdata:{pattern:/(\\begin\{((?:verbatim|lstlisting)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$(?:\\[\s\S]|[^\\$])*\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:equation|math|eqnarray|align|multline|gather)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\}(?:\[[^\]]+\])?)/,lookbehind:!0,alias:"class-name"},function:{pattern:e,alias:"selector"},punctuation:/[[\]{}&]/},a.languages.tex=a.languages.latex,a.languages.context=a.languages.latex}(Prism); \ No newline at end of file +!function(a){var e=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:e,alias:"regex"}};a.languages.latex={comment:/%.*/m,cdata:{pattern:/(\\begin\{((?:verbatim|lstlisting)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:equation|math|eqnarray|align|multline|gather)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\}(?:\[[^\]]+\])?)/,lookbehind:!0,alias:"class-name"},function:{pattern:e,alias:"selector"},punctuation:/[[\]{}&]/},a.languages.tex=a.languages.latex,a.languages.context=a.languages.latex}(Prism); \ No newline at end of file diff --git a/tests/languages/latex/equation_feature.test b/tests/languages/latex/equation_feature.test index 40caeebe89..60191b3f20 100644 --- a/tests/languages/latex/equation_feature.test +++ b/tests/languages/latex/equation_feature.test @@ -1,6 +1,9 @@ $foo$ $a \dots b$ +$$foo$$ +$$a \dots +b$$ \(foo\) \(a \dots b\) @@ -36,6 +39,14 @@ b\end{gather} ["equation-command", "\\dots"], "\r\nb$" ]], + ["equation", [ + "$$foo$$" + ]], + ["equation", [ + "$$a ", + ["equation-command", "\\dots"], + "\r\nb$$" + ]], ["equation", ["\\(foo\\)"]], ["equation", [ "\\(a ", @@ -118,4 +129,4 @@ b\end{gather} ---------------------------------------------------- -Checks for equations. \ No newline at end of file +Checks for equations.