all repos — NoPaste @ edb00b0ab136a96023b51a3e1c59d21a807d66a2

Resurrected - The PussTheCat.org fork of NoPaste

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});