/* | |
Language: Bash | |
Author: vah <[email protected]> | |
Contributrors: Benjamin Pannell <[email protected]> | |
Website: https://www.gnu.org/software/bash/ | |
Category: common | |
*/ | |
/** @type LanguageFn */ | |
function bash(hljs) { | |
const regex = hljs.regex; | |
const VAR = {}; | |
const BRACED_VAR = { | |
begin: /\$\{/, | |
end: /\}/, | |
contains: [ | |
"self", | |
{ | |
begin: /:-/, | |
contains: [ VAR ] | |
} // default values | |
] | |
}; | |
Object.assign(VAR, { | |
className: 'variable', | |
variants: [ | |
{ begin: regex.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 = { | |
match: /\\"/ | |
}; | |
const APOS_STRING = { | |
className: 'string', | |
begin: /'/, | |
end: /'/ | |
}; | |
const ESCAPED_APOS = { | |
match: /\\'/ | |
}; | |
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 | |
}; | |
const KEYWORDS = [ | |
"if", | |
"then", | |
"else", | |
"elif", | |
"fi", | |
"for", | |
"while", | |
"until", | |
"in", | |
"do", | |
"done", | |
"case", | |
"esac", | |
"function", | |
"select" | |
]; | |
const LITERALS = [ | |
"true", | |
"false" | |
]; | |
// to consume paths to prevent keyword matches inside them | |
const PATH_MODE = { match: /(\/[a-z._-]+)+/ }; | |
// http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html | |
const SHELL_BUILT_INS = [ | |
"break", | |
"cd", | |
"continue", | |
"eval", | |
"exec", | |
"exit", | |
"export", | |
"getopts", | |
"hash", | |
"pwd", | |
"readonly", | |
"return", | |
"shift", | |
"test", | |
"times", | |
"trap", | |
"umask", | |
"unset" | |
]; | |
const BASH_BUILT_INS = [ | |
"alias", | |
"bind", | |
"builtin", | |
"caller", | |
"command", | |
"declare", | |
"echo", | |
"enable", | |
"help", | |
"let", | |
"local", | |
"logout", | |
"mapfile", | |
"printf", | |
"read", | |
"readarray", | |
"source", | |
"type", | |
"typeset", | |
"ulimit", | |
"unalias" | |
]; | |
const 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" | |
]; | |
const GNU_CORE_UTILS = [ | |
"chcon", | |
"chgrp", | |
"chown", | |
"chmod", | |
"cp", | |
"dd", | |
"df", | |
"dir", | |
"dircolors", | |
"ln", | |
"ls", | |
"mkdir", | |
"mkfifo", | |
"mknod", | |
"mktemp", | |
"mv", | |
"realpath", | |
"rm", | |
"rmdir", | |
"shred", | |
"sync", | |
"touch", | |
"truncate", | |
"vdir", | |
"b2sum", | |
"base32", | |
"base64", | |
"cat", | |
"cksum", | |
"comm", | |
"csplit", | |
"cut", | |
"expand", | |
"fmt", | |
"fold", | |
"head", | |
"join", | |
"md5sum", | |
"nl", | |
"numfmt", | |
"od", | |
"paste", | |
"ptx", | |
"pr", | |
"sha1sum", | |
"sha224sum", | |
"sha256sum", | |
"sha384sum", | |
"sha512sum", | |
"shuf", | |
"sort", | |
"split", | |
"sum", | |
"tac", | |
"tail", | |
"tr", | |
"tsort", | |
"unexpand", | |
"uniq", | |
"wc", | |
"arch", | |
"basename", | |
"chroot", | |
"date", | |
"dirname", | |
"du", | |
"echo", | |
"env", | |
"expr", | |
"factor", | |
// "false", // keyword literal already | |
"groups", | |
"hostid", | |
"id", | |
"link", | |
"logname", | |
"nice", | |
"nohup", | |
"nproc", | |
"pathchk", | |
"pinky", | |
"printenv", | |
"printf", | |
"pwd", | |
"readlink", | |
"runcon", | |
"seq", | |
"sleep", | |
"stat", | |
"stdbuf", | |
"stty", | |
"tee", | |
"test", | |
"timeout", | |
// "true", // keyword literal already | |
"tty", | |
"uname", | |
"unlink", | |
"uptime", | |
"users", | |
"who", | |
"whoami", | |
"yes" | |
]; | |
return { | |
name: 'Bash', | |
aliases: [ 'sh' ], | |
keywords: { | |
$pattern: /\b[a-z][a-z0-9._-]+\b/, | |
keyword: KEYWORDS, | |
literal: LITERALS, | |
built_in: [ | |
...SHELL_BUILT_INS, | |
...BASH_BUILT_INS, | |
// Shell modifiers | |
"set", | |
"shopt", | |
...ZSH_BUILT_INS, | |
...GNU_CORE_UTILS | |
] | |
}, | |
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, | |
PATH_MODE, | |
QUOTE_STRING, | |
ESCAPED_QUOTE, | |
APOS_STRING, | |
ESCAPED_APOS, | |
VAR | |
] | |
}; | |
} | |
export { bash as default }; | |