170 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @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;
 |