"" "
pygments.lexers.css
~~~~~~~~~~~~~~~~~~~
Lexers
for CSS
and related stylesheet formats.
:copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE
for details.
"" "
import re
import copy
from pygments.lexer
import ExtendedRegexLexer, RegexLexer, include, bygroups, \
default, words, inherit
from pygments.token
import Comment, Operator, Keyword, Name, String, Number, \
Punctuation, Whitespace
from pygments.lexers._css_builtins
import _css_properties
__all__ = [
'CssLexer' ,
'SassLexer' ,
'ScssLexer' ,
'LessCssLexer' ]
# List of vendor prefixes obtained from:
# https://www.w3.org/TR/CSS21/syndata.html#vendor-keyword-history
_vendor_prefixes = (
'-ms-' ,
'mso-' ,
'-moz-' ,
'-o-' ,
'-xv-' ,
'-atsc-' ,
'-wap-' ,
'-khtml-' ,
'-webkit-' ,
'prince-' ,
'-ah-' ,
'-hp-' ,
'-ro-' ,
'-rim-' ,
'-tc-' ,
)
# List of extended color keywords obtained from:
# https://drafts.csswg.org/css-color/#named-colors
_color_keywords = (
'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' ,
'turquoise' ,
'violet' ,
'wheat' ,
'white' ,
'whitesmoke' ,
'yellow' ,
'yellowgreen' ,
) + (
'transparent' ,)
# List of keyword values obtained from:
# http://cssvalues.com/
_keyword_values = (
'absolute' ,
'alias' ,
'all' ,
'all-petite-caps' ,
'all-scroll' ,
'all-small-caps' ,
'allow-end' ,
'alpha' ,
'alternate' ,
'alternate-reverse' ,
'always' ,
'armenian' ,
'auto' ,
'avoid' ,
'avoid-column' ,
'avoid-page' ,
'backwards' ,
'balance' ,
'baseline' ,
'below' ,
'blink' ,
'block' ,
'bold' ,
'bolder' ,
'border-box' ,
'both' ,
'bottom' ,
'box-decoration' ,
'break-word' ,
'capitalize' ,
'cell' ,
'center' ,
'circle' ,
'clip' ,
'clone' ,
'close-quote' ,
'col-resize' ,
'collapse' ,
'color' ,
'color-burn' ,
'color-dodge' ,
'column' ,
'column-reverse' ,
'compact' ,
'condensed' ,
'contain' ,
'container' ,
'content-box' ,
'context-menu' ,
'copy' ,
'cover' ,
'crisp-edges' ,
'crosshair' ,
'currentColor' ,
'cursive' ,
'darken' ,
'dashed' ,
'decimal' ,
'decimal-leading-zero' ,
'default' ,
'descendants' ,
'difference' ,
'digits' ,
'disc' ,
'distribute' ,
'dot' ,
'dotted' ,
'double' ,
'double-circle' ,
'e-resize' ,
'each-line' ,
'ease' ,
'ease-in' ,
'ease-in-out' ,
'ease-out' ,
'edges' ,
'ellipsis' ,
'end' ,
'ew-resize' ,
'exclusion' ,
'expanded' ,
'extra-condensed' ,
'extra-expanded' ,
'fantasy' ,
'fill' ,
'fill-box' ,
'filled' ,
'first' ,
'fixed' ,
'flat' ,
'flex' ,
'flex-end' ,
'flex-start' ,
'flip' ,
'force-end' ,
'forwards' ,
'from-image' ,
'full-width' ,
'geometricPrecision' ,
'georgian' ,
'groove' ,
'hanging' ,
'hard-light' ,
'help' ,
'hidden' ,
'hide' ,
'horizontal' ,
'hue' ,
'icon' ,
'infinite' ,
'inherit' ,
'initial' ,
'ink' ,
'inline' ,
'inline-block' ,
'inline-flex' ,
'inline-table' ,
'inset' ,
'inside' ,
'inter-word' ,
'invert' ,
'isolate' ,
'italic' ,
'justify' ,
'large' ,
'larger' ,
'last' ,
'left' ,
'lighten' ,
'lighter' ,
'line-through' ,
'linear' ,
'list-item' ,
'local' ,
'loose' ,
'lower-alpha' ,
'lower-greek' ,
'lower-latin' ,
'lower-roman' ,
'lowercase' ,
'ltr' ,
'luminance' ,
'luminosity' ,
'mandatory' ,
'manipulation' ,
'manual' ,
'margin-box' ,
'match-parent' ,
'medium' ,
'mixed' ,
'monospace' ,
'move' ,
'multiply' ,
'n-resize' ,
'ne-resize' ,
'nesw-resize' ,
'no-close-quote' ,
'no-drop' ,
'no-open-quote' ,
'no-repeat' ,
'none' ,
'normal' ,
'not-allowed' ,
'nowrap' ,
'ns-resize' ,
'nw-resize' ,
'nwse-resize' ,
'objects' ,
'oblique' ,
'off' ,
'on' ,
'open' ,
'open-quote' ,
'optimizeLegibility' ,
'optimizeSpeed' ,
'outset' ,
'outside' ,
'over' ,
'overlay' ,
'overline' ,
'padding-box' ,
'page' ,
'pan-down' ,
'pan-left' ,
'pan-right' ,
'pan-up' ,
'pan-x' ,
'pan-y' ,
'paused' ,
'petite-caps' ,
'pixelated' ,
'pointer' ,
'preserve-3d' ,
'progress' ,
'proximity' ,
'relative' ,
'repeat' ,
'repeat no-repeat' ,
'repeat-x' ,
'repeat-y' ,
'reverse' ,
'ridge' ,
'right' ,
'round' ,
'row' ,
'row-resize' ,
'row-reverse' ,
'rtl' ,
'ruby' ,
'ruby-base' ,
'ruby-base-container' ,
'ruby-text' ,
'ruby-text-container' ,
'run-in' ,
'running' ,
's-resize' ,
'sans-serif' ,
'saturation' ,
'scale-down' ,
'screen' ,
'scroll' ,
'se-resize' ,
'semi-condensed' ,
'semi-expanded' ,
'separate' ,
'serif' ,
'sesame' ,
'show' ,
'sideways' ,
'sideways-left' ,
'sideways-right' ,
'slice' ,
'small' ,
'small-caps' ,
'smaller' ,
'smooth' ,
'snap' ,
'soft-light' ,
'solid' ,
'space' ,
'space-around' ,
'space-between' ,
'spaces' ,
'square' ,
'start' ,
'static' ,
'step-end' ,
'step-start' ,
'sticky' ,
'stretch' ,
'strict' ,
'stroke-box' ,
'style' ,
'sw-resize' ,
'table' ,
'table-caption' ,
'table-cell' ,
'table-column' ,
'table-column-group' ,
'table-footer-group' ,
'table-header-group' ,
'table-row' ,
'table-row-group' ,
'text' ,
'thick' ,
'thin' ,
'titling-caps' ,
'to' ,
'top' ,
'triangle' ,
'ultra-condensed' ,
'ultra-expanded' ,
'under' ,
'underline' ,
'unicase' ,
'unset' ,
'upper-alpha' ,
'upper-latin' ,
'upper-roman' ,
'uppercase' ,
'upright' ,
'use-glyph-orientation' ,
'vertical' ,
'vertical-text' ,
'view-box' ,
'visible' ,
'w-resize' ,
'wait' ,
'wavy' ,
'weight' ,
'weight style' ,
'wrap' ,
'wrap-reverse' ,
'x-large' ,
'x-small' ,
'xx-large' ,
'xx-small' ,
'zoom-in' ,
'zoom-out' ,
)
# List of other keyword values from other sources:
_other_keyword_values = (
'above' ,
'aural' ,
'behind' ,
'bidi-override' ,
'center-left' ,
'center-right' ,
'cjk-ideographic' ,
'continuous' ,
'crop' ,
'cross' ,
'embed' ,
'far-left' ,
'far-right' ,
'fast' ,
'faster' ,
'hebrew' ,
'high' ,
'higher' ,
'hiragana' ,
'hiragana-iroha' ,
'katakana' ,
'katakana-iroha' ,
'landscape' ,
'left-side' ,
'leftwards' ,
'level' ,
'loud' ,
'low' ,
'lower' ,
'message-box' ,
'middle' ,
'mix' ,
'narrower' ,
'once' ,
'portrait' ,
'right-side' ,
'rightwards' ,
'silent' ,
'slow' ,
'slower' ,
'small-caption' ,
'soft' ,
'spell-out' ,
'status-bar' ,
'super' ,
'text-bottom' ,
'text-top' ,
'wider' ,
'x-fast' ,
'x-high' ,
'x-loud' ,
'x-low' ,
'x-soft' ,
'yes' ,
'pre' ,
'pre-wrap' ,
'pre-line' ,
)
# List of functional notation and function keyword values:
_functional_notation_keyword_values = (
'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' ,
'whiteness' ,
)
# Note! Handle url(...) separately.
# List of units obtained from:
# https://www.w3.org/TR/css3-values/
_angle_units = (
'deg' ,
'grad' ,
'rad' ,
'turn' ,
)
_frequency_units = (
'Hz' ,
'kHz' ,
)
_length_units = (
'em' ,
'ex' ,
'ch' ,
'rem' ,
'vh' ,
'vw' ,
'vmin' ,
'vmax' ,
'px' ,
'mm' ,
'cm' ,
'in' ,
'pt' ,
'pc' ,
'q' ,
)
_resolution_units = (
'dpi' ,
'dpcm' ,
'dppx' ,
)
_time_units = (
's' ,
'ms' ,
)
_all_units = _angle_units + _frequency_units + _length_units + \
_resolution_units + _time_units
class CssLexer(RegexLexer):
"" "
For CSS (Cascading Style Sheets).
"" "
name =
'CSS'
url =
'https://www.w3.org/TR/CSS/#css '
aliases = [
'css' ]
filenames = [
'*.css' ]
mimetypes = [
'text/css' ]
version_added =
''
tokens = {
'root' : [
include(
'basics' ),
],
'basics' : [
(r
'\s+' , Whitespace),
(r
'/\*(?:.|\n)*?\*/' , Comment),
(r
'\{' , Punctuation,
'content' ),
(r
'(\:{1,2})([\w-]+)' , bygroups(Punctuation, Name.Decorator)),
(r
'(\.)([\w-]+)' , bygroups(Punctuation, Name.
Class )),
(r
'(\#)([\w-]+)', bygroups(Punctuation, Name.Namespace)),
(r
'(@)([\w-]+)' , bygroups(Punctuation, Keyword),
'atrule' ),
(r
'[\w-]+' , Name.Tag),
(r
'[~^*!%&$\[\]()<>|+=@:;,./?-]' , Operator),
(r
'"(\\\\|\\[^\\]|[^"\\])*"' , String.Double),
(r
"'(\\\\|\\[^\\]|[^'\\])*'" , String.Single),
],
'atrule' : [
(r
'\{' , Punctuation,
'atcontent' ),
(r
';' , Punctuation,
'#pop'),
include(
'basics' ),
],
'atcontent' : [
include(
'basics' ),
(r
'\}' , Punctuation,
'#pop:2'),
],
'content' : [
(r
'\s+' , Whitespace),
(r
'\}' , Punctuation,
'#pop'),
(r
';' , Punctuation),
(r
'^@.*?$' , Comment.Preproc),
(words(_vendor_prefixes,), Keyword.Pseudo),
(r
'(' +r
'|' .join(_css_properties)+r
')(\s*)(\:)' ,
bygroups(Keyword, Whitespace, Punctuation),
'value-start' ),
(r
'([-]+[a-zA-Z_][\w-]*)(\s*)(\:)' , bygroups(Name.Variable, Whitespace, Punctuation
),
'value-start' ),
(r'([a-zA-Z_][\w-]*)(\s*)(\:)' , bygroups(Name, Whitespace, Punctuation),
'value-start' ),
(r'/\*(?:.|\n)*?\*/' , Comment),
],
'value-start' : [
(r'\s+' , Whitespace),
(words(_vendor_prefixes,), Name.Builtin.Pseudo),
include('urls' ),
(r'(' +r'|' .join(_functional_notation_keyword_values)+r')(\()' ,
bygroups(Name.Builtin, Punctuation), 'function-start' ),
(r'([a-zA-Z_][\w-]+)(\()' ,
bygroups(Name.Function, Punctuation), 'function-start' ),
(words(_keyword_values, suffix=r'\b' ), Keyword.Constant),
(words(_other_keyword_values, suffix=r'\b' ), Keyword.Constant),
(words(_color_keywords, suffix=r'\b' ), Keyword.Constant),
# for transition-property etc.
(words(_css_properties, suffix=r'\b' ), Keyword),
(r'\!important' , Comment.Preproc),
(r'/\*(?:.|\n)*?\*/' , Comment),
include('numeric-values' ),
(r'[~^*!%&<>|+=@:./?-]+' , Operator),
(r'[\[\](),]+' , Punctuation),
(r'"(\\\\|\\[^\\]|[^"\\])*"' , String.Double),
(r"'(\\\\|\\[^\\]|[^'\\])*'" , String.Single),
(r'[a-zA-Z_][\w-]*' , Name),
(r';' , Punctuation, '#pop'),
(r'\}' , Punctuation, '#pop:2'),
],
'function-start' : [
(r'\s+' , Whitespace),
(r'[-]+([A-Za-z][\w+]*[-]*)+' , Name.Variable),
include('urls' ),
(words(_vendor_prefixes,), Keyword.Pseudo),
(words(_keyword_values, suffix=r'\b' ), Keyword.Constant),
(words(_other_keyword_values, suffix=r'\b' ), Keyword.Constant),
(words(_color_keywords, suffix=r'\b' ), Keyword.Constant),
# function-start may be entered recursively
(r'(' + r'|' .join(_functional_notation_keyword_values) + r')(\()' ,
bygroups(Name.Builtin, Punctuation), 'function-start' ),
(r'([a-zA-Z_][\w-]+)(\()' ,
bygroups(Name.Function, Punctuation), 'function-start' ),
(r'/\*(?:.|\n)*?\*/' , Comment),
include('numeric-values' ),
(r'[*+/-]' , Operator),
(r',' , Punctuation),
(r'"(\\\\|\\[^\\]|[^"\\])*"' , String.Double),
(r"'(\\\\|\\[^\\]|[^'\\])*'" , String.Single),
(r'[a-zA-Z_-]\w*' , Name),
(r'\)' , Punctuation, '#pop'),
],
'urls' : [
(r'(url)(\()(".*?")(\))' , bygroups(Name.Builtin, Punctuation,
String.Double, Punctuation)),
(r"(url)(\()('.*?')(\))" , bygroups(Name.Builtin, Punctuation,
String.Single, Punctuation)),
(r'(url)(\()(.*?)(\))' , bygroups(Name.Builtin, Punctuation,
String.Other, Punctuation)),
],
'numeric-values' : [
(r'\#[a-zA-Z0-9]{1,6}', Number.Hex),
(r'[+\-]?[0-9]*[.][0-9]+' , Number.Float, 'numeric-end' ),
(r'[+\-]?[0-9]+' , Number.Integer, 'numeric-end' ),
],
'numeric-end' : [
(words(_all_units, suffix=r'\b' ), Keyword.Type),
(r'%' , Keyword.Type),
default('#pop'),
],
}
common_sass_tokens = {
'value' : [
(r'[ \t]+' , Whitespace),
(r'[!$][\w-]+' , Name.Variable),
(r'url\(' , String.Other, 'string-url' ),
(r'[a-z_-][\w-]*(?=\()' , Name.Function),
(words(_css_properties + (
'above' , 'absolute' , 'always' , 'armenian' , 'aural' , 'auto' , 'avoid' , 'baseline' ,
'behind' , 'below' , 'bidi-override' , 'blink' , 'block' , 'bold' , 'bolder' , 'both' ,
'capitalize' , 'center-left' , 'center-right' , 'center' , 'circle' ,
'cjk-ideographic' , 'close-quote' , 'collapse' , 'condensed' , 'continuous' ,
'crosshair' , 'cross' , 'cursive' , 'dashed' , 'decimal-leading-zero' ,
'decimal' , 'default' , 'digits' , 'disc' , 'dotted' , 'double' , 'e-resize' , 'embed' ,
'extra-condensed' , 'extra-expanded' , 'expanded' , 'fantasy' , 'far-left' ,
'far-right' , 'faster' , 'fast' , 'fixed' , 'georgian' , 'groove' , 'hebrew' , 'help' ,
'hidden' , 'hide' , 'higher' , 'high' , 'hiragana-iroha' , 'hiragana' , 'icon' ,
'inherit' , 'inline-table' , 'inline' , 'inset' , 'inside' , 'invert' , 'italic' ,
'justify' , 'katakana-iroha' , 'katakana' , 'landscape' , 'larger' , 'large' ,
'left-side' , 'leftwards' , 'level' , 'lighter' , 'line-through' , 'list-item' ,
'loud' , 'lower-alpha' , 'lower-greek' , 'lower-roman' , 'lowercase' , 'ltr' ,
'lower' , 'low' , 'medium' , 'message-box' , 'middle' , 'mix' , 'monospace' ,
'n-resize' , 'narrower' , 'ne-resize' , 'no-close-quote' , 'no-open-quote' ,
'no-repeat' , 'none' , 'normal' , 'nowrap' , 'nw-resize' , 'oblique' , 'once' ,
'open-quote' , 'outset' , 'outside' , 'overline' , 'pointer' , 'portrait' , 'px' ,
'relative' , 'repeat-x' , 'repeat-y' , 'repeat' , 'rgb' , 'ridge' , 'right-side' ,
'rightwards' , 's-resize' , 'sans-serif' , 'scroll' , 'se-resize' ,
'semi-condensed' , 'semi-expanded' , 'separate' , 'serif' , 'show' , 'silent' ,
'slow' , 'slower' , 'small-caps' , 'small-caption' , 'smaller' , 'soft' , 'solid' ,
'spell-out' , 'square' , 'static' , 'status-bar' , 'super' , 'sw-resize' ,
'table-caption' , 'table-cell' , 'table-column' , 'table-column-group' ,
'table-footer-group' , 'table-header-group' , 'table-row' ,
'table-row-group' , 'text' , 'text-bottom' , 'text-top' , 'thick' , 'thin' ,
'transparent' , 'ultra-condensed' , 'ultra-expanded' , 'underline' ,
'upper-alpha' , 'upper-latin' , 'upper-roman' , 'uppercase' , 'url' ,
'visible' , 'w-resize' , 'wait' , 'wider' , 'x-fast' , 'x-high' , 'x-large' , 'x-loud' ,
'x-low' , 'x-small' , 'x-soft' , 'xx-large' , 'xx-small' , 'yes' ), suffix=r'\b' ),
Name.Constant),
(words(_color_keywords, suffix=r'\b' ), Name.Entity),
(words((
'black' , 'silver' , 'gray' , 'white' , 'maroon' , 'red' , 'purple' , 'fuchsia' , 'green' ,
'lime' , 'olive' , 'yellow' , 'navy' , 'blue' , 'teal' , 'aqua' ), suffix=r'\b' ),
Name.Builtin),
(r'\!(important|default)' , Name.Exception),
(r'(true|false)' , Name.Pseudo),
(r'(and|or|not)' , Operator.Word),
(r'/\*' , Comment.Multiline, 'inline-comment' ),
(r'//[^\n]*' , Comment.Single),
(r'\#[a-z0-9]{1,6}', Number.Hex),
(r'(-?\d+)(\%|[a-z]+)?' , bygroups(Number.Integer, Keyword.Type)),
(r'(-?\d*\.\d+)(\%|[a-z]+)?' , bygroups(Number.Float, Keyword.Type)),
(r'#\{', String.Interpol, 'interpolation'),
(r'[~^*!&%<>|+=@:,./?-]+' , Operator),
(r'[\[\]()]+' , Punctuation),
(r'"' , String.Double, 'string-double' ),
(r"'" , String.Single, 'string-single' ),
(r'[a-z_-][\w-]*' , Name),
],
'interpolation' : [
(r'\}' , String.Interpol, '#pop'),
include('value' ),
],
'selector' : [
(r'[ \t]+' , Whitespace),
(r'\:' , Name.Decorator, 'pseudo-class' ),
(r'\.' , Name.Class , 'class' ),
(r'\#', Name.Namespace, 'id'),
(r'[\w-]+' , Name.Tag),
(r'#\{', String.Interpol, 'interpolation'),
(r'&' , Keyword),
(r'[~^*!&\[\]()<>|+=@:;,./?-]' , Operator),
(r'"' , String.Double, 'string-double' ),
(r"'" , String.Single, 'string-single' ),
],
'string-double' : [
(r'(\\.|#(?=[^\n{])|[^\n"#])+', String.Double),
(r'#\{', String.Interpol, 'interpolation'),
(r'"' , String.Double, '#pop'),
],
'string-single' : [
(r"(\\.|#(?=[^\n{])|[^\n'#])+", String.Single),
(r'#\{', String.Interpol, 'interpolation'),
(r"'" , String.Single, '#pop'),
],
'string-url' : [
(r'(\\#|#(?=[^\n{])|[^\n#)])+', String.Other),
(r'#\{', String.Interpol, 'interpolation'),
(r'\)' , String.Other, '#pop'),
],
'pseudo-class' : [
(r'[\w-]+' , Name.Decorator),
(r'#\{', String.Interpol, 'interpolation'),
default('#pop'),
],
'class' : [
(r'[\w-]+' , Name.Class ),
(r'#\{', String.Interpol, 'interpolation'),
default('#pop'),
],
'id' : [
(r'[\w-]+' , Name.Namespace),
(r'#\{', String.Interpol, 'interpolation'),
default('#pop'),
],
'for' : [
(r'(from|to|through)' , Operator.Word),
include('value' ),
],
}
def _indentation(lexer, match, ctx):
indentation = match.group(0)
yield match.start(), Whitespace, indentation
ctx.last_indentation = indentation
ctx.pos = match.end()
if hasattr(ctx, 'block_state' ) and ctx.block_state and \
indentation.startswith(ctx.block_indentation) and \
indentation != ctx.block_indentation:
ctx.stack.append(ctx.block_state)
else :
ctx.block_state = None
ctx.block_indentation = None
ctx.stack.append('content' )
def _starts_block(token, state):
def callback(lexer, match, ctx):
yield match.start(), token, match.group(0)
if hasattr(ctx, 'last_indentation' ):
ctx.block_indentation = ctx.last_indentation
else :
ctx.block_indentation = ''
ctx.block_state = state
ctx.pos = match.end()
return callback
class SassLexer(ExtendedRegexLexer):
"" "
For Sass stylesheets.
"" "
name = 'Sass'
url = 'https://sass-lang.com/ '
aliases = ['sass' ]
filenames = ['*.sass' ]
mimetypes = ['text/x-sass' ]
version_added = '1.3'
flags = re.IGNORECASE | re.MULTILINE
tokens = {
'root' : [
(r'[ \t]*\n' , Whitespace),
(r'[ \t]*' , _indentation),
],
'content' : [
(r'//[^\n]*' , _starts_block(Comment.Single, 'single-comment' ),
'root' ),
(r'/\*[^\n]*' , _starts_block(Comment.Multiline, 'multi-comment' ),
'root' ),
(r'@import' , Keyword, 'import' ),
(r'@for' , Keyword, 'for' ),
(r'@(debug|warn|if|while)' , Keyword, 'value' ),
(r'(@mixin)( )([\w-]+)' , bygroups(Keyword, Whitespace, Name.Function), 'value' ),
(r'(@include)( )([\w-]+)' , bygroups(Keyword, Whitespace, Name.Decorator), 'value' ),
(r'@extend' , Keyword, 'selector' ),
(r'@[\w-]+' , Keyword, 'selector' ),
(r'=[\w-]+' , Name.Function, 'value' ),
(r'\+[\w-]+' , Name.Decorator, 'value' ),
(r'([!$][\w-]\w*)([ \t]*(?:(?:\|\|)?=|:))' ,
bygroups(Name.Variable, Operator), 'value' ),
(r':' , Name.Attribute, 'old-style-attr' ),
(r'(?=.+?[=:]([^a-z]|$))' , Name.Attribute, 'new-style-attr' ),
default('selector' ),
],
'single-comment' : [
(r'.+' , Comment.Single),
(r'\n' , Whitespace, 'root' ),
],
'multi-comment' : [
(r'.+' , Comment.Multiline),
(r'\n' , Whitespace, 'root' ),
],
'import' : [
(r'[ \t]+' , Whitespace),
(r'\S+' , String),
(r'\n' , Whitespace, 'root' ),
],
'old-style-attr' : [
(r'[^\s:="\[]+' , Name.Attribute),
(r'#\{', String.Interpol, 'interpolation'),
(r'([ \t]*)(=)' , bygroups(Whitespace, Operator), 'value' ),
default('value' ),
],
'new-style-attr' : [
(r'[^\s:="\[]+' , Name.Attribute),
(r'#\{', String.Interpol, 'interpolation'),
(r'([ \t]*)([=:])' , bygroups(Whitespace, Operator), 'value' ),
],
'inline-comment' : [
(r"(\\#|#(?=[^\n{])|\*(?=[^\n/])|[^\n#*])+", Comment.Multiline),
(r'#\{', String.Interpol, 'interpolation'),
(r"\*/" , Comment, '#pop'),
],
}
for group, common in common_sass_tokens.items():
tokens[group] = copy.copy(common)
tokens['value' ].append((r'\n' , Whitespace, 'root' ))
tokens['selector' ].append((r'\n' , Whitespace, 'root' ))
class ScssLexer(RegexLexer):
"" "
For SCSS stylesheets.
"" "
name = 'SCSS'
url = 'https://sass-lang.com/ '
aliases = ['scss' ]
filenames = ['*.scss' ]
mimetypes = ['text/x-scss' ]
version_added = ''
flags = re.IGNORECASE | re.DOTALL
tokens = {
'root' : [
(r'\s+' , Whitespace),
(r'//.*?\n' , Comment.Single),
(r'/\*.*?\*/' , Comment.Multiline),
(r'@import' , Keyword, 'value' ),
(r'@for' , Keyword, 'for' ),
(r'@(debug|warn|if|while)' , Keyword, 'value' ),
(r'(@mixin)( [\w-]+)' , bygroups(Keyword, Name.Function), 'value' ),
(r'(@include)( [\w-]+)' , bygroups(Keyword, Name.Decorator), 'value' ),
(r'@extend' , Keyword, 'selector' ),
(r'(@media)(\s+)' , bygroups(Keyword, Whitespace), 'value' ),
(r'@[\w-]+' , Keyword, 'selector' ),
(r'(\$[\w-]*\w)([ \t]*:)' , bygroups(Name.Variable, Operator), 'value' ),
# TODO: broken, and prone to infinite loops.
# (r'(?=[^;{}][;}])', Name.Attribute, 'attr'),
# (r'(?=[^;{}:]+:[^a-z])', Name.Attribute, 'attr'),
default('selector' ),
],
'attr' : [
(r'[^\s:="\[]+' , Name.Attribute),
(r'#\{', String.Interpol, 'interpolation'),
(r'[ \t]*:' , Operator, 'value' ),
default('#pop'),
],
'inline-comment' : [
(r"(\\#|#(?=[^{])|\*(?=[^/])|[^#*])+", Comment.Multiline),
(r'#\{', String.Interpol, 'interpolation'),
(r"\*/" , Comment, '#pop'),
],
}
for group, common in common_sass_tokens.items():
tokens[group] = copy.copy(common)
tokens['value' ].extend([(r'\n' , Whitespace), (r'[;{}]' , Punctuation, '#pop')])
tokens['selector' ].extend([(r'\n' , Whitespace), (r'[;{}]' , Punctuation, '#pop')])
class LessCssLexer(CssLexer):
"" "
For LESS styleshets.
"" "
name = 'LessCss'
url = 'http://lesscss.org/ '
aliases = ['less' ]
filenames = ['*.less' ]
mimetypes = ['text/x-less-css' ]
version_added = '2.1'
tokens = {
'root' : [
(r'@\w+' , Name.Variable),
inherit,
],
'content' : [
(r'\{' , Punctuation, '#push'),
(r'//.*\n' , Comment.Single),
inherit,
],
}
Messung V0.5 C=87 H=96 G=91
¤ Dauer der Verarbeitung: 0.6 Sekunden
¤
*© Formatika GbR, Deutschland