You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
4.0 KiB
169 lines
4.0 KiB
/** |
|
* @param {string} value |
|
* @returns {RegExp} |
|
* */ |
|
|
|
/** |
|
* @param {RegExp | string } re |
|
* @returns {string} |
|
*/ |
|
function source(re) { |
|
if (!re) return null; |
|
if (typeof re === "string") return re; |
|
|
|
return re.source; |
|
} |
|
|
|
/** |
|
* @param {...(RegExp | string) } args |
|
* @returns {string} |
|
*/ |
|
function concat(...args) { |
|
const joined = args.map((x) => source(x)).join(""); |
|
return joined; |
|
} |
|
|
|
/* |
|
Language: Bash |
|
Author: vah <vahtenberg@gmail.com> |
|
Contributrors: Benjamin Pannell <contact@sierrasoftworks.com> |
|
Website: https://www.gnu.org/software/bash/ |
|
Category: common |
|
*/ |
|
|
|
/** @type LanguageFn */ |
|
function bash(hljs) { |
|
const VAR = {}; |
|
const BRACED_VAR = { |
|
begin: /\$\{/, |
|
end:/\}/, |
|
contains: [ |
|
"self", |
|
{ |
|
begin: /:-/, |
|
contains: [ VAR ] |
|
} // default values |
|
] |
|
}; |
|
Object.assign(VAR,{ |
|
className: 'variable', |
|
variants: [ |
|
{begin: concat(/\$[\w\d#@][\w\d_]*/, |
|
// negative look-ahead tries to avoid matching patterns that are not |
|
// Perl at all like $ident$, @ident@, etc. |
|
`(?![\\w\\d])(?![$])`) }, |
|
BRACED_VAR |
|
] |
|
}); |
|
|
|
const SUBST = { |
|
className: 'subst', |
|
begin: /\$\(/, end: /\)/, |
|
contains: [hljs.BACKSLASH_ESCAPE] |
|
}; |
|
const HERE_DOC = { |
|
begin: /<<-?\s*(?=\w+)/, |
|
starts: { |
|
contains: [ |
|
hljs.END_SAME_AS_BEGIN({ |
|
begin: /(\w+)/, |
|
end: /(\w+)/, |
|
className: 'string' |
|
}) |
|
] |
|
} |
|
}; |
|
const QUOTE_STRING = { |
|
className: 'string', |
|
begin: /"/, end: /"/, |
|
contains: [ |
|
hljs.BACKSLASH_ESCAPE, |
|
VAR, |
|
SUBST |
|
] |
|
}; |
|
SUBST.contains.push(QUOTE_STRING); |
|
const ESCAPED_QUOTE = { |
|
className: '', |
|
begin: /\\"/ |
|
|
|
}; |
|
const APOS_STRING = { |
|
className: 'string', |
|
begin: /'/, end: /'/ |
|
}; |
|
const ARITHMETIC = { |
|
begin: /\$\(\(/, |
|
end: /\)\)/, |
|
contains: [ |
|
{ begin: /\d+#[0-9a-f]+/, className: "number" }, |
|
hljs.NUMBER_MODE, |
|
VAR |
|
] |
|
}; |
|
const SH_LIKE_SHELLS = [ |
|
"fish", |
|
"bash", |
|
"zsh", |
|
"sh", |
|
"csh", |
|
"ksh", |
|
"tcsh", |
|
"dash", |
|
"scsh", |
|
]; |
|
const KNOWN_SHEBANG = hljs.SHEBANG({ |
|
binary: `(${SH_LIKE_SHELLS.join("|")})`, |
|
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', |
|
aliases: ['sh', 'zsh'], |
|
keywords: { |
|
$pattern: /\b[a-z._-]+\b/, |
|
keyword: |
|
'if then else elif fi for while in do done case esac function', |
|
literal: |
|
'true false', |
|
built_in: |
|
// Shell built-ins |
|
// http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html |
|
'break cd continue eval exec exit export getopts hash pwd readonly return shift test times ' + |
|
'trap umask unset ' + |
|
// Bash built-ins |
|
'alias bind builtin caller command declare echo enable help let local logout mapfile printf ' + |
|
'read readarray source type typeset ulimit unalias ' + |
|
// Shell modifiers |
|
'set shopt ' + |
|
// Zsh built-ins |
|
'autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles ' + |
|
'compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate ' + |
|
'fc fg float functions getcap getln history integer jobs kill limit log noglob popd print ' + |
|
'pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit ' + |
|
'unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof ' + |
|
'zpty zregexparse zsocket zstyle ztcp' |
|
}, |
|
contains: [ |
|
KNOWN_SHEBANG, // to catch known shells and boost relevancy |
|
hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang |
|
FUNCTION, |
|
ARITHMETIC, |
|
hljs.HASH_COMMENT_MODE, |
|
HERE_DOC, |
|
QUOTE_STRING, |
|
ESCAPED_QUOTE, |
|
APOS_STRING, |
|
VAR |
|
] |
|
}; |
|
} |
|
|
|
module.exports = bash;
|
|
|