Skip to content

Commit

Permalink
begin/end with group :function instead of :string
Browse files Browse the repository at this point in the history
  • Loading branch information
noprompt committed Jan 13, 2012
1 parent f049cab commit 5750b1c
Showing 1 changed file with 40 additions and 40 deletions.
80 changes: 40 additions & 40 deletions lib/coderay/scanners/css.rb
Expand Up @@ -2,17 +2,17 @@ module CodeRay
module Scanners

class CSS < Scanner

register_for :css

KINDS_NOT_LOC = [
:comment,
:class, :pseudo_class, :type,
:constant, :directive,
:key, :value, :operator, :color, :float, :string,
:error, :important,
] # :nodoc:

module RE # :nodoc:
Hex = /[0-9a-fA-F]/
Unicode = /\\#{Hex}{1,6}(?:\r\n|\s)?/ # differs from standard because it allows uppercase hex too
Expand All @@ -23,47 +23,47 @@ module RE # :nodoc:
String1 = /"(?:[^\n\r\f\\"]|\\#{NL}|#{Escape})*"?/ # TODO: buggy regexp
String2 = /'(?:[^\n\r\f\\']|\\#{NL}|#{Escape})*'?/ # TODO: buggy regexp
String = /#{String1}|#{String2}/

HexColor = /#(?:#{Hex}{6}|#{Hex}{3})/
Color = /#{HexColor}/

Num = /-?(?:[0-9]+|[0-9]*\.[0-9]+)/
Name = /#{NMChar}+/
Ident = /-?#{NMStart}#{NMChar}*/
AtKeyword = /@#{Ident}/
Percentage = /#{Num}%/

reldimensions = %w[em ex px]
absdimensions = %w[in cm mm pt pc]
Unit = Regexp.union(*(reldimensions + absdimensions + %w[s]))

Dimension = /#{Num}#{Unit}/

Comment = %r! /\* (?: .*? \*/ | .* ) !mx
Function = /(?:url|alpha|attr|counters?)\((?:[^)\n\r\f]|\\\))*\)?/

Id = /##{Name}/
Class = /\.#{Name}/
PseudoClass = /:#{Name}/
AttributeSelector = /\[[^\]]*\]?/
end

protected

def setup
@state = :initial
@value_expected = nil
end

def scan_tokens encoder, options
states = Array(options[:state] || @state)
value_expected = @value_expected

until eos?

if match = scan(/\s+/)
encoder.text_token match, :space

elsif case states.last
when :initial, :media
if match = scan(/(?>#{RE::Ident})(?!\()|\*/ox)
Expand All @@ -89,7 +89,7 @@ def scan_tokens encoder, options
states.push :media_before_name
next
end

when :block
if match = scan(/(?>#{RE::Ident})(?!\()/ox)
if value_expected
Expand All @@ -99,52 +99,52 @@ def scan_tokens encoder, options
end
next
end

when :media_before_name
if match = scan(RE::Ident)
encoder.text_token match, :type
states[-1] = :media_after_name
next
end

when :media_after_name
if match = scan(/\{/)
encoder.text_token match, :operator
states[-1] = :media
next
end

else
#:nocov:
raise_inspect 'Unknown state', encoder
#:nocov:

end

elsif match = scan(/\/\*(?:.*?\*\/|\z)/m)
encoder.text_token match, :comment

elsif match = scan(/\{/)
value_expected = false
encoder.text_token match, :operator
states.push :block

elsif match = scan(/\}/)
value_expected = false
encoder.text_token match, :operator
if states.last == :block || states.last == :media
states.pop
end

elsif match = scan(/#{RE::String}/o)
encoder.begin_group :string
encoder.text_token match[0, 1], :delimiter
encoder.text_token match[1..-2], :content if match.size > 2
encoder.text_token match[-1, 1], :delimiter if match.size >= 2
encoder.end_group :string

elsif match = scan(/#{RE::Function}/o)
encoder.begin_group :string
encoder.begin_group :function
start = match[/^\w+\(/]
encoder.text_token start, :delimiter
if match[-1] == ?)
Expand All @@ -153,47 +153,47 @@ def scan_tokens encoder, options
else
encoder.text_token match[start.size..-1], :content
end
encoder.end_group :string
encoder.end_group :function

elsif match = scan(/(?: #{RE::Dimension} | #{RE::Percentage} | #{RE::Num} )/ox)
encoder.text_token match, :float

elsif match = scan(/#{RE::Color}/o)
encoder.text_token match, :color

elsif match = scan(/! *important/)
encoder.text_token match, :important

elsif match = scan(/(?:rgb|hsl)a?\([^()\n]*\)?/)
encoder.text_token match, :color

elsif match = scan(RE::AtKeyword)
encoder.text_token match, :directive

elsif match = scan(/ [+>:;,.=()\/] /x)
if match == ':'
value_expected = true
elsif match == ';'
value_expected = false
end
encoder.text_token match, :operator

else
encoder.text_token getch, :error

end

end

if options[:keep_state]
@state = states
@value_expected = value_expected
end

encoder
end

end

end
end

0 comments on commit 5750b1c

Please sign in to comment.