annotate .cms/lib/codemirror/mode/tiki/tiki.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
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 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 mod(require("../../lib/codemirror"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 define(["../../lib/codemirror"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 CodeMirror.defineMode('tiki', function(config) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 function inBlock(style, terminator, returnTokenizer) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 return function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 while (!stream.eol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 if (stream.match(terminator)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 state.tokenize = inText;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 if (returnTokenizer) state.tokenize = returnTokenizer;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 return style;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 function inLine(style) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 return function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 while(!stream.eol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 state.tokenize = inText;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 return style;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 function inText(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 function chain(parser) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 state.tokenize = parser;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 return parser(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 var sol = stream.sol();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 var ch = stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 //non start of line
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 switch (ch) { //switch is generally much faster than if, so it is used here
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 case "{": //plugin
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 stream.eat("/");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 stream.eatSpace();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 stream.eatWhile(/[^\s\u00a0=\"\'\/?(}]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 state.tokenize = inPlugin;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 return "tag";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 case "_": //bold
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 if (stream.eat("_"))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 return chain(inBlock("strong", "__", inText));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 case "'": //italics
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 if (stream.eat("'"))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 return chain(inBlock("em", "''", inText));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 case "(":// Wiki Link
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 if (stream.eat("("))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 return chain(inBlock("variable-2", "))", inText));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 case "[":// Weblink
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 return chain(inBlock("variable-3", "]", inText));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 case "|": //table
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 if (stream.eat("|"))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 return chain(inBlock("comment", "||"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 case "-":
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 if (stream.eat("=")) {//titleBar
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 return chain(inBlock("header string", "=-", inText));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 } else if (stream.eat("-")) {//deleted
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 return chain(inBlock("error tw-deleted", "--", inText));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 case "=": //underline
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 if (stream.match("=="))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 return chain(inBlock("tw-underline", "===", inText));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 case ":":
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 if (stream.eat(":"))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 return chain(inBlock("comment", "::"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 case "^": //box
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 return chain(inBlock("tw-box", "^"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 case "~": //np
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 if (stream.match("np~"))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 return chain(inBlock("meta", "~/np~"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 //start of line types
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 if (sol) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 switch (ch) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 case "!": //header at start of line
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 if (stream.match('!!!!!')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 return chain(inLine("header string"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 } else if (stream.match('!!!!')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 return chain(inLine("header string"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 } else if (stream.match('!!!')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 return chain(inLine("header string"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 } else if (stream.match('!!')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 return chain(inLine("header string"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 return chain(inLine("header string"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 case "*": //unordered list line item, or <li /> at start of line
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 case "#": //ordered list line item, or <li /> at start of line
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 case "+": //ordered list line item, or <li /> at start of line
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 return chain(inLine("tw-listitem bracket"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 var indentUnit = config.indentUnit;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 // Return variables for tokenizers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 var pluginName, type;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 function inPlugin(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 var ch = stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 var peek = stream.peek();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 if (ch == "}") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 state.tokenize = inText;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 //type = ch == ")" ? "endPlugin" : "selfclosePlugin"; inPlugin
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 return "tag";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 } else if (ch == "(" || ch == ")") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 return "bracket";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 } else if (ch == "=") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 type = "equals";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 if (peek == ">") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 peek = stream.peek();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 //here we detect values directly after equal character with no quotes
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 if (!/[\'\"]/.test(peek)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 state.tokenize = inAttributeNoQuote();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 //end detect values
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 return "operator";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 } else if (/[\'\"]/.test(ch)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 state.tokenize = inAttribute(ch);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 return state.tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 stream.eatWhile(/[^\s\u00a0=\"\'\/?]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 return "keyword";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 function inAttribute(quote) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 return function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 while (!stream.eol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 if (stream.next() == quote) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 state.tokenize = inPlugin;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 function inAttributeNoQuote() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 return function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 while (!stream.eol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 var ch = stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 var peek = stream.peek();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 if (ch == " " || ch == "," || /[ )}]/.test(peek)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 state.tokenize = inPlugin;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 var curState, setStyle;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 function pass() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 function cont() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199 pass.apply(null, arguments);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 return true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 function pushContext(pluginName, startOfLine) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 var noIndent = curState.context && curState.context.noIndent;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 curState.context = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 prev: curState.context,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 pluginName: pluginName,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 indent: curState.indented,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 startOfLine: startOfLine,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210 noIndent: noIndent
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 function popContext() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 if (curState.context) curState.context = curState.context.prev;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
218 function element(type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
219 if (type == "openPlugin") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
220 else if (type == "closePlugin") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
221 var err = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
222 if (curState.context) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
223 err = curState.context.pluginName != pluginName;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
224 popContext();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
225 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
226 err = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
227 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
228 if (err) setStyle = "error";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
229 return cont(endcloseplugin(err));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
230 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
231 else if (type == "string") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
232 if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
233 if (curState.tokenize == inText) popContext();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
234 return cont();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
235 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
236 else return cont();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
237 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
238
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
239 function endplugin(startOfLine) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
240 return function(type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
241 if (
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
242 type == "selfclosePlugin" ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
243 type == "endPlugin"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
244 )
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
245 return cont();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
246 if (type == "endPlugin") {pushContext(curState.pluginName, startOfLine); return cont();}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
247 return cont();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
248 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
249 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
250
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
251 function endcloseplugin(err) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
252 return function(type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
253 if (err) setStyle = "error";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
254 if (type == "endPlugin") return cont();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
255 return pass();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
256 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
257 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
258
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
259 function attributes(type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
260 if (type == "keyword") {setStyle = "attribute"; return cont(attributes);}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
261 if (type == "equals") return cont(attvalue, attributes);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
262 return pass();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
263 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
264 function attvalue(type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
265 if (type == "keyword") {setStyle = "string"; return cont();}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
266 if (type == "string") return cont(attvaluemaybe);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
267 return pass();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
268 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
269 function attvaluemaybe(type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
270 if (type == "string") return cont(attvaluemaybe);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
271 else return pass();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
272 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
273 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
274 startState: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
275 return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
276 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
277 token: function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
278 if (stream.sol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
279 state.startOfLine = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
280 state.indented = stream.indentation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
281 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
282 if (stream.eatSpace()) return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
283
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
284 setStyle = type = pluginName = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
285 var style = state.tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
286 if ((style || type) && style != "comment") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
287 curState = state;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
288 while (true) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
289 var comb = state.cc.pop() || element;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
290 if (comb(type || style)) break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
291 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
292 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
293 state.startOfLine = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
294 return setStyle || style;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
295 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
296 indent: function(state, textAfter) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
297 var context = state.context;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
298 if (context && context.noIndent) return 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
299 if (context && /^{\//.test(textAfter))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
300 context = context.prev;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
301 while (context && !context.startOfLine)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
302 context = context.prev;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
303 if (context) return context.indent + indentUnit;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
304 else return 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
305 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
306 electricChars: "/"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
307 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
308 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
309
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
310 CodeMirror.defineMIME("text/tiki", "tiki");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
311
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
312 });