Class: Precssious::Preprocessor

Inherits:
Object
  • Object
show all
Defined in:
lib/precssious/preprocessor.rb

Class Method Summary collapse

Instance Method Summary collapse

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

#anyObject



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

#peekObject



22
# File 'lib/precssious/preprocessor.rb', line 22

def peek; @tokens[0]; end

#peek2Object



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

#ruleObject



40
41
42
# File 'lib/precssious/preprocessor.rb', line 40

def rule
  Rule.new pull(:text).data, rule_value
end

#rule_valueObject



44
45
46
47
48
49
# File 'lib/precssious/preprocessor.rb', line 44

def rule_value
  consume :lbrace
  result = any
  consume :rbrace
  result
end

#rulesObject



32
33
34
35
36
37
38
# File 'lib/precssious/preprocessor.rb', line 32

def rules
  result = []
  while peek
    result << rule
  end
  result
end

#valueObject



67
68
69
70
71
# File 'lib/precssious/preprocessor.rb', line 67

def value
  l = pull(:text)
  consume(:semicolon)
  Value.new l.data
end