/* Language: Bash Author: vah Contributrors: Benjamin Pannell 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 = { 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 }; const KEYWORDS = [ "if", "then", "else", "elif", "fi", "for", "while", "in", "do", "done", "case", "esac", "function" ]; 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, VAR ] }; } export { bash as default };