Class: Sass::Tree::Visitors::Base Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/sass/tree/visitors/base.rb

Overview

This class is abstract.

The abstract base class for Sass visitors. Visitors should extend this class, then implement visit_* methods for each node they care about (e.g. visit_rule for RuleNode or visit_for for ForNode). These methods take the node in question as argument. They may yield to visit the child nodes of the current node.

Note: due to the unusual nature of IfNode, special care must be taken to ensure that it is properly handled. In particular, there is no built-in scaffolding for dealing with the return value of @else nodes.

Direct Known Subclasses

CheckNesting, Convert, Cssize, DeepCopy, Perform, SetOptions, ToCss

Constant Summary collapse

NODE_NAME_RE =
/.*::(.*?)Node$/

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.visit(root) ⇒ Object

Runs the visitor on a tree.

Parameters:

  • root (Tree::Node)

    The root node of the Sass tree.

Returns:

  • (Object)

    The return value of #visit for the root node.



23
24
25
# File 'lib/sass/tree/visitors/base.rb', line 23

def self.visit(root)
  new.send(:visit, root)
end

Instance Method Details

#node_name(node) ⇒ String (protected)

Returns the name of a node as used in the visit_* method.

Parameters:

Returns:

  • (String)

    The name.



62
63
64
65
# File 'lib/sass/tree/visitors/base.rb', line 62

def node_name(node)
  @@node_names ||= {}
  @@node_names[node.class.name] ||= node.class.name.gsub(NODE_NAME_RE, '\\1').downcase
end

#visit(node) ⇒ Object (protected)

Runs the visitor on the given node. This can be overridden by subclasses that need to do something for each node.

Parameters:

Returns:

  • (Object)

    The return value of the visit_* method for this node.



34
35
36
37
38
39
40
41
# File 'lib/sass/tree/visitors/base.rb', line 34

def visit(node)
  method = "visit_#{node_name node}"
  if self.respond_to?(method)
    self.send(method, node) {visit_children(node)}
  else
    visit_children(node)
  end
end

#visit_children(parent) ⇒ Array<Object> (protected)

Visit the child nodes for a given node. This can be overridden by subclasses that need to do something with the child nodes' return values.

This method is run when visit_* methods yield, and its return value is returned from the yield.

Parameters:

  • parent (Tree::Node)

    The parent node of the children to visit.

Returns:

  • (Array<Object>)

    The return values of the visit_* methods for the children.



52
53
54
# File 'lib/sass/tree/visitors/base.rb', line 52

def visit_children(parent)
  parent.children.map {|c| visit(c)}
end

#visit_if(node) (protected)

yields, then runs the visitor on the @else clause if the node has one. This exists to ensure that the contents of the @else clause get visited.



69
70
71
72
73
# File 'lib/sass/tree/visitors/base.rb', line 69

def visit_if(node)
  yield
  visit(node.else) if node.else
  node
end