vue-markdown/src/assets/js/codemirror/mode/css.js

1861 lines
48 KiB
JavaScript

import CodeMirror from '../index';
CodeMirror.defineMode('css', function (config, parserConfig) {
var inline = parserConfig.inline;
if (!parserConfig.propertyKeywords) {
parserConfig = CodeMirror.resolveMode('text/css');
}
var indentUnit = config.indentUnit,
tokenHooks = parserConfig.tokenHooks,
documentTypes = parserConfig.documentTypes || {},
mediaTypes = parserConfig.mediaTypes || {},
mediaFeatures = parserConfig.mediaFeatures || {},
mediaValueKeywords = parserConfig.mediaValueKeywords || {},
propertyKeywords = parserConfig.propertyKeywords || {},
nonStandardPropertyKeywords =
parserConfig.nonStandardPropertyKeywords || {},
fontProperties = parserConfig.fontProperties || {},
counterDescriptors = parserConfig.counterDescriptors || {},
colorKeywords = parserConfig.colorKeywords || {},
valueKeywords = parserConfig.valueKeywords || {},
allowNested = parserConfig.allowNested,
lineComment = parserConfig.lineComment,
supportsAtComponent = parserConfig.supportsAtComponent === true;
var type, override;
function ret(style, tp) {
type = tp;
return style;
}
// Tokenizers
function tokenBase(stream, state) {
var ch = stream.next();
if (tokenHooks[ch]) {
var result = tokenHooks[ch](stream, state);
if (result !== false) {
return result;
}
}
if (ch == '@') {
stream.eatWhile(/[\w\\\-]/);
return ret('def', stream.current());
} else if (ch == '=' || ((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(/^-[\w\\\-]*/)) {
stream.eatWhile(/[\w\\\-]/);
if (stream.match(/^\s*:/, false)) {
return ret('variable-2', 'variable-definition');
}
return ret('variable-2', 'variable');
} else if (stream.match(/^\w+-/)) {
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 (/[:;{}\[\]\(\)]/.test(ch)) {
return ret(null, ch);
} else if (stream.match(/[\w-.]+(?=\()/)) {
if (
/^(url(-prefix)?|domain|regexp)$/.test(stream.current().toLowerCase())
) {
state.tokenize = tokenParenthesized;
}
return ret('variable callee', 'variable');
} else if (/[\w\\\-]/.test(ch)) {
stream.eatWhile(/[\w\\\-]/);
return ret('property', 'word');
} else {
return ret(null, null);
}
}
function tokenString(quote) {
return function (stream, state) {
var escaped = false,
ch;
while ((ch = stream.next()) != null) {
if (ch == quote && !escaped) {
if (quote == ')') {
stream.backUp(1);
}
break;
}
escaped = !escaped && ch == '\\';
}
if (ch == quote || (!escaped && quote != ')')) {
state.tokenize = null;
}
return ret('string', 'string');
};
}
function tokenParenthesized(stream, state) {
stream.next(); // Must be '('
if (!stream.match(/\s*[\"\')]/, false)) {
state.tokenize = tokenString(')');
} else {
state.tokenize = null;
}
return ret(null, '(');
}
// Context management
function Context(type, indent, prev) {
this.type = type;
this.indent = indent;
this.prev = prev;
}
function pushContext(state, stream, type, indent) {
state.context = new Context(
type,
stream.indentation() + (indent === false ? 0 : indentUnit),
state.context
);
return type;
}
function popContext(state) {
if (state.context.prev) {
state.context = state.context.prev;
}
return state.context.type;
}
function pass(type, stream, state) {
return states[state.context.type](type, stream, state);
}
function popAndPass(type, stream, state, n) {
for (var i = n || 1; i > 0; i--) {
state.context = state.context.prev;
}
return pass(type, stream, state);
}
// Parser
function wordAsValue(stream) {
var word = stream.current().toLowerCase();
if (valueKeywords.hasOwnProperty(word)) {
override = 'atom';
} else if (colorKeywords.hasOwnProperty(word)) {
override = 'keyword';
} else {
override = 'variable';
}
}
var states = {};
states.top = function (type, stream, state) {
if (type == '{') {
return pushContext(state, stream, 'block');
} else if (type == '}' && state.context.prev) {
return popContext(state);
} else if (supportsAtComponent && /@component/i.test(type)) {
return pushContext(state, stream, 'atComponentBlock');
} else if (/^@(-moz-)?document$/i.test(type)) {
return pushContext(state, stream, 'documentTypes');
} else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) {
return pushContext(state, stream, 'atBlock');
} else if (/^@(font-face|counter-style)/i.test(type)) {
state.stateArg = type;
return 'restricted_atBlock_before';
} else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) {
return 'keyframes';
} else if (type && type.charAt(0) == '@') {
return pushContext(state, stream, 'at');
} else if (type == 'hash') {
override = 'builtin';
} else if (type == 'word') {
override = 'tag';
} else if (type == 'variable-definition') {
return 'maybeprop';
} else if (type == 'interpolation') {
return pushContext(state, stream, 'interpolation');
} else if (type == ':') {
return 'pseudo';
} else if (allowNested && type == '(') {
return pushContext(state, stream, 'parens');
}
return state.context.type;
};
states.block = function (type, stream, state) {
if (type == 'word') {
var word = stream.current().toLowerCase();
if (propertyKeywords.hasOwnProperty(word)) {
override = 'property';
return 'maybeprop';
} else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {
override = 'string-2';
return 'maybeprop';
} else if (allowNested) {
override = stream.match(/^\s*:(?:\s|$)/, false) ? 'property' : 'tag';
return 'block';
} else {
override += ' error';
return 'maybeprop';
}
} else if (type == 'meta') {
return 'block';
} else if (!allowNested && (type == 'hash' || type == 'qualifier')) {
override = 'error';
return 'block';
} else {
return states.top(type, stream, state);
}
};
states.maybeprop = function (type, stream, state) {
if (type == ':') {
return pushContext(state, stream, 'prop');
}
return pass(type, stream, state);
};
states.prop = function (type, stream, state) {
if (type == ';') {
return popContext(state);
}
if (type == '{' && allowNested) {
return pushContext(state, stream, 'propBlock');
}
if (type == '}' || type == '{') {
return popAndPass(type, stream, state);
}
if (type == '(') {
return pushContext(state, stream, 'parens');
}
if (
type == 'hash' &&
!/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(
stream.current()
)
) {
override += ' error';
} else if (type == 'word') {
wordAsValue(stream);
} else if (type == 'interpolation') {
return pushContext(state, stream, 'interpolation');
}
return 'prop';
};
states.propBlock = function (type, _stream, state) {
if (type == '}') {
return popContext(state);
}
if (type == 'word') {
override = 'property';
return 'maybeprop';
}
return state.context.type;
};
states.parens = function (type, stream, state) {
if (type == '{' || type == '}') {
return popAndPass(type, stream, state);
}
if (type == ')') {
return popContext(state);
}
if (type == '(') {
return pushContext(state, stream, 'parens');
}
if (type == 'interpolation') {
return pushContext(state, stream, 'interpolation');
}
if (type == 'word') {
wordAsValue(stream);
}
return 'parens';
};
states.pseudo = function (type, stream, state) {
if (type == 'meta') {
return 'pseudo';
}
if (type == 'word') {
override = 'variable-3';
return state.context.type;
}
return pass(type, stream, state);
};
states.documentTypes = function (type, stream, state) {
if (type == 'word' && documentTypes.hasOwnProperty(stream.current())) {
override = 'tag';
return state.context.type;
} else {
return states.atBlock(type, stream, state);
}
};
states.atBlock = function (type, stream, state) {
if (type == '(') {
return pushContext(state, stream, 'atBlock_parens');
}
if (type == '}' || type == ';') {
return popAndPass(type, stream, state);
}
if (type == '{') {
return (
popContext(state) &&
pushContext(state, stream, allowNested ? 'block' : 'top')
);
}
if (type == 'interpolation') {
return pushContext(state, stream, 'interpolation');
}
if (type == 'word') {
var word = stream.current().toLowerCase();
if (word == 'only' || word == 'not' || word == 'and' || word == 'or') {
override = 'keyword';
} else if (mediaTypes.hasOwnProperty(word)) {
override = 'attribute';
} else if (mediaFeatures.hasOwnProperty(word)) {
override = 'property';
} else if (mediaValueKeywords.hasOwnProperty(word)) {
override = 'keyword';
} else if (propertyKeywords.hasOwnProperty(word)) {
override = 'property';
} else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {
override = 'string-2';
} else if (valueKeywords.hasOwnProperty(word)) {
override = 'atom';
} else if (colorKeywords.hasOwnProperty(word)) {
override = 'keyword';
} else {
override = 'error';
}
}
return state.context.type;
};
states.atComponentBlock = function (type, stream, state) {
if (type == '}') {
return popAndPass(type, stream, state);
}
if (type == '{') {
return (
popContext(state) &&
pushContext(state, stream, allowNested ? 'block' : 'top', false)
);
}
if (type == 'word') {
override = 'error';
}
return state.context.type;
};
states.atBlock_parens = function (type, stream, state) {
if (type == ')') {
return popContext(state);
}
if (type == '{' || type == '}') {
return popAndPass(type, stream, state, 2);
}
return states.atBlock(type, stream, state);
};
states.restricted_atBlock_before = function (type, stream, state) {
if (type == '{') {
return pushContext(state, stream, 'restricted_atBlock');
}
if (type == 'word' && state.stateArg == '@counter-style') {
override = 'variable';
return 'restricted_atBlock_before';
}
return pass(type, stream, state);
};
states.restricted_atBlock = function (type, stream, state) {
if (type == '}') {
state.stateArg = null;
return popContext(state);
}
if (type == 'word') {
if (
(state.stateArg == '@font-face' &&
!fontProperties.hasOwnProperty(stream.current().toLowerCase())) ||
(state.stateArg == '@counter-style' &&
!counterDescriptors.hasOwnProperty(stream.current().toLowerCase()))
) {
override = 'error';
} else {
override = 'property';
}
return 'maybeprop';
}
return 'restricted_atBlock';
};
states.keyframes = function (type, stream, state) {
if (type == 'word') {
override = 'variable';
return 'keyframes';
}
if (type == '{') {
return pushContext(state, stream, 'top');
}
return pass(type, stream, state);
};
states.at = function (type, stream, state) {
if (type == ';') {
return popContext(state);
}
if (type == '{' || type == '}') {
return popAndPass(type, stream, state);
}
if (type == 'word') {
override = 'tag';
} else if (type == 'hash') {
override = 'builtin';
}
return 'at';
};
states.interpolation = function (type, stream, state) {
if (type == '}') {
return popContext(state);
}
if (type == '{' || type == ';') {
return popAndPass(type, stream, state);
}
if (type == 'word') {
override = 'variable';
} else if (type != 'variable' && type != '(' && type != ')') {
override = 'error';
}
return 'interpolation';
};
return {
startState: function (base) {
return {
tokenize: null,
state: inline ? 'block' : 'top',
stateArg: null,
context: new Context(inline ? 'block' : 'top', base || 0, null)
};
},
token: function (stream, state) {
if (!state.tokenize && stream.eatSpace()) {
return null;
}
var style = (state.tokenize || tokenBase)(stream, state);
if (style && typeof style === 'object') {
type = style[1];
style = style[0];
}
override = style;
if (type != 'comment') {
state.state = states[state.state](type, stream, state);
}
return override;
},
indent: function (state, textAfter) {
var cx = state.context,
ch = textAfter && textAfter.charAt(0);
var indent = cx.indent;
if (cx.type == 'prop' && (ch == '}' || ch == ')')) {
cx = cx.prev;
}
if (cx.prev) {
if (
ch == '}' &&
(cx.type == 'block' ||
cx.type == 'top' ||
cx.type == 'interpolation' ||
cx.type == 'restricted_atBlock')
) {
// Resume indentation from parent context.
cx = cx.prev;
indent = cx.indent;
} else if (
(ch == ')' &&
(cx.type == 'parens' || cx.type == 'atBlock_parens')) ||
(ch == '{' && (cx.type == 'at' || cx.type == 'atBlock'))
) {
// Dedent relative to current context.
indent = Math.max(0, cx.indent - indentUnit);
}
}
return indent;
},
electricChars: '}',
blockCommentStart: '/*',
blockCommentEnd: '*/',
blockCommentContinue: ' * ',
lineComment: lineComment,
fold: 'brace'
};
});
function keySet(array) {
var keys = {};
for (var i = 0; i < array.length; ++i) {
keys[array[i].toLowerCase()] = true;
}
return keys;
}
var documentTypes_ = ['domain', 'regexp', 'url', 'url-prefix'],
documentTypes = keySet(documentTypes_);
var mediaTypes_ = [
'all',
'aural',
'braille',
'handheld',
'print',
'projection',
'screen',
'tty',
'tv',
'embossed'
],
mediaTypes = keySet(mediaTypes_);
var mediaFeatures_ = [
'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',
'orientation',
'device-pixel-ratio',
'min-device-pixel-ratio',
'max-device-pixel-ratio',
'pointer',
'any-pointer',
'hover',
'any-hover'
],
mediaFeatures = keySet(mediaFeatures_);
var mediaValueKeywords_ = [
'landscape',
'portrait',
'none',
'coarse',
'fine',
'on-demand',
'hover',
'interlace',
'progressive'
],
mediaValueKeywords = keySet(mediaValueKeywords_);
var propertyKeywords_ = [
'align-content',
'align-items',
'align-self',
'alignment-adjust',
'alignment-baseline',
'anchor-point',
'animation',
'animation-delay',
'animation-direction',
'animation-duration',
'animation-fill-mode',
'animation-iteration-count',
'animation-name',
'animation-play-state',
'animation-timing-function',
'appearance',
'azimuth',
'backface-visibility',
'background',
'background-attachment',
'background-blend-mode',
'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',
'caret-color',
'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',
'grid-area',
'grid-auto-columns',
'grid-auto-flow',
'grid-auto-rows',
'grid-column',
'grid-column-end',
'grid-column-gap',
'grid-column-start',
'grid-gap',
'grid-row',
'grid-row-end',
'grid-row-gap',
'grid-row-start',
'grid-template',
'grid-template-areas',
'grid-template-columns',
'grid-template-rows',
'hanging-punctuation',
'height',
'hyphens',
'icon',
'image-orientation',
'image-rendering',
'image-resolution',
'inline-box-align',
'justify-content',
'justify-items',
'justify-self',
'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',
'marks',
'marquee-direction',
'marquee-loop',
'marquee-play-count',
'marquee-speed',
'marquee-style',
'max-height',
'max-width',
'min-height',
'min-width',
'mix-blend-mode',
'move-to',
'nav-down',
'nav-index',
'nav-left',
'nav-right',
'nav-up',
'object-fit',
'object-position',
'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',
'place-content',
'place-items',
'place-self',
'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-image-threshold',
'shape-inside',
'shape-margin',
'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',
'user-select',
'vertical-align',
'visibility',
'voice-balance',
'voice-duration',
'voice-family',
'voice-pitch',
'voice-range',
'voice-rate',
'voice-stress',
'voice-volume',
'volume',
'white-space',
'widows',
'width',
'will-change',
'word-break',
'word-spacing',
'word-wrap',
'z-index',
// 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-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',
'text-anchor',
'writing-mode'
],
propertyKeywords = keySet(propertyKeywords_);
var nonStandardPropertyKeywords_ = [
'scrollbar-arrow-color',
'scrollbar-base-color',
'scrollbar-dark-shadow-color',
'scrollbar-face-color',
'scrollbar-highlight-color',
'scrollbar-shadow-color',
'scrollbar-3d-light-color',
'scrollbar-track-color',
'shape-inside',
'searchfield-cancel-button',
'searchfield-decoration',
'searchfield-results-button',
'searchfield-results-decoration',
'zoom'
],
nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);
var fontProperties_ = [
'font-family',
'src',
'unicode-range',
'font-variant',
'font-feature-settings',
'font-stretch',
'font-weight',
'font-style'
],
fontProperties = keySet(fontProperties_);
var counterDescriptors_ = [
'additive-symbols',
'fallback',
'negative',
'pad',
'prefix',
'range',
'speak-as',
'suffix',
'symbols',
'system'
],
counterDescriptors = keySet(counterDescriptors_);
var colorKeywords_ = [
'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',
'rebeccapurple',
'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'
],
colorKeywords = keySet(colorKeywords_);
var valueKeywords_ = [
'above',
'absolute',
'activeborder',
'additive',
'activecaption',
'afar',
'after-white-space',
'ahead',
'alias',
'all',
'all-scroll',
'alphabetic',
'alternate',
'always',
'amharic',
'amharic-abegede',
'antialiased',
'appworkspace',
'arabic-indic',
'armenian',
'asterisks',
'attr',
'auto',
'auto-flow',
'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',
'bullets',
'button',
'button-bevel',
'buttonface',
'buttonhighlight',
'buttonshadow',
'buttontext',
'calc',
'cambodian',
'capitalize',
'caps-lock-indicator',
'caption',
'captiontext',
'caret',
'cell',
'center',
'checkbox',
'circle',
'cjk-decimal',
'cjk-earthly-branch',
'cjk-heavenly-stem',
'cjk-ideographic',
'clear',
'clip',
'close-quote',
'col-resize',
'collapse',
'color',
'color-burn',
'color-dodge',
'column',
'column-reverse',
'compact',
'condensed',
'contain',
'content',
'contents',
'content-box',
'context-menu',
'continuous',
'copy',
'counter',
'counters',
'cover',
'crop',
'cross',
'crosshair',
'currentcolor',
'cursive',
'cyclic',
'darken',
'dashed',
'decimal',
'decimal-leading-zero',
'default',
'default-button',
'dense',
'destination-atop',
'destination-in',
'destination-out',
'destination-over',
'devanagari',
'difference',
'disc',
'discard',
'disclosure-closed',
'disclosure-open',
'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',
'ethiopic-numeric',
'ew-resize',
'exclusion',
'expanded',
'extends',
'extra-condensed',
'extra-expanded',
'fantasy',
'fast',
'fill',
'fixed',
'flat',
'flex',
'flex-end',
'flex-start',
'footnotes',
'forwards',
'from',
'geometricPrecision',
'georgian',
'graytext',
'grid',
'groove',
'gujarati',
'gurmukhi',
'hand',
'hangul',
'hangul-consonant',
'hard-light',
'hebrew',
'help',
'hidden',
'hide',
'higher',
'highlight',
'highlighttext',
'hiragana',
'hiragana-iroha',
'horizontal',
'hsl',
'hsla',
'hue',
'icon',
'ignore',
'inactiveborder',
'inactivecaption',
'inactivecaptiontext',
'infinite',
'infobackground',
'infotext',
'inherit',
'initial',
'inline',
'inline-axis',
'inline-block',
'inline-flex',
'inline-grid',
'inline-table',
'inset',
'inside',
'intrinsic',
'invert',
'italic',
'japanese-formal',
'japanese-informal',
'justify',
'kannada',
'katakana',
'katakana-iroha',
'keep-all',
'khmer',
'korean-hangul-formal',
'korean-hanja-formal',
'korean-hanja-informal',
'landscape',
'lao',
'large',
'larger',
'left',
'level',
'lighter',
'lighten',
'line-through',
'linear',
'linear-gradient',
'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',
'luminosity',
'malayalam',
'match',
'matrix',
'matrix3d',
'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',
'multiply',
'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',
'numbers',
'numeric',
'nw-resize',
'nwse-resize',
'oblique',
'octal',
'opacity',
'open-quote',
'optimizeLegibility',
'optimizeSpeed',
'oriya',
'oromo',
'outset',
'outside',
'outside-shape',
'overlay',
'overline',
'padding',
'padding-box',
'painted',
'page',
'paused',
'persian',
'perspective',
'plus-darker',
'plus-lighter',
'pointer',
'polygon',
'portrait',
'pre',
'pre-line',
'pre-wrap',
'preserve-3d',
'progress',
'push-button',
'radial-gradient',
'radio',
'read-only',
'read-write',
'read-write-plaintext-only',
'rectangle',
'region',
'relative',
'repeat',
'repeating-linear-gradient',
'repeating-radial-gradient',
'repeat-x',
'repeat-y',
'reset',
'reverse',
'rgb',
'rgba',
'ridge',
'right',
'rotate',
'rotate3d',
'rotateX',
'rotateY',
'rotateZ',
'round',
'row',
'row-resize',
'row-reverse',
'rtl',
'run-in',
'running',
's-resize',
'sans-serif',
'saturation',
'scale',
'scale3d',
'scaleX',
'scaleY',
'scaleZ',
'screen',
'scroll',
'scrollbar',
'scroll-position',
'se-resize',
'searchfield',
'searchfield-cancel-button',
'searchfield-decoration',
'searchfield-results-button',
'searchfield-results-decoration',
'self-start',
'self-end',
'semi-condensed',
'semi-expanded',
'separate',
'serif',
'show',
'sidama',
'simp-chinese-formal',
'simp-chinese-informal',
'single',
'skew',
'skewX',
'skewY',
'skip-white-space',
'slide',
'slider-horizontal',
'slider-vertical',
'sliderthumb-horizontal',
'sliderthumb-vertical',
'slow',
'small',
'small-caps',
'small-caption',
'smaller',
'soft-light',
'solid',
'somali',
'source-atop',
'source-in',
'source-out',
'source-over',
'space',
'space-around',
'space-between',
'space-evenly',
'spell-out',
'square',
'square-button',
'start',
'static',
'status-bar',
'stretch',
'stroke',
'sub',
'subpixel-antialiased',
'super',
'sw-resize',
'symbolic',
'symbols',
'system-ui',
'table',
'table-caption',
'table-cell',
'table-column',
'table-column-group',
'table-footer-group',
'table-header-group',
'table-row',
'table-row-group',
'tamil',
'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',
'trad-chinese-formal',
'trad-chinese-informal',
'transform',
'translate',
'translate3d',
'translateX',
'translateY',
'translateZ',
'transparent',
'ultra-condensed',
'ultra-expanded',
'underline',
'unset',
'up',
'upper-alpha',
'upper-armenian',
'upper-greek',
'upper-hexadecimal',
'upper-latin',
'upper-norwegian',
'upper-roman',
'uppercase',
'urdu',
'url',
'var',
'vertical',
'vertical-text',
'visible',
'visibleFill',
'visiblePainted',
'visibleStroke',
'visual',
'w-resize',
'wait',
'wave',
'wider',
'window',
'windowframe',
'windowtext',
'words',
'wrap',
'wrap-reverse',
'x-large',
'x-small',
'xor',
'xx-large',
'xx-small'
],
valueKeywords = keySet(valueKeywords_);
var allWords = documentTypes_
.concat(mediaTypes_)
.concat(mediaFeatures_)
.concat(mediaValueKeywords_)
.concat(propertyKeywords_)
.concat(nonStandardPropertyKeywords_)
.concat(colorKeywords_)
.concat(valueKeywords_);
CodeMirror.registerHelper('hintWords', 'css', allWords);
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', {
documentTypes: documentTypes,
mediaTypes: mediaTypes,
mediaFeatures: mediaFeatures,
mediaValueKeywords: mediaValueKeywords,
propertyKeywords: propertyKeywords,
nonStandardPropertyKeywords: nonStandardPropertyKeywords,
fontProperties: fontProperties,
counterDescriptors: counterDescriptors,
colorKeywords: colorKeywords,
valueKeywords: valueKeywords,
tokenHooks: {
'/': function (stream, state) {
if (!stream.eat('*')) {
return false;
}
state.tokenize = tokenCComment;
return tokenCComment(stream, state);
}
},
name: 'css'
});
CodeMirror.defineMIME('text/x-scss', {
mediaTypes: mediaTypes,
mediaFeatures: mediaFeatures,
mediaValueKeywords: mediaValueKeywords,
propertyKeywords: propertyKeywords,
nonStandardPropertyKeywords: nonStandardPropertyKeywords,
colorKeywords: colorKeywords,
valueKeywords: valueKeywords,
fontProperties: fontProperties,
allowNested: true,
lineComment: '//',
tokenHooks: {
'/': 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.match(/\s*\{/, false)) {
return [null, null];
}
return false;
},
$: function (stream) {
stream.match(/^[\w-]+/);
if (stream.match(/^\s*:/, false)) {
return ['variable-2', 'variable-definition'];
}
return ['variable-2', 'variable'];
},
'#': function (stream) {
if (!stream.eat('{')) {
return false;
}
return [null, 'interpolation'];
}
},
name: 'css',
helperType: 'scss'
});
CodeMirror.defineMIME('text/x-less', {
mediaTypes: mediaTypes,
mediaFeatures: mediaFeatures,
mediaValueKeywords: mediaValueKeywords,
propertyKeywords: propertyKeywords,
nonStandardPropertyKeywords: nonStandardPropertyKeywords,
colorKeywords: colorKeywords,
valueKeywords: valueKeywords,
fontProperties: fontProperties,
allowNested: true,
lineComment: '//',
tokenHooks: {
'/': 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 [null, 'interpolation'];
}
if (
stream.match(
/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i,
false
)
) {
return false;
}
stream.eatWhile(/[\w\\\-]/);
if (stream.match(/^\s*:/, false)) {
return ['variable-2', 'variable-definition'];
}
return ['variable-2', 'variable'];
},
'&': function () {
return ['atom', 'atom'];
}
},
name: 'css',
helperType: 'less'
});
CodeMirror.defineMIME('text/x-gss', {
documentTypes: documentTypes,
mediaTypes: mediaTypes,
mediaFeatures: mediaFeatures,
propertyKeywords: propertyKeywords,
nonStandardPropertyKeywords: nonStandardPropertyKeywords,
fontProperties: fontProperties,
counterDescriptors: counterDescriptors,
colorKeywords: colorKeywords,
valueKeywords: valueKeywords,
supportsAtComponent: true,
tokenHooks: {
'/': function (stream, state) {
if (!stream.eat('*')) {
return false;
}
state.tokenize = tokenCComment;
return tokenCComment(stream, state);
}
},
name: 'css',
helperType: 'gss'
});
CodeMirror.defineMIME('less', 'css');
CodeMirror.defineMIME('scss', 'css');
CodeMirror.defineMIME('sass', 'css');
CodeMirror.defineMIME('style', 'css');