/* Language: SCSS Description: Scss is an extension of the syntax of CSS. Author: Kurt Emch Website: https://sass-lang.com Category: common, css, web */ import * as css from "./lib/css-shared.js"; /** @type LanguageFn */ export default function(hljs) { const modes = css.MODES(hljs); const PSEUDO_ELEMENTS = css.PSEUDO_ELEMENTS; const PSEUDO_CLASSES = css.PSEUDO_CLASSES; const AT_IDENTIFIER = '@[a-z-]+'; // @font-face const AT_MODIFIERS = "and or not only"; const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*'; const VARIABLE = { className: 'variable', begin: '(\\$' + IDENT_RE + ')\\b', relevance: 0 }; return { name: 'SCSS', case_insensitive: true, illegal: '[=/|\']', contains: [ hljs.C_LINE_COMMENT_MODE, hljs.C_BLOCK_COMMENT_MODE, // to recognize keyframe 40% etc which are outside the scope of our // attribute value mode modes.CSS_NUMBER_MODE, { className: 'selector-id', begin: '#[A-Za-z0-9_-]+', relevance: 0 }, { className: 'selector-class', begin: '\\.[A-Za-z0-9_-]+', relevance: 0 }, modes.ATTRIBUTE_SELECTOR_MODE, { className: 'selector-tag', begin: '\\b(' + css.TAGS.join('|') + ')\\b', // was there, before, but why? relevance: 0 }, { className: 'selector-pseudo', begin: ':(' + PSEUDO_CLASSES.join('|') + ')' }, { className: 'selector-pseudo', begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')' }, VARIABLE, { // pseudo-selector params begin: /\(/, end: /\)/, contains: [ modes.CSS_NUMBER_MODE ] }, modes.CSS_VARIABLE, { className: 'attribute', begin: '\\b(' + css.ATTRIBUTES.join('|') + ')\\b' }, { begin: '\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b' }, { begin: /:/, end: /[;}{]/, relevance: 0, contains: [ modes.BLOCK_COMMENT, VARIABLE, modes.HEXCOLOR, modes.CSS_NUMBER_MODE, hljs.QUOTE_STRING_MODE, hljs.APOS_STRING_MODE, modes.IMPORTANT, modes.FUNCTION_DISPATCH ] }, // matching these here allows us to treat them more like regular CSS // rules so everything between the {} gets regular rule highlighting, // which is what we want for page and font-face { begin: '@(page|font-face)', keywords: { $pattern: AT_IDENTIFIER, keyword: '@page @font-face' } }, { begin: '@', end: '[{;]', returnBegin: true, keywords: { $pattern: /[a-z-]+/, keyword: AT_MODIFIERS, attribute: css.MEDIA_FEATURES.join(" ") }, contains: [ { begin: AT_IDENTIFIER, className: "keyword" }, { begin: /[a-z-]+(?=:)/, className: "attribute" }, VARIABLE, hljs.QUOTE_STRING_MODE, hljs.APOS_STRING_MODE, modes.HEXCOLOR, modes.CSS_NUMBER_MODE ] }, modes.FUNCTION_DISPATCH ] }; }