1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 // Distributed under an MIT license: http://codemirror.net/LICENSE
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
11 })(function(CodeMirror
) {
14 CodeMirror
.defineMode("css", function(config
, parserConfig
) {
15 if (!parserConfig
.propertyKeywords
) parserConfig
= CodeMirror
.resolveMode("text/css");
17 var indentUnit
= config
.indentUnit
,
18 tokenHooks
= parserConfig
.tokenHooks
,
19 mediaTypes
= parserConfig
.mediaTypes
|| {},
20 mediaFeatures
= parserConfig
.mediaFeatures
|| {},
21 propertyKeywords
= parserConfig
.propertyKeywords
|| {},
22 nonStandardPropertyKeywords
= parserConfig
.nonStandardPropertyKeywords
|| {},
23 colorKeywords
= parserConfig
.colorKeywords
|| {},
24 valueKeywords
= parserConfig
.valueKeywords
|| {},
25 fontProperties
= parserConfig
.fontProperties
|| {},
26 allowNested
= parserConfig
.allowNested
;
29 function ret(style
, tp
) { type
= tp
; return style
; }
33 function tokenBase(stream
, state
) {
34 var ch
= stream
.next();
36 var result
= tokenHooks
[ch
](stream
, state
);
37 if (result
!== false) return result
;
40 stream
.eatWhile(/[\w\\\-]/);
41 return ret("def", stream
.current());
42 } else if (ch
== "=" || (ch
== "~" || ch
== "|") && stream
.eat("=")) {
43 return ret(null, "compare");
44 } else if (ch
== "\"" || ch
== "'") {
45 state
.tokenize
= tokenString(ch
);
46 return state
.tokenize(stream
, state
);
47 } else if (ch
== "#") {
48 stream
.eatWhile(/[\w\\\-]/);
49 return ret("atom", "hash");
50 } else if (ch
== "!") {
51 stream
.match(/^\s*\w*/);
52 return ret("keyword", "important");
53 } else if (/\d/.test(ch
) || ch
== "." && stream
.eat(/\d/)) {
54 stream
.eatWhile(/[\w.%]/);
55 return ret("number", "unit");
56 } else if (ch
=== "-") {
57 if (/[\d.]/.test(stream
.peek())) {
58 stream
.eatWhile(/[\w.%]/);
59 return ret("number", "unit");
60 } else if (stream
.match(/^\w+-/)) {
61 return ret("meta", "meta");
63 } else if (/[,+>*\/]/.test(ch
)) {
64 return ret(null, "select-op");
65 } else if (ch
== "." && stream
.match(/^-?[_a-z][_a-z0-9-]*/i)) {
66 return ret("qualifier", "qualifier");
67 } else if (/[:;{}\[\]\(\)]/.test(ch
)) {
69 } else if (ch
== "u" && stream
.match("rl(")) {
71 state
.tokenize
= tokenParenthesized
;
72 return ret("property", "word");
73 } else if (/[\w\\\-]/.test(ch
)) {
74 stream
.eatWhile(/[\w\\\-]/);
75 return ret("property", "word");
77 return ret(null, null);
81 function tokenString(quote
) {
82 return function(stream
, state
) {
83 var escaped
= false, ch
;
84 while ((ch
= stream
.next()) != null) {
85 if (ch
== quote
&& !escaped
) {
86 if (quote
== ")") stream
.backUp(1);
89 escaped
= !escaped
&& ch
== "\\";
91 if (ch
== quote
|| !escaped
&& quote
!= ")") state
.tokenize
= null;
92 return ret("string", "string");
96 function tokenParenthesized(stream
, state
) {
97 stream
.next(); // Must be '('
98 if (!stream
.match(/\s*[\"\')]/, false))
99 state
.tokenize
= tokenString(")");
101 state
.tokenize
= null;
102 return ret(null, "(");
105 // Context management
107 function Context(type
, indent
, prev
) {
109 this.indent
= indent
;
113 function pushContext(state
, stream
, type
) {
114 state
.context
= new Context(type
, stream
.indentation() + indentUnit
, state
.context
);
118 function popContext(state
) {
119 state
.context
= state
.context
.prev
;
120 return state
.context
.type
;
123 function pass(type
, stream
, state
) {
124 return states
[state
.context
.type
](type
, stream
, state
);
126 function popAndPass(type
, stream
, state
, n
) {
127 for (var i
= n
|| 1; i
> 0; i
--)
128 state
.context
= state
.context
.prev
;
129 return pass(type
, stream
, state
);
134 function wordAsValue(stream
) {
135 var word
= stream
.current().toLowerCase();
136 if (valueKeywords
.hasOwnProperty(word
))
138 else if (colorKeywords
.hasOwnProperty(word
))
139 override
= "keyword";
141 override
= "variable";
146 states
.top = function(type
, stream
, state
) {
148 return pushContext(state
, stream
, "block");
149 } else if (type
== "}" && state
.context
.prev
) {
150 return popContext(state
);
151 } else if (type
== "@media") {
152 return pushContext(state
, stream
, "media");
153 } else if (type
== "@font-face") {
154 return "font_face_before";
155 } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type
)) {
157 } else if (type
&& type
.charAt(0) == "@") {
158 return pushContext(state
, stream
, "at");
159 } else if (type
== "hash") {
160 override
= "builtin";
161 } else if (type
== "word") {
163 } else if (type
== "variable-definition") {
165 } else if (type
== "interpolation") {
166 return pushContext(state
, stream
, "interpolation");
167 } else if (type
== ":") {
169 } else if (allowNested
&& type
== "(") {
170 return pushContext(state
, stream
, "parens");
172 return state
.context
.type
;
175 states
.block = function(type
, stream
, state
) {
176 if (type
== "word") {
177 var word
= stream
.current().toLowerCase();
178 if (propertyKeywords
.hasOwnProperty(word
)) {
179 override
= "property";
181 } else if (nonStandardPropertyKeywords
.hasOwnProperty(word
)) {
182 override
= "string-2";
184 } else if (allowNested
) {
185 override
= stream
.match(/^\s*:/, false) ? "property" : "tag";
188 override
+= " error";
191 } else if (type
== "meta") {
193 } else if (!allowNested
&& (type
== "hash" || type
== "qualifier")) {
197 return states
.top(type
, stream
, state
);
201 states
.maybeprop = function(type
, stream
, state
) {
202 if (type
== ":") return pushContext(state
, stream
, "prop");
203 return pass(type
, stream
, state
);
206 states
.prop = function(type
, stream
, state
) {
207 if (type
== ";") return popContext(state
);
208 if (type
== "{" && allowNested
) return pushContext(state
, stream
, "propBlock");
209 if (type
== "}" || type
== "{") return popAndPass(type
, stream
, state
);
210 if (type
== "(") return pushContext(state
, stream
, "parens");
212 if (type
== "hash" && !/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream
.current())) {
213 override
+= " error";
214 } else if (type
== "word") {
216 } else if (type
== "interpolation") {
217 return pushContext(state
, stream
, "interpolation");
222 states
.propBlock = function(type
, _stream
, state
) {
223 if (type
== "}") return popContext(state
);
224 if (type
== "word") { override
= "property"; return "maybeprop"; }
225 return state
.context
.type
;
228 states
.parens = function(type
, stream
, state
) {
229 if (type
== "{" || type
== "}") return popAndPass(type
, stream
, state
);
230 if (type
== ")") return popContext(state
);
231 if (type
== "(") return pushContext(state
, stream
, "parens");
232 if (type
== "word") wordAsValue(stream
);
236 states
.pseudo = function(type
, stream
, state
) {
237 if (type
== "word") {
238 override
= "variable-3";
239 return state
.context
.type
;
241 return pass(type
, stream
, state
);
244 states
.media = function(type
, stream
, state
) {
245 if (type
== "(") return pushContext(state
, stream
, "media_parens");
246 if (type
== "}") return popAndPass(type
, stream
, state
);
247 if (type
== "{") return popContext(state
) && pushContext(state
, stream
, allowNested
? "block" : "top");
249 if (type
== "word") {
250 var word
= stream
.current().toLowerCase();
251 if (word
== "only" || word
== "not" || word
== "and")
252 override
= "keyword";
253 else if (mediaTypes
.hasOwnProperty(word
))
254 override
= "attribute";
255 else if (mediaFeatures
.hasOwnProperty(word
))
256 override
= "property";
260 return state
.context
.type
;
263 states
.media_parens = function(type
, stream
, state
) {
264 if (type
== ")") return popContext(state
);
265 if (type
== "{" || type
== "}") return popAndPass(type
, stream
, state
, 2);
266 return states
.media(type
, stream
, state
);
269 states
.font_face_before = function(type
, stream
, state
) {
271 return pushContext(state
, stream
, "font_face");
272 return pass(type
, stream
, state
);
275 states
.font_face = function(type
, stream
, state
) {
276 if (type
== "}") return popContext(state
);
277 if (type
== "word") {
278 if (!fontProperties
.hasOwnProperty(stream
.current().toLowerCase()))
281 override
= "property";
287 states
.keyframes = function(type
, stream
, state
) {
288 if (type
== "word") { override
= "variable"; return "keyframes"; }
289 if (type
== "{") return pushContext(state
, stream
, "top");
290 return pass(type
, stream
, state
);
293 states
.at = function(type
, stream
, state
) {
294 if (type
== ";") return popContext(state
);
295 if (type
== "{" || type
== "}") return popAndPass(type
, stream
, state
);
296 if (type
== "word") override
= "tag";
297 else if (type
== "hash") override
= "builtin";
301 states
.interpolation = function(type
, stream
, state
) {
302 if (type
== "}") return popContext(state
);
303 if (type
== "{" || type
== ";") return popAndPass(type
, stream
, state
);
304 if (type
!= "variable") override
= "error";
305 return "interpolation";
309 startState: function(base
) {
310 return {tokenize
: null,
312 context
: new Context("top", base
|| 0, null)};
315 token: function(stream
, state
) {
316 if (!state
.tokenize
&& stream
.eatSpace()) return null;
317 var style
= (state
.tokenize
|| tokenBase
)(stream
, state
);
318 if (style
&& typeof style
== "object") {
323 state
.state
= states
[state
.state
](type
, stream
, state
);
327 indent: function(state
, textAfter
) {
328 var cx
= state
.context
, ch
= textAfter
&& textAfter
.charAt(0);
329 var indent
= cx
.indent
;
330 if (cx
.type
== "prop" && (ch
== "}" || ch
== ")")) cx
= cx
.prev
;
332 (ch
== "}" && (cx
.type
== "block" || cx
.type
== "top" || cx
.type
== "interpolation" || cx
.type
== "font_face") ||
333 ch
== ")" && (cx
.type
== "parens" || cx
.type
== "media_parens") ||
334 ch
== "{" && (cx
.type
== "at" || cx
.type
== "media"))) {
335 indent
= cx
.indent
- indentUnit
;
342 blockCommentStart
: "/*",
343 blockCommentEnd
: "*/",
348 function keySet(array
) {
350 for (var i
= 0; i
< array
.length
; ++i
) {
351 keys
[array
[i
]] = true;
357 "all", "aural", "braille", "handheld", "print", "projection", "screen",
358 "tty", "tv", "embossed"
359 ], mediaTypes
= keySet(mediaTypes_
);
361 var mediaFeatures_
= [
362 "width", "min-width", "max-width", "height", "min-height", "max-height",
363 "device-width", "min-device-width", "max-device-width", "device-height",
364 "min-device-height", "max-device-height", "aspect-ratio",
365 "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio",
366 "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color",
367 "max-color", "color-index", "min-color-index", "max-color-index",
368 "monochrome", "min-monochrome", "max-monochrome", "resolution",
369 "min-resolution", "max-resolution", "scan", "grid"
370 ], mediaFeatures
= keySet(mediaFeatures_
);
372 var propertyKeywords_
= [
373 "align-content", "align-items", "align-self", "alignment-adjust",
374 "alignment-baseline", "anchor-point", "animation", "animation-delay",
375 "animation-direction", "animation-duration", "animation-fill-mode",
376 "animation-iteration-count", "animation-name", "animation-play-state",
377 "animation-timing-function", "appearance", "azimuth", "backface-visibility",
378 "background", "background-attachment", "background-clip", "background-color",
379 "background-image", "background-origin", "background-position",
380 "background-repeat", "background-size", "baseline-shift", "binding",
381 "bleed", "bookmark-label", "bookmark-level", "bookmark-state",
382 "bookmark-target", "border", "border-bottom", "border-bottom-color",
383 "border-bottom-left-radius", "border-bottom-right-radius",
384 "border-bottom-style", "border-bottom-width", "border-collapse",
385 "border-color", "border-image", "border-image-outset",
386 "border-image-repeat", "border-image-slice", "border-image-source",
387 "border-image-width", "border-left", "border-left-color",
388 "border-left-style", "border-left-width", "border-radius", "border-right",
389 "border-right-color", "border-right-style", "border-right-width",
390 "border-spacing", "border-style", "border-top", "border-top-color",
391 "border-top-left-radius", "border-top-right-radius", "border-top-style",
392 "border-top-width", "border-width", "bottom", "box-decoration-break",
393 "box-shadow", "box-sizing", "break-after", "break-before", "break-inside",
394 "caption-side", "clear", "clip", "color", "color-profile", "column-count",
395 "column-fill", "column-gap", "column-rule", "column-rule-color",
396 "column-rule-style", "column-rule-width", "column-span", "column-width",
397 "columns", "content", "counter-increment", "counter-reset", "crop", "cue",
398 "cue-after", "cue-before", "cursor", "direction", "display",
399 "dominant-baseline", "drop-initial-after-adjust",
400 "drop-initial-after-align", "drop-initial-before-adjust",
401 "drop-initial-before-align", "drop-initial-size", "drop-initial-value",
402 "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis",
403 "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap",
404 "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings",
405 "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust",
406 "font-stretch", "font-style", "font-synthesis", "font-variant",
407 "font-variant-alternates", "font-variant-caps", "font-variant-east-asian",
408 "font-variant-ligatures", "font-variant-numeric", "font-variant-position",
409 "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow",
410 "grid-auto-position", "grid-auto-rows", "grid-column", "grid-column-end",
411 "grid-column-start", "grid-row", "grid-row-end", "grid-row-start",
412 "grid-template", "grid-template-areas", "grid-template-columns",
413 "grid-template-rows", "hanging-punctuation", "height", "hyphens",
414 "icon", "image-orientation", "image-rendering", "image-resolution",
415 "inline-box-align", "justify-content", "left", "letter-spacing",
416 "line-break", "line-height", "line-stacking", "line-stacking-ruby",
417 "line-stacking-shift", "line-stacking-strategy", "list-style",
418 "list-style-image", "list-style-position", "list-style-type", "margin",
419 "margin-bottom", "margin-left", "margin-right", "margin-top",
420 "marker-offset", "marks", "marquee-direction", "marquee-loop",
421 "marquee-play-count", "marquee-speed", "marquee-style", "max-height",
422 "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index",
423 "nav-left", "nav-right", "nav-up", "object-fit", "object-position",
424 "opacity", "order", "orphans", "outline",
425 "outline-color", "outline-offset", "outline-style", "outline-width",
426 "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y",
427 "padding", "padding-bottom", "padding-left", "padding-right", "padding-top",
428 "page", "page-break-after", "page-break-before", "page-break-inside",
429 "page-policy", "pause", "pause-after", "pause-before", "perspective",
430 "perspective-origin", "pitch", "pitch-range", "play-during", "position",
431 "presentation-level", "punctuation-trim", "quotes", "region-break-after",
432 "region-break-before", "region-break-inside", "region-fragment",
433 "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness",
434 "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang",
435 "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin",
436 "shape-outside", "size", "speak", "speak-as", "speak-header",
437 "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set",
438 "tab-size", "table-layout", "target", "target-name", "target-new",
439 "target-position", "text-align", "text-align-last", "text-decoration",
440 "text-decoration-color", "text-decoration-line", "text-decoration-skip",
441 "text-decoration-style", "text-emphasis", "text-emphasis-color",
442 "text-emphasis-position", "text-emphasis-style", "text-height",
443 "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow",
444 "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position",
445 "text-wrap", "top", "transform", "transform-origin", "transform-style",
446 "transition", "transition-delay", "transition-duration",
447 "transition-property", "transition-timing-function", "unicode-bidi",
448 "vertical-align", "visibility", "voice-balance", "voice-duration",
449 "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress",
450 "voice-volume", "volume", "white-space", "widows", "width", "word-break",
451 "word-spacing", "word-wrap", "z-index",
453 "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color",
454 "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events",
455 "color-interpolation", "color-interpolation-filters",
456 "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering",
457 "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke",
458 "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin",
459 "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering",
460 "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal",
461 "glyph-orientation-vertical", "text-anchor", "writing-mode"
462 ], propertyKeywords
= keySet(propertyKeywords_
);
464 var nonStandardPropertyKeywords
= [
465 "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color",
466 "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color",
467 "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside",
468 "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button",
469 "searchfield-results-decoration", "zoom"
470 ], nonStandardPropertyKeywords
= keySet(nonStandardPropertyKeywords
);
472 var colorKeywords_
= [
473 "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige",
474 "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown",
475 "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue",
476 "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod",
477 "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen",
478 "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen",
479 "darkslateblue", "darkslategray", "darkturquoise", "darkviolet",
480 "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick",
481 "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite",
482 "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew",
483 "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender",
484 "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral",
485 "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink",
486 "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray",
487 "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta",
488 "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple",
489 "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise",
490 "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin",
491 "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered",
492 "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred",
493 "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue",
494 "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown",
495 "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue",
496 "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan",
497 "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white",
498 "whitesmoke", "yellow", "yellowgreen"
499 ], colorKeywords
= keySet(colorKeywords_
);
501 var valueKeywords_
= [
502 "above", "absolute", "activeborder", "activecaption", "afar",
503 "after-white-space", "ahead", "alias", "all", "all-scroll", "alternate",
504 "always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
505 "arabic-indic", "armenian", "asterisks", "auto", "avoid", "avoid-column", "avoid-page",
506 "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary",
507 "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
508 "both", "bottom", "break", "break-all", "break-word", "button", "button-bevel",
509 "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian",
510 "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret",
511 "cell", "center", "checkbox", "circle", "cjk-earthly-branch",
512 "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote",
513 "col-resize", "collapse", "column", "compact", "condensed", "contain", "content",
514 "content-box", "context-menu", "continuous", "copy", "cover", "crop",
515 "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal",
516 "decimal-leading-zero", "default", "default-button", "destination-atop",
517 "destination-in", "destination-out", "destination-over", "devanagari",
518 "disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted",
519 "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out",
520 "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede",
521 "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er",
522 "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er",
523 "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et",
524 "ethiopic-halehame-gez", "ethiopic-halehame-om-et",
525 "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et",
526 "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et",
527 "ethiopic-halehame-tig", "ew-resize", "expanded", "extra-condensed",
528 "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "footnotes",
529 "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove",
530 "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew",
531 "help", "hidden", "hide", "higher", "highlight", "highlighttext",
532 "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore",
533 "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite",
534 "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis",
535 "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert",
536 "italic", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer",
537 "landscape", "lao", "large", "larger", "left", "level", "lighter",
538 "line-through", "linear", "lines", "list-item", "listbox", "listitem",
539 "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian",
540 "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian",
541 "lower-roman", "lowercase", "ltr", "malayalam", "match",
542 "media-controls-background", "media-current-time-display",
543 "media-fullscreen-button", "media-mute-button", "media-play-button",
544 "media-return-to-realtime-button", "media-rewind-button",
545 "media-seek-back-button", "media-seek-forward-button", "media-slider",
546 "media-sliderthumb", "media-time-remaining-display", "media-volume-slider",
547 "media-volume-slider-container", "media-volume-sliderthumb", "medium",
548 "menu", "menulist", "menulist-button", "menulist-text",
549 "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic",
550 "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize",
551 "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop",
552 "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap",
553 "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote",
554 "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset",
555 "outside", "outside-shape", "overlay", "overline", "padding", "padding-box",
556 "painted", "page", "paused", "persian", "plus-darker", "plus-lighter", "pointer",
557 "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button",
558 "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region",
559 "relative", "repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba",
560 "ridge", "right", "round", "row-resize", "rtl", "run-in", "running",
561 "s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield",
562 "searchfield-cancel-button", "searchfield-decoration",
563 "searchfield-results-button", "searchfield-results-decoration",
564 "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama",
565 "single", "skip-white-space", "slide", "slider-horizontal",
566 "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
567 "small", "small-caps", "small-caption", "smaller", "solid", "somali",
568 "source-atop", "source-in", "source-out", "source-over", "space", "square",
569 "square-button", "start", "static", "status-bar", "stretch", "stroke",
570 "sub", "subpixel-antialiased", "super", "sw-resize", "table",
571 "table-caption", "table-cell", "table-column", "table-column-group",
572 "table-footer-group", "table-header-group", "table-row", "table-row-group",
573 "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai",
574 "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight",
575 "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er",
576 "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top",
577 "transparent", "ultra-condensed", "ultra-expanded", "underline", "up",
578 "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal",
579 "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url",
580 "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted",
581 "visibleStroke", "visual", "w-resize", "wait", "wave", "wider",
582 "window", "windowframe", "windowtext", "x-large", "x-small", "xor",
583 "xx-large", "xx-small"
584 ], valueKeywords
= keySet(valueKeywords_
);
586 var fontProperties_
= [
587 "font-family", "src", "unicode-range", "font-variant", "font-feature-settings",
588 "font-stretch", "font-weight", "font-style"
589 ], fontProperties
= keySet(fontProperties_
);
591 var allWords
= mediaTypes_
.concat(mediaFeatures_
).concat(propertyKeywords_
)
592 .concat(nonStandardPropertyKeywords
).concat(colorKeywords_
).concat(valueKeywords_
);
593 CodeMirror
.registerHelper("hintWords", "css", allWords
);
595 function tokenCComment(stream
, state
) {
596 var maybeEnd
= false, ch
;
597 while ((ch
= stream
.next()) != null) {
598 if (maybeEnd
&& ch
== "/") {
599 state
.tokenize
= null;
602 maybeEnd
= (ch
== "*");
604 return ["comment", "comment"];
607 function tokenSGMLComment(stream
, state
) {
608 if (stream
.skipTo("-->")) {
610 state
.tokenize
= null;
614 return ["comment", "comment"];
617 CodeMirror
.defineMIME("text/css", {
618 mediaTypes
: mediaTypes
,
619 mediaFeatures
: mediaFeatures
,
620 propertyKeywords
: propertyKeywords
,
621 nonStandardPropertyKeywords
: nonStandardPropertyKeywords
,
622 colorKeywords
: colorKeywords
,
623 valueKeywords
: valueKeywords
,
624 fontProperties
: fontProperties
,
626 "<": function(stream
, state
) {
627 if (!stream
.match("!--")) return false;
628 state
.tokenize
= tokenSGMLComment
;
629 return tokenSGMLComment(stream
, state
);
631 "/": function(stream
, state
) {
632 if (!stream
.eat("*")) return false;
633 state
.tokenize
= tokenCComment
;
634 return tokenCComment(stream
, state
);
640 CodeMirror
.defineMIME("text/x-scss", {
641 mediaTypes
: mediaTypes
,
642 mediaFeatures
: mediaFeatures
,
643 propertyKeywords
: propertyKeywords
,
644 nonStandardPropertyKeywords
: nonStandardPropertyKeywords
,
645 colorKeywords
: colorKeywords
,
646 valueKeywords
: valueKeywords
,
647 fontProperties
: fontProperties
,
650 "/": function(stream
, state
) {
651 if (stream
.eat("/")) {
653 return ["comment", "comment"];
654 } else if (stream
.eat("*")) {
655 state
.tokenize
= tokenCComment
;
656 return tokenCComment(stream
, state
);
658 return ["operator", "operator"];
661 ":": function(stream
) {
662 if (stream
.match(/\s*\{/))
666 "$": function(stream
) {
667 stream
.match(/^[\w-]+/);
668 if (stream
.match(/^\s*:/, false))
669 return ["variable-2", "variable-definition"];
670 return ["variable-2", "variable"];
672 "#": function(stream
) {
673 if (!stream
.eat("{")) return false;
674 return [null, "interpolation"];
681 CodeMirror
.defineMIME("text/x-less", {
682 mediaTypes
: mediaTypes
,
683 mediaFeatures
: mediaFeatures
,
684 propertyKeywords
: propertyKeywords
,
685 nonStandardPropertyKeywords
: nonStandardPropertyKeywords
,
686 colorKeywords
: colorKeywords
,
687 valueKeywords
: valueKeywords
,
688 fontProperties
: fontProperties
,
691 "/": function(stream
, state
) {
692 if (stream
.eat("/")) {
694 return ["comment", "comment"];
695 } else if (stream
.eat("*")) {
696 state
.tokenize
= tokenCComment
;
697 return tokenCComment(stream
, state
);
699 return ["operator", "operator"];
702 "@": function(stream
) {
703 if (stream
.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, false)) return false;
704 stream
.eatWhile(/[\w\\\-]/);
705 if (stream
.match(/^\s*:/, false))
706 return ["variable-2", "variable-definition"];
707 return ["variable-2", "variable"];
710 return ["atom", "atom"];