| "use strict"; |
| |
| const _ = require("lodash"); |
| |
| const keywordSets = {}; |
| |
| keywordSets.nonLengthUnits = new Set([ |
| // Relative length units |
| "%", |
| // Time length units |
| "s", |
| "ms", |
| // Angle |
| "deg", |
| "grad", |
| "turn", |
| "rad", |
| // Frequency |
| "Hz", |
| "kHz", |
| // Resolution |
| "dpi", |
| "dpcm", |
| "dppx" |
| ]); |
| |
| keywordSets.lengthUnits = new Set([ |
| // Relative length units |
| "em", |
| "ex", |
| "ch", |
| "rem", |
| // Viewport-percentage lengths |
| "vh", |
| "vw", |
| "vmin", |
| "vmax", |
| "vm", |
| // Absolute length units |
| "px", |
| "mm", |
| "cm", |
| "in", |
| "pt", |
| "pc", |
| "q", |
| // Flexible length units |
| "fr" |
| ]); |
| |
| keywordSets.units = uniteSets( |
| keywordSets.nonLengthUnits, |
| keywordSets.lengthUnits |
| ); |
| |
| keywordSets.colorFunctionNames = new Set([ |
| "rgb", |
| "rgba", |
| "hsl", |
| "hsla", |
| "hwb", |
| "gray" |
| ]); |
| |
| keywordSets.camelCaseFunctionNames = new Set([ |
| "translateX", |
| "translateY", |
| "translateZ", |
| "scaleX", |
| "scaleY", |
| "scaleZ", |
| "rotateX", |
| "rotateY", |
| "rotateZ", |
| "skewX", |
| "skewY" |
| ]); |
| |
| keywordSets.basicKeywords = new Set(["initial", "inherit", "unset"]); |
| |
| keywordSets.systemFontValues = uniteSets(keywordSets.basicKeywords, [ |
| "caption", |
| "icon", |
| "menu", |
| "message-box", |
| "small-caption", |
| "status-bar" |
| ]); |
| |
| keywordSets.fontFamilyKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "serif", |
| "sans-serif", |
| "cursive", |
| "fantasy", |
| "monospace", |
| "system-ui" |
| ]); |
| |
| keywordSets.fontWeightRelativeKeywords = new Set(["bolder", "lighter"]); |
| |
| keywordSets.fontWeightAbsoluteKeywords = new Set(["bold"]); |
| |
| keywordSets.fontWeightNumericKeywords = new Set([ |
| "100", |
| "200", |
| "300", |
| "400", |
| "500", |
| "600", |
| "700", |
| "800", |
| "900" |
| ]); |
| |
| keywordSets.fontWeightKeywords = uniteSets( |
| keywordSets.basicKeywords, |
| keywordSets.fontWeightRelativeKeywords, |
| keywordSets.fontWeightAbsoluteKeywords, |
| keywordSets.fontWeightNumericKeywords |
| ); |
| |
| keywordSets.animationNameKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "none" |
| ]); |
| |
| keywordSets.animationTimingFunctionKeywords = uniteSets( |
| keywordSets.basicKeywords, |
| [ |
| "linear", |
| "ease", |
| "ease-in", |
| "ease-in-out", |
| "ease-out", |
| "step-start", |
| "step-end", |
| "steps", |
| "cubic-bezier" |
| ] |
| ); |
| |
| keywordSets.animationIterationCountKeywords = new Set(["infinite"]); |
| |
| keywordSets.animationDirectionKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "normal", |
| "reverse", |
| "alternate", |
| "alternate-reverse" |
| ]); |
| |
| keywordSets.animationFillModeKeywords = new Set([ |
| "none", |
| "forwards", |
| "backwards", |
| "both" |
| ]); |
| |
| keywordSets.animationPlayStateKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "running", |
| "paused" |
| ]); |
| |
| // cf. https://developer.mozilla.org/en-US/docs/Web/CSS/animation |
| keywordSets.animationShorthandKeywords = uniteSets( |
| keywordSets.basicKeywords, |
| keywordSets.animationNameKeywords, |
| keywordSets.animationTimingFunctionKeywords, |
| keywordSets.animationIterationCountKeywords, |
| keywordSets.animationDirectionKeywords, |
| keywordSets.animationFillModeKeywords, |
| keywordSets.animationPlayStateKeywords |
| ); |
| |
| // These are the ones that can have single-colon notation |
| keywordSets.levelOneAndTwoPseudoElements = new Set([ |
| "before", |
| "after", |
| "first-line", |
| "first-letter" |
| ]); |
| |
| // These are the ones that require double-colon notation |
| keywordSets.levelThreePseudoElements = new Set([ |
| "before", |
| "after", |
| "first-line", |
| "first-letter", |
| "selection", |
| "spelling-error", |
| "grammar-error", |
| "backdrop", |
| "marker", |
| "placeholder", |
| "shadow", |
| "slotted", |
| "content" |
| ]); |
| |
| keywordSets.vendorSpecificPseudoElements = new Set([ |
| "-moz-progress-bar", |
| "-moz-range-progress", |
| "-moz-range-thumb", |
| "-moz-range-track", |
| "-ms-browse", |
| "-ms-check", |
| "-ms-clear", |
| "-ms-expand", |
| "-ms-fill", |
| "-ms-fill-lower", |
| "-ms-fill-upper", |
| "-ms-reveal", |
| "-ms-thumb", |
| "-ms-ticks-after", |
| "-ms-ticks-before", |
| "-ms-tooltip", |
| "-ms-track", |
| "-ms-value", |
| "-webkit-progress-bar", |
| "-webkit-progress-value", |
| "-webkit-slider-runnable-track", |
| "-webkit-slider-thumb" |
| ]); |
| |
| keywordSets.pseudoElements = uniteSets( |
| keywordSets.levelOneAndTwoPseudoElements, |
| keywordSets.levelThreePseudoElements, |
| keywordSets.vendorSpecificPseudoElements |
| ); |
| |
| keywordSets.aNPlusBNotationPseudoClasses = new Set([ |
| "nth-child", |
| "nth-column", |
| "nth-last-child", |
| "nth-last-column", |
| "nth-last-of-type", |
| "nth-of-type" |
| ]); |
| |
| keywordSets.linguisticPseudoClasses = new Set(["dir", "lang"]); |
| |
| keywordSets.atRulePagePseudoClasses = new Set([ |
| "first", |
| "right", |
| "left", |
| "blank" |
| ]); |
| |
| keywordSets.otherPseudoClasses = new Set([ |
| "active", |
| "any-link", |
| "blank", |
| "checked", |
| "contains", |
| "current", |
| "default", |
| "defined", |
| "disabled", |
| "drop", |
| "empty", |
| "enabled", |
| "first-child", |
| "first-of-type", |
| "focus", |
| "focus-ring", |
| "focus-within", |
| "focus-visible", |
| "fullscreen", |
| "future", |
| "has", |
| "host", |
| "host-context", |
| "hover", |
| "indeterminate", |
| "in-range", |
| "invalid", |
| "last-child", |
| "last-of-type", |
| "link", |
| "matches", |
| "not", |
| "only-child", |
| "only-of-type", |
| "optional", |
| "out-of-range", |
| "past", |
| "placeholder-shown", |
| "playing", |
| "paused", |
| "read-only", |
| "read-write", |
| "required", |
| "root", |
| "scope", |
| "target", |
| "user-error", |
| "user-invalid", |
| "val", |
| "valid", |
| "visited" |
| ]); |
| |
| keywordSets.webkitProprietaryPseudoElements = new Set([ |
| "scrollbar", |
| "scrollbar-button", |
| "scrollbar-track", |
| "scrollbar-track-piece", |
| "scrollbar-thumb", |
| "scrollbar-corner", |
| "resize" |
| ]); |
| |
| keywordSets.webkitProprietaryPseudoClasses = new Set([ |
| "horizontal", |
| "vertical", |
| "decrement", |
| "increment", |
| "start", |
| "end", |
| "double-button", |
| "single-button", |
| "no-button", |
| "corner-present", |
| "window-inactive" |
| ]); |
| |
| keywordSets.pseudoClasses = uniteSets( |
| keywordSets.aNPlusBNotationPseudoClasses, |
| keywordSets.linguisticPseudoClasses, |
| keywordSets.otherPseudoClasses |
| ); |
| |
| keywordSets.shorthandTimeProperties = new Set(["transition", "animation"]); |
| |
| keywordSets.longhandTimeProperties = new Set([ |
| "transition-duration", |
| "transition-delay", |
| "animation-duration", |
| "animation-delay" |
| ]); |
| |
| keywordSets.timeProperties = uniteSets( |
| keywordSets.shorthandTimeProperties, |
| keywordSets.longhandTimeProperties |
| ); |
| |
| keywordSets.camelCaseKeywords = new Set([ |
| "optimizeSpeed", |
| "optimizeQuality", |
| "optimizeLegibility", |
| "geometricPrecision", |
| "currentColor", |
| "crispEdges", |
| "visiblePainted", |
| "visibleFill", |
| "visibleStroke", |
| "sRGB", |
| "linearRGB" |
| ]); |
| |
| // https://developer.mozilla.org/docs/Web/CSS/counter-increment |
| keywordSets.counterIncrementKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "none" |
| ]); |
| |
| keywordSets.counterResetKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "none" |
| ]); |
| |
| keywordSets.gridRowKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "auto", |
| "span" |
| ]); |
| |
| keywordSets.gridColumnKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "auto", |
| "span" |
| ]); |
| |
| keywordSets.gridAreaKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "auto", |
| "span" |
| ]); |
| |
| // https://developer.mozilla.org/ru/docs/Web/CSS/list-style-type |
| keywordSets.listStyleTypeKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "none", |
| "disc", |
| "circle", |
| "square", |
| "decimal", |
| "cjk-decimal", |
| "decimal-leading-zero", |
| "lower-roman", |
| "upper-roman", |
| "lower-greek", |
| "lower-alpha", |
| "lower-latin", |
| "upper-alpha", |
| "upper-latin", |
| "arabic-indic", |
| "armenian", |
| "bengali", |
| "cambodian", |
| "cjk-earthly-branch", |
| "cjk-ideographic", |
| "devanagari", |
| "ethiopic-numeric", |
| "georgian", |
| "gujarati", |
| "gurmukhi", |
| "hebrew", |
| "hiragana", |
| "hiragana-iroha", |
| "japanese-formal", |
| "japanese-informal", |
| "kannada", |
| "katakana", |
| "katakana-iroha", |
| "khmer", |
| "korean-hangul-formal", |
| "korean-hanja-formal", |
| "korean-hanja-informal", |
| "lao", |
| "lower-armenian", |
| "malayalam", |
| "mongolian", |
| "myanmar", |
| "oriya", |
| "persian", |
| "simp-chinese-formal", |
| "simp-chinese-informal", |
| "tamil", |
| "telugu", |
| "thai", |
| "tibetan", |
| "trad-chinese-formal", |
| "trad-chinese-informal", |
| "upper-armenian", |
| "disclosure-open", |
| "disclosure-closed", |
| // Non-standard extensions (without prefixe) |
| "ethiopic-halehame", |
| "ethiopic-halehame-am", |
| "ethiopic-halehame-ti-er", |
| "ethiopic-halehame-ti-et", |
| "hangul", |
| "hangul-consonant", |
| "urdu" |
| ]); |
| |
| keywordSets.listStylePositionKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "inside", |
| "outside" |
| ]); |
| |
| keywordSets.listStyleImageKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "none" |
| ]); |
| |
| keywordSets.listStyleShorthandKeywords = uniteSets( |
| keywordSets.basicKeywords, |
| keywordSets.listStyleTypeKeywords, |
| keywordSets.listStylePositionKeywords, |
| keywordSets.listStyleImageKeywords |
| ); |
| |
| keywordSets.fontStyleKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "normal", |
| "italic", |
| "oblique" |
| ]); |
| |
| keywordSets.fontVariantKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "normal", |
| "none", |
| "historical-forms", |
| "none", |
| "common-ligatures", |
| "no-common-ligatures", |
| "discretionary-ligatures", |
| "no-discretionary-ligatures", |
| "historical-ligatures", |
| "no-historical-ligatures", |
| "contextual", |
| "no-contextual", |
| "small-caps", |
| "small-caps", |
| "all-small-caps", |
| "petite-caps", |
| "all-petite-caps", |
| "unicase", |
| "titling-caps", |
| "lining-nums", |
| "oldstyle-nums", |
| "proportional-nums", |
| "tabular-nums", |
| "diagonal-fractions", |
| "stacked-fractions", |
| "ordinal", |
| "slashed-zero", |
| "jis78", |
| "jis83", |
| "jis90", |
| "jis04", |
| "simplified", |
| "traditional", |
| "full-width", |
| "proportional-width", |
| "ruby" |
| ]); |
| |
| keywordSets.fontStretchKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "semi-condensed", |
| "condensed", |
| "extra-condensed", |
| "ultra-condensed", |
| "semi-expanded", |
| "expanded", |
| "extra-expanded", |
| "ultra-expanded" |
| ]); |
| |
| keywordSets.fontSizeKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "xx-small", |
| "x-small", |
| "small", |
| "medium", |
| "large", |
| "x-large", |
| "xx-large", |
| "larger", |
| "smaller" |
| ]); |
| |
| keywordSets.lineHeightKeywords = uniteSets(keywordSets.basicKeywords, [ |
| "normal" |
| ]); |
| |
| keywordSets.fontShorthandKeywords = uniteSets( |
| keywordSets.basicKeywords, |
| keywordSets.fontStyleKeywords, |
| keywordSets.fontVariantKeywords, |
| keywordSets.fontWeightKeywords, |
| keywordSets.fontStretchKeywords, |
| keywordSets.fontSizeKeywords, |
| keywordSets.lineHeightKeywords, |
| keywordSets.fontFamilyKeywords |
| ); |
| |
| keywordSets.keyframeSelectorKeywords = new Set(["from", "to"]); |
| |
| // https://www.w3.org/TR/css-page-3/#syntax-page-selector |
| keywordSets.pageMarginAtRules = new Set([ |
| "top-left-corner", |
| "top-left", |
| "top-center", |
| "top-right", |
| "top-right-corner", |
| "bottom-left-corner", |
| "bottom-left", |
| "bottom-center", |
| "bottom-right", |
| "bottom-right-corner", |
| "left-top", |
| "left-middle", |
| "left-bottom", |
| "right-top", |
| "right-middle", |
| "right-bottom" |
| ]); |
| |
| // https://developer.mozilla.org/en/docs/Web/CSS/At-rule |
| keywordSets.atRules = uniteSets(keywordSets.pageMarginAtRules, [ |
| "apply", |
| "annotation", |
| "character-variant", |
| "charset", |
| "counter-style", |
| "custom-media", |
| "custom-selector", |
| "document", |
| "font-face", |
| "font-feature-values", |
| "import", |
| "keyframes", |
| "media", |
| "namespace", |
| "nest", |
| "ornaments", |
| "page", |
| "styleset", |
| "stylistic", |
| "supports", |
| "swash", |
| "viewport" |
| ]); |
| |
| // https://drafts.csswg.org/mediaqueries/#descdef-media-update |
| keywordSets.deprecatedMediaFeatureNames = new Set([ |
| "device-aspect-ratio", |
| "device-height", |
| "device-width", |
| "max-device-aspect-ratio", |
| "max-device-height", |
| "max-device-width", |
| "min-device-aspect-ratio", |
| "min-device-height", |
| "min-device-width" |
| ]); |
| |
| // https://drafts.csswg.org/mediaqueries/#descdef-media-update |
| keywordSets.mediaFeatureNames = uniteSets( |
| keywordSets.deprecatedMediaFeatureNames, |
| [ |
| "any-hover", |
| "any-pointer", |
| "aspect-ratio", |
| "color", |
| "color-gamut", |
| "color-index", |
| "grid", |
| "height", |
| "hover", |
| "inverted-colors", |
| "light-level", |
| "max-aspect-ratio", |
| "max-color", |
| "max-color-index", |
| "max-height", |
| "max-monochrome", |
| "max-resolution", |
| "max-width", |
| "min-aspect-ratio", |
| "min-color", |
| "min-color-index", |
| "min-height", |
| "min-monochrome", |
| "min-resolution", |
| "min-width", |
| "monochrome", |
| "orientation", |
| "overflow-block", |
| "overflow-inline", |
| "pointer", |
| "prefers-color-scheme", |
| "prefers-reduced-motion", |
| "prefers-reduced-transparency", |
| "resolution", |
| "scan", |
| "scripting", |
| "update", |
| "width" |
| ] |
| ); |
| |
| // https://www.w3.org/TR/CSS22/ui.html#system-colors |
| keywordSets.systemColors = new Set([ |
| "activeborder", |
| "activecaption", |
| "appworkspace", |
| "background", |
| "buttonface", |
| "buttonhighlight", |
| "buttonshadow", |
| "buttontext", |
| "captiontext", |
| "graytext", |
| "highlight", |
| "highlighttext", |
| "inactiveborder", |
| "inactivecaption", |
| "inactivecaptiontext", |
| "infobackground", |
| "infotext", |
| "menu", |
| "menutext", |
| "scrollbar", |
| "threeddarkshadow", |
| "threedface", |
| "threedhighlight", |
| "threedlightshadow", |
| "threedshadow", |
| "window", |
| "windowframe", |
| "windowtext" |
| ]); |
| |
| // htmlTags includes only "standard" tags. So we augment it with older tags etc. |
| keywordSets.nonStandardHtmlTags = new Set([ |
| "acronym", |
| "applet", |
| "basefont", |
| "big", |
| "blink", |
| "center", |
| "content", |
| "dir", |
| "font", |
| "frame", |
| "frameset", |
| "hgroup", |
| "isindex", |
| "keygen", |
| "listing", |
| "marquee", |
| "noembed", |
| "plaintext", |
| "spacer", |
| "strike", |
| "tt", |
| "xmp" |
| ]); |
| |
| function uniteSets() { |
| const sets = Array.from(arguments); |
| |
| return new Set( |
| sets.reduce((result, set) => { |
| return result.concat(_.toArray(set)); |
| }, []) |
| ); |
| } |
| |
| module.exports = keywordSets; |