From 5d9174bbece3b9de02f9a713cf9b0e7dd90e05ef Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 24 Dec 2019 11:35:30 -0500 Subject: [PATCH 1/4] (javascript) support jsx fragments --- CHANGES.md | 1 + src/highlight.js | 2 ++ src/languages/javascript.js | 17 ++++++++++++++++- test/markup/javascript/jsx-fragment.expect.txt | 10 ++++++++++ test/markup/javascript/jsx-fragment.txt | 10 ++++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/markup/javascript/jsx-fragment.expect.txt create mode 100644 test/markup/javascript/jsx-fragment.txt diff --git a/CHANGES.md b/CHANGES.md index 7ceeff534a..40d91bbca8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -14,6 +14,7 @@ Core Changes: Language Improvements: +- (javascript) support jsx fragments () [Josh Goebel][] - (vbnet) add nameof operator to the keywords (#2329) [Youssef Victor][] - (stan) updated with improved coverage of language keywords and patterns. (#1829) [Jeffrey Arnold][] diff --git a/src/highlight.js b/src/highlight.js index 3194194996..5248f253e3 100644 --- a/src/highlight.js +++ b/src/highlight.js @@ -780,6 +780,8 @@ https://highlightjs.org/ if (err.message && err.message.indexOf('Illegal') !== -1) { return { illegal: true, + illegalBy: err, + context: codeToHighlight.substring(index-10, index+10), relevance: 0, value: escape(codeToHighlight) }; diff --git a/src/languages/javascript.js b/src/languages/javascript.js index 701a5b1167..7d6078995b 100644 --- a/src/languages/javascript.js +++ b/src/languages/javascript.js @@ -6,6 +6,10 @@ Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript */ function(hljs) { + var FRAGMENT = { + begin: '<>', + end: '' + }; var TAG_START = /<[A-Za-z0-9\\._:-]+/; var TAG_FINISH = /\/[A-Za-z0-9\\._:-]+>|\/>/; var IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*'; @@ -189,7 +193,18 @@ function(hljs) { end: /\s*/, skip: true, }, - { // JSX + // JSX + { + begin: FRAGMENT.begin, end: FRAGMENT.end, + subLanguage: 'xml', + contains: [ + { + begin: TAG_START, end: TAG_FINISH, skip: true, + contains: ['self'] + } + ] + }, + { begin: TAG_START, end: TAG_FINISH, subLanguage: 'xml', contains: [ diff --git a/test/markup/javascript/jsx-fragment.expect.txt b/test/markup/javascript/jsx-fragment.expect.txt new file mode 100644 index 0000000000..b0a72c9f94 --- /dev/null +++ b/test/markup/javascript/jsx-fragment.expect.txt @@ -0,0 +1,10 @@ +class Columns extends React.Component { + render() { + return ( + <> + <td>Hello</td> + <td>World</td> + </> + ); + } +} diff --git a/test/markup/javascript/jsx-fragment.txt b/test/markup/javascript/jsx-fragment.txt new file mode 100644 index 0000000000..13fff075b7 --- /dev/null +++ b/test/markup/javascript/jsx-fragment.txt @@ -0,0 +1,10 @@ +class Columns extends React.Component { + render() { + return ( + <> + Hello + World + + ); + } +} From 4fe628ef1847ddf818ecefd67b6f9a13e0731a3a Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 24 Dec 2019 11:36:24 -0500 Subject: [PATCH 2/4] add PR # --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 40d91bbca8..f448959b9e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -14,7 +14,7 @@ Core Changes: Language Improvements: -- (javascript) support jsx fragments () [Josh Goebel][] +- (javascript) support jsx fragments (#2333) [Josh Goebel][] - (vbnet) add nameof operator to the keywords (#2329) [Youssef Victor][] - (stan) updated with improved coverage of language keywords and patterns. (#1829) [Jeffrey Arnold][] From d1d89e9c4e60db5bb1c390838fbe5230c009d9b5 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 24 Dec 2019 11:41:55 -0500 Subject: [PATCH 3/4] DRY --- src/languages/javascript.js | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/languages/javascript.js b/src/languages/javascript.js index 7d6078995b..d7a6ec1f28 100644 --- a/src/languages/javascript.js +++ b/src/languages/javascript.js @@ -10,8 +10,10 @@ function(hljs) { begin: '<>', end: '' }; - var TAG_START = /<[A-Za-z0-9\\._:-]+/; - var TAG_FINISH = /\/[A-Za-z0-9\\._:-]+>|\/>/; + var XML_TAG = { + begin: /<[A-Za-z0-9\\._:-]+/, + end: /\/[A-Za-z0-9\\._:-]+>|\/>/ + }; var IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*'; var KEYWORDS = { keyword: @@ -193,27 +195,19 @@ function(hljs) { end: /\s*/, skip: true, }, - // JSX - { - begin: FRAGMENT.begin, end: FRAGMENT.end, + { // JSX + variants: [ + { begin: FRAGMENT.begin, end: FRAGMENT.end }, + { begin: XML_TAG.begin, end: XML_TAG.end } + ], subLanguage: 'xml', contains: [ { - begin: TAG_START, end: TAG_FINISH, skip: true, + begin: XML_TAG.begin, end: XML_TAG.end, skip: true, contains: ['self'] } ] }, - { - begin: TAG_START, end: TAG_FINISH, - subLanguage: 'xml', - contains: [ - { - begin: TAG_START, end: TAG_FINISH, skip: true, - contains: ['self'] - } - ] - } ], relevance: 0 }, From 7200abb616d7f018809965c3f0a08916b36dc81c Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 24 Dec 2019 12:02:47 -0500 Subject: [PATCH 4/4] Update highlight.js --- src/highlight.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/highlight.js b/src/highlight.js index 5248f253e3..3194194996 100644 --- a/src/highlight.js +++ b/src/highlight.js @@ -780,8 +780,6 @@ https://highlightjs.org/ if (err.message && err.message.indexOf('Illegal') !== -1) { return { illegal: true, - illegalBy: err, - context: codeToHighlight.substring(index-10, index+10), relevance: 0, value: escape(codeToHighlight) };