# File lib/coderay/scanners/css.rb, line 53 53: def scan_tokens tokens, options 54: 55: value_expected = nil 56: states = [:initial] 57: 58: until eos? 59: 60: kind = nil 61: match = nil 62: 63: if scan(/\s+/) 64: kind = :space 65: 66: elsif case states.last 67: when :initial, :media 68: if scan(/(?>#{RE::Ident})(?!\()|\*/x) 69: kind = :type 70: elsif scan RE::Class 71: kind = :class 72: elsif scan RE::Id 73: kind = :constant 74: elsif scan RE::PseudoClass 75: kind = :pseudo_class 76: elsif match = scan(RE::AttributeSelector) 77: # TODO: Improve highlighting inside of attribute selectors. 78: tokens << [:open, :string] 79: tokens << [match[0,1], :delimiter] 80: tokens << [match[1..2], :content] if match.size > 2 81: tokens << [match[1,1], :delimiter] if match[1] == ]] 82: tokens << [:close, :string] 83: next 84: elsif match = scan(/@media/) 85: kind = :directive 86: states.push :media_before_name 87: end 88: 89: when :block 90: if scan(/(?>#{RE::Ident})(?!\()/x) 91: if value_expected 92: kind = :value 93: else 94: kind = :key 95: end 96: end 97: 98: when :media_before_name 99: if scan RE::Ident 100: kind = :type 101: states[1] = :media_after_name 102: end 103: 104: when :media_after_name 105: if scan(/\{/) 106: kind = :operator 107: states[1] = :media 108: end 109: 110: when :comment 111: if scan(/(?:[^*\s]|\*(?!\/))+/) 112: kind = :comment 113: elsif scan(/\*\//) 114: kind = :comment 115: states.pop 116: elsif scan(/\s+/) 117: kind = :space 118: end 119: 120: else 121: raise_inspect 'Unknown state', tokens 122: 123: end 124: 125: elsif scan(/\/\*/) 126: kind = :comment 127: states.push :comment 128: 129: elsif scan(/\{/) 130: value_expected = false 131: kind = :operator 132: states.push :block 133: 134: elsif scan(/\}/) 135: value_expected = false 136: if states.last == :block || states.last == :media 137: kind = :operator 138: states.pop 139: else 140: kind = :error 141: end 142: 143: elsif match = scan(/#{RE::String}/) 144: tokens << [:open, :string] 145: tokens << [match[0, 1], :delimiter] 146: tokens << [match[1..2], :content] if match.size > 2 147: tokens << [match[1, 1], :delimiter] if match.size >= 2 148: tokens << [:close, :string] 149: next 150: 151: elsif match = scan(/#{RE::Function}/) 152: tokens << [:open, :string] 153: start = match[/^\w+\(/] 154: tokens << [start, :delimiter] 155: if match[1] == )) 156: tokens << [match[start.size..2], :content] 157: tokens << [')', :delimiter] 158: else 159: tokens << [match[start.size..1], :content] 160: end 161: tokens << [:close, :string] 162: next 163: 164: elsif scan(/(?: #{RE::Dimension} | #{RE::Percentage} | #{RE::Num} )/x) 165: kind = :float 166: 167: elsif scan(/#{RE::Color}/) 168: kind = :color 169: 170: elsif scan(/! *important/) 171: kind = :important 172: 173: elsif scan(/rgb\([^()\n]*\)?/) 174: kind = :color 175: 176: elsif scan(/#{RE::AtKeyword}/) 177: kind = :directive 178: 179: elsif match = scan(/ [+>:;,.=()\/] /) 180: if match == ':' 181: value_expected = true 182: elsif match == ';' 183: value_expected = false 184: end 185: kind = :operator 186: 187: else 188: getch 189: kind = :error 190: 191: end 192: 193: match ||= matched 194: if $CODERAY_DEBUG and not kind 195: raise_inspect 'Error token %p in line %d' % 196: [[match, kind], line], tokens 197: end 198: raise_inspect 'Empty token', tokens unless match 199: 200: tokens << [match, kind] 201: 202: end 203: 204: tokens 205: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.