scripts/CodeMirror/mode/css/css.js (view raw)
1// CodeMirror, copyright (c) by Marijn Haverbeke and others
2// Distributed under an MIT license: https://codemirror.net/LICENSE
3
4(function(mod) {
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
6 mod(require("../../lib/codemirror"));
7 else if (typeof define == "function" && define.amd) // AMD
8 define(["../../lib/codemirror"], mod);
9 else // Plain browser env
10 mod(CodeMirror);
11})(function(CodeMirror) {
12"use strict";
13
14CodeMirror.defineMode("css", function(config, parserConfig) {
15 var inline = parserConfig.inline
16 if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css");
17
18 var indentUnit = config.indentUnit,
19 tokenHooks = parserConfig.tokenHooks,
20 documentTypes = parserConfig.documentTypes || {},
21 mediaTypes = parserConfig.mediaTypes || {},
22 mediaFeatures = parserConfig.mediaFeatures || {},
23 mediaValueKeywords = parserConfig.mediaValueKeywords || {},
24 propertyKeywords = parserConfig.propertyKeywords || {},
25 nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},
26 fontProperties = parserConfig.fontProperties || {},
27 counterDescriptors = parserConfig.counterDescriptors || {},
28 colorKeywords = parserConfig.colorKeywords || {},
29 valueKeywords = parserConfig.valueKeywords || {},
30 allowNested = parserConfig.allowNested,
31 lineComment = parserConfig.lineComment,
32 supportsAtComponent = parserConfig.supportsAtComponent === true;
33
34 var type, override;
35 function ret(style, tp) { type = tp; return style; }
36
37 // Tokenizers
38
39 function tokenBase(stream, state) {
40 var ch = stream.next();
41 if (tokenHooks[ch]) {
42 var result = tokenHooks[ch](stream, state);
43 if (result !== false) return result;
44 }
45 if (ch == "@") {
46 stream.eatWhile(/[\w\\\-]/);
47 return ret("def", stream.current());
48 } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) {
49 return ret(null, "compare");
50 } else if (ch == "\"" || ch == "'") {
51 state.tokenize = tokenString(ch);
52 return state.tokenize(stream, state);
53 } else if (ch == "#") {
54 stream.eatWhile(/[\w\\\-]/);
55 return ret("atom", "hash");
56 } else if (ch == "!") {
57 stream.match(/^\s*\w*/);
58 return ret("keyword", "important");
59 } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) {
60 stream.eatWhile(/[\w.%]/);
61 return ret("number", "unit");
62 } else if (ch === "-") {
63 if (/[\d.]/.test(stream.peek())) {
64 stream.eatWhile(/[\w.%]/);
65 return ret("number", "unit");
66 } else if (stream.match(/^-[\w\\\-]*/)) {
67 stream.eatWhile(/[\w\\\-]/);
68 if (stream.match(/^\s*:/, false))
69 return ret("variable-2", "variable-definition");
70 return ret("variable-2", "variable");
71 } else if (stream.match(/^\w+-/)) {
72 return ret("meta", "meta");
73 }
74 } else if (/[,+>*\/]/.test(ch)) {
75 return ret(null, "select-op");
76 } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {
77 return ret("qualifier", "qualifier");
78 } else if (/[:;{}\[\]\(\)]/.test(ch)) {
79 return ret(null, ch);
80 } else if (stream.match(/[\w-.]+(?=\()/)) {
81 if (/^(url(-prefix)?|domain|regexp)$/.test(stream.current().toLowerCase())) {
82 state.tokenize = tokenParenthesized;
83 }
84 return ret("variable callee", "variable");
85 } else if (/[\w\\\-]/.test(ch)) {
86 stream.eatWhile(/[\w\\\-]/);
87 return ret("property", "word");
88 } else {
89 return ret(null, null);
90 }
91 }
92
93 function tokenString(quote) {
94 return function(stream, state) {
95 var escaped = false, ch;
96 while ((ch = stream.next()) != null) {
97 if (ch == quote && !escaped) {
98 if (quote == ")") stream.backUp(1);
99 break;
100 }
101 escaped = !escaped && ch == "\\";
102 }
103 if (ch == quote || !escaped && quote != ")") state.tokenize = null;
104 return ret("string", "string");
105 };
106 }
107
108 function tokenParenthesized(stream, state) {
109 stream.next(); // Must be '('
110 if (!stream.match(/\s*[\"\')]/, false))
111 state.tokenize = tokenString(")");
112 else
113 state.tokenize = null;
114 return ret(null, "(");
115 }
116
117 // Context management
118
119 function Context(type, indent, prev) {
120 this.type = type;
121 this.indent = indent;
122 this.prev = prev;
123 }
124
125 function pushContext(state, stream, type, indent) {
126 state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context);
127 return type;
128 }
129
130 function popContext(state) {
131 if (state.context.prev)
132 state.context = state.context.prev;
133 return state.context.type;
134 }
135
136 function pass(type, stream, state) {
137 return states[state.context.type](type, stream, state);
138 }
139 function popAndPass(type, stream, state, n) {
140 for (var i = n || 1; i > 0; i--)
141 state.context = state.context.prev;
142 return pass(type, stream, state);
143 }
144
145 // Parser
146
147 function wordAsValue(stream) {
148 var word = stream.current().toLowerCase();
149 if (valueKeywords.hasOwnProperty(word))
150 override = "atom";
151 else if (colorKeywords.hasOwnProperty(word))
152 override = "keyword";
153 else
154 override = "variable";
155 }
156
157 var states = {};
158
159 states.top = function(type, stream, state) {
160 if (type == "{") {
161 return pushContext(state, stream, "block");
162 } else if (type == "}" && state.context.prev) {
163 return popContext(state);
164 } else if (supportsAtComponent && /@component/i.test(type)) {
165 return pushContext(state, stream, "atComponentBlock");
166 } else if (/^@(-moz-)?document$/i.test(type)) {
167 return pushContext(state, stream, "documentTypes");
168 } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) {
169 return pushContext(state, stream, "atBlock");
170 } else if (/^@(font-face|counter-style)/i.test(type)) {
171 state.stateArg = type;
172 return "restricted_atBlock_before";
173 } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) {
174 return "keyframes";
175 } else if (type && type.charAt(0) == "@") {
176 return pushContext(state, stream, "at");
177 } else if (type == "hash") {
178 override = "builtin";
179 } else if (type == "word") {
180 override = "tag";
181 } else if (type == "variable-definition") {
182 return "maybeprop";
183 } else if (type == "interpolation") {
184 return pushContext(state, stream, "interpolation");
185 } else if (type == ":") {
186 return "pseudo";
187 } else if (allowNested && type == "(") {
188 return pushContext(state, stream, "parens");
189 }
190 return state.context.type;
191 };
192
193 states.block = function(type, stream, state) {
194 if (type == "word") {
195 var word = stream.current().toLowerCase();
196 if (propertyKeywords.hasOwnProperty(word)) {
197 override = "property";
198 return "maybeprop";
199 } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {
200 override = "string-2";
201 return "maybeprop";
202 } else if (allowNested) {
203 override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag";
204 return "block";
205 } else {
206 override += " error";
207 return "maybeprop";
208 }
209 } else if (type == "meta") {
210 return "block";
211 } else if (!allowNested && (type == "hash" || type == "qualifier")) {
212 override = "error";
213 return "block";
214 } else {
215 return states.top(type, stream, state);
216 }
217 };
218
219 states.maybeprop = function(type, stream, state) {
220 if (type == ":") return pushContext(state, stream, "prop");
221 return pass(type, stream, state);
222 };
223
224 states.prop = function(type, stream, state) {
225 if (type == ";") return popContext(state);
226 if (type == "{" && allowNested) return pushContext(state, stream, "propBlock");
227 if (type == "}" || type == "{") return popAndPass(type, stream, state);
228 if (type == "(") return pushContext(state, stream, "parens");
229
230 if (type == "hash" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) {
231 override += " error";
232 } else if (type == "word") {
233 wordAsValue(stream);
234 } else if (type == "interpolation") {
235 return pushContext(state, stream, "interpolation");
236 }
237 return "prop";
238 };
239
240 states.propBlock = function(type, _stream, state) {
241 if (type == "}") return popContext(state);
242 if (type == "word") { override = "property"; return "maybeprop"; }
243 return state.context.type;
244 };
245
246 states.parens = function(type, stream, state) {
247 if (type == "{" || type == "}") return popAndPass(type, stream, state);
248 if (type == ")") return popContext(state);
249 if (type == "(") return pushContext(state, stream, "parens");
250 if (type == "interpolation") return pushContext(state, stream, "interpolation");
251 if (type == "word") wordAsValue(stream);
252 return "parens";
253 };
254
255 states.pseudo = function(type, stream, state) {
256 if (type == "meta") return "pseudo";
257
258 if (type == "word") {
259 override = "variable-3";
260 return state.context.type;
261 }
262 return pass(type, stream, state);
263 };
264
265 states.documentTypes = function(type, stream, state) {
266 if (type == "word" && documentTypes.hasOwnProperty(stream.current())) {
267 override = "tag";
268 return state.context.type;
269 } else {
270 return states.atBlock(type, stream, state);
271 }
272 };
273
274 states.atBlock = function(type, stream, state) {
275 if (type == "(") return pushContext(state, stream, "atBlock_parens");
276 if (type == "}" || type == ";") return popAndPass(type, stream, state);
277 if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top");
278
279 if (type == "interpolation") return pushContext(state, stream, "interpolation");
280
281 if (type == "word") {
282 var word = stream.current().toLowerCase();
283 if (word == "only" || word == "not" || word == "and" || word == "or")
284 override = "keyword";
285 else if (mediaTypes.hasOwnProperty(word))
286 override = "attribute";
287 else if (mediaFeatures.hasOwnProperty(word))
288 override = "property";
289 else if (mediaValueKeywords.hasOwnProperty(word))
290 override = "keyword";
291 else if (propertyKeywords.hasOwnProperty(word))
292 override = "property";
293 else if (nonStandardPropertyKeywords.hasOwnProperty(word))
294 override = "string-2";
295 else if (valueKeywords.hasOwnProperty(word))
296 override = "atom";
297 else if (colorKeywords.hasOwnProperty(word))
298 override = "keyword";
299 else
300 override = "error";
301 }
302 return state.context.type;
303 };
304
305 states.atComponentBlock = function(type, stream, state) {
306 if (type == "}")
307 return popAndPass(type, stream, state);
308 if (type == "{")
309 return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false);
310 if (type == "word")
311 override = "error";
312 return state.context.type;
313 };
314
315 states.atBlock_parens = function(type, stream, state) {
316 if (type == ")") return popContext(state);
317 if (type == "{" || type == "}") return popAndPass(type, stream, state, 2);
318 return states.atBlock(type, stream, state);
319 };
320
321 states.restricted_atBlock_before = function(type, stream, state) {
322 if (type == "{")
323 return pushContext(state, stream, "restricted_atBlock");
324 if (type == "word" && state.stateArg == "@counter-style") {
325 override = "variable";
326 return "restricted_atBlock_before";
327 }
328 return pass(type, stream, state);
329 };
330
331 states.restricted_atBlock = function(type, stream, state) {
332 if (type == "}") {
333 state.stateArg = null;
334 return popContext(state);
335 }
336 if (type == "word") {
337 if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) ||
338 (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase())))
339 override = "error";
340 else
341 override = "property";
342 return "maybeprop";
343 }
344 return "restricted_atBlock";
345 };
346
347 states.keyframes = function(type, stream, state) {
348 if (type == "word") { override = "variable"; return "keyframes"; }
349 if (type == "{") return pushContext(state, stream, "top");
350 return pass(type, stream, state);
351 };
352
353 states.at = function(type, stream, state) {
354 if (type == ";") return popContext(state);
355 if (type == "{" || type == "}") return popAndPass(type, stream, state);
356 if (type == "word") override = "tag";
357 else if (type == "hash") override = "builtin";
358 return "at";
359 };
360
361 states.interpolation = function(type, stream, state) {
362 if (type == "}") return popContext(state);
363 if (type == "{" || type == ";") return popAndPass(type, stream, state);
364 if (type == "word") override = "variable";
365 else if (type != "variable" && type != "(" && type != ")") override = "error";
366 return "interpolation";
367 };
368
369 return {
370 startState: function(base) {
371 return {tokenize: null,
372 state: inline ? "block" : "top",
373 stateArg: null,
374 context: new Context(inline ? "block" : "top", base || 0, null)};
375 },
376
377 token: function(stream, state) {
378 if (!state.tokenize && stream.eatSpace()) return null;
379 var style = (state.tokenize || tokenBase)(stream, state);
380 if (style && typeof style == "object") {
381 type = style[1];
382 style = style[0];
383 }
384 override = style;
385 if (type != "comment")
386 state.state = states[state.state](type, stream, state);
387 return override;
388 },
389
390 indent: function(state, textAfter) {
391 var cx = state.context, ch = textAfter && textAfter.charAt(0);
392 var indent = cx.indent;
393 if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev;
394 if (cx.prev) {
395 if (ch == "}" && (cx.type == "block" || cx.type == "top" ||
396 cx.type == "interpolation" || cx.type == "restricted_atBlock")) {
397 // Resume indentation from parent context.
398 cx = cx.prev;
399 indent = cx.indent;
400 } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") ||
401 ch == "{" && (cx.type == "at" || cx.type == "atBlock")) {
402 // Dedent relative to current context.
403 indent = Math.max(0, cx.indent - indentUnit);
404 }
405 }
406 return indent;
407 },
408
409 electricChars: "}",
410 blockCommentStart: "/*",
411 blockCommentEnd: "*/",
412 blockCommentContinue: " * ",
413 lineComment: lineComment,
414 fold: "brace"
415 };
416});
417
418 function keySet(array) {
419 var keys = {};
420 for (var i = 0; i < array.length; ++i) {
421 keys[array[i].toLowerCase()] = true;
422 }
423 return keys;
424 }
425
426 var documentTypes_ = [
427 "domain", "regexp", "url", "url-prefix"
428 ], documentTypes = keySet(documentTypes_);
429
430 var mediaTypes_ = [
431 "all", "aural", "braille", "handheld", "print", "projection", "screen",
432 "tty", "tv", "embossed"
433 ], mediaTypes = keySet(mediaTypes_);
434
435 var mediaFeatures_ = [
436 "width", "min-width", "max-width", "height", "min-height", "max-height",
437 "device-width", "min-device-width", "max-device-width", "device-height",
438 "min-device-height", "max-device-height", "aspect-ratio",
439 "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio",
440 "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color",
441 "max-color", "color-index", "min-color-index", "max-color-index",
442 "monochrome", "min-monochrome", "max-monochrome", "resolution",
443 "min-resolution", "max-resolution", "scan", "grid", "orientation",
444 "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio",
445 "pointer", "any-pointer", "hover", "any-hover", "prefers-color-scheme"
446 ], mediaFeatures = keySet(mediaFeatures_);
447
448 var mediaValueKeywords_ = [
449 "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover",
450 "interlace", "progressive",
451 "dark", "light"
452 ], mediaValueKeywords = keySet(mediaValueKeywords_);
453
454 var propertyKeywords_ = [
455 "align-content", "align-items", "align-self", "alignment-adjust",
456 "alignment-baseline", "all", "anchor-point", "animation", "animation-delay",
457 "animation-direction", "animation-duration", "animation-fill-mode",
458 "animation-iteration-count", "animation-name", "animation-play-state",
459 "animation-timing-function", "appearance", "azimuth", "backdrop-filter",
460 "backface-visibility", "background", "background-attachment",
461 "background-blend-mode", "background-clip", "background-color",
462 "background-image", "background-origin", "background-position",
463 "background-position-x", "background-position-y", "background-repeat",
464 "background-size", "baseline-shift", "binding", "bleed", "block-size",
465 "bookmark-label", "bookmark-level", "bookmark-state", "bookmark-target",
466 "border", "border-bottom", "border-bottom-color", "border-bottom-left-radius",
467 "border-bottom-right-radius", "border-bottom-style", "border-bottom-width",
468 "border-collapse", "border-color", "border-image", "border-image-outset",
469 "border-image-repeat", "border-image-slice", "border-image-source",
470 "border-image-width", "border-left", "border-left-color", "border-left-style",
471 "border-left-width", "border-radius", "border-right", "border-right-color",
472 "border-right-style", "border-right-width", "border-spacing", "border-style",
473 "border-top", "border-top-color", "border-top-left-radius",
474 "border-top-right-radius", "border-top-style", "border-top-width",
475 "border-width", "bottom", "box-decoration-break", "box-shadow", "box-sizing",
476 "break-after", "break-before", "break-inside", "caption-side", "caret-color",
477 "clear", "clip", "color", "color-profile", "column-count", "column-fill",
478 "column-gap", "column-rule", "column-rule-color", "column-rule-style",
479 "column-rule-width", "column-span", "column-width", "columns", "contain",
480 "content", "counter-increment", "counter-reset", "crop", "cue", "cue-after",
481 "cue-before", "cursor", "direction", "display", "dominant-baseline",
482 "drop-initial-after-adjust", "drop-initial-after-align",
483 "drop-initial-before-adjust", "drop-initial-before-align", "drop-initial-size",
484 "drop-initial-value", "elevation", "empty-cells", "fit", "fit-position",
485 "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow",
486 "flex-shrink", "flex-wrap", "float", "float-offset", "flow-from", "flow-into",
487 "font", "font-family", "font-feature-settings", "font-kerning",
488 "font-language-override", "font-optical-sizing", "font-size",
489 "font-size-adjust", "font-stretch", "font-style", "font-synthesis",
490 "font-variant", "font-variant-alternates", "font-variant-caps",
491 "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric",
492 "font-variant-position", "font-variation-settings", "font-weight", "gap",
493 "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", "grid-auto-rows",
494 "grid-column", "grid-column-end", "grid-column-gap", "grid-column-start",
495 "grid-gap", "grid-row", "grid-row-end", "grid-row-gap", "grid-row-start",
496 "grid-template", "grid-template-areas", "grid-template-columns",
497 "grid-template-rows", "hanging-punctuation", "height", "hyphens", "icon",
498 "image-orientation", "image-rendering", "image-resolution", "inline-box-align",
499 "inset", "inset-block", "inset-block-end", "inset-block-start", "inset-inline",
500 "inset-inline-end", "inset-inline-start", "isolation", "justify-content",
501 "justify-items", "justify-self", "left", "letter-spacing", "line-break",
502 "line-height", "line-height-step", "line-stacking", "line-stacking-ruby",
503 "line-stacking-shift", "line-stacking-strategy", "list-style",
504 "list-style-image", "list-style-position", "list-style-type", "margin",
505 "margin-bottom", "margin-left", "margin-right", "margin-top", "marks",
506 "marquee-direction", "marquee-loop", "marquee-play-count", "marquee-speed",
507 "marquee-style", "mask-clip", "mask-composite", "mask-image", "mask-mode",
508 "mask-origin", "mask-position", "mask-repeat", "mask-size","mask-type",
509 "max-block-size", "max-height", "max-inline-size",
510 "max-width", "min-block-size", "min-height", "min-inline-size", "min-width",
511 "mix-blend-mode", "move-to", "nav-down", "nav-index", "nav-left", "nav-right",
512 "nav-up", "object-fit", "object-position", "offset", "offset-anchor",
513 "offset-distance", "offset-path", "offset-position", "offset-rotate",
514 "opacity", "order", "orphans", "outline", "outline-color", "outline-offset",
515 "outline-style", "outline-width", "overflow", "overflow-style",
516 "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-bottom",
517 "padding-left", "padding-right", "padding-top", "page", "page-break-after",
518 "page-break-before", "page-break-inside", "page-policy", "pause",
519 "pause-after", "pause-before", "perspective", "perspective-origin", "pitch",
520 "pitch-range", "place-content", "place-items", "place-self", "play-during",
521 "position", "presentation-level", "punctuation-trim", "quotes",
522 "region-break-after", "region-break-before", "region-break-inside",
523 "region-fragment", "rendering-intent", "resize", "rest", "rest-after",
524 "rest-before", "richness", "right", "rotate", "rotation", "rotation-point",
525 "row-gap", "ruby-align", "ruby-overhang", "ruby-position", "ruby-span",
526 "scale", "scroll-behavior", "scroll-margin", "scroll-margin-block",
527 "scroll-margin-block-end", "scroll-margin-block-start", "scroll-margin-bottom",
528 "scroll-margin-inline", "scroll-margin-inline-end",
529 "scroll-margin-inline-start", "scroll-margin-left", "scroll-margin-right",
530 "scroll-margin-top", "scroll-padding", "scroll-padding-block",
531 "scroll-padding-block-end", "scroll-padding-block-start",
532 "scroll-padding-bottom", "scroll-padding-inline", "scroll-padding-inline-end",
533 "scroll-padding-inline-start", "scroll-padding-left", "scroll-padding-right",
534 "scroll-padding-top", "scroll-snap-align", "scroll-snap-type",
535 "shape-image-threshold", "shape-inside", "shape-margin", "shape-outside",
536 "size", "speak", "speak-as", "speak-header", "speak-numeral",
537 "speak-punctuation", "speech-rate", "stress", "string-set", "tab-size",
538 "table-layout", "target", "target-name", "target-new", "target-position",
539 "text-align", "text-align-last", "text-combine-upright", "text-decoration",
540 "text-decoration-color", "text-decoration-line", "text-decoration-skip",
541 "text-decoration-skip-ink", "text-decoration-style", "text-emphasis",
542 "text-emphasis-color", "text-emphasis-position", "text-emphasis-style",
543 "text-height", "text-indent", "text-justify", "text-orientation",
544 "text-outline", "text-overflow", "text-rendering", "text-shadow",
545 "text-size-adjust", "text-space-collapse", "text-transform",
546 "text-underline-position", "text-wrap", "top", "touch-action", "transform", "transform-origin",
547 "transform-style", "transition", "transition-delay", "transition-duration",
548 "transition-property", "transition-timing-function", "translate",
549 "unicode-bidi", "user-select", "vertical-align", "visibility", "voice-balance",
550 "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate",
551 "voice-stress", "voice-volume", "volume", "white-space", "widows", "width",
552 "will-change", "word-break", "word-spacing", "word-wrap", "writing-mode", "z-index",
553 // SVG-specific
554 "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color",
555 "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events",
556 "color-interpolation", "color-interpolation-filters",
557 "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering",
558 "marker", "marker-end", "marker-mid", "marker-start", "paint-order", "shape-rendering", "stroke",
559 "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin",
560 "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering",
561 "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal",
562 "glyph-orientation-vertical", "text-anchor", "writing-mode",
563 ], propertyKeywords = keySet(propertyKeywords_);
564
565 var nonStandardPropertyKeywords_ = [
566 "border-block", "border-block-color", "border-block-end",
567 "border-block-end-color", "border-block-end-style", "border-block-end-width",
568 "border-block-start", "border-block-start-color", "border-block-start-style",
569 "border-block-start-width", "border-block-style", "border-block-width",
570 "border-inline", "border-inline-color", "border-inline-end",
571 "border-inline-end-color", "border-inline-end-style",
572 "border-inline-end-width", "border-inline-start", "border-inline-start-color",
573 "border-inline-start-style", "border-inline-start-width",
574 "border-inline-style", "border-inline-width", "margin-block",
575 "margin-block-end", "margin-block-start", "margin-inline", "margin-inline-end",
576 "margin-inline-start", "padding-block", "padding-block-end",
577 "padding-block-start", "padding-inline", "padding-inline-end",
578 "padding-inline-start", "scroll-snap-stop", "scrollbar-3d-light-color",
579 "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color",
580 "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color",
581 "scrollbar-track-color", "searchfield-cancel-button", "searchfield-decoration",
582 "searchfield-results-button", "searchfield-results-decoration", "shape-inside", "zoom"
583 ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);
584
585 var fontProperties_ = [
586 "font-display", "font-family", "src", "unicode-range", "font-variant",
587 "font-feature-settings", "font-stretch", "font-weight", "font-style"
588 ], fontProperties = keySet(fontProperties_);
589
590 var counterDescriptors_ = [
591 "additive-symbols", "fallback", "negative", "pad", "prefix", "range",
592 "speak-as", "suffix", "symbols", "system"
593 ], counterDescriptors = keySet(counterDescriptors_);
594
595 var colorKeywords_ = [
596 "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige",
597 "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown",
598 "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue",
599 "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod",
600 "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen",
601 "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen",
602 "darkslateblue", "darkslategray", "darkturquoise", "darkviolet",
603 "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick",
604 "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite",
605 "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew",
606 "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender",
607 "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral",
608 "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink",
609 "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray",
610 "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta",
611 "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple",
612 "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise",
613 "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin",
614 "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered",
615 "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred",
616 "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue",
617 "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown",
618 "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue",
619 "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan",
620 "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white",
621 "whitesmoke", "yellow", "yellowgreen"
622 ], colorKeywords = keySet(colorKeywords_);
623
624 var valueKeywords_ = [
625 "above", "absolute", "activeborder", "additive", "activecaption", "afar",
626 "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate",
627 "always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
628 "arabic-indic", "armenian", "asterisks", "attr", "auto", "auto-flow", "avoid", "avoid-column", "avoid-page",
629 "avoid-region", "axis-pan", "background", "backwards", "baseline", "below", "bidi-override", "binary",
630 "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
631 "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel",
632 "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian",
633 "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret",
634 "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch",
635 "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote",
636 "col-resize", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse",
637 "compact", "condensed", "contain", "content", "contents",
638 "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop",
639 "cross", "crosshair", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal",
640 "decimal-leading-zero", "default", "default-button", "dense", "destination-atop",
641 "destination-in", "destination-out", "destination-over", "devanagari", "difference",
642 "disc", "discard", "disclosure-closed", "disclosure-open", "document",
643 "dot-dash", "dot-dot-dash",
644 "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out",
645 "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede",
646 "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er",
647 "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er",
648 "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et",
649 "ethiopic-halehame-gez", "ethiopic-halehame-om-et",
650 "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et",
651 "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig",
652 "ethiopic-numeric", "ew-resize", "exclusion", "expanded", "extends", "extra-condensed",
653 "extra-expanded", "fantasy", "fast", "fill", "fill-box", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes",
654 "forwards", "from", "geometricPrecision", "georgian", "graytext", "grid", "groove",
655 "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hard-light", "hebrew",
656 "help", "hidden", "hide", "higher", "highlight", "highlighttext",
657 "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "hue", "icon", "ignore",
658 "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite",
659 "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis",
660 "inline-block", "inline-flex", "inline-grid", "inline-table", "inset", "inside", "intrinsic", "invert",
661 "italic", "japanese-formal", "japanese-informal", "justify", "kannada",
662 "katakana", "katakana-iroha", "keep-all", "khmer",
663 "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal",
664 "landscape", "lao", "large", "larger", "left", "level", "lighter", "lighten",
665 "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem",
666 "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian",
667 "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian",
668 "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "manipulation", "match", "matrix", "matrix3d",
669 "media-controls-background", "media-current-time-display",
670 "media-fullscreen-button", "media-mute-button", "media-play-button",
671 "media-return-to-realtime-button", "media-rewind-button",
672 "media-seek-back-button", "media-seek-forward-button", "media-slider",
673 "media-sliderthumb", "media-time-remaining-display", "media-volume-slider",
674 "media-volume-slider-container", "media-volume-sliderthumb", "medium",
675 "menu", "menulist", "menulist-button", "menulist-text",
676 "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic",
677 "mix", "mongolian", "monospace", "move", "multiple", "multiple_mask_images", "multiply", "myanmar", "n-resize",
678 "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop",
679 "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap",
680 "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "opacity", "open-quote",
681 "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset",
682 "outside", "outside-shape", "overlay", "overline", "padding", "padding-box",
683 "painted", "page", "paused", "persian", "perspective", "pinch-zoom", "plus-darker", "plus-lighter",
684 "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d",
685 "progress", "push-button", "radial-gradient", "radio", "read-only",
686 "read-write", "read-write-plaintext-only", "rectangle", "region",
687 "relative", "repeat", "repeating-linear-gradient",
688 "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse",
689 "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY",
690 "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running",
691 "s-resize", "sans-serif", "saturation", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen",
692 "scroll", "scrollbar", "scroll-position", "se-resize", "searchfield",
693 "searchfield-cancel-button", "searchfield-decoration",
694 "searchfield-results-button", "searchfield-results-decoration", "self-start", "self-end",
695 "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama",
696 "simp-chinese-formal", "simp-chinese-informal", "single",
697 "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal",
698 "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
699 "small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali",
700 "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "space-evenly", "spell-out", "square",
701 "square-button", "start", "static", "status-bar", "stretch", "stroke", "stroke-box", "sub",
702 "subpixel-antialiased", "svg_masks", "super", "sw-resize", "symbolic", "symbols", "system-ui", "table",
703 "table-caption", "table-cell", "table-column", "table-column-group",
704 "table-footer-group", "table-header-group", "table-row", "table-row-group",
705 "tamil",
706 "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai",
707 "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight",
708 "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er",
709 "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top",
710 "trad-chinese-formal", "trad-chinese-informal", "transform",
711 "translate", "translate3d", "translateX", "translateY", "translateZ",
712 "transparent", "ultra-condensed", "ultra-expanded", "underline", "unidirectional-pan", "unset", "up",
713 "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal",
714 "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url",
715 "var", "vertical", "vertical-text", "view-box", "visible", "visibleFill", "visiblePainted",
716 "visibleStroke", "visual", "w-resize", "wait", "wave", "wider",
717 "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor",
718 "xx-large", "xx-small"
719 ], valueKeywords = keySet(valueKeywords_);
720
721 var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_)
722 .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_)
723 .concat(valueKeywords_);
724 CodeMirror.registerHelper("hintWords", "css", allWords);
725
726 function tokenCComment(stream, state) {
727 var maybeEnd = false, ch;
728 while ((ch = stream.next()) != null) {
729 if (maybeEnd && ch == "/") {
730 state.tokenize = null;
731 break;
732 }
733 maybeEnd = (ch == "*");
734 }
735 return ["comment", "comment"];
736 }
737
738 CodeMirror.defineMIME("text/css", {
739 documentTypes: documentTypes,
740 mediaTypes: mediaTypes,
741 mediaFeatures: mediaFeatures,
742 mediaValueKeywords: mediaValueKeywords,
743 propertyKeywords: propertyKeywords,
744 nonStandardPropertyKeywords: nonStandardPropertyKeywords,
745 fontProperties: fontProperties,
746 counterDescriptors: counterDescriptors,
747 colorKeywords: colorKeywords,
748 valueKeywords: valueKeywords,
749 tokenHooks: {
750 "/": function(stream, state) {
751 if (!stream.eat("*")) return false;
752 state.tokenize = tokenCComment;
753 return tokenCComment(stream, state);
754 }
755 },
756 name: "css"
757 });
758
759 CodeMirror.defineMIME("text/x-scss", {
760 mediaTypes: mediaTypes,
761 mediaFeatures: mediaFeatures,
762 mediaValueKeywords: mediaValueKeywords,
763 propertyKeywords: propertyKeywords,
764 nonStandardPropertyKeywords: nonStandardPropertyKeywords,
765 colorKeywords: colorKeywords,
766 valueKeywords: valueKeywords,
767 fontProperties: fontProperties,
768 allowNested: true,
769 lineComment: "//",
770 tokenHooks: {
771 "/": function(stream, state) {
772 if (stream.eat("/")) {
773 stream.skipToEnd();
774 return ["comment", "comment"];
775 } else if (stream.eat("*")) {
776 state.tokenize = tokenCComment;
777 return tokenCComment(stream, state);
778 } else {
779 return ["operator", "operator"];
780 }
781 },
782 ":": function(stream) {
783 if (stream.match(/\s*\{/, false))
784 return [null, null]
785 return false;
786 },
787 "$": function(stream) {
788 stream.match(/^[\w-]+/);
789 if (stream.match(/^\s*:/, false))
790 return ["variable-2", "variable-definition"];
791 return ["variable-2", "variable"];
792 },
793 "#": function(stream) {
794 if (!stream.eat("{")) return false;
795 return [null, "interpolation"];
796 }
797 },
798 name: "css",
799 helperType: "scss"
800 });
801
802 CodeMirror.defineMIME("text/x-less", {
803 mediaTypes: mediaTypes,
804 mediaFeatures: mediaFeatures,
805 mediaValueKeywords: mediaValueKeywords,
806 propertyKeywords: propertyKeywords,
807 nonStandardPropertyKeywords: nonStandardPropertyKeywords,
808 colorKeywords: colorKeywords,
809 valueKeywords: valueKeywords,
810 fontProperties: fontProperties,
811 allowNested: true,
812 lineComment: "//",
813 tokenHooks: {
814 "/": function(stream, state) {
815 if (stream.eat("/")) {
816 stream.skipToEnd();
817 return ["comment", "comment"];
818 } else if (stream.eat("*")) {
819 state.tokenize = tokenCComment;
820 return tokenCComment(stream, state);
821 } else {
822 return ["operator", "operator"];
823 }
824 },
825 "@": function(stream) {
826 if (stream.eat("{")) return [null, "interpolation"];
827 if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i, false)) return false;
828 stream.eatWhile(/[\w\\\-]/);
829 if (stream.match(/^\s*:/, false))
830 return ["variable-2", "variable-definition"];
831 return ["variable-2", "variable"];
832 },
833 "&": function() {
834 return ["atom", "atom"];
835 }
836 },
837 name: "css",
838 helperType: "less"
839 });
840
841 CodeMirror.defineMIME("text/x-gss", {
842 documentTypes: documentTypes,
843 mediaTypes: mediaTypes,
844 mediaFeatures: mediaFeatures,
845 propertyKeywords: propertyKeywords,
846 nonStandardPropertyKeywords: nonStandardPropertyKeywords,
847 fontProperties: fontProperties,
848 counterDescriptors: counterDescriptors,
849 colorKeywords: colorKeywords,
850 valueKeywords: valueKeywords,
851 supportsAtComponent: true,
852 tokenHooks: {
853 "/": function(stream, state) {
854 if (!stream.eat("*")) return false;
855 state.tokenize = tokenCComment;
856 return tokenCComment(stream, state);
857 }
858 },
859 name: "css",
860 helperType: "gss"
861 });
862
863});