tcl.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /*
  2. Language: Tcl
  3. Description: Tcl is a very simple programming language.
  4. Author: Radek Liska <radekliska@gmail.com>
  5. Website: https://www.tcl.tk/about/language.html
  6. */
  7. function tcl(hljs) {
  8. const regex = hljs.regex;
  9. const TCL_IDENT = /[a-zA-Z_][a-zA-Z0-9_]*/;
  10. const NUMBER = {
  11. className: 'number',
  12. variants: [
  13. hljs.BINARY_NUMBER_MODE,
  14. hljs.C_NUMBER_MODE
  15. ]
  16. };
  17. const KEYWORDS = [
  18. "after",
  19. "append",
  20. "apply",
  21. "array",
  22. "auto_execok",
  23. "auto_import",
  24. "auto_load",
  25. "auto_mkindex",
  26. "auto_mkindex_old",
  27. "auto_qualify",
  28. "auto_reset",
  29. "bgerror",
  30. "binary",
  31. "break",
  32. "catch",
  33. "cd",
  34. "chan",
  35. "clock",
  36. "close",
  37. "concat",
  38. "continue",
  39. "dde",
  40. "dict",
  41. "encoding",
  42. "eof",
  43. "error",
  44. "eval",
  45. "exec",
  46. "exit",
  47. "expr",
  48. "fblocked",
  49. "fconfigure",
  50. "fcopy",
  51. "file",
  52. "fileevent",
  53. "filename",
  54. "flush",
  55. "for",
  56. "foreach",
  57. "format",
  58. "gets",
  59. "glob",
  60. "global",
  61. "history",
  62. "http",
  63. "if",
  64. "incr",
  65. "info",
  66. "interp",
  67. "join",
  68. "lappend|10",
  69. "lassign|10",
  70. "lindex|10",
  71. "linsert|10",
  72. "list",
  73. "llength|10",
  74. "load",
  75. "lrange|10",
  76. "lrepeat|10",
  77. "lreplace|10",
  78. "lreverse|10",
  79. "lsearch|10",
  80. "lset|10",
  81. "lsort|10",
  82. "mathfunc",
  83. "mathop",
  84. "memory",
  85. "msgcat",
  86. "namespace",
  87. "open",
  88. "package",
  89. "parray",
  90. "pid",
  91. "pkg::create",
  92. "pkg_mkIndex",
  93. "platform",
  94. "platform::shell",
  95. "proc",
  96. "puts",
  97. "pwd",
  98. "read",
  99. "refchan",
  100. "regexp",
  101. "registry",
  102. "regsub|10",
  103. "rename",
  104. "return",
  105. "safe",
  106. "scan",
  107. "seek",
  108. "set",
  109. "socket",
  110. "source",
  111. "split",
  112. "string",
  113. "subst",
  114. "switch",
  115. "tcl_endOfWord",
  116. "tcl_findLibrary",
  117. "tcl_startOfNextWord",
  118. "tcl_startOfPreviousWord",
  119. "tcl_wordBreakAfter",
  120. "tcl_wordBreakBefore",
  121. "tcltest",
  122. "tclvars",
  123. "tell",
  124. "time",
  125. "tm",
  126. "trace",
  127. "unknown",
  128. "unload",
  129. "unset",
  130. "update",
  131. "uplevel",
  132. "upvar",
  133. "variable",
  134. "vwait",
  135. "while"
  136. ];
  137. return {
  138. name: 'Tcl',
  139. aliases: [ 'tk' ],
  140. keywords: KEYWORDS,
  141. contains: [
  142. hljs.COMMENT(';[ \\t]*#', '$'),
  143. hljs.COMMENT('^[ \\t]*#', '$'),
  144. {
  145. beginKeywords: 'proc',
  146. end: '[\\{]',
  147. excludeEnd: true,
  148. contains: [
  149. {
  150. className: 'title',
  151. begin: '[ \\t\\n\\r]+(::)?[a-zA-Z_]((::)?[a-zA-Z0-9_])*',
  152. end: '[ \\t\\n\\r]',
  153. endsWithParent: true,
  154. excludeEnd: true
  155. }
  156. ]
  157. },
  158. {
  159. className: "variable",
  160. variants: [
  161. { begin: regex.concat(
  162. /\$/,
  163. regex.optional(/::/),
  164. TCL_IDENT,
  165. '(::',
  166. TCL_IDENT,
  167. ')*'
  168. ) },
  169. {
  170. begin: '\\$\\{(::)?[a-zA-Z_]((::)?[a-zA-Z0-9_])*',
  171. end: '\\}',
  172. contains: [ NUMBER ]
  173. }
  174. ]
  175. },
  176. {
  177. className: 'string',
  178. contains: [ hljs.BACKSLASH_ESCAPE ],
  179. variants: [ hljs.inherit(hljs.QUOTE_STRING_MODE, { illegal: null }) ]
  180. },
  181. NUMBER
  182. ]
  183. };
  184. }
  185. module.exports = tcl;