Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / WebKit / Source / devtools / front_end / cm / css.js
blob2678c57d59adf10d728b402c4692a1f965a6b234
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 // Distributed under an MIT license: http://codemirror.net/LICENSE
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";
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;
28 var type, override;
29 function ret(style, tp) { type = tp; return style; }
31 // Tokenizers
33 function tokenBase(stream, state) {
34 var ch = stream.next();
35 if (tokenHooks[ch]) {
36 var result = tokenHooks[ch](stream, state);
37 if (result !== false) return result;
39 if (ch == "@") {
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)) {
68 return ret(null, ch);
69 } else if (ch == "u" && stream.match("rl(")) {
70 stream.backUp(1);
71 state.tokenize = tokenParenthesized;
72 return ret("property", "word");
73 } else if (/[\w\\\-]/.test(ch)) {
74 stream.eatWhile(/[\w\\\-]/);
75 return ret("property", "word");
76 } else {
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);
87 break;
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(")");
100 else
101 state.tokenize = null;
102 return ret(null, "(");
105 // Context management
107 function Context(type, indent, prev) {
108 this.type = type;
109 this.indent = indent;
110 this.prev = prev;
113 function pushContext(state, stream, type) {
114 state.context = new Context(type, stream.indentation() + indentUnit, state.context);
115 return type;
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);
132 // Parser
134 function wordAsValue(stream) {
135 var word = stream.current().toLowerCase();
136 if (valueKeywords.hasOwnProperty(word))
137 override = "atom";
138 else if (colorKeywords.hasOwnProperty(word))
139 override = "keyword";
140 else
141 override = "variable";
144 var states = {};
146 states.top = function(type, stream, state) {
147 if (type == "{") {
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)) {
156 return "keyframes";
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") {
162 override = "tag";
163 } else if (type == "variable-definition") {
164 return "maybeprop";
165 } else if (type == "interpolation") {
166 return pushContext(state, stream, "interpolation");
167 } else if (type == ":") {
168 return "pseudo";
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";
180 return "maybeprop";
181 } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {
182 override = "string-2";
183 return "maybeprop";
184 } else if (allowNested) {
185 override = stream.match(/^\s*:/, false) ? "property" : "tag";
186 return "block";
187 } else {
188 override += " error";
189 return "maybeprop";
191 } else if (type == "meta") {
192 return "block";
193 } else if (!allowNested && (type == "hash" || type == "qualifier")) {
194 override = "error";
195 return "block";
196 } else {
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") {
215 wordAsValue(stream);
216 } else if (type == "interpolation") {
217 return pushContext(state, stream, "interpolation");
219 return "prop";
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);
233 return "parens";
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";
257 else
258 override = "error";
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) {
270 if (type == "{")
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()))
279 override = "error";
280 else
281 override = "property";
282 return "maybeprop";
284 return "font_face";
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";
298 return "at";
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";
308 return {
309 startState: function(base) {
310 return {tokenize: null,
311 state: "top",
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") {
319 type = style[1];
320 style = style[0];
322 override = style;
323 state.state = states[state.state](type, stream, state);
324 return override;
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;
331 if (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;
336 cx = cx.prev;
338 return indent;
341 electricChars: "}",
342 blockCommentStart: "/*",
343 blockCommentEnd: "*/",
344 fold: "brace"
348 function keySet(array) {
349 var keys = {};
350 for (var i = 0; i < array.length; ++i) {
351 keys[array[i]] = true;
353 return keys;
356 var mediaTypes_ = [
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",
452 // SVG-specific
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;
600 break;
602 maybeEnd = (ch == "*");
604 return ["comment", "comment"];
607 function tokenSGMLComment(stream, state) {
608 if (stream.skipTo("-->")) {
609 stream.match("-->");
610 state.tokenize = null;
611 } else {
612 stream.skipToEnd();
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,
625 tokenHooks: {
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);
637 name: "css"
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,
648 allowNested: true,
649 tokenHooks: {
650 "/": function(stream, state) {
651 if (stream.eat("/")) {
652 stream.skipToEnd();
653 return ["comment", "comment"];
654 } else if (stream.eat("*")) {
655 state.tokenize = tokenCComment;
656 return tokenCComment(stream, state);
657 } else {
658 return ["operator", "operator"];
661 ":": function(stream) {
662 if (stream.match(/\s*\{/))
663 return [null, "{"];
664 return false;
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"];
677 name: "css",
678 helperType: "scss"
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,
689 allowNested: true,
690 tokenHooks: {
691 "/": function(stream, state) {
692 if (stream.eat("/")) {
693 stream.skipToEnd();
694 return ["comment", "comment"];
695 } else if (stream.eat("*")) {
696 state.tokenize = tokenCComment;
697 return tokenCComment(stream, state);
698 } else {
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"];
709 "&": function() {
710 return ["atom", "atom"];
713 name: "css",
714 helperType: "less"