Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F1182214
css.js
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Wed, Oct 15, 11:00 PM
Size
21 KB
Mime Type
text/plain
Expires
Fri, Oct 17, 11:00 PM (1 d, 7 h)
Engine
blob
Format
Raw Data
Handle
767669
Attached To
rINP In-Portal
css.js
View Options
CodeMirror
.
defineMode
(
"css"
,
function
(
config
)
{
var
indentUnit
=
config
.
indentUnit
,
type
;
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"
,
"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"
,
"rendering-intent"
,
"resize"
,
"rest"
,
"rest-after"
,
"rest-before"
,
"richness"
,
"right"
,
"rotation"
,
"rotation-point"
,
"ruby-align"
,
"ruby-overhang"
,
"ruby-position"
,
"ruby-span"
,
"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-shadow"
,
"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"
]);
var
colorKeywords
=
keySet
([
"black"
,
"silver"
,
"gray"
,
"white"
,
"maroon"
,
"red"
,
"purple"
,
"fuchsia"
,
"green"
,
"lime"
,
"olive"
,
"yellow"
,
"navy"
,
"blue"
,
"teal"
,
"aqua"
]);
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"
,
"background"
,
"backwards"
,
"baseline"
,
"below"
,
"bidi-override"
,
"binary"
,
"bengali"
,
"blink"
,
"block"
,
"block-axis"
,
"bold"
,
"bolder"
,
"border"
,
"border-box"
,
"both"
,
"bottom"
,
"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"
,
"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"
,
"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"
,
"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"
,
"navy"
,
"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"
,
"overlay"
,
"overline"
,
"padding"
,
"padding-box"
,
"painted"
,
"paused"
,
"persian"
,
"plus-darker"
,
"plus-lighter"
,
"pointer"
,
"portrait"
,
"pre"
,
"pre-line"
,
"pre-wrap"
,
"preserve-3d"
,
"progress"
,
"push-button"
,
"radio"
,
"read-only"
,
"read-write"
,
"read-write-plaintext-only"
,
"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"
,
"white"
,
"wider"
,
"window"
,
"windowframe"
,
"windowtext"
,
"x-large"
,
"x-small"
,
"xor"
,
"xx-large"
,
"xx-small"
,
"yellow"
]);
function
keySet
(
array
)
{
var
keys
=
{};
for
(
var
i
=
0
;
i
<
array
.
length
;
++
i
)
keys
[
array
[
i
]]
=
true
;
return
keys
;
}
function
ret
(
style
,
tp
)
{
type
=
tp
;
return
style
;}
function
tokenBase
(
stream
,
state
)
{
var
ch
=
stream
.
next
();
if
(
ch
==
"@"
)
{
stream
.
eatWhile
(
/[\w\\\-]/
);
return
ret
(
"def"
,
stream
.
current
());}
else
if
(
ch
==
"/"
&&
stream
.
eat
(
"*"
))
{
state
.
tokenize
=
tokenCComment
;
return
tokenCComment
(
stream
,
state
);
}
else
if
(
ch
==
"<"
&&
stream
.
eat
(
"!"
))
{
state
.
tokenize
=
tokenSGMLComment
;
return
tokenSGMLComment
(
stream
,
state
);
}
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
))
{
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
tokenCComment
(
stream
,
state
)
{
var
maybeEnd
=
false
,
ch
;
while
((
ch
=
stream
.
next
())
!=
null
)
{
if
(
maybeEnd
&&
ch
==
"/"
)
{
state
.
tokenize
=
tokenBase
;
break
;
}
maybeEnd
=
(
ch
==
"*"
);
}
return
ret
(
"comment"
,
"comment"
);
}
function
tokenSGMLComment
(
stream
,
state
)
{
var
dashes
=
0
,
ch
;
while
((
ch
=
stream
.
next
())
!=
null
)
{
if
(
dashes
>=
2
&&
ch
==
">"
)
{
state
.
tokenize
=
tokenBase
;
break
;
}
dashes
=
(
ch
==
"-"
)
?
dashes
+
1
:
0
;
}
return
ret
(
"comment"
,
"comment"
);
}
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
:
[]};
},
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.
if
(
state
.
tokenize
==
tokenBase
&&
stream
.
eatSpace
())
return
null
;
var
style
=
state
.
tokenize
(
stream
,
state
);
// Changing style returned based on context
var
context
=
state
.
stack
[
state
.
stack
.
length
-
1
];
if
(
style
==
"property"
)
{
if
(
context
==
"propertyValue"
){
if
(
valueKeywords
[
stream
.
current
()])
{
style
=
"string-2"
;
}
else
if
(
colorKeywords
[
stream
.
current
()])
{
style
=
"keyword"
;
}
else
{
style
=
"variable-2"
;
}
}
else
if
(
context
==
"rule"
)
{
if
(
!
propertyKeywords
[
stream
.
current
()])
{
style
+=
" error"
;
}
}
else
if
(
!
context
||
context
==
"@media{"
)
{
style
=
"tag"
;
}
else
if
(
context
==
"@media"
)
{
if
(
atMediaTypes
[
stream
.
current
()])
{
style
=
"attribute"
;
// Known attribute
}
else
if
(
/^(only|not)$/i
.
test
(
stream
.
current
()))
{
style
=
"keyword"
;
}
else
if
(
stream
.
current
().
toLowerCase
()
==
"and"
)
{
style
=
"error"
;
// "and" is only allowed in @mediaType
}
else
if
(
atMediaFeatures
[
stream
.
current
()])
{
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
[
stream
.
current
()])
{
style
=
"attribute"
;
}
else
if
(
stream
.
current
().
toLowerCase
()
==
"and"
)
{
style
=
"operator"
;
}
else
if
(
/^(only|not)$/i
.
test
(
stream
.
current
()))
{
style
=
"error"
;
// Only allowed in @media
}
else
if
(
atMediaFeatures
[
stream
.
current
()])
{
style
=
"error"
;
// Known property, should be in parentheses
}
else
{
// Unknown attribute or property, but expecting property (preceded
// by "and"). Should be in parentheses
style
=
"error"
;
}
}
else
if
(
context
==
"@mediaType("
)
{
if
(
propertyKeywords
[
stream
.
current
()])
{
// do nothing, remains "property"
}
else
if
(
atMediaTypes
[
stream
.
current
()])
{
style
=
"error"
;
// Known property, should be in parentheses
}
else
if
(
stream
.
current
().
toLowerCase
()
==
"and"
)
{
style
=
"operator"
;
}
else
if
(
/^(only|not)$/i
.
test
(
stream
.
current
()))
{
style
=
"error"
;
// Only allowed in @media
}
else
{
style
+=
" error"
;
}
}
else
{
style
=
"error"
;
}
}
else
if
(
style
==
"atom"
)
{
if
(
!
context
||
context
==
"@media{"
)
{
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
.
pop
();
state
.
stack
[
state
.
stack
.
length
-
1
]
=
"@media{"
;
}
else
state
.
stack
.
push
(
"rule"
);
}
else
if
(
type
==
"}"
)
{
state
.
stack
.
pop
();
if
(
context
==
"propertyValue"
)
state
.
stack
.
pop
();
}
else
if
(
type
==
"@media"
)
state
.
stack
.
push
(
"@media"
);
else
if
(
context
==
"@media"
&&
/\b(keyword|attribute)\b/
.
test
(
style
))
state
.
stack
.
push
(
"@mediaType"
);
else
if
(
context
==
"@mediaType"
&&
stream
.
current
()
==
","
)
state
.
stack
.
pop
();
else
if
(
context
==
"@mediaType"
&&
type
==
"("
)
state
.
stack
.
push
(
"@mediaType("
);
else
if
(
context
==
"@mediaType("
&&
type
==
")"
)
state
.
stack
.
pop
();
else
if
(
context
==
"rule"
&&
type
==
":"
)
state
.
stack
.
push
(
"propertyValue"
);
else
if
(
context
==
"propertyValue"
&&
type
==
";"
)
state
.
stack
.
pop
();
return
style
;
},
indent
:
function
(
state
,
textAfter
)
{
var
n
=
state
.
stack
.
length
;
if
(
/^\}/
.
test
(
textAfter
))
n
-=
state
.
stack
[
state
.
stack
.
length
-
1
]
==
"propertyValue"
?
2
:
1
;
return
state
.
baseIndent
+
n
*
indentUnit
;
},
electricChars
:
"}"
};
});
CodeMirror
.
defineMIME
(
"text/css"
,
"css"
);
Event Timeline
Log In to Comment