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
yields, then runs the visitor on the@elseclause 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)
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
|