116 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.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 } re
 | |
|  * @returns {string}
 | |
|  */
 | |
| function optional(re) {
 | |
|   return concat('(', re, ')?');
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @param {...(RegExp | string) } args
 | |
|  * @returns {string}
 | |
|  */
 | |
| function concat(...args) {
 | |
|   const joined = args.map((x) => source(x)).join("");
 | |
|   return joined;
 | |
| }
 | |
| 
 | |
| /*
 | |
| Language: Tcl
 | |
| Description: Tcl is a very simple programming language.
 | |
| Author: Radek Liska <radekliska@gmail.com>
 | |
| Website: https://www.tcl.tk/about/language.html
 | |
| */
 | |
| 
 | |
| function tcl(hljs) {
 | |
|   const TCL_IDENT = /[a-zA-Z_][a-zA-Z0-9_]*/;
 | |
| 
 | |
|   const NUMBER = {
 | |
|     className: 'number',
 | |
|     variants: [hljs.BINARY_NUMBER_MODE, hljs.C_NUMBER_MODE]
 | |
|   };
 | |
| 
 | |
|   return {
 | |
|     name: 'Tcl',
 | |
|     aliases: ['tk'],
 | |
|     keywords: 'after append apply array auto_execok auto_import auto_load auto_mkindex ' +
 | |
|       'auto_mkindex_old auto_qualify auto_reset bgerror binary break catch cd chan clock ' +
 | |
|       'close concat continue dde dict encoding eof error eval exec exit expr fblocked ' +
 | |
|       'fconfigure fcopy file fileevent filename flush for foreach format gets glob global ' +
 | |
|       'history http if incr info interp join lappend|10 lassign|10 lindex|10 linsert|10 list ' +
 | |
|       'llength|10 load lrange|10 lrepeat|10 lreplace|10 lreverse|10 lsearch|10 lset|10 lsort|10 '+
 | |
|       'mathfunc mathop memory msgcat namespace open package parray pid pkg::create pkg_mkIndex '+
 | |
|       'platform platform::shell proc puts pwd read refchan regexp registry regsub|10 rename '+
 | |
|       'return safe scan seek set socket source split string subst switch tcl_endOfWord '+
 | |
|       'tcl_findLibrary tcl_startOfNextWord tcl_startOfPreviousWord tcl_wordBreakAfter '+
 | |
|       'tcl_wordBreakBefore tcltest tclvars tell time tm trace unknown unload unset update '+
 | |
|       'uplevel upvar variable vwait while',
 | |
|     contains: [
 | |
|       hljs.COMMENT(';[ \\t]*#', '$'),
 | |
|       hljs.COMMENT('^[ \\t]*#', '$'),
 | |
|       {
 | |
|         beginKeywords: 'proc',
 | |
|         end: '[\\{]',
 | |
|         excludeEnd: true,
 | |
|         contains: [
 | |
|           {
 | |
|             className: 'title',
 | |
|             begin: '[ \\t\\n\\r]+(::)?[a-zA-Z_]((::)?[a-zA-Z0-9_])*',
 | |
|             end: '[ \\t\\n\\r]',
 | |
|             endsWithParent: true,
 | |
|             excludeEnd: true
 | |
|           }
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         className: "variable",
 | |
|         variants: [
 | |
|           {
 | |
|             begin: concat(
 | |
|               /\$/,
 | |
|               optional(/::/),
 | |
|               TCL_IDENT,
 | |
|               '(::',
 | |
|               TCL_IDENT,
 | |
|               ')*'
 | |
|             )
 | |
|           },
 | |
|           {
 | |
|             begin: '\\$\\{(::)?[a-zA-Z_]((::)?[a-zA-Z0-9_])*',
 | |
|             end: '\\}',
 | |
|             contains: [
 | |
|               NUMBER
 | |
|             ]
 | |
|           }
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         className: 'string',
 | |
|         contains: [hljs.BACKSLASH_ESCAPE],
 | |
|         variants: [
 | |
|           hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null})
 | |
|         ]
 | |
|       },
 | |
|       NUMBER
 | |
|     ]
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = tcl;
 |