You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.0 KiB
115 lines
3.0 KiB
/** |
|
* @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;
|
|
|