Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
codemirror5/mode/css/css.js /
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
639 lines (615 sloc)
28.6 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| CodeMirror.defineMode("css", function(config, parserConfig) { | |
| "use strict"; | |
| if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css"); | |
| var indentUnit = config.indentUnit || config.tabSize || 2, | |
| hooks = parserConfig.hooks || {}, | |
| atMediaTypes = parserConfig.atMediaTypes || {}, | |
| atMediaFeatures = parserConfig.atMediaFeatures || {}, | |
| propertyKeywords = parserConfig.propertyKeywords || {}, | |
| colorKeywords = parserConfig.colorKeywords || {}, | |
| valueKeywords = parserConfig.valueKeywords || {}, | |
| allowNested = !!parserConfig.allowNested, | |
| type = null; | |
| function ret(style, tp) { type = tp; return style; } | |
| function tokenBase(stream, state) { | |
| var ch = stream.next(); | |
| if (hooks[ch]) { | |
| // result[0] is style and result[1] is type | |
| var result = hooks[ch](stream, state); | |
| if (result !== false) return result; | |
| } | |
| if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("def", stream.current());} | |
| else if (ch == "=") ret(null, "compare"); | |
| else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare"); | |
| else if (ch == "\"" || ch == "'") { | |
| state.tokenize = tokenString(ch); | |
| return state.tokenize(stream, state); | |
| } | |
| else if (ch == "#") { | |
| stream.eatWhile(/[\w\\\-]/); | |
| return ret("atom", "hash"); | |
| } | |
| else if (ch == "!") { | |
| stream.match(/^\s*\w*/); | |
| return ret("keyword", "important"); | |
| } | |
| else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) { | |
| stream.eatWhile(/[\w.%]/); | |
| return ret("number", "unit"); | |
| } | |
| else if (ch === "-") { | |
| if (/\d/.test(stream.peek())) { | |
| stream.eatWhile(/[\w.%]/); | |
| return ret("number", "unit"); | |
| } else if (stream.match(/^[^-]+-/)) { | |
| return ret("meta", "meta"); | |
| } | |
| } | |
| else if (/[,+>*\/]/.test(ch)) { | |
| return ret(null, "select-op"); | |
| } | |
| else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) { | |
| return ret("qualifier", "qualifier"); | |
| } | |
| else if (ch == ":") { | |
| return ret("operator", ch); | |
| } | |
| else if (/[;{}\[\]\(\)]/.test(ch)) { | |
| return ret(null, ch); | |
| } | |
| else if (ch == "u" && stream.match("rl(")) { | |
| stream.backUp(1); | |
| state.tokenize = tokenParenthesized; | |
| return ret("property", "variable"); | |
| } | |
| else { | |
| stream.eatWhile(/[\w\\\-]/); | |
| return ret("property", "variable"); | |
| } | |
| } | |
| function tokenString(quote, nonInclusive) { | |
| return function(stream, state) { | |
| var escaped = false, ch; | |
| while ((ch = stream.next()) != null) { | |
| if (ch == quote && !escaped) | |
| break; | |
| escaped = !escaped && ch == "\\"; | |
| } | |
| if (!escaped) { | |
| if (nonInclusive) stream.backUp(1); | |
| state.tokenize = tokenBase; | |
| } | |
| return ret("string", "string"); | |
| }; | |
| } | |
| function tokenParenthesized(stream, state) { | |
| stream.next(); // Must be '(' | |
| if (!stream.match(/\s*[\"\']/, false)) | |
| state.tokenize = tokenString(")", true); | |
| else | |
| state.tokenize = tokenBase; | |
| return ret(null, "("); | |
| } | |
| return { | |
| startState: function(base) { | |
| return {tokenize: tokenBase, | |
| baseIndent: base || 0, | |
| stack: [], | |
| lastToken: null}; | |
| }, | |
| token: function(stream, state) { | |
| // Use these terms when applicable (see http://www.xanthir.com/blog/b4E50) | |
| // | |
| // rule** or **ruleset: | |
| // A selector + braces combo, or an at-rule. | |
| // | |
| // declaration block: | |
| // A sequence of declarations. | |
| // | |
| // declaration: | |
| // A property + colon + value combo. | |
| // | |
| // property value: | |
| // The entire value of a property. | |
| // | |
| // component value: | |
| // A single piece of a property value. Like the 5px in | |
| // text-shadow: 0 0 5px blue;. Can also refer to things that are | |
| // multiple terms, like the 1-4 terms that make up the background-size | |
| // portion of the background shorthand. | |
| // | |
| // term: | |
| // The basic unit of author-facing CSS, like a single number (5), | |
| // dimension (5px), string ("foo"), or function. Officially defined | |
| // by the CSS 2.1 grammar (look for the 'term' production) | |
| // | |
| // | |
| // simple selector: | |
| // A single atomic selector, like a type selector, an attr selector, a | |
| // class selector, etc. | |
| // | |
| // compound selector: | |
| // One or more simple selectors without a combinator. div.example is | |
| // compound, div > .example is not. | |
| // | |
| // complex selector: | |
| // One or more compound selectors chained with combinators. | |
| // | |
| // combinator: | |
| // The parts of selectors that express relationships. There are four | |
| // currently - the space (descendant combinator), the greater-than | |
| // bracket (child combinator), the plus sign (next sibling combinator), | |
| // and the tilda (following sibling combinator). | |
| // | |
| // sequence of selectors: | |
| // One or more of the named type of selector chained with commas. | |
| state.tokenize = state.tokenize || tokenBase; | |
| if (state.tokenize == tokenBase && stream.eatSpace()) return null; | |
| var style = state.tokenize(stream, state); | |
| if (style && typeof style != "string") style = ret(style[0], style[1]); | |
| // Changing style returned based on context | |
| var context = state.stack[state.stack.length-1]; | |
| if (style == "variable") { | |
| if (type == "variable-definition") state.stack.push("propertyValue"); | |
| return state.lastToken = "variable-2"; | |
| } else if (style == "property") { | |
| var word = stream.current().toLowerCase(); | |
| if (context == "propertyValue") { | |
| if (valueKeywords.hasOwnProperty(word)) { | |
| style = "string-2"; | |
| } else if (colorKeywords.hasOwnProperty(word)) { | |
| style = "keyword"; | |
| } else { | |
| style = "variable-2"; | |
| } | |
| } else if (context == "rule") { | |
| if (!propertyKeywords.hasOwnProperty(word)) { | |
| style += " error"; | |
| } | |
| } else if (context == "block") { | |
| // if a value is present in both property, value, or color, the order | |
| // of preference is property -> color -> value | |
| if (propertyKeywords.hasOwnProperty(word)) { | |
| style = "property"; | |
| } else if (colorKeywords.hasOwnProperty(word)) { | |
| style = "keyword"; | |
| } else if (valueKeywords.hasOwnProperty(word)) { | |
| style = "string-2"; | |
| } else { | |
| style = "tag"; | |
| } | |
| } else if (!context || context == "@media{") { | |
| style = "tag"; | |
| } else if (context == "@media") { | |
| if (atMediaTypes[stream.current()]) { | |
| style = "attribute"; // Known attribute | |
| } else if (/^(only|not)$/.test(word)) { | |
| style = "keyword"; | |
| } else if (word == "and") { | |
| style = "error"; // "and" is only allowed in @mediaType | |
| } else if (atMediaFeatures.hasOwnProperty(word)) { | |
| style = "error"; // Known property, should be in @mediaType( | |
| } else { | |
| // Unknown, expecting keyword or attribute, assuming attribute | |
| style = "attribute error"; | |
| } | |
| } else if (context == "@mediaType") { | |
| if (atMediaTypes.hasOwnProperty(word)) { | |
| style = "attribute"; | |
| } else if (word == "and") { | |
| style = "operator"; | |
| } else if (/^(only|not)$/.test(word)) { | |
| style = "error"; // Only allowed in @media | |
| } else { | |
| // Unknown attribute or property, but expecting property (preceded | |
| // by "and"). Should be in parentheses | |
| style = "error"; | |
| } | |
| } else if (context == "@mediaType(") { | |
| if (propertyKeywords.hasOwnProperty(word)) { | |
| // do nothing, remains "property" | |
| } else if (atMediaTypes.hasOwnProperty(word)) { | |
| style = "error"; // Known property, should be in parentheses | |
| } else if (word == "and") { | |
| style = "operator"; | |
| } else if (/^(only|not)$/.test(word)) { | |
| style = "error"; // Only allowed in @media | |
| } else { | |
| style += " error"; | |
| } | |
| } else if (context == "@import") { | |
| style = "tag"; | |
| } else { | |
| style = "error"; | |
| } | |
| } else if (style == "atom") { | |
| if(!context || context == "@media{" || context == "block") { | |
| style = "builtin"; | |
| } else if (context == "propertyValue") { | |
| if (!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) { | |
| style += " error"; | |
| } | |
| } else { | |
| style = "error"; | |
| } | |
| } else if (context == "@media" && type == "{") { | |
| style = "error"; | |
| } | |
| // Push/pop context stack | |
| if (type == "{") { | |
| if (context == "@media" || context == "@mediaType") { | |
| state.stack[state.stack.length-1] = "@media{"; | |
| } | |
| else { | |
| var newContext = allowNested ? "block" : "rule"; | |
| state.stack.push(newContext); | |
| } | |
| } | |
| else if (type == "}") { | |
| if (context == "interpolation") style = "operator"; | |
| // Pop off end of array until { is reached | |
| while(state.stack.length){ | |
| var removed = state.stack.pop(); | |
| if(removed.indexOf("{") > -1 || removed == "block" || removed == "rule"){ | |
| break; | |
| } | |
| } | |
| } | |
| else if (type == "interpolation") state.stack.push("interpolation"); | |
| else if (type == "@media") state.stack.push("@media"); | |
| else if (type == "@import") state.stack.push("@import"); | |
| else if (context == "@media" && /\b(keyword|attribute)\b/.test(style)) | |
| state.stack[state.stack.length-1] = "@mediaType"; | |
| else if (context == "@mediaType" && stream.current() == ",") | |
| state.stack[state.stack.length-1] = "@media"; | |
| else if (type == "(") { | |
| if (context == "@media" || context == "@mediaType") { | |
| // Make sure @mediaType is used to avoid error on { | |
| state.stack[state.stack.length-1] = "@mediaType"; | |
| state.stack.push("@mediaType("); | |
| } | |
| else state.stack.push("("); | |
| } | |
| else if (type == ")") { | |
| // Pop off end of array until ( is reached | |
| while(state.stack.length){ | |
| var removed = state.stack.pop(); | |
| if(removed.indexOf("(") > -1){ | |
| break; | |
| } | |
| } | |
| } | |
| else if (type == ":" && state.lastToken == "property") state.stack.push("propertyValue"); | |
| else if (context == "propertyValue" && type == ";") state.stack.pop(); | |
| else if (context == "@import" && type == ";") state.stack.pop(); | |
| return state.lastToken = style; | |
| }, | |
| indent: function(state, textAfter) { | |
| var n = state.stack.length; | |
| if (/^\}/.test(textAfter)) | |
| n -= state.stack[n-1] == "propertyValue" ? 2 : 1; | |
| return state.baseIndent + n * indentUnit; | |
| }, | |
| electricChars: "}", | |
| blockCommentStart: "/*", | |
| blockCommentEnd: "*/", | |
| fold: "brace" | |
| }; | |
| }); | |
| (function() { | |
| function keySet(array) { | |
| var keys = {}; | |
| for (var i = 0; i < array.length; ++i) { | |
| keys[array[i]] = true; | |
| } | |
| return keys; | |
| } | |
| var atMediaTypes = keySet([ | |
| "all", "aural", "braille", "handheld", "print", "projection", "screen", | |
| "tty", "tv", "embossed" | |
| ]); | |
| var atMediaFeatures = keySet([ | |
| "width", "min-width", "max-width", "height", "min-height", "max-height", | |
| "device-width", "min-device-width", "max-device-width", "device-height", | |
| "min-device-height", "max-device-height", "aspect-ratio", | |
| "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", | |
| "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", | |
| "max-color", "color-index", "min-color-index", "max-color-index", | |
| "monochrome", "min-monochrome", "max-monochrome", "resolution", | |
| "min-resolution", "max-resolution", "scan", "grid" | |
| ]); | |
| var propertyKeywords = keySet([ | |
| "align-content", "align-items", "align-self", "alignment-adjust", | |
| "alignment-baseline", "anchor-point", "animation", "animation-delay", | |
| "animation-direction", "animation-duration", "animation-iteration-count", | |
| "animation-name", "animation-play-state", "animation-timing-function", | |
| "appearance", "azimuth", "backface-visibility", "background", | |
| "background-attachment", "background-clip", "background-color", | |
| "background-image", "background-origin", "background-position", | |
| "background-repeat", "background-size", "baseline-shift", "binding", | |
| "bleed", "bookmark-label", "bookmark-level", "bookmark-state", | |
| "bookmark-target", "border", "border-bottom", "border-bottom-color", | |
| "border-bottom-left-radius", "border-bottom-right-radius", | |
| "border-bottom-style", "border-bottom-width", "border-collapse", | |
| "border-color", "border-image", "border-image-outset", | |
| "border-image-repeat", "border-image-slice", "border-image-source", | |
| "border-image-width", "border-left", "border-left-color", | |
| "border-left-style", "border-left-width", "border-radius", "border-right", | |
| "border-right-color", "border-right-style", "border-right-width", | |
| "border-spacing", "border-style", "border-top", "border-top-color", | |
| "border-top-left-radius", "border-top-right-radius", "border-top-style", | |
| "border-top-width", "border-width", "bottom", "box-decoration-break", | |
| "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", | |
| "caption-side", "clear", "clip", "color", "color-profile", "column-count", | |
| "column-fill", "column-gap", "column-rule", "column-rule-color", | |
| "column-rule-style", "column-rule-width", "column-span", "column-width", | |
| "columns", "content", "counter-increment", "counter-reset", "crop", "cue", | |
| "cue-after", "cue-before", "cursor", "direction", "display", | |
| "dominant-baseline", "drop-initial-after-adjust", | |
| "drop-initial-after-align", "drop-initial-before-adjust", | |
| "drop-initial-before-align", "drop-initial-size", "drop-initial-value", | |
| "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", | |
| "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", | |
| "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings", | |
| "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", | |
| "font-stretch", "font-style", "font-synthesis", "font-variant", | |
| "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", | |
| "font-variant-ligatures", "font-variant-numeric", "font-variant-position", | |
| "font-weight", "grid-cell", "grid-column", "grid-column-align", | |
| "grid-column-sizing", "grid-column-span", "grid-columns", "grid-flow", | |
| "grid-row", "grid-row-align", "grid-row-sizing", "grid-row-span", | |
| "grid-rows", "grid-template", "hanging-punctuation", "height", "hyphens", | |
| "icon", "image-orientation", "image-rendering", "image-resolution", | |
| "inline-box-align", "justify-content", "left", "letter-spacing", | |
| "line-break", "line-height", "line-stacking", "line-stacking-ruby", | |
| "line-stacking-shift", "line-stacking-strategy", "list-style", | |
| "list-style-image", "list-style-position", "list-style-type", "margin", | |
| "margin-bottom", "margin-left", "margin-right", "margin-top", | |
| "marker-offset", "marks", "marquee-direction", "marquee-loop", | |
| "marquee-play-count", "marquee-speed", "marquee-style", "max-height", | |
| "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index", | |
| "nav-left", "nav-right", "nav-up", "opacity", "order", "orphans", "outline", | |
| "outline-color", "outline-offset", "outline-style", "outline-width", | |
| "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", | |
| "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", | |
| "page", "page-break-after", "page-break-before", "page-break-inside", | |
| "page-policy", "pause", "pause-after", "pause-before", "perspective", | |
| "perspective-origin", "pitch", "pitch-range", "play-during", "position", | |
| "presentation-level", "punctuation-trim", "quotes", "region-break-after", | |
| "region-break-before", "region-break-inside", "region-fragment", | |
| "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", | |
| "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", | |
| "ruby-position", "ruby-span", "shape-inside", "shape-outside", "size", | |
| "speak", "speak-as", "speak-header", | |
| "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", | |
| "tab-size", "table-layout", "target", "target-name", "target-new", | |
| "target-position", "text-align", "text-align-last", "text-decoration", | |
| "text-decoration-color", "text-decoration-line", "text-decoration-skip", | |
| "text-decoration-style", "text-emphasis", "text-emphasis-color", | |
| "text-emphasis-position", "text-emphasis-style", "text-height", | |
| "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow", | |
| "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position", | |
| "text-wrap", "top", "transform", "transform-origin", "transform-style", | |
| "transition", "transition-delay", "transition-duration", | |
| "transition-property", "transition-timing-function", "unicode-bidi", | |
| "vertical-align", "visibility", "voice-balance", "voice-duration", | |
| "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", | |
| "voice-volume", "volume", "white-space", "widows", "width", "word-break", | |
| "word-spacing", "word-wrap", "z-index", "zoom", | |
| // SVG-specific | |
| "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", | |
| "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", | |
| "color-interpolation", "color-interpolation-filters", "color-profile", | |
| "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", | |
| "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke", | |
| "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", | |
| "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", | |
| "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", | |
| "glyph-orientation-vertical", "kerning", "text-anchor", "writing-mode" | |
| ]); | |
| var colorKeywords = keySet([ | |
| "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", | |
| "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", | |
| "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", | |
| "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", | |
| "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", | |
| "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", | |
| "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", | |
| "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", | |
| "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", | |
| "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", | |
| "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", | |
| "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", | |
| "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", | |
| "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", | |
| "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", | |
| "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", | |
| "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", | |
| "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", | |
| "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", | |
| "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", | |
| "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", | |
| "purple", "red", "rosybrown", "royalblue", "saddlebrown", "salmon", | |
| "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", | |
| "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", | |
| "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", | |
| "whitesmoke", "yellow", "yellowgreen" | |
| ]); | |
| var valueKeywords = keySet([ | |
| "above", "absolute", "activeborder", "activecaption", "afar", | |
| "after-white-space", "ahead", "alias", "all", "all-scroll", "alternate", | |
| "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", | |
| "arabic-indic", "armenian", "asterisks", "auto", "avoid", "avoid-column", "avoid-page", | |
| "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", | |
| "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", | |
| "both", "bottom", "break", "break-all", "break-word", "button", "button-bevel", | |
| "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian", | |
| "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", | |
| "cell", "center", "checkbox", "circle", "cjk-earthly-branch", | |
| "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", | |
| "col-resize", "collapse", "column", "compact", "condensed", "contain", "content", | |
| "content-box", "context-menu", "continuous", "copy", "cover", "crop", | |
| "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal", | |
| "decimal-leading-zero", "default", "default-button", "destination-atop", | |
| "destination-in", "destination-out", "destination-over", "devanagari", | |
| "disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted", | |
| "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", | |
| "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", | |
| "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", | |
| "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", | |
| "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", | |
| "ethiopic-halehame-gez", "ethiopic-halehame-om-et", | |
| "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", | |
| "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", | |
| "ethiopic-halehame-tig", "ew-resize", "expanded", "extra-condensed", | |
| "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "footnotes", | |
| "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove", | |
| "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", | |
| "help", "hidden", "hide", "higher", "highlight", "highlighttext", | |
| "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore", | |
| "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", | |
| "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", | |
| "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert", | |
| "italic", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer", | |
| "landscape", "lao", "large", "larger", "left", "level", "lighter", | |
| "line-through", "linear", "lines", "list-item", "listbox", "listitem", | |
| "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", | |
| "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", | |
| "lower-roman", "lowercase", "ltr", "malayalam", "match", | |
| "media-controls-background", "media-current-time-display", | |
| "media-fullscreen-button", "media-mute-button", "media-play-button", | |
| "media-return-to-realtime-button", "media-rewind-button", | |
| "media-seek-back-button", "media-seek-forward-button", "media-slider", | |
| "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", | |
| "media-volume-slider-container", "media-volume-sliderthumb", "medium", | |
| "menu", "menulist", "menulist-button", "menulist-text", | |
| "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", | |
| "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize", | |
| "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", | |
| "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", | |
| "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", | |
| "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", | |
| "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", | |
| "painted", "page", "paused", "persian", "plus-darker", "plus-lighter", "pointer", | |
| "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", | |
| "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region", | |
| "relative", "repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba", | |
| "ridge", "right", "round", "row-resize", "rtl", "run-in", "running", | |
| "s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield", | |
| "searchfield-cancel-button", "searchfield-decoration", | |
| "searchfield-results-button", "searchfield-results-decoration", | |
| "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", | |
| "single", "skip-white-space", "slide", "slider-horizontal", | |
| "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", | |
| "small", "small-caps", "small-caption", "smaller", "solid", "somali", | |
| "source-atop", "source-in", "source-out", "source-over", "space", "square", | |
| "square-button", "start", "static", "status-bar", "stretch", "stroke", | |
| "sub", "subpixel-antialiased", "super", "sw-resize", "table", | |
| "table-caption", "table-cell", "table-column", "table-column-group", | |
| "table-footer-group", "table-header-group", "table-row", "table-row-group", | |
| "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", | |
| "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", | |
| "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", | |
| "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", | |
| "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", | |
| "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", | |
| "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", | |
| "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", | |
| "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", | |
| "window", "windowframe", "windowtext", "x-large", "x-small", "xor", | |
| "xx-large", "xx-small" | |
| ]); | |
| function tokenCComment(stream, state) { | |
| var maybeEnd = false, ch; | |
| while ((ch = stream.next()) != null) { | |
| if (maybeEnd && ch == "/") { | |
| state.tokenize = null; | |
| break; | |
| } | |
| maybeEnd = (ch == "*"); | |
| } | |
| return ["comment", "comment"]; | |
| } | |
| CodeMirror.defineMIME("text/css", { | |
| atMediaTypes: atMediaTypes, | |
| atMediaFeatures: atMediaFeatures, | |
| propertyKeywords: propertyKeywords, | |
| colorKeywords: colorKeywords, | |
| valueKeywords: valueKeywords, | |
| hooks: { | |
| "<": function(stream, state) { | |
| function tokenSGMLComment(stream, state) { | |
| var dashes = 0, ch; | |
| while ((ch = stream.next()) != null) { | |
| if (dashes >= 2 && ch == ">") { | |
| state.tokenize = null; | |
| break; | |
| } | |
| dashes = (ch == "-") ? dashes + 1 : 0; | |
| } | |
| return ["comment", "comment"]; | |
| } | |
| if (stream.eat("!")) { | |
| state.tokenize = tokenSGMLComment; | |
| return tokenSGMLComment(stream, state); | |
| } | |
| }, | |
| "/": function(stream, state) { | |
| if (stream.eat("*")) { | |
| state.tokenize = tokenCComment; | |
| return tokenCComment(stream, state); | |
| } | |
| return false; | |
| } | |
| }, | |
| name: "css" | |
| }); | |
| CodeMirror.defineMIME("text/x-scss", { | |
| atMediaTypes: atMediaTypes, | |
| atMediaFeatures: atMediaFeatures, | |
| propertyKeywords: propertyKeywords, | |
| colorKeywords: colorKeywords, | |
| valueKeywords: valueKeywords, | |
| allowNested: true, | |
| hooks: { | |
| ":": function(stream) { | |
| if (stream.match(/\s*{/)) { | |
| return [null, "{"]; | |
| } | |
| return false; | |
| }, | |
| "$": function(stream) { | |
| stream.match(/^[\w-]+/); | |
| if (stream.peek() == ":") { | |
| return ["variable", "variable-definition"]; | |
| } | |
| return ["variable", "variable"]; | |
| }, | |
| ",": function(stream, state) { | |
| if (state.stack[state.stack.length - 1] == "propertyValue" && stream.match(/^ *\$/, false)) { | |
| return ["operator", ";"]; | |
| } | |
| }, | |
| "/": function(stream, state) { | |
| if (stream.eat("/")) { | |
| stream.skipToEnd(); | |
| return ["comment", "comment"]; | |
| } else if (stream.eat("*")) { | |
| state.tokenize = tokenCComment; | |
| return tokenCComment(stream, state); | |
| } else { | |
| return ["operator", "operator"]; | |
| } | |
| }, | |
| "#": function(stream) { | |
| if (stream.eat("{")) { | |
| return ["operator", "interpolation"]; | |
| } else { | |
| stream.eatWhile(/[\w\\\-]/); | |
| return ["atom", "hash"]; | |
| } | |
| } | |
| }, | |
| name: "css" | |
| }); | |
| })(); |