@ryusei/light
Version:
<div align="center"> <a href="https://light.ryuseijs.com"> <img alt="RyuseiLight" src="https://light.ryuseijs.com/images/svg/logo.svg" width="70"> </a>
135 lines (117 loc) • 3.37 kB
text/typescript
import { Language } from '../../types';
import {
CATEGORY_BRACKET,
CATEGORY_COMMENT,
CATEGORY_FUNCTION,
CATEGORY_KEYWORD,
CATEGORY_NUMBER,
CATEGORY_OPERATOR,
CATEGORY_PROPERTY,
CATEGORY_SELECTOR,
CATEGORY_SPACE,
CATEGORY_STRING,
CATEGORY_DELIMITER,
CATEGORY_TAG,
CATEGORY_ATRULE,
} from '../../constants/categories';
import { REGEXP_MULTILINE_COMMENT, REGEXP_SPACE } from '../../constants/regexp';
/**
* Returns the CSS language definition.
*
* @return A Language object.
*/
export function css(): Language {
return {
id : 'css',
name: 'CSS',
grammar: {
main: [
[ '#common' ],
// An atrule without a block
[ '#findSingleAtrule' ],
// Blocks including atrules
[ '#findBlock' ],
],
findBlock: [
[ '#block', /[^ \t\r\n;{}][^;{}]*{.*?}/s, ' ' ],
],
findSingleAtrule: [
[ '#atrule', /@[^{;]+?;/s ],
],
// Finds atrules before { and ;
findAtrule: [
[ '#atrule', /@[^{;]*?(?=[{;])/s ],
],
// May not start with digits
findSelector: [
[ '#selector', /[^ \t\r\n{};].*?(?={)/s ],
],
common: [
[ CATEGORY_STRING, /(['"]).*?[^\\]\1/s ],
[ CATEGORY_COMMENT, REGEXP_MULTILINE_COMMENT ],
[ CATEGORY_SPACE, REGEXP_SPACE ],
],
block: [
[ '#inner', /{/, ' ' ],
[ CATEGORY_BRACKET, /}/, ' ' ],
[ '#findAtrule' ],
[ '#findSelector' ],
[ CATEGORY_SPACE, REGEXP_SPACE ],
],
inner: [
[ CATEGORY_BRACKET, /{/ ],
[ '#common' ],
[ '#findBlock' ],
[ '#props' ],
[ '#findAtrule' ],
[ '', /}/, ' ' ],
],
atrule: [
[ '#common' ],
[ '#url', /\burl\(/, ' ' ],
[ CATEGORY_SPACE, REGEXP_SPACE ],
[ CATEGORY_ATRULE, /[^\s();]+/ ],
[ CATEGORY_DELIMITER, /[:;,]/ ],
[ '#paren', /\(/, ' ' ],
],
paren: [
[ CATEGORY_BRACKET, /^\(/ ],
[ '#common' ],
[ '#paren', /\(/, ' ' ],
[ CATEGORY_BRACKET, /\)/, ' ' ],
[ '#props' ],
],
selector: [
[ '#common' ],
[ CATEGORY_OPERATOR, /[>+~]/ ],
[ CATEGORY_BRACKET, /[[\]()]/ ],
[ CATEGORY_DELIMITER, /=/ ],
[ CATEGORY_SELECTOR, /::?\S+/ ],
[ CATEGORY_SELECTOR, /[\W\d]\S+/ ],
[ CATEGORY_TAG, /\b[a-z]+|\*/i ],
[ CATEGORY_SELECTOR, /\S+/ ],
],
url: [
[ '#common' ],
[ CATEGORY_FUNCTION, /^url/ ],
[ CATEGORY_BRACKET, /\(/ ],
[ CATEGORY_STRING, /[^)]+/ ],
[ CATEGORY_BRACKET, /\)/, ' ' ],
],
props: [
[ CATEGORY_PROPERTY, /[a-z0-9-_\xA0-\uFFFF]+(?=:)/i ],
[ '#url', /\burl\(/, ' ' ],
[ CATEGORY_FUNCTION, /\b[\w-]+(?=\()\b/ ],
[ CATEGORY_KEYWORD, /!important|\b(?:initial|inherit|unset)/ ],
[ CATEGORY_PROPERTY, /[a-z0-9-]+(?=:)/ ],
[ CATEGORY_NUMBER, /#([0-9a-f]{6}|[0-9a-f]{3})/i ],
[ CATEGORY_NUMBER, /\bU\+[0-9a-f?-]+/i ],
[ CATEGORY_NUMBER, /[+-]?(\d+\.?\d*|\d*\.?\d+)/ ],
[ CATEGORY_DELIMITER, /[:;,]/ ],
[ '#paren', /\(/, ' ' ],
[ CATEGORY_BRACKET, /[[\])]/ ],
[ CATEGORY_SPACE, REGEXP_SPACE ],
],
},
};
}