From f41c5cd53b975b413f18cf31cf0299204132302c Mon Sep 17 00:00:00 2001 From: Golmote Date: Wed, 29 Nov 2017 08:35:55 +0100 Subject: [PATCH] JSX: Improve highlighting support. Fix #1235 and #1236 --- components/prism-jsx.js | 6 +++--- components/prism-jsx.min.js | 2 +- tests/languages/jsx/issue1235.test | 29 +++++++++++++++++++++++++++++ tests/languages/jsx/issue1236.test | 26 ++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 tests/languages/jsx/issue1235.test create mode 100644 tests/languages/jsx/issue1236.test diff --git a/components/prism-jsx.js b/components/prism-jsx.js index bf0f3b19e3..4b59cfba04 100644 --- a/components/prism-jsx.js +++ b/components/prism-jsx.js @@ -3,15 +3,15 @@ var javascript = Prism.util.clone(Prism.languages.javascript); Prism.languages.jsx = Prism.languages.extend('markup', javascript); -Prism.languages.jsx.tag.pattern= /<\/?[\w.:-]+\s*(?:\s+(?:[\w\.:-]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+|(?:\{[^}]*\})))?|\{\.{3}\w+\}))*\s*\/?>/i; +Prism.languages.jsx.tag.pattern= /<\/?[\w.:-]+\s*(?:\s+(?:[\w.:-]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+|(?:\{\{?[^}]*\}?\})))?|\{\.{3}[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\}))*\s*\/?>/i; Prism.languages.jsx.tag.inside['attr-value'].pattern = /=(?!\{)(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">]+)/i; Prism.languages.insertBefore('inside', 'attr-name', { 'spread': { - pattern: /\{\.{3}\w+\}/, + pattern: /\{\.{3}[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\}/, inside: { - 'punctuation': /[{}]|\.{3}/, + 'punctuation': /\.{3}|[{}.]/, 'attr-value': /\w+/ } } diff --git a/components/prism-jsx.min.js b/components/prism-jsx.min.js index 9b284cc4a5..7f696af5ad 100644 --- a/components/prism-jsx.min.js +++ b/components/prism-jsx.min.js @@ -1 +1 @@ -!function(a){var e=a.util.clone(a.languages.javascript);a.languages.jsx=a.languages.extend("markup",e),a.languages.jsx.tag.pattern=/<\/?[\w.:-]+\s*(?:\s+(?:[\w\.:-]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+|(?:\{[^}]*\})))?|\{\.{3}\w+\}))*\s*\/?>/i,a.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">]+)/i,a.languages.insertBefore("inside","attr-name",{spread:{pattern:/\{\.{3}\w+\}/,inside:{punctuation:/[{}]|\.{3}/,"attr-value":/\w+/}}},a.languages.jsx.tag);var s=a.util.clone(a.languages.jsx);delete s.punctuation,s=a.languages.insertBefore("jsx","operator",{punctuation:/=(?={)|[{}[\];(),.:]/},{jsx:s}),a.languages.insertBefore("inside","attr-value",{script:{pattern:/=(\{(?:\{[^}]*\}|[^}])+\})/i,inside:s,alias:"language-javascript"}},a.languages.jsx.tag)}(Prism); \ No newline at end of file +!function(a){var e=a.util.clone(a.languages.javascript);a.languages.jsx=a.languages.extend("markup",e),a.languages.jsx.tag.pattern=/<\/?[\w.:-]+\s*(?:\s+(?:[\w.:-]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+|(?:\{\{?[^}]*\}?\})))?|\{\.{3}[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\}))*\s*\/?>/i,a.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">]+)/i,a.languages.insertBefore("inside","attr-name",{spread:{pattern:/\{\.{3}[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\}/,inside:{punctuation:/\.{3}|[{}.]/,"attr-value":/\w+/}}},a.languages.jsx.tag);var s=a.util.clone(a.languages.jsx);delete s.punctuation,s=a.languages.insertBefore("jsx","operator",{punctuation:/=(?={)|[{}[\];(),.:]/},{jsx:s}),a.languages.insertBefore("inside","attr-value",{script:{pattern:/=(\{(?:\{[^}]*\}|[^}])+\})/i,inside:s,alias:"language-javascript"}},a.languages.jsx.tag)}(Prism); \ No newline at end of file diff --git a/tests/languages/jsx/issue1235.test b/tests/languages/jsx/issue1235.test new file mode 100644 index 0000000000..79a8a0ea59 --- /dev/null +++ b/tests/languages/jsx/issue1235.test @@ -0,0 +1,29 @@ + + +---------------------------------------------------- + +[ + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "Child" + ]], + ["attr-name", ["options"]], + ["script", [ + ["punctuation", "="], + ["punctuation", "{"], + ["punctuation", "{"], + " track", + ["punctuation", ":"], + ["boolean", "true"], + ["punctuation", "}"], + ["punctuation", "}"] + ]], + ["punctuation", ">"] + ]] +] + +---------------------------------------------------- + +Checks that attribute can contain an simple object. +See #1235. \ No newline at end of file diff --git a/tests/languages/jsx/issue1236.test b/tests/languages/jsx/issue1236.test new file mode 100644 index 0000000000..a46c48959c --- /dev/null +++ b/tests/languages/jsx/issue1236.test @@ -0,0 +1,26 @@ + + +---------------------------------------------------- + +[ + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "Child" + ]], + ["spread", [ + ["punctuation", "{"], + ["punctuation", "..."], + ["attr-value", "this"], + ["punctuation", "."], + ["attr-value", "props"], + ["punctuation", "}"] + ]], + ["punctuation", ">"] + ]] +] + +---------------------------------------------------- + +Checks that spread can contain an object property. +See #1236. \ No newline at end of file