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.

116 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;