highlight.js
Version:
Syntax highlighting with language autodetection.
226 lines (215 loc) • 3.86 kB
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]
};
const 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"
];
return {
name: 'Tcl',
aliases: ['tk'],
keywords: KEYWORDS,
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;