| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 | /** * @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: BashAuthor: 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;
 |