Class: Tinge::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/tinge/parser.rb

Defined Under Namespace

Classes: Result

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(text) ⇒ Parser

Returns a new instance of Parser.



19
20
21
# File 'lib/tinge/parser.rb', line 19

def initialize(text)
  @text = text
end

Class Method Details

.parse(text) ⇒ Object



13
14
15
16
17
# File 'lib/tinge/parser.rb', line 13

def self.parse(text)
  new(text).tap { |parser|
    parser.run
  }.result
end

Instance Method Details

#colors(node) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/tinge/parser.rb', line 63

def colors(node)
  case node
  when Sass::Tree::PropNode
    node.value.inspect.scan(/(#[0-9a-f]+|(?:hsl|rgb)a?\([^\)]+\))/).flatten
  when Sass::Tree::VariableNode
    if node.expr.is_a?(Sass::Script::Color)
      [node.expr.to_s]
    else
      []
    end
  end
end

#documentObject



27
28
29
30
# File 'lib/tinge/parser.rb', line 27

def document
  parse_document unless @document
  @document
end

#extract(node, parent = nil) ⇒ Object



56
57
58
59
60
61
# File 'lib/tinge/parser.rb', line 56

def extract(node, parent = nil)
  colors(node).each do |color|
    result[color] ||= Color.new(color)
    result[color].add_sighting(node, parent)
  end
end

#parse_documentObject



32
33
34
35
36
37
# File 'lib/tinge/parser.rb', line 32

def parse_document
  Sass::Tree::Visitors::Perform.tinge_parser = self
  @engine = Sass::Engine.new(@text, syntax: :scss)
  @document = @engine.to_tree
  @engine.render
end

#resultObject



43
44
45
# File 'lib/tinge/parser.rb', line 43

def result
  @result ||= Result.new
end

#runObject



39
40
41
# File 'lib/tinge/parser.rb', line 39

def run
  visit(document)
end

#set_var(name, value) ⇒ Object



23
24
25
# File 'lib/tinge/parser.rb', line 23

def set_var(name, value)
  result.vars[name] = value
end

#visit(node, parent = nil) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/tinge/parser.rb', line 47

def visit(node, parent = nil)
  if node.is_a?(Sass::Tree::PropNode) || node.is_a?(Sass::Tree::VariableNode)
    extract(node, parent)
  end
  node.each do |child|
    visit(child, node) unless child == node
  end
end