Class: Precssious::Preprocessor
- Inherits:
-
Object
- Object
- Precssious::Preprocessor
- Defined in:
- lib/precssious/preprocessor.rb
Class Method Summary collapse
Instance Method Summary collapse
- #any ⇒ Object
- #consume(type) ⇒ Object
-
#initialize(input) ⇒ Preprocessor
constructor
A new instance of Preprocessor.
- #peek ⇒ Object
- #peek2 ⇒ Object
- #pull(type = nil) ⇒ Object
- #rule ⇒ Object
- #rule_value ⇒ Object
- #rules ⇒ Object
- #value ⇒ Object
Constructor Details
#initialize(input) ⇒ Preprocessor
Returns a new instance of Preprocessor.
6 7 8 9 10 11 12 |
# File 'lib/precssious/preprocessor.rb', line 6 def initialize(input) @tokens = [] Preprocessor.tokenize(Preprocessor.strip_comments(input)) do |t| @tokens << t end end |
Class Method Details
.strip_comments(input) ⇒ Object
90 91 92 |
# File 'lib/precssious/preprocessor.rb', line 90 def self.strip_comments(input) input.gsub /\/\*.*?\*\//, '' end |
.tokenize(input) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/precssious/preprocessor.rb', line 73 def self.tokenize(input) current = [] input.each_char do |c| if %W({ } ;).include? c.to_s prev = current.join('').strip current.clear yield Token.new(:text, prev) if prev.length > 0 yield Token.new(:lbrace, nil) if c.to_s == '{' yield Token.new(:rbrace, nil) if c.to_s == '}' yield Token.new(:semicolon, nil) if c.to_s == ';' else current << c end end end |
Instance Method Details
#any ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/precssious/preprocessor.rb', line 51 def any result = [] while (peek.type != :rbrace) if peek2 && peek2.type == :lbrace result << rule else if peek2 && peek2.type == :semicolon result << value else raise 'Unexpected CSS syntax (missing ;?)' end end end result end |
#consume(type) ⇒ Object
24 25 26 27 28 29 |
# File 'lib/precssious/preprocessor.rb', line 24 def consume(type) t = pull if t.type != type raise "Unexpected token (#{t.data}, #{@tokens[0]}, #{@tokens[1]}, #{@tokens[2]}, #{@tokens[3]}) #{t.type}, expected #{type}" end end |
#peek ⇒ Object
22 |
# File 'lib/precssious/preprocessor.rb', line 22 def peek; @tokens[0]; end |
#peek2 ⇒ Object
23 |
# File 'lib/precssious/preprocessor.rb', line 23 def peek2; @tokens[1] if @tokens.length > 1; end |
#pull(type = nil) ⇒ Object
15 16 17 18 19 20 21 |
# File 'lib/precssious/preprocessor.rb', line 15 def pull(type = nil) result = @tokens.shift if type && result.type != type raise 'Unexpected token (#{result}, #{@tokens[0]}, #{@tokens[1]}, #{@tokens[2]}, #{@tokens[3]})' end result end |
#rule ⇒ Object
40 41 42 |
# File 'lib/precssious/preprocessor.rb', line 40 def rule Rule.new pull(:text).data, rule_value end |
#rule_value ⇒ Object
44 45 46 47 48 49 |
# File 'lib/precssious/preprocessor.rb', line 44 def rule_value consume :lbrace result = any consume :rbrace result end |
#rules ⇒ Object
32 33 34 35 36 37 38 |
# File 'lib/precssious/preprocessor.rb', line 32 def rules result = [] while peek result << rule end result end |
#value ⇒ Object
67 68 69 70 71 |
# File 'lib/precssious/preprocessor.rb', line 67 def value l = pull(:text) consume(:semicolon) Value.new l.data end |