From 7303d90eaac2880665f22a5ad4284b3322c20455 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 28 Feb 2020 18:21:00 -0500 Subject: [PATCH 1/4] enh(bash) add arithmetic support --- CHANGES.md | 1 + src/languages/bash.js | 10 ++++++++++ test/markup/bash/arithmetic.expect.txt | 8 ++++++++ test/markup/bash/arithmetic.txt | 8 ++++++++ 4 files changed, 27 insertions(+) create mode 100644 test/markup/bash/arithmetic.expect.txt create mode 100644 test/markup/bash/arithmetic.txt diff --git a/CHANGES.md b/CHANGES.md index 9061a346cb..86ca1dcf7b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -19,6 +19,7 @@ Language Improvements: - fix(javascript) prevent get/set variables conflicting with keywords (#2440) [Josh Goebel][] - bug(clojure) Now highlights `defn-` properly (#2438) [Josh Goebel][] +- enh(bash) Add arithmetic expression support (#2439) [Josh Goebel][] - enh(clojure) Add support for global definitions name (#2347) [Alexandre Grison][] - enh(fortran) Support Fortran 77 style comments (#2416) [Josh Goebel][] - (csharp) add support for `@identifier` style identifiers (#2414) [Josh Goebel][] diff --git a/src/languages/bash.js b/src/languages/bash.js index 3d37ded159..04856e01bd 100644 --- a/src/languages/bash.js +++ b/src/languages/bash.js @@ -36,6 +36,15 @@ export default function(hljs) { className: 'string', begin: /'/, end: /'/ }; + const ARITHEMETIC = { + begin: /\$\(\(/, + end: /\)\)/, + contains: [ + { begin: /\d+#[0-9a-f]+/, className: "number" }, + hljs.NUMBER_MODE, + VAR + ] + }; return { name: 'Bash', @@ -79,6 +88,7 @@ export default function(hljs) { contains: [hljs.inherit(hljs.TITLE_MODE, {begin: /\w[\w\d_]*/})], relevance: 0 }, + ARITHEMETIC, hljs.HASH_COMMENT_MODE, QUOTE_STRING, ESCAPED_QUOTE, diff --git a/test/markup/bash/arithmetic.expect.txt b/test/markup/bash/arithmetic.expect.txt new file mode 100644 index 0000000000..28ebd37413 --- /dev/null +++ b/test/markup/bash/arithmetic.expect.txt @@ -0,0 +1,8 @@ +echo $(( 16#deadbeef / 1003 )) + +yumi=deadbeef +echo $(( 16#$yumi / 1003 )) + +B=20 +yumi=deadbeef +echo $(( $B#$yumi / 1003 )) diff --git a/test/markup/bash/arithmetic.txt b/test/markup/bash/arithmetic.txt new file mode 100644 index 0000000000..d44dea465e --- /dev/null +++ b/test/markup/bash/arithmetic.txt @@ -0,0 +1,8 @@ +echo $(( 16#deadbeef / 1003 )) + +yumi=deadbeef +echo $(( 16#$yumi / 1003 )) + +B=20 +yumi=deadbeef +echo $(( $B#$yumi / 1003 )) From 019688075b40bc51d8d7aeb5b3e8a4a47b4fc180 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 28 Feb 2020 18:47:35 -0500 Subject: [PATCH 2/4] enh(bash) string nested within string --- CHANGES.md | 1 + src/languages/bash.js | 12 +++++++----- test/markup/bash/strings.expect.txt | 3 +++ test/markup/bash/strings.txt | 3 +++ 4 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 test/markup/bash/strings.expect.txt create mode 100644 test/markup/bash/strings.txt diff --git a/CHANGES.md b/CHANGES.md index 86ca1dcf7b..12aba8e042 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -19,6 +19,7 @@ Language Improvements: - fix(javascript) prevent get/set variables conflicting with keywords (#2440) [Josh Goebel][] - bug(clojure) Now highlights `defn-` properly (#2438) [Josh Goebel][] +- enh(bash) string nested within string (#2439) [Josh Goebel][] - enh(bash) Add arithmetic expression support (#2439) [Josh Goebel][] - enh(clojure) Add support for global definitions name (#2347) [Alexandre Grison][] - enh(fortran) Support Fortran 77 style comments (#2416) [Josh Goebel][] diff --git a/src/languages/bash.js b/src/languages/bash.js index 04856e01bd..e115e81b4e 100644 --- a/src/languages/bash.js +++ b/src/languages/bash.js @@ -14,19 +14,21 @@ export default function(hljs) { {begin: /\$\{(.*?)}/} ] }; + var SUBST = { + className: 'subst', + begin: /\$\(/, end: /\)/, + contains: [hljs.BACKSLASH_ESCAPE] + }; var QUOTE_STRING = { className: 'string', begin: /"/, end: /"/, contains: [ hljs.BACKSLASH_ESCAPE, VAR, - { - className: 'variable', - begin: /\$\(/, end: /\)/, - contains: [hljs.BACKSLASH_ESCAPE] - } + SUBST ] }; + SUBST.contains.push(QUOTE_STRING); var ESCAPED_QUOTE = { className: '', begin: /\\"/ diff --git a/test/markup/bash/strings.expect.txt b/test/markup/bash/strings.expect.txt new file mode 100644 index 0000000000..39abcc1b1d --- /dev/null +++ b/test/markup/bash/strings.expect.txt @@ -0,0 +1,3 @@ +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +TLS_DIR="$SCRIPT_DIR/../src/main/resources/tls" +ROOT_DIR="$SCRIPT_DIR/.." diff --git a/test/markup/bash/strings.txt b/test/markup/bash/strings.txt new file mode 100644 index 0000000000..c2d7f55732 --- /dev/null +++ b/test/markup/bash/strings.txt @@ -0,0 +1,3 @@ +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +TLS_DIR="$SCRIPT_DIR/../src/main/resources/tls" +ROOT_DIR="$SCRIPT_DIR/.." From d731825d9df41a8c62df949218b5f88e929ebda5 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 28 Feb 2020 18:49:53 -0500 Subject: [PATCH 3/4] (chore) cleanup bash a bit --- src/languages/bash.js | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/languages/bash.js b/src/languages/bash.js index e115e81b4e..093947df27 100644 --- a/src/languages/bash.js +++ b/src/languages/bash.js @@ -7,19 +7,19 @@ Category: common */ export default function(hljs) { - var VAR = { + const VAR = { className: 'variable', variants: [ {begin: /\$[\w\d#@][\w\d_]*/}, {begin: /\$\{(.*?)}/} ] }; - var SUBST = { + const SUBST = { className: 'subst', begin: /\$\(/, end: /\)/, contains: [hljs.BACKSLASH_ESCAPE] }; - var QUOTE_STRING = { + const QUOTE_STRING = { className: 'string', begin: /"/, end: /"/, contains: [ @@ -29,16 +29,16 @@ export default function(hljs) { ] }; SUBST.contains.push(QUOTE_STRING); - var ESCAPED_QUOTE = { + const ESCAPED_QUOTE = { className: '', begin: /\\"/ }; - var APOS_STRING = { + const APOS_STRING = { className: 'string', begin: /'/, end: /'/ }; - const ARITHEMETIC = { + const ARITHMETIC = { begin: /\$\(\(/, end: /\)\)/, contains: [ @@ -47,6 +47,18 @@ export default function(hljs) { VAR ] }; + const SHEBANG = { + className: 'meta', + begin: /^#![^\n]+sh\s*$/, + relevance: 10 + }; + const FUNCTION = { + className: 'function', + begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/, + returnBegin: true, + contains: [hljs.inherit(hljs.TITLE_MODE, {begin: /\w[\w\d_]*/})], + relevance: 0 + }; return { name: 'Bash', @@ -78,19 +90,9 @@ export default function(hljs) { '-ne -eq -lt -gt -f -d -e -s -l -a' // relevance booster }, contains: [ - { - className: 'meta', - begin: /^#![^\n]+sh\s*$/, - relevance: 10 - }, - { - className: 'function', - begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/, - returnBegin: true, - contains: [hljs.inherit(hljs.TITLE_MODE, {begin: /\w[\w\d_]*/})], - relevance: 0 - }, - ARITHEMETIC, + SHEBANG, + FUNCTION, + ARITHMETIC, hljs.HASH_COMMENT_MODE, QUOTE_STRING, ESCAPED_QUOTE, From ee7dd6142b240189cfdc3c38d6a041200eb0f790 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 28 Feb 2020 19:16:53 -0500 Subject: [PATCH 4/4] enh(bash) default value is another variable --- CHANGES.md | 1 + src/languages/bash.js | 14 +++++++++++--- test/markup/bash/variables.expect.txt | 3 +++ test/markup/bash/variables.txt | 3 +++ 4 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 test/markup/bash/variables.expect.txt create mode 100644 test/markup/bash/variables.txt diff --git a/CHANGES.md b/CHANGES.md index 12aba8e042..b9ef99e36d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -19,6 +19,7 @@ Language Improvements: - fix(javascript) prevent get/set variables conflicting with keywords (#2440) [Josh Goebel][] - bug(clojure) Now highlights `defn-` properly (#2438) [Josh Goebel][] +- enh(bash) default value is another variable (#2439) [Josh Goebel][] - enh(bash) string nested within string (#2439) [Josh Goebel][] - enh(bash) Add arithmetic expression support (#2439) [Josh Goebel][] - enh(clojure) Add support for global definitions name (#2347) [Alexandre Grison][] diff --git a/src/languages/bash.js b/src/languages/bash.js index 093947df27..be9c8c92fc 100644 --- a/src/languages/bash.js +++ b/src/languages/bash.js @@ -7,13 +7,21 @@ Category: common */ export default function(hljs) { - const VAR = { + const VAR = {}; + const BRACED_VAR = { + begin: /\$\{/, end:/\}/, + contains: [ + { begin: /:-/, contains: [VAR] } // default values + ] + }; + Object.assign(VAR,{ className: 'variable', variants: [ {begin: /\$[\w\d#@][\w\d_]*/}, - {begin: /\$\{(.*?)}/} + BRACED_VAR ] - }; + }); + const SUBST = { className: 'subst', begin: /\$\(/, end: /\)/, diff --git a/test/markup/bash/variables.expect.txt b/test/markup/bash/variables.expect.txt new file mode 100644 index 0000000000..708b15f2f2 --- /dev/null +++ b/test/markup/bash/variables.expect.txt @@ -0,0 +1,3 @@ +$A +${B} +${WURST:-${CARNE}} diff --git a/test/markup/bash/variables.txt b/test/markup/bash/variables.txt new file mode 100644 index 0000000000..eb89ed0cda --- /dev/null +++ b/test/markup/bash/variables.txt @@ -0,0 +1,3 @@ +$A +${B} +${WURST:-${CARNE}}