1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
#TLEX start=default
module Web
module CSS
class Scanner
H = "[0-9a-f]"
NONASCII = "[\302\240-\364\217\277\277]"
UNICODE = "\\\\#{H}{1,6}[ \\t\\r\\n\\f]?"
ESCAPE = "(?:#{UNICODE}|\\\\[ -~\302\240-\364\217\277\277])"
NMSTART = "(?:[a-z]|#{NONASCII}|#{ESCAPE})"
NMCHAR = "(?:[a-z0-9\-]|#{NONASCII}|#{ESCAPE})"
NL = "(?:\\n|\\r\\n|\\r|\\f)"
STRING1 = "(?:\"([\\t !\#$%&(-~]|#{NL}|\'|#{NONASCII}|#{ESCAPE})*\")"
STRING2 = "(?:\'([\\t !\#$%&(-~]|#{NL}|\"|#{NONASCII}|#{ESCAPE})*\')"
IDENT = "#{NMSTART}#{NMCHAR}*"
NAME = "#{NMCHAR}+"
NUM = "(?:[0-9]+|[0-9]*\.[0-9]+)"
STRING = "(?:#{STRING1}|#{STRING2})"
URL = "(?:[!\#$%&*-~]|#{NONASCII}|#{ESCAPE})*"
W = "[ \\t\\r\\n\\f]*"
RANGE = "\\?{1,6}|#{H}(\\?{0,5}|#{H}(\\?{0,4}|#{H}(\\?{0,3}|#{H}(\\?{0,2}|#{H}(\\?\\?|#{H})))))"
###
#:default
#/[ \t\r\n\f]+/ui
push [:S,matched]
#/\/\*/ui
transit_state :comment
#/<!--/ui
push [:CDO,matched]
#/-->/ui
push [:CDC,matched]
#/~=/ui
push [:INCLUDES,matched]
#/\|=/ui
push [:DASHMATCH,matched]
#/#{STRING}/ui
push [:STRING,matched]
#/url\(#{W}(#{STRING})#{W}\)/ui
push [:URI,matched]
#/url\(#{W}(#{URL})#{W}\)/ui
push [:URI,matched]
#/#{IDENT}/ui
push [:IDENT,matched]
#/\##{NAME}/ui
push [:HASH,matched]
#/@#{IDENT}/ui
case matched.downcase
when "@import"
push [:IMPORT_SYM,matched]
when "@page"
push [:PAGE_SYM,matched]
when "@media"
push [:MEDIA_SYM,matched]
when "@font-face"
push [:FONT_FACE_SYM,matched]
when "@charset"
push [:CHARSET_SYM,matched]
else
push [:ATKEYWORD,matched]
end
#/!#{W}important/ui
push [:IMPORTANT_SYM,matched]
#/(#{NUM})em/ui
push [:EMS,matched]
#/(#{NUM})ex/ui
push [:EXS,matched]
#/(#{NUM})px/ui
push [:LENGTH,matched]
#/(#{NUM})cm/ui
push [:LENGTH,matched]
#/(#{NUM})mm/ui
push [:LENGTH,matched]
#/(#{NUM})in/ui
push [:LENGTH,matched]
#/(#{NUM})pt/ui
push [:LENGTH,matched]
#/(#{NUM})pc/ui
push [:LENGTH,matched]
#/(#{NUM})deg/ui
push [:ANGLE,matched]
#/(#{NUM})rad/ui
push [:ANGLE,matched]
#/(#{NUM})grad/ui
push [:ANGLE,matched]
#/(#{NUM})ms/ui
push [:TIME,matched]
#/(#{NUM})s/ui
push [:TIME,matched]
#/(#{NUM})Hz/ui
push [:FREQ,matched]
#/(#{NUM})kHz/ui
push [:FREQ,matched]
#/(#{NUM})(#{IDENT})/ui
push [:DIMEN,matched]
#/(#{NUM})%/ui
push [:PERCENTAGE,matched]
#/(#{NUM})/ui
push [:NUMBER,matched]
#/(#{IDENT})\(/ui
push [:FUNCTION,matched]
#/U\+#{RANGE}/ui
push [:UNICODERANGE,matched]
#/U\+#{H}{1,6}-#{H}{1,6}/ui
push [:UNICODERANGE,matched]
#/#{IDENT}/ui
push [:IDENT,matched]
#/./ui
push [matched.intern,matched]
#:comment
#/[^*]/ui
#
#/\*\//ui
transit_state :default
#/./ui
#
###
end # Scanner
end # CSS
end # Web
if $0==__FILE__
scan = Web::CSS::Scanner.new(ARGF)
while token=scan.token
p token
end
end
|