annotate .cms/lib/codemirror/mode/pug/pug.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"), require("../javascript/javascript"), require("../css/css"), require("../htmlmixed/htmlmixed"));
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", "../javascript/javascript", "../css/css", "../htmlmixed/htmlmixed"], 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("pug", function (config) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 // token types
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 var KEYWORD = 'keyword';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 var DOCTYPE = 'meta';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 var ID = 'builtin';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 var CLASS = 'qualifier';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 var ATTRS_NEST = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 '{': '}',
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 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 var jsMode = CodeMirror.getMode(config, 'javascript');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 function State() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 this.javaScriptLine = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 this.javaScriptLineExcludesColon = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 this.javaScriptArguments = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 this.javaScriptArgumentsDepth = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 this.isInterpolating = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 this.interpolationNesting = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 this.jsState = CodeMirror.startState(jsMode);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 this.restOfLine = '';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 this.isIncludeFiltered = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 this.isEach = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 this.lastTag = '';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 this.scriptType = '';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 // Attributes Mode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 this.isAttrs = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 this.attrsNest = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 this.inAttributeName = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 this.attributeIsType = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 this.attrValue = '';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 // Indented Mode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 this.indentOf = Infinity;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 this.indentToken = '';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 this.innerMode = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 this.innerState = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 this.innerModeForLine = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 /**
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 * Safely copy a state
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 *
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 * @return {State}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 State.prototype.copy = function () {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 var res = new State();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 res.javaScriptLine = this.javaScriptLine;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 res.javaScriptLineExcludesColon = this.javaScriptLineExcludesColon;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 res.javaScriptArguments = this.javaScriptArguments;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 res.javaScriptArgumentsDepth = this.javaScriptArgumentsDepth;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 res.isInterpolating = this.isInterpolating;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 res.interpolationNesting = this.interpolationNesting;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 res.jsState = CodeMirror.copyState(jsMode, this.jsState);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 res.innerMode = this.innerMode;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 if (this.innerMode && this.innerState) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 res.innerState = CodeMirror.copyState(this.innerMode, this.innerState);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 res.restOfLine = this.restOfLine;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 res.isIncludeFiltered = this.isIncludeFiltered;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 res.isEach = this.isEach;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 res.lastTag = this.lastTag;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 res.scriptType = this.scriptType;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 res.isAttrs = this.isAttrs;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 res.attrsNest = this.attrsNest.slice();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 res.inAttributeName = this.inAttributeName;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 res.attributeIsType = this.attributeIsType;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 res.attrValue = this.attrValue;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 res.indentOf = this.indentOf;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 res.indentToken = this.indentToken;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 res.innerModeForLine = this.innerModeForLine;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 return res;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 function javaScript(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 if (stream.sol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 // if javaScriptLine was set at end of line, ignore it
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 state.javaScriptLine = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 state.javaScriptLineExcludesColon = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 if (state.javaScriptLine) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 if (state.javaScriptLineExcludesColon && stream.peek() === ':') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 state.javaScriptLine = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 state.javaScriptLineExcludesColon = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 var tok = jsMode.token(stream, state.jsState);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 if (stream.eol()) state.javaScriptLine = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 return tok || true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 function javaScriptArguments(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 if (state.javaScriptArguments) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 if (state.javaScriptArgumentsDepth === 0 && stream.peek() !== '(') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 state.javaScriptArguments = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 if (stream.peek() === '(') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 state.javaScriptArgumentsDepth++;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 } else if (stream.peek() === ')') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 state.javaScriptArgumentsDepth--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 if (state.javaScriptArgumentsDepth === 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 state.javaScriptArguments = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 return;
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 var tok = jsMode.token(stream, state.jsState);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 return tok || true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 function yieldStatement(stream) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 if (stream.match(/^yield\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 return 'keyword';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 function doctype(stream) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 if (stream.match(/^(?:doctype) *([^\n]+)?/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 return DOCTYPE;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 function interpolation(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 if (stream.match('#{')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 state.isInterpolating = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 state.interpolationNesting = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 return 'punctuation';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 function interpolationContinued(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 if (state.isInterpolating) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 if (stream.peek() === '}') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 state.interpolationNesting--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 if (state.interpolationNesting < 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 state.isInterpolating = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 return 'punctuation';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 } else if (stream.peek() === '{') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 state.interpolationNesting++;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 return jsMode.token(stream, state.jsState) || true;
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 caseStatement(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 if (stream.match(/^case\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 state.javaScriptLine = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 function when(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 if (stream.match(/^when\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 state.javaScriptLine = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 state.javaScriptLineExcludesColon = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 return KEYWORD;
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
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 function defaultStatement(stream) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 if (stream.match(/^default\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 function extendsStatement(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 if (stream.match(/^extends?\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 state.restOfLine = 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 function append(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 if (stream.match(/^append\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 state.restOfLine = 'variable';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210 return KEYWORD;
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 function prepend(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 if (stream.match(/^prepend\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 state.restOfLine = 'variable';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
218 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
219 function block(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
220 if (stream.match(/^block\b *(?:(prepend|append)\b)?/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
221 state.restOfLine = 'variable';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
222 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
223 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
224 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
225
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
226 function include(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
227 if (stream.match(/^include\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
228 state.restOfLine = 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
229 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
230 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
231 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
232
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
233 function includeFiltered(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
234 if (stream.match(/^include:([a-zA-Z0-9\-]+)/, false) && stream.match('include')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
235 state.isIncludeFiltered = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
236 return KEYWORD;
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
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
240 function includeFilteredContinued(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
241 if (state.isIncludeFiltered) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
242 var tok = filter(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
243 state.isIncludeFiltered = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
244 state.restOfLine = 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
245 return tok;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
246 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
247 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
248
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
249 function mixin(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
250 if (stream.match(/^mixin\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
251 state.javaScriptLine = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
252 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
253 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
254 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
255
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
256 function call(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
257 if (stream.match(/^\+([-\w]+)/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
258 if (!stream.match(/^\( *[-\w]+ *=/, false)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
259 state.javaScriptArguments = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
260 state.javaScriptArgumentsDepth = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
261 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
262 return 'variable';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
263 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
264 if (stream.match('+#{', false)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
265 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
266 state.mixinCallAfter = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
267 return interpolation(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
268 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
269 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
270 function callArguments(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
271 if (state.mixinCallAfter) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
272 state.mixinCallAfter = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
273 if (!stream.match(/^\( *[-\w]+ *=/, false)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
274 state.javaScriptArguments = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
275 state.javaScriptArgumentsDepth = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
276 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
277 return true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
278 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
279 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
280
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
281 function conditional(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
282 if (stream.match(/^(if|unless|else if|else)\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
283 state.javaScriptLine = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
284 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
285 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
286 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
287
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
288 function each(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
289 if (stream.match(/^(- *)?(each|for)\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
290 state.isEach = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
291 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
292 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
293 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
294 function eachContinued(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
295 if (state.isEach) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
296 if (stream.match(/^ in\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
297 state.javaScriptLine = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
298 state.isEach = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
299 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
300 } else if (stream.sol() || stream.eol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
301 state.isEach = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
302 } else if (stream.next()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
303 while (!stream.match(/^ in\b/, false) && stream.next());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
304 return 'variable';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
305 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
306 }
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 function whileStatement(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
310 if (stream.match(/^while\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
311 state.javaScriptLine = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
312 return KEYWORD;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
313 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
314 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
315
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
316 function tag(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
317 var captures;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
318 if (captures = stream.match(/^(\w(?:[-:\w]*\w)?)\/?/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
319 state.lastTag = captures[1].toLowerCase();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
320 if (state.lastTag === 'script') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
321 state.scriptType = 'application/javascript';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
322 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
323 return 'tag';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
324 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
325 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
326
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
327 function filter(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
328 if (stream.match(/^:([\w\-]+)/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
329 var innerMode;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
330 if (config && config.innerModes) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
331 innerMode = config.innerModes(stream.current().substring(1));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
332 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
333 if (!innerMode) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
334 innerMode = stream.current().substring(1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
335 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
336 if (typeof innerMode === 'string') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
337 innerMode = CodeMirror.getMode(config, innerMode);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
338 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
339 setInnerMode(stream, state, innerMode);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
340 return 'atom';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
341 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
342 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
343
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
344 function code(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
345 if (stream.match(/^(!?=|-)/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
346 state.javaScriptLine = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
347 return 'punctuation';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
348 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
349 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
350
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
351 function id(stream) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
352 if (stream.match(/^#([\w-]+)/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
353 return ID;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
354 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
355 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
356
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
357 function className(stream) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
358 if (stream.match(/^\.([\w-]+)/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
359 return CLASS;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
360 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
361 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
362
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
363 function attrs(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
364 if (stream.peek() == '(') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
365 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
366 state.isAttrs = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
367 state.attrsNest = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
368 state.inAttributeName = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
369 state.attrValue = '';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
370 state.attributeIsType = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
371 return 'punctuation';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
372 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
373 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
374
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
375 function attrsContinued(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
376 if (state.isAttrs) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
377 if (ATTRS_NEST[stream.peek()]) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
378 state.attrsNest.push(ATTRS_NEST[stream.peek()]);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
379 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
380 if (state.attrsNest[state.attrsNest.length - 1] === stream.peek()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
381 state.attrsNest.pop();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
382 } else if (stream.eat(')')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
383 state.isAttrs = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
384 return 'punctuation';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
385 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
386 if (state.inAttributeName && stream.match(/^[^=,\)!]+/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
387 if (stream.peek() === '=' || stream.peek() === '!') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
388 state.inAttributeName = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
389 state.jsState = CodeMirror.startState(jsMode);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
390 if (state.lastTag === 'script' && stream.current().trim().toLowerCase() === 'type') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
391 state.attributeIsType = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
392 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
393 state.attributeIsType = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
394 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
395 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
396 return 'attribute';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
397 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
398
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
399 var tok = jsMode.token(stream, state.jsState);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
400 if (state.attributeIsType && tok === 'string') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
401 state.scriptType = stream.current().toString();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
402 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
403 if (state.attrsNest.length === 0 && (tok === 'string' || tok === 'variable' || tok === 'keyword')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
404 try {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
405 Function('', 'var x ' + state.attrValue.replace(/,\s*$/, '').replace(/^!/, ''));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
406 state.inAttributeName = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
407 state.attrValue = '';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
408 stream.backUp(stream.current().length);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
409 return attrsContinued(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
410 } catch (ex) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
411 //not the end of an attribute
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
412 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
413 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
414 state.attrValue += stream.current();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
415 return tok || true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
416 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
417 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
418
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
419 function attributesBlock(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
420 if (stream.match(/^&attributes\b/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
421 state.javaScriptArguments = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
422 state.javaScriptArgumentsDepth = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
423 return 'keyword';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
424 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
425 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
426
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
427 function indent(stream) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
428 if (stream.sol() && stream.eatSpace()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
429 return 'indent';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
430 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
431 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
432
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
433 function comment(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
434 if (stream.match(/^ *\/\/(-)?([^\n]*)/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
435 state.indentOf = stream.indentation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
436 state.indentToken = 'comment';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
437 return 'comment';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
438 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
439 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
440
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
441 function colon(stream) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
442 if (stream.match(/^: */)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
443 return 'colon';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
444 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
445 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
446
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
447 function text(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
448 if (stream.match(/^(?:\| ?| )([^\n]+)/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
449 return 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
450 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
451 if (stream.match(/^(<[^\n]*)/, false)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
452 // html string
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
453 setInnerMode(stream, state, 'htmlmixed');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
454 state.innerModeForLine = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
455 return innerMode(stream, state, true);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
456 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
457 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
458
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
459 function dot(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
460 if (stream.eat('.')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
461 var innerMode = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
462 if (state.lastTag === 'script' && state.scriptType.toLowerCase().indexOf('javascript') != -1) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
463 innerMode = state.scriptType.toLowerCase().replace(/"|'/g, '');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
464 } else if (state.lastTag === 'style') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
465 innerMode = 'css';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
466 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
467 setInnerMode(stream, state, innerMode);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
468 return 'dot';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
469 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
470 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
471
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
472 function fail(stream) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
473 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
474 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
475 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
476
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
477
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
478 function setInnerMode(stream, state, mode) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
479 mode = CodeMirror.mimeModes[mode] || mode;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
480 mode = config.innerModes ? config.innerModes(mode) || mode : mode;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
481 mode = CodeMirror.mimeModes[mode] || mode;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
482 mode = CodeMirror.getMode(config, mode);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
483 state.indentOf = stream.indentation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
484
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
485 if (mode && mode.name !== 'null') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
486 state.innerMode = mode;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
487 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
488 state.indentToken = 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
489 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
490 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
491 function innerMode(stream, state, force) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
492 if (stream.indentation() > state.indentOf || (state.innerModeForLine && !stream.sol()) || force) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
493 if (state.innerMode) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
494 if (!state.innerState) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
495 state.innerState = state.innerMode.startState ? CodeMirror.startState(state.innerMode, stream.indentation()) : {};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
496 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
497 return stream.hideFirstChars(state.indentOf + 2, function () {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
498 return state.innerMode.token(stream, state.innerState) || true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
499 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
500 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
501 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
502 return state.indentToken;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
503 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
504 } else if (stream.sol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
505 state.indentOf = Infinity;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
506 state.indentToken = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
507 state.innerMode = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
508 state.innerState = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
509 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
510 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
511 function restOfLine(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
512 if (stream.sol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
513 // if restOfLine was set at end of line, ignore it
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
514 state.restOfLine = '';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
515 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
516 if (state.restOfLine) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
517 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
518 var tok = state.restOfLine;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
519 state.restOfLine = '';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
520 return tok;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
521 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
522 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
523
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
524
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
525 function startState() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
526 return new State();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
527 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
528 function copyState(state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
529 return state.copy();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
530 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
531 /**
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
532 * Get the next token in the stream
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
533 *
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
534 * @param {Stream} stream
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
535 * @param {State} state
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
536 */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
537 function nextToken(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
538 var tok = innerMode(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
539 || restOfLine(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
540 || interpolationContinued(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
541 || includeFilteredContinued(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
542 || eachContinued(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
543 || attrsContinued(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
544 || javaScript(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
545 || javaScriptArguments(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
546 || callArguments(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
547
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
548 || yieldStatement(stream)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
549 || doctype(stream)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
550 || interpolation(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
551 || caseStatement(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
552 || when(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
553 || defaultStatement(stream)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
554 || extendsStatement(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
555 || append(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
556 || prepend(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
557 || block(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
558 || include(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
559 || includeFiltered(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
560 || mixin(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
561 || call(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
562 || conditional(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
563 || each(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
564 || whileStatement(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
565 || tag(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
566 || filter(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
567 || code(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
568 || id(stream)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
569 || className(stream)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
570 || attrs(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
571 || attributesBlock(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
572 || indent(stream)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
573 || text(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
574 || comment(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
575 || colon(stream)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
576 || dot(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
577 || fail(stream);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
578
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
579 return tok === true ? null : tok;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
580 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
581 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
582 startState: startState,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
583 copyState: copyState,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
584 token: nextToken
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
585 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
586 }, 'javascript', 'css', 'htmlmixed');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
587
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
588 CodeMirror.defineMIME('text/x-pug', 'pug');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
589 CodeMirror.defineMIME('text/x-jade', 'pug');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
590
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
591 });