Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve bash support [no squash] #2439

Merged
merged 4 commits into from Feb 29, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGES.md
Expand Up @@ -19,6 +19,9 @@ 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][]
- enh(fortran) Support Fortran 77 style comments (#2416) [Josh Goebel][]
- (csharp) add support for `@identifier` style identifiers (#2414) [Josh Goebel][]
Expand Down
66 changes: 44 additions & 22 deletions src/languages/bash.js
Expand Up @@ -7,35 +7,66 @@ Category: common
*/

export default function(hljs) {
var 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: /\)/,
contains: [hljs.BACKSLASH_ESCAPE]
};
var QUOTE_STRING = {
const QUOTE_STRING = {
className: 'string',
begin: /"/, end: /"/,
contains: [
hljs.BACKSLASH_ESCAPE,
VAR,
{
className: 'variable',
begin: /\$\(/, end: /\)/,
contains: [hljs.BACKSLASH_ESCAPE]
}
SUBST
]
};
var ESCAPED_QUOTE = {
SUBST.contains.push(QUOTE_STRING);
const ESCAPED_QUOTE = {
className: '',
begin: /\\"/

};
var APOS_STRING = {
const APOS_STRING = {
className: 'string',
begin: /'/, end: /'/
};
const ARITHMETIC = {
begin: /\$\(\(/,
end: /\)\)/,
contains: [
{ begin: /\d+#[0-9a-f]+/, className: "number" },
hljs.NUMBER_MODE,
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',
Expand Down Expand Up @@ -67,18 +98,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
},
SHEBANG,
FUNCTION,
ARITHMETIC,
hljs.HASH_COMMENT_MODE,
QUOTE_STRING,
ESCAPED_QUOTE,
Expand Down
8 changes: 8 additions & 0 deletions test/markup/bash/arithmetic.expect.txt
@@ -0,0 +1,8 @@
<span class="hljs-built_in">echo</span> $(( <span class="hljs-number">16#deadbeef</span> / <span class="hljs-number">1003</span> ))

yumi=deadbeef
<span class="hljs-built_in">echo</span> $(( <span class="hljs-number">16</span>#<span class="hljs-variable">$yumi</span> / <span class="hljs-number">1003</span> ))

B=20
yumi=deadbeef
<span class="hljs-built_in">echo</span> $(( <span class="hljs-variable">$B</span>#<span class="hljs-variable">$yumi</span> / <span class="hljs-number">1003</span> ))
8 changes: 8 additions & 0 deletions 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 ))
3 changes: 3 additions & 0 deletions test/markup/bash/strings.expect.txt
@@ -0,0 +1,3 @@
SCRIPT_DIR=<span class="hljs-string">"<span class="hljs-subst">$( cd <span class="hljs-string">"<span class="hljs-subst">$( dirname <span class="hljs-string">"<span class="hljs-variable">${BASH_SOURCE[0]}</span>"</span> )</span>"</span> &gt;/dev/null 2&gt;&amp;1 &amp;&amp; pwd )</span>"</span>
TLS_DIR=<span class="hljs-string">"<span class="hljs-variable">$SCRIPT_DIR</span>/../src/main/resources/tls"</span>
ROOT_DIR=<span class="hljs-string">"<span class="hljs-variable">$SCRIPT_DIR</span>/.."</span>
3 changes: 3 additions & 0 deletions 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/.."
3 changes: 3 additions & 0 deletions test/markup/bash/variables.expect.txt
@@ -0,0 +1,3 @@
<span class="hljs-variable">$A</span>
<span class="hljs-variable">${B}</span>
<span class="hljs-variable">${WURST:-<span class="hljs-variable">${CARNE}</span>}</span>
3 changes: 3 additions & 0 deletions test/markup/bash/variables.txt
@@ -0,0 +1,3 @@
$A
${B}
${WURST:-${CARNE}}