453 lines
8.5 KiB
JavaScript
453 lines
8.5 KiB
JavaScript
|
module.exports = function(hljs) {
|
||
|
|
||
|
var VARIABLE = {
|
||
|
className: 'variable',
|
||
|
begin: '\\$' + hljs.IDENT_RE
|
||
|
};
|
||
|
|
||
|
var HEX_COLOR = {
|
||
|
className: 'number',
|
||
|
begin: '#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})'
|
||
|
};
|
||
|
|
||
|
var AT_KEYWORDS = [
|
||
|
'charset',
|
||
|
'css',
|
||
|
'debug',
|
||
|
'extend',
|
||
|
'font-face',
|
||
|
'for',
|
||
|
'import',
|
||
|
'include',
|
||
|
'media',
|
||
|
'mixin',
|
||
|
'page',
|
||
|
'warn',
|
||
|
'while'
|
||
|
];
|
||
|
|
||
|
var PSEUDO_SELECTORS = [
|
||
|
'after',
|
||
|
'before',
|
||
|
'first-letter',
|
||
|
'first-line',
|
||
|
'active',
|
||
|
'first-child',
|
||
|
'focus',
|
||
|
'hover',
|
||
|
'lang',
|
||
|
'link',
|
||
|
'visited'
|
||
|
];
|
||
|
|
||
|
var TAGS = [
|
||
|
'a',
|
||
|
'abbr',
|
||
|
'address',
|
||
|
'article',
|
||
|
'aside',
|
||
|
'audio',
|
||
|
'b',
|
||
|
'blockquote',
|
||
|
'body',
|
||
|
'button',
|
||
|
'canvas',
|
||
|
'caption',
|
||
|
'cite',
|
||
|
'code',
|
||
|
'dd',
|
||
|
'del',
|
||
|
'details',
|
||
|
'dfn',
|
||
|
'div',
|
||
|
'dl',
|
||
|
'dt',
|
||
|
'em',
|
||
|
'fieldset',
|
||
|
'figcaption',
|
||
|
'figure',
|
||
|
'footer',
|
||
|
'form',
|
||
|
'h1',
|
||
|
'h2',
|
||
|
'h3',
|
||
|
'h4',
|
||
|
'h5',
|
||
|
'h6',
|
||
|
'header',
|
||
|
'hgroup',
|
||
|
'html',
|
||
|
'i',
|
||
|
'iframe',
|
||
|
'img',
|
||
|
'input',
|
||
|
'ins',
|
||
|
'kbd',
|
||
|
'label',
|
||
|
'legend',
|
||
|
'li',
|
||
|
'mark',
|
||
|
'menu',
|
||
|
'nav',
|
||
|
'object',
|
||
|
'ol',
|
||
|
'p',
|
||
|
'q',
|
||
|
'quote',
|
||
|
'samp',
|
||
|
'section',
|
||
|
'span',
|
||
|
'strong',
|
||
|
'summary',
|
||
|
'sup',
|
||
|
'table',
|
||
|
'tbody',
|
||
|
'td',
|
||
|
'textarea',
|
||
|
'tfoot',
|
||
|
'th',
|
||
|
'thead',
|
||
|
'time',
|
||
|
'tr',
|
||
|
'ul',
|
||
|
'var',
|
||
|
'video'
|
||
|
];
|
||
|
|
||
|
var TAG_END = '[\\.\\s\\n\\[\\:,]';
|
||
|
|
||
|
var ATTRIBUTES = [
|
||
|
'align-content',
|
||
|
'align-items',
|
||
|
'align-self',
|
||
|
'animation',
|
||
|
'animation-delay',
|
||
|
'animation-direction',
|
||
|
'animation-duration',
|
||
|
'animation-fill-mode',
|
||
|
'animation-iteration-count',
|
||
|
'animation-name',
|
||
|
'animation-play-state',
|
||
|
'animation-timing-function',
|
||
|
'auto',
|
||
|
'backface-visibility',
|
||
|
'background',
|
||
|
'background-attachment',
|
||
|
'background-clip',
|
||
|
'background-color',
|
||
|
'background-image',
|
||
|
'background-origin',
|
||
|
'background-position',
|
||
|
'background-repeat',
|
||
|
'background-size',
|
||
|
'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',
|
||
|
'clip-path',
|
||
|
'color',
|
||
|
'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',
|
||
|
'cursor',
|
||
|
'direction',
|
||
|
'display',
|
||
|
'empty-cells',
|
||
|
'filter',
|
||
|
'flex',
|
||
|
'flex-basis',
|
||
|
'flex-direction',
|
||
|
'flex-flow',
|
||
|
'flex-grow',
|
||
|
'flex-shrink',
|
||
|
'flex-wrap',
|
||
|
'float',
|
||
|
'font',
|
||
|
'font-family',
|
||
|
'font-feature-settings',
|
||
|
'font-kerning',
|
||
|
'font-language-override',
|
||
|
'font-size',
|
||
|
'font-size-adjust',
|
||
|
'font-stretch',
|
||
|
'font-style',
|
||
|
'font-variant',
|
||
|
'font-variant-ligatures',
|
||
|
'font-weight',
|
||
|
'height',
|
||
|
'hyphens',
|
||
|
'icon',
|
||
|
'image-orientation',
|
||
|
'image-rendering',
|
||
|
'image-resolution',
|
||
|
'ime-mode',
|
||
|
'inherit',
|
||
|
'initial',
|
||
|
'justify-content',
|
||
|
'left',
|
||
|
'letter-spacing',
|
||
|
'line-height',
|
||
|
'list-style',
|
||
|
'list-style-image',
|
||
|
'list-style-position',
|
||
|
'list-style-type',
|
||
|
'margin',
|
||
|
'margin-bottom',
|
||
|
'margin-left',
|
||
|
'margin-right',
|
||
|
'margin-top',
|
||
|
'marks',
|
||
|
'mask',
|
||
|
'max-height',
|
||
|
'max-width',
|
||
|
'min-height',
|
||
|
'min-width',
|
||
|
'nav-down',
|
||
|
'nav-index',
|
||
|
'nav-left',
|
||
|
'nav-right',
|
||
|
'nav-up',
|
||
|
'none',
|
||
|
'normal',
|
||
|
'object-fit',
|
||
|
'object-position',
|
||
|
'opacity',
|
||
|
'order',
|
||
|
'orphans',
|
||
|
'outline',
|
||
|
'outline-color',
|
||
|
'outline-offset',
|
||
|
'outline-style',
|
||
|
'outline-width',
|
||
|
'overflow',
|
||
|
'overflow-wrap',
|
||
|
'overflow-x',
|
||
|
'overflow-y',
|
||
|
'padding',
|
||
|
'padding-bottom',
|
||
|
'padding-left',
|
||
|
'padding-right',
|
||
|
'padding-top',
|
||
|
'page-break-after',
|
||
|
'page-break-before',
|
||
|
'page-break-inside',
|
||
|
'perspective',
|
||
|
'perspective-origin',
|
||
|
'pointer-events',
|
||
|
'position',
|
||
|
'quotes',
|
||
|
'resize',
|
||
|
'right',
|
||
|
'tab-size',
|
||
|
'table-layout',
|
||
|
'text-align',
|
||
|
'text-align-last',
|
||
|
'text-decoration',
|
||
|
'text-decoration-color',
|
||
|
'text-decoration-line',
|
||
|
'text-decoration-style',
|
||
|
'text-indent',
|
||
|
'text-overflow',
|
||
|
'text-rendering',
|
||
|
'text-shadow',
|
||
|
'text-transform',
|
||
|
'text-underline-position',
|
||
|
'top',
|
||
|
'transform',
|
||
|
'transform-origin',
|
||
|
'transform-style',
|
||
|
'transition',
|
||
|
'transition-delay',
|
||
|
'transition-duration',
|
||
|
'transition-property',
|
||
|
'transition-timing-function',
|
||
|
'unicode-bidi',
|
||
|
'vertical-align',
|
||
|
'visibility',
|
||
|
'white-space',
|
||
|
'widows',
|
||
|
'width',
|
||
|
'word-break',
|
||
|
'word-spacing',
|
||
|
'word-wrap',
|
||
|
'z-index'
|
||
|
];
|
||
|
|
||
|
// illegals
|
||
|
var ILLEGAL = [
|
||
|
'\\?',
|
||
|
'(\\bReturn\\b)', // monkey
|
||
|
'(\\bEnd\\b)', // monkey
|
||
|
'(\\bend\\b)', // vbscript
|
||
|
'(\\bdef\\b)', // gradle
|
||
|
';', // a whole lot of languages
|
||
|
'#\\s', // markdown
|
||
|
'\\*\\s', // markdown
|
||
|
'===\\s', // markdown
|
||
|
'\\|',
|
||
|
'%', // prolog
|
||
|
];
|
||
|
|
||
|
return {
|
||
|
aliases: ['styl'],
|
||
|
case_insensitive: false,
|
||
|
keywords: 'if else for in',
|
||
|
illegal: '(' + ILLEGAL.join('|') + ')',
|
||
|
contains: [
|
||
|
|
||
|
// strings
|
||
|
hljs.QUOTE_STRING_MODE,
|
||
|
hljs.APOS_STRING_MODE,
|
||
|
|
||
|
// comments
|
||
|
hljs.C_LINE_COMMENT_MODE,
|
||
|
hljs.C_BLOCK_COMMENT_MODE,
|
||
|
|
||
|
// hex colors
|
||
|
HEX_COLOR,
|
||
|
|
||
|
// class tag
|
||
|
{
|
||
|
begin: '\\.[a-zA-Z][a-zA-Z0-9_-]*' + TAG_END,
|
||
|
returnBegin: true,
|
||
|
contains: [
|
||
|
{className: 'selector-class', begin: '\\.[a-zA-Z][a-zA-Z0-9_-]*'}
|
||
|
]
|
||
|
},
|
||
|
|
||
|
// id tag
|
||
|
{
|
||
|
begin: '\\#[a-zA-Z][a-zA-Z0-9_-]*' + TAG_END,
|
||
|
returnBegin: true,
|
||
|
contains: [
|
||
|
{className: 'selector-id', begin: '\\#[a-zA-Z][a-zA-Z0-9_-]*'}
|
||
|
]
|
||
|
},
|
||
|
|
||
|
// tags
|
||
|
{
|
||
|
begin: '\\b(' + TAGS.join('|') + ')' + TAG_END,
|
||
|
returnBegin: true,
|
||
|
contains: [
|
||
|
{className: 'selector-tag', begin: '\\b[a-zA-Z][a-zA-Z0-9_-]*'}
|
||
|
]
|
||
|
},
|
||
|
|
||
|
// psuedo selectors
|
||
|
{
|
||
|
begin: '&?:?:\\b(' + PSEUDO_SELECTORS.join('|') + ')' + TAG_END
|
||
|
},
|
||
|
|
||
|
// @ keywords
|
||
|
{
|
||
|
begin: '\@(' + AT_KEYWORDS.join('|') + ')\\b'
|
||
|
},
|
||
|
|
||
|
// variables
|
||
|
VARIABLE,
|
||
|
|
||
|
// dimension
|
||
|
hljs.CSS_NUMBER_MODE,
|
||
|
|
||
|
// number
|
||
|
hljs.NUMBER_MODE,
|
||
|
|
||
|
// functions
|
||
|
// - only from beginning of line + whitespace
|
||
|
{
|
||
|
className: 'function',
|
||
|
begin: '^[a-zA-Z][a-zA-Z0-9_\-]*\\(.*\\)',
|
||
|
illegal: '[\\n]',
|
||
|
returnBegin: true,
|
||
|
contains: [
|
||
|
{className: 'title', begin: '\\b[a-zA-Z][a-zA-Z0-9_\-]*'},
|
||
|
{
|
||
|
className: 'params',
|
||
|
begin: /\(/,
|
||
|
end: /\)/,
|
||
|
contains: [
|
||
|
HEX_COLOR,
|
||
|
VARIABLE,
|
||
|
hljs.APOS_STRING_MODE,
|
||
|
hljs.CSS_NUMBER_MODE,
|
||
|
hljs.NUMBER_MODE,
|
||
|
hljs.QUOTE_STRING_MODE
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
|
||
|
// attributes
|
||
|
// - only from beginning of line + whitespace
|
||
|
// - must have whitespace after it
|
||
|
{
|
||
|
className: 'attribute',
|
||
|
begin: '\\b(' + ATTRIBUTES.reverse().join('|') + ')\\b',
|
||
|
starts: {
|
||
|
// value container
|
||
|
end: /;|$/,
|
||
|
contains: [
|
||
|
HEX_COLOR,
|
||
|
VARIABLE,
|
||
|
hljs.APOS_STRING_MODE,
|
||
|
hljs.QUOTE_STRING_MODE,
|
||
|
hljs.CSS_NUMBER_MODE,
|
||
|
hljs.NUMBER_MODE,
|
||
|
hljs.C_BLOCK_COMMENT_MODE
|
||
|
],
|
||
|
illegal: /\./,
|
||
|
relevance: 0
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
};
|