lib/rouge/lexers/css.rb in rouge-0.2.1 vs lib/rouge/lexers/css.rb in rouge-0.2.2

- old
+ new

@@ -7,98 +7,110 @@ filenames '*.css' mimetypes 'text/css' identifier = /[a-zA-Z0-9_-]+/ number = /-?(?:[0-9]+(\.[0-9]+)?|\.[0-9]+)/ - keywords = %w( - azimuth background-attachment background-color - background-image background-position background-repeat - background border-bottom-color border-bottom-style - border-bottom-width border-left-color border-left-style - border-left-width border-right border-right-color - border-right-style border-right-width border-top-color - border-top-style border-top-width border-bottom - border-collapse border-left border-width border-color - border-spacing border-style border-top border caption-side - clear clip color content counter-increment counter-reset - cue-after cue-before cue cursor direction display - elevation empty-cells float font-family font-size - font-size-adjust font-stretch font-style font-variant - font-weight font height letter-spacing line-height - list-style-type list-style-image list-style-position - list-style margin-bottom margin-left margin-right - margin-top margin marker-offset marks max-height max-width - min-height min-width opacity orphans outline outline-color - outline-style outline-width overflow(?:-x -y ) padding-bottom - padding-left padding-right padding-top padding page - page-break-after page-break-before page-break-inside - pause-after pause-before pause pitch pitch-range - play-during position quotes richness right size - speak-header speak-numeral speak-punctuation speak - speech-rate stress table-layout text-align text-decoration - text-indent text-shadow text-transform top unicode-bidi - vertical-align visibility voice-family volume white-space - widows width word-spacing z-index bottom left - 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 - crop 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 - ) - builtins = %w( - indigo gold firebrick indianred yellow darkolivegreen - darkseagreen mediumvioletred mediumorchid chartreuse - mediumslateblue black springgreen crimson lightsalmon brown - turquoise olivedrab cyan silver skyblue gray darkturquoise - goldenrod darkgreen darkviolet darkgray lightpink teal - darkmagenta lightgoldenrodyellow lavender yellowgreen thistle - violet navy orchid blue ghostwhite honeydew cornflowerblue - darkblue darkkhaki mediumpurple cornsilk red bisque slategray - darkcyan khaki wheat deepskyblue darkred steelblue aliceblue - gainsboro mediumturquoise floralwhite coral purple lightgrey - lightcyan darksalmon beige azure lightsteelblue oldlace - greenyellow royalblue lightseagreen mistyrose sienna - lightcoral orangered navajowhite lime palegreen burlywood - seashell mediumspringgreen fuchsia papayawhip blanchedalmond - peru aquamarine white darkslategray ivory dodgerblue - lemonchiffon chocolate orange forestgreen slateblue olive - mintcream antiquewhite darkorange cadetblue moccasin - limegreen saddlebrown darkslateblue lightskyblue deeppink - plum aqua darkgoldenrod maroon sandybrown magenta tan - rosybrown pink lightblue palevioletred mediumseagreen - dimgray powderblue seagreen snow mediumblue midnightblue - paleturquoise palegoldenrod whitesmoke darkorchid salmon - lightslategray lawngreen lightgreen tomato hotpink - lightyellow lavenderblush linen mediumaquamarine green - blueviolet peachpuff - ) + def self.attributes + @attributes ||= Set.new %w( + azimuth background background-attachment background-color + background-image background-position background-repeat + border border-bottom border-bottom-color border-bottom-style + border-bottom-width border-collapse border-color border-left + border-left-color border-left-style border-left-width + border-right border-right-color border-right-style + border-right-width border-spacing border-style border-top + border-top-color border-top-style border-top-width + border-width bottom caption-side clear clip color content + counter-increment counter-reset cue cue-after cue-before cursor + direction display elevation empty-cells float font font-family + font-size font-size-adjust font-stretch font-style font-variant + font-weight height 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 marker-offset + marks max-height max-width min-height min-width opacity orphans + outline outline-color outline-style outline-width overflow-x + overflow-y padding padding-bottom padding-left padding-right + padding-top page page-break-after page-break-before + page-break-inside pause pause-after pause-before pitch + pitch-range play-during position quotes richness right size + speak speak-header speak-numeral speak-punctuation speech-rate + src stress table-layout text-align text-decoration text-indent + text-shadow text-transform top unicode-bidi vertical-align + visibility voice-family volume white-space widows width + word-spacing z-index + ) + end + def self.builtins + @builtins ||= Set.new %w( + above absolute always armenian aural auto avoid left bottom + baseline behind below bidi-override blink block bold bolder + both bottom capitalize center center-left center-right circle + cjk-ideographic close-quote collapse condensed continuous crop + cross crosshair cursive dashed decimal decimal-leading-zero + default digits disc dotted double e-resize embed expanded + extra-condensed extra-expanded fantasy far-left far-right fast + faster fixed georgian groove hebrew help hidden hide high higher + hiragana hiragana-iroha icon inherit inline inline-table inset + inside invert italic justify katakana katakana-iroha landscape + large larger left left-side leftwards level lighter line-through + list-item loud low lower lower-alpha lower-greek lower-roman + lowercase ltr 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 repeat-x repeat-y + rgb ridge right 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 top 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 + ) + end + + def self.constants + @constants ||= Set.new %w( + indigo gold firebrick indianred yellow darkolivegreen + darkseagreen mediumvioletred mediumorchid chartreuse + mediumslateblue black springgreen crimson lightsalmon brown + turquoise olivedrab cyan silver skyblue gray darkturquoise + goldenrod darkgreen darkviolet darkgray lightpink teal + darkmagenta lightgoldenrodyellow lavender yellowgreen thistle + violet navy orchid blue ghostwhite honeydew cornflowerblue + darkblue darkkhaki mediumpurple cornsilk red bisque slategray + darkcyan khaki wheat deepskyblue darkred steelblue aliceblue + gainsboro mediumturquoise floralwhite coral purple lightgrey + lightcyan darksalmon beige azure lightsteelblue oldlace + greenyellow royalblue lightseagreen mistyrose sienna lightcoral + orangered navajowhite lime palegreen burlywood seashell + mediumspringgreen fuchsia papayawhip blanchedalmond peru + aquamarine white darkslategray ivory dodgerblue lemonchiffon + chocolate orange forestgreen slateblue olive mintcream + antiquewhite darkorange cadetblue moccasin limegreen saddlebrown + darkslateblue lightskyblue deeppink plum aqua darkgoldenrod + maroon sandybrown magenta tan rosybrown pink lightblue + palevioletred mediumseagreen dimgray powderblue seagreen snow + mediumblue midnightblue paleturquoise palegoldenrod whitesmoke + darkorchid salmon lightslategray lawngreen lightgreen tomato + hotpink lightyellow lavenderblush linen mediumaquamarine green + blueviolet peachpuff + ) + end + + # source: http://www.w3.org/TR/CSS21/syndata.html#vendor-keyword-history + def self.vendor_prefixes + @vendor_prefixes ||= Set.new %w( + -ah- -atsc- -hp- -khtml- -moz- -ms- -o- -rim- -ro- -tc- -wap- + -webkit- -xv- mso- prince- + ) + end + state :root do mixin :basics rule /{/, 'Punctuation', :stanza rule /:#{identifier}/, 'Name.Decorator' rule /\.#{identifier}/, 'Name.Class' @@ -114,11 +126,19 @@ rule /#[0-9a-f]{1,6}/i, 'Literal.Number' # colors rule /#{number}(?:em|px|%|pt|pc|in|mm|m|ex|s)?\b/, 'Literal.Number' rule /[\[\]():\/.]/, 'Punctuation' rule /"(\\\\|\\"|[^"])*"/, 'Literal.String.Single' rule /'(\\\\|\\'|[^'])*'/, 'Literal.String.Double' - rule identifier, 'Name' + rule(identifier) do |m| + if self.class.constants.include? m[0] + token 'Name.Constant' + elsif self.class.builtins.include? m[0] + token 'Name.Builtin' + else + token 'Name' + end + end end state :at_rule do rule /{(?=\s*#{identifier}\s*:)/m, 'Punctuation', :at_stanza rule /{/, 'Punctuation', :at_body @@ -149,17 +169,20 @@ end state :stanza do mixin :basics rule /}/, 'Punctuation', :pop! - rule /(#{identifier}\s*):/m do |m| - if keywords.include? m[1] - token 'Keyword' - elsif builtins.include? m[1] - token 'Name.Builtin' + rule /(#{identifier})(\s*)(:)/m do |m| + if self.class.attributes.include? m[1] + group 'Name.Label' + elsif self.class.vendor_prefixes.any? { |p| m[1].start_with?(p) } + group 'Name.Label' else - token 'Name' + group 'Name.Property' end + + group 'Text' + group 'Punctuation' push :stanza_value end end