Class: Sass::Tree::Visitors::Base Abstract
- Inherits:
-
Object
- Object
- Sass::Tree::Visitors::Base
- Defined in:
- lib/sass/tree/visitors/base.rb
Overview
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
-
.visit(root) ⇒ Object
Runs the visitor on a tree.
Instance Method Summary collapse
-
#node_name(node) ⇒ String
protected
Returns the name of a node as used in the
visit_*
method. -
#visit(node) ⇒ Object
protected
Runs the visitor on the given node.
-
#visit_children(parent) ⇒ Array<Object>
protected
Visit the child nodes for a given node.
-
#visit_if(node)
protected
yield
s, then runs the visitor on the@else
clause if the node has one.
Class Method Details
.visit(root) ⇒ Object
Runs the visitor on a tree.
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.
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.
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
.
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)
yield
s, 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
|