146 lines
3.3 KiB
JavaScript
146 lines
3.3 KiB
JavaScript
"use strict";
|
||
function css(hljs) {
|
||
var FUNCTION_LIKE = {
|
||
begin: /[\w-]+\(/,
|
||
returnBegin: true,
|
||
contains: [
|
||
{
|
||
className: "built_in",
|
||
begin: /[\w-]+/
|
||
},
|
||
{
|
||
begin: /\(/,
|
||
end: /\)/,
|
||
contains: [
|
||
hljs.APOS_STRING_MODE,
|
||
hljs.QUOTE_STRING_MODE,
|
||
hljs.CSS_NUMBER_MODE
|
||
]
|
||
}
|
||
]
|
||
};
|
||
var ATTRIBUTE = {
|
||
className: "attribute",
|
||
begin: /\S/,
|
||
end: ":",
|
||
excludeEnd: true,
|
||
starts: {
|
||
endsWithParent: true,
|
||
excludeEnd: true,
|
||
contains: [
|
||
FUNCTION_LIKE,
|
||
hljs.CSS_NUMBER_MODE,
|
||
hljs.QUOTE_STRING_MODE,
|
||
hljs.APOS_STRING_MODE,
|
||
hljs.C_BLOCK_COMMENT_MODE,
|
||
{
|
||
className: "number",
|
||
begin: "#[0-9A-Fa-f]+"
|
||
},
|
||
{
|
||
className: "meta",
|
||
begin: "!important"
|
||
}
|
||
]
|
||
}
|
||
};
|
||
var AT_IDENTIFIER = "@[a-z-]+";
|
||
var AT_MODIFIERS = "and or not only";
|
||
var AT_PROPERTY_RE = /@\-?\w[\w]*(\-\w+)*/;
|
||
var IDENT_RE = "[a-zA-Z-][a-zA-Z0-9_-]*";
|
||
var RULE = {
|
||
begin: /(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,
|
||
returnBegin: true,
|
||
end: ";",
|
||
endsWithParent: true,
|
||
contains: [
|
||
ATTRIBUTE
|
||
]
|
||
};
|
||
return {
|
||
case_insensitive: true,
|
||
illegal: /[=\/|'\$]/,
|
||
contains: [
|
||
hljs.C_BLOCK_COMMENT_MODE,
|
||
{
|
||
className: "selector-id",
|
||
begin: /#[A-Za-z0-9_-]+/
|
||
},
|
||
{
|
||
className: "selector-class",
|
||
begin: /\.[A-Za-z0-9_-]+/
|
||
},
|
||
{
|
||
className: "selector-attr",
|
||
begin: /\[/,
|
||
end: /\]/,
|
||
illegal: "$",
|
||
contains: [
|
||
hljs.APOS_STRING_MODE,
|
||
hljs.QUOTE_STRING_MODE
|
||
]
|
||
},
|
||
{
|
||
className: "selector-pseudo",
|
||
begin: /:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/
|
||
},
|
||
// 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)",
|
||
lexemes: AT_IDENTIFIER,
|
||
keywords: "@page @font-face"
|
||
},
|
||
{
|
||
begin: "@",
|
||
end: "[{;]",
|
||
// at_rule eating first "{" is a good thing
|
||
// because it doesn’t let it to be parsed as
|
||
// a rule set but instead drops parser into
|
||
// the default mode which is how it should be.
|
||
illegal: /:/,
|
||
// break on Less variables @var: ...
|
||
returnBegin: true,
|
||
contains: [
|
||
{
|
||
className: "keyword",
|
||
begin: AT_PROPERTY_RE
|
||
},
|
||
{
|
||
begin: /\s/,
|
||
endsWithParent: true,
|
||
excludeEnd: true,
|
||
relevance: 0,
|
||
keywords: AT_MODIFIERS,
|
||
contains: [
|
||
{
|
||
begin: /[a-z-]+:/,
|
||
className: "attribute"
|
||
},
|
||
hljs.APOS_STRING_MODE,
|
||
hljs.QUOTE_STRING_MODE,
|
||
hljs.CSS_NUMBER_MODE
|
||
]
|
||
}
|
||
]
|
||
},
|
||
{
|
||
className: "selector-tag",
|
||
begin: IDENT_RE,
|
||
relevance: 0
|
||
},
|
||
{
|
||
begin: "{",
|
||
end: "}",
|
||
illegal: /\S/,
|
||
contains: [
|
||
hljs.C_BLOCK_COMMENT_MODE,
|
||
RULE
|
||
]
|
||
}
|
||
]
|
||
};
|
||
}
|
||
exports.css = css;
|