diff options
author | murphy <murphy@rubychan.de> | 2009-02-06 01:14:25 +0000 |
---|---|---|
committer | murphy <murphy@rubychan.de> | 2009-02-06 01:14:25 +0000 |
commit | 904532b6f937c4af2afd30bcc4282f6513f82acb (patch) | |
tree | 083308a20bbbcc0fcfa1e05888e9e747b02964f7 /lib/coderay | |
parent | b390954126e93c33321cfb546c2d43431ba0a4b3 (diff) | |
download | coderay-904532b6f937c4af2afd30bcc4282f6513f82acb.tar.gz |
Fixed CSS scanner (closes #72).
* handles url(...) outside of blocks
* handles @media
* handles [attribute=selectors] (too simple, added TODO)
Diffstat (limited to 'lib/coderay')
-rw-r--r-- | lib/coderay/scanners/css.rb | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/lib/coderay/scanners/css.rb b/lib/coderay/scanners/css.rb index 848f136..bfa8bda 100644 --- a/lib/coderay/scanners/css.rb +++ b/lib/coderay/scanners/css.rb @@ -38,6 +38,7 @@ module Scanners Id = /##{Name}/ Class = /\.#{Name}/ PseudoClass = /:#{Name}/ + AttributeSelector = /\[[^\]]*\]?/ end @@ -55,8 +56,8 @@ module Scanners kind = :space elsif case states.last - when :initial - if scan(/#{RE::Ident}|\*/ox) + when :initial, :media + if scan(/(?>#{RE::Ident})(?!\()|\*/ox) kind = :keyword elsif scan RE::Class kind = :class @@ -64,10 +65,19 @@ module Scanners kind = :constant elsif scan RE::PseudoClass kind = :pseudo_class - elsif scan RE::Name - kind = :identifier + elsif match = scan(RE::AttributeSelector) + # TODO: Improve highlighting inside of attribute selectors. + tokens << [:open, :string] + tokens << [match[0,1], :delimiter] + tokens << [match[1..-2], :content] if match.size > 2 + tokens << [match[-1,1], :delimiter] if match[-1] == ?] + tokens << [:close, :string] + next + elsif match = scan(/@media/) + kind = :directive + states.push :media_before_name end - + when :block if scan(/(?>#{RE::Ident})(?!\()/ox) if value_expected @@ -77,6 +87,18 @@ module Scanners end end + when :media_before_name + if scan RE::Ident + kind = :type + states[-1] = :media_after_name + end + + when :media_after_name + if scan(/\{/) + kind = :operator + states[-1] = :media + end + when :comment if scan(/(?:[^*\s]|\*(?!\/))+/) kind = :comment @@ -103,7 +125,7 @@ module Scanners elsif scan(/\}/) value_expected = false - if states.last == :block + if states.last == :block || states.last == :media kind = :operator states.pop else |