173 lines
8.8 KiB
Lua
Executable File
173 lines
8.8 KiB
Lua
Executable File
-- Copyright 2006-2019 Mitchell mitchell.att.foicica.com. See License.txt.
|
|
-- CSS LPeg lexer.
|
|
|
|
local lexer = require('lexer')
|
|
local token, word_match = lexer.token, lexer.word_match
|
|
local P, R, S, V = lpeg.P, lpeg.R, lpeg.S, lpeg.V
|
|
|
|
local lex = lexer.new('css')
|
|
|
|
-- Whitespace.
|
|
lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
|
|
|
|
-- Properties.
|
|
lex:add_rule('property', token('property', word_match[[
|
|
-- CSS 1.
|
|
color background-color background-image background-repeat
|
|
background-attachment background-position background font-family font-style
|
|
font-variant font-weight font-size font word-spacing letter-spacing
|
|
text-decoration vertical-align text-transform text-align text-indent
|
|
line-height margin-top margin-right margin-bottom margin-left margin
|
|
padding-top padding-right padding-bottom padding-left padding border-top-width
|
|
border-right-width border-bottom-width border-left-width border-width
|
|
border-top border-right border-bottom border-left border border-color
|
|
border-style width height float clear display white-space list-style-type
|
|
list-style-image list-style-position list-style
|
|
-- CSS 2.
|
|
border-top-color border-right-color border-bottom-color border-left-color
|
|
border-color border-top-style border-right-style border-bottom-style
|
|
border-left-style border-style top right bottom left position z-index
|
|
direction unicode-bidi min-width max-width min-height max-height overflow clip
|
|
visibility content quotes counter-reset counter-increment marker-offset size
|
|
marks page-break-before page-break-after page-break-inside page orphans widows
|
|
font-stretch font-size-adjust unicode-range units-per-em src panose-1 stemv
|
|
stemh slope cap-height x-height ascent descent widths bbox definition-src
|
|
baseline centerline mathline topline text-shadow caption-side table-layout
|
|
border-collapse border-spacing empty-cells speak-header cursor outline
|
|
outline-width outline-style outline-color volume speak pause-before
|
|
pause-after pause cue-before cue-after cue play-during azimuth elevation
|
|
speech-rate voice-family pitch pitch-range stress richness speak-punctuation
|
|
speak-numeral
|
|
-- CSS 3.
|
|
flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap
|
|
align-content align-items align-self justify-content order border-radius
|
|
transition transform box-shadow filter opacity resize word-break word-wrap
|
|
box-sizing animation text-overflow
|
|
]]))
|
|
lex:add_style('property', lexer.STYLE_KEYWORD)
|
|
|
|
-- Values.
|
|
lex:add_rule('value', token('value', word_match[[
|
|
-- CSS 1.
|
|
auto none normal italic oblique small-caps bold bolder lighter xx-small
|
|
x-small small medium large x-large xx-large larger smaller transparent repeat
|
|
repeat-x repeat-y no-repeat scroll fixed top bottom left center right justify
|
|
both underline overline line-through blink baseline sub super text-top middle
|
|
text-bottom capitalize uppercase lowercase thin medium thick dotted dashed
|
|
solid double groove ridge inset outset block inline list-item pre no-wrap
|
|
inside outside disc circle square decimal lower-roman upper-roman lower-alpha
|
|
upper-alpha aqua black blue fuchsia gray green lime maroon navy olive purple
|
|
red silver teal white yellow
|
|
-- CSS 2.
|
|
inherit run-in compact marker table inline-table table-row-group
|
|
table-header-group table-footer-group table-row table-column-group
|
|
table-column table-cell table-caption static relative absolute fixed ltr rtl
|
|
embed bidi-override visible hidden scroll collapse open-quote close-quote
|
|
no-open-quote no-close-quote decimal-leading-zero lower-greek lower-latin
|
|
upper-latin hebrew armenian georgian cjk-ideographic hiragana katakana
|
|
hiragana-iroha katakana-iroha landscape portrait crop cross always avoid wider
|
|
narrower ultra-condensed extra-condensed condensed semi-condensed
|
|
semi-expanded expanded extra-expanded ultra-expanded caption icon menu
|
|
message-box small-caption status-bar separate show hide once crosshair default
|
|
pointer move text wait help e-resize ne-resize nw-resize n-resize se-resize
|
|
sw-resize s-resize w-resize ActiveBorder ActiveCaption AppWorkspace Background
|
|
ButtonFace ButtonHighlight ButtonShadow InactiveCaptionText ButtonText
|
|
CaptionText GrayText Highlight HighlightText InactiveBorder InactiveCaption
|
|
InfoBackground InfoText Menu MenuText Scrollbar ThreeDDarkShadow ThreeDFace
|
|
ThreeDHighlight ThreeDLightShadow ThreeDShadow Window WindowFrame WindowText
|
|
silent x-soft soft medium loud x-loud spell-out mix left-side far-left
|
|
center-left center-right far-right right-side behind leftwards rightwards
|
|
below level above higher lower x-slow slow medium fast x-fast faster slower
|
|
male female child x-low low high x-high code digits continous
|
|
-- CSS 3.
|
|
flex row column ellipsis inline-block
|
|
]]))
|
|
lex:add_style('value', lexer.STYLE_CONSTANT)
|
|
|
|
-- Functions.
|
|
lex:add_rule('function', token(lexer.FUNCTION, word_match[[
|
|
attr blackness blend blenda blur brightness calc circle color-mod contrast
|
|
counter cubic-bezier device-cmyk drop-shadow ellipse gray grayscale hsl hsla
|
|
hue hue-rotate hwb image inset invert lightness linear-gradient matrix
|
|
matrix3d opacity perspective polygon radial-gradient rect
|
|
repeating-linear-gradient repeating-radial-gradient rgb rgba rotate rotate3d
|
|
rotateX rotateY rotateZ saturate saturation scale scale3d scaleX scaleY scaleZ
|
|
sepia shade skewX skewY steps tint toggle translate translate3d translateX
|
|
translateY translateZ url whiteness var
|
|
]]))
|
|
|
|
-- Colors.
|
|
local xdigit = lexer.xdigit
|
|
lex:add_rule('color', token('color', word_match[[
|
|
aliceblue antiquewhite aqua aquamarine azure beige bisque black
|
|
blanchedalmond blue blueviolet brown burlywood cadetblue chartreuse chocolate
|
|
coral cornflowerblue cornsilk crimson cyan darkblue darkcyan darkgoldenrod
|
|
darkgray darkgreen darkgrey darkkhaki darkmagenta darkolivegreen darkorange
|
|
darkorchid darkred darksalmon darkseagreen darkslateblue darkslategray
|
|
darkslategrey darkturquoise darkviolet deeppink deepskyblue dimgray dimgrey
|
|
dodgerblue firebrick floralwhite forestgreen fuchsia gainsboro ghostwhite gold
|
|
goldenrod gray green greenyellow grey honeydew hotpink indianred indigo ivory
|
|
khaki lavender lavenderblush lawngreen lemonchiffon lightblue lightcoral
|
|
lightcyan lightgoldenrodyellow lightgray lightgreen lightgrey lightpink
|
|
lightsalmon lightseagreen lightskyblue lightslategray lightslategrey
|
|
lightsteelblue lightyellow lime limegreen linen magenta maroon
|
|
mediumaquamarine mediumblue mediumorchid mediumpurple mediumseagreen
|
|
mediumslateblue mediumspringgreen mediumturquoise mediumvioletred
|
|
midnightblue mintcream mistyrose moccasin navajowhite navy oldlace olive
|
|
olivedrab orange orangered orchid palegoldenrod palegreen paleturquoise
|
|
palevioletred papayawhip peachpuff peru pink plum powderblue purple
|
|
rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown seagreen
|
|
seashell sienna silver skyblue slateblue slategray slategrey snow springgreen
|
|
steelblue tan teal thistle tomato transparent turquoise violet wheat white
|
|
whitesmoke yellow yellowgreen
|
|
]] + '#' * xdigit * xdigit * xdigit * (xdigit * xdigit * xdigit)^-1))
|
|
lex:add_style('color', lexer.STYLE_NUMBER)
|
|
|
|
-- Identifiers.
|
|
lex:add_rule('identifier', token(lexer.IDENTIFIER, lexer.alpha *
|
|
(lexer.alnum + S('_-'))^0))
|
|
|
|
-- Pseudo classes and pseudo elements.
|
|
lex:add_rule('pseudoclass', ':' * token('pseudoclass', word_match[[
|
|
active checked disabled empty enabled first-child first-of-type focus hover
|
|
in-range invalid lang last-child last-of-type link not nth-child
|
|
nth-last-child nth-last-of-type nth-of-type only-of-type only-child optional
|
|
out-of-range read-only read-write required root target valid visited
|
|
]]))
|
|
lex:add_style('pseudoclass', lexer.STYLE_CONSTANT)
|
|
lex:add_rule('pseudoelement', '::' * token('pseudoelement', word_match[[
|
|
after before first-letter first-line selection
|
|
]]))
|
|
lex:add_style('pseudoelement', lexer.STYLE_CONSTANT)
|
|
|
|
-- Strings.
|
|
lex:add_rule('string', token(lexer.STRING, lexer.delimited_range("'") +
|
|
lexer.delimited_range('"')))
|
|
|
|
-- Comments.
|
|
lex:add_rule('comment', token(lexer.COMMENT, '/*' * (lexer.any - '*/')^0 *
|
|
P('*/')^-1))
|
|
|
|
-- Numbers.
|
|
local unit = token('unit', word_match[[
|
|
ch cm deg dpcm dpi dppx em ex grad Hz in kHz mm ms pc pt px q rad rem s turn
|
|
vh vmax vmin vw
|
|
]])
|
|
lex:add_style('unit', lexer.STYLE_NUMBER)
|
|
lex:add_rule('number', token(lexer.NUMBER, lexer.digit^1) * unit^-1)
|
|
|
|
-- Operators.
|
|
lex:add_rule('operator', token(lexer.OPERATOR, S('~!#*>+=|.,:;()[]{}')))
|
|
|
|
-- At rule.
|
|
lex:add_rule('at_rule', token('at_rule', P('@') * word_match[[
|
|
charset font-face media page import namespace keyframes
|
|
]]))
|
|
lex:add_style('at_rule', lexer.STYLE_PREPROCESSOR)
|
|
|
|
-- Fold points.
|
|
lex:add_fold_point(lexer.OPERATOR, '{', '}')
|
|
lex:add_fold_point(lexer.COMMENT, '/*', '*/')
|
|
|
|
return lex
|