annotate .cms/lib/codemirror/mode/tcl/tcl.js @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents 78edf6b517a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 //tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 mod(require("../../lib/codemirror"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 define(["../../lib/codemirror"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 CodeMirror.defineMode("tcl", function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 function parseWords(str) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 var obj = {}, words = str.split(" ");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 return obj;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 var keywords = parseWords("Tcl safe after append array auto_execok auto_import auto_load " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 "auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 "binary break catch cd close concat continue dde eof encoding error " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 "eval exec exit expr fblocked fconfigure fcopy file fileevent filename " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 "filename flush for foreach format gets glob global history http if " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 "incr info interp join lappend lindex linsert list llength load lrange " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 "lreplace lsearch lset lsort memory msgcat namespace open package parray " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 "pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 "registry regsub rename resource return scan seek set socket source split " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 "string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 "tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 "tclvars tell time trace unknown unset update uplevel upvar variable " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 "vwait");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 var isOperatorChar = /[+\-*&%=<>!?^\/\|]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 function chain(stream, state, f) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 state.tokenize = f;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 return f(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 function tokenBase(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 var beforeParams = state.beforeParams;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 state.beforeParams = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 var ch = stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 if ((ch == '"' || ch == "'") && state.inParams) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 return chain(stream, state, tokenString(ch));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 } else if (/[\[\]{}\(\),;\.]/.test(ch)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 if (ch == "(" && beforeParams) state.inParams = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 else if (ch == ")") state.inParams = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 } else if (/\d/.test(ch)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 stream.eatWhile(/[\w\.]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 return "number";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 } else if (ch == "#") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 if (stream.eat("*"))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 return chain(stream, state, tokenComment);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 if (ch == "#" && stream.match(/ *\[ *\[/))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 return chain(stream, state, tokenUnparsed);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 return "comment";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 } else if (ch == '"') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 stream.skipTo(/"/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 return "comment";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 } else if (ch == "$") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 stream.eatWhile(/[$_a-z0-9A-Z\.{:]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 stream.eatWhile(/}/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 state.beforeParams = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 return "builtin";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 } else if (isOperatorChar.test(ch)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 stream.eatWhile(isOperatorChar);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 return "comment";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 stream.eatWhile(/[\w\$_{}\xa1-\uffff]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 var word = stream.current().toLowerCase();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 if (keywords && keywords.propertyIsEnumerable(word))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 return "keyword";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 if (functions && functions.propertyIsEnumerable(word)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 state.beforeParams = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 return "keyword";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 function tokenString(quote) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 return function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 var escaped = false, next, end = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 while ((next = stream.next()) != null) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 if (next == quote && !escaped) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 end = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 escaped = !escaped && next == "\\";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 if (end) state.tokenize = tokenBase;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 function tokenComment(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 var maybeEnd = false, ch;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 while (ch = stream.next()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 if (ch == "#" && maybeEnd) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 state.tokenize = tokenBase;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 maybeEnd = (ch == "*");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 return "comment";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 function tokenUnparsed(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 var maybeEnd = 0, ch;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 while (ch = stream.next()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 if (ch == "#" && maybeEnd == 2) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 state.tokenize = tokenBase;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 if (ch == "]")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 maybeEnd++;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 else if (ch != " ")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 maybeEnd = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 return "meta";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 startState: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 tokenize: tokenBase,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 beforeParams: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 inParams: false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 token: function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 if (stream.eatSpace()) return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 return state.tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 lineComment: "#"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 CodeMirror.defineMIME("text/x-tcl", "tcl");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 });