vendor/plugins/haml/lib/sass/tree/node.rb in radiantcms-couchrest_model-0.1.4 vs vendor/plugins/haml/lib/sass/tree/node.rb in radiantcms-couchrest_model-0.1.5
- old
+ new
@@ -1,249 +1,44 @@
module Sass
- # A namespace for nodes in the Sass parse tree.
- #
- # The Sass parse tree has two states.
- # When it's first parsed, it has nodes for mixin definitions
- # and for loops and so forth,
- # in addition to nodes for CSS rules and properties.
- #
- # However, {Tree::Node#perform} returns a different sort of tree.
- # This tree maps more closely to the resulting CSS document
- # than it does to the original Sass document.
- # It still has nodes for CSS rules and properties,
- # but it doesn't have any dynamic-generation-related nodes.
- #
- # Nodes that only appear in the pre-perform state are called **dynamic nodes**;
- # those that appear in both states are called **static nodes**.
module Tree
- # This class doubles as the root node of the parse tree
- # and the superclass of all other parse-tree nodes.
class Node
- # The child nodes of this node.
- #
- # @return [Array<Tree::Node>]
attr_accessor :children
-
- # The line of the document on which this node appeared.
- #
- # @return [Fixnum]
attr_accessor :line
+ attr_accessor :filename
- # The name of the document on which this node appeared.
- #
- # @return [String]
- attr_writer :filename
-
- # The options hash for the node.
- # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
- #
- # @return [{Symbol => Object}]
- attr_reader :options
-
- def initialize
+ def initialize(style)
+ @style = style
@children = []
end
- # Sets the options hash for the node and all its children.
- #
- # @param options [{Symbol => Object}] The options
- # @see #options
- def options=(options)
- children.each {|c| c.options = options}
- @options = options
- end
-
- # The name of the document on which this node appeared.
- #
- # @return [String]
- def filename
- @filename || (@options && @options[:filename])
- end
-
- # Appends a child to the node.
- #
- # @param child [Tree::Node] The child node
- # @raise [Sass::SyntaxError] if `child` is invalid
- # @see #invalid_child?
def <<(child)
if msg = invalid_child?(child)
raise Sass::SyntaxError.new(msg, child.line)
end
@children << child
end
- # Return the last child node.
- #
- # We need this because {Tree::Node} duck types as an Array for {Sass::Engine}.
- #
- # @return [Tree::Node] The last child node
- def last
- children.last
- end
-
- # Compares this node and another object (only other {Tree::Node}s will be equal).
- # This does a structural comparison;
- # if the contents of the nodes and all the child nodes are equivalent,
- # then the nodes are as well.
- #
- # Only static nodes need to override this.
- #
- # @param other [Object] The object to compare with
- # @return [Boolean] Whether or not this node and the other object
- # are the same
- # @see Sass::Tree
def ==(other)
self.class == other.class && other.children == children
end
- # Runs the dynamic Sass code *and* computes the CSS for the tree.
- #
- # @see #perform
- # @see #to_s
- def render
- perform(Environment.new).to_s
- end
-
- # True if \{#to\_s} will return `nil`;
- # that is, if the node shouldn't be rendered.
- # Should only be called in a static tree.
- #
- # @return [Boolean]
- def invisible?; false; end
-
- # Computes the CSS corresponding to this Sass tree.
- #
- # Only static-node subclasses need to implement \{#to\_s}.
- #
- # This may return `nil`, but it will only do so if \{#invisible?} is true.
- #
- # @return [String, nil] The resulting CSS
- # @raise [Sass::SyntaxError] if some element of the tree is invalid
- # @see Sass::Tree
def to_s
result = String.new
children.each do |child|
- if child.is_a? PropNode
- message = "Properties aren't allowed at the root of a document." +
- child.pseudo_class_selector_message
- raise Sass::SyntaxError.new(message, child.line)
+ if child.is_a? AttrNode
+ raise SyntaxError.new('Attributes aren\'t allowed at the root of a document.', child.line)
else
- next if child.invisible?
- child_str = child.to_s(1)
- result << child_str + (style == :compressed ? '' : "\n")
+ result << "#{child.to_s(1)}" + (@style == :compressed ? '' : "\n")
end
end
- result.rstrip!
- return "" if result.empty?
- return result + "\n"
- rescue Sass::SyntaxError => e; e.add_metadata(filename, line)
+ @style == :compressed ? result+"\n" : result[0...-1]
end
- # Runs the dynamic Sass code:
- # mixins, variables, control directives, and so forth.
- # This doesn't modify this node or any of its children.
- #
- # \{#perform} shouldn't be overridden directly;
- # if you want to return a new node (or list of nodes),
- # override \{#\_perform};
- # if you want to destructively modify this node,
- # override \{#perform!}.
- #
- # @param environment [Sass::Environment] The lexical environment containing
- # variable and mixin values
- # @return [Tree::Node] The resulting tree of static nodes
- # @raise [Sass::SyntaxError] if some element of the tree is invalid
- # @see Sass::Tree
- def perform(environment)
- environment.options = @options if self.class == Tree::Node
- _perform(environment)
- rescue Sass::SyntaxError => e; e.add_metadata(filename, line)
- end
+ private
- # The output style. See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
- #
- # @return [Symbol]
- def style
- @options[:style]
- end
-
- protected
-
- # Runs any dynamic Sass code in this particular node.
- # This doesn't modify this node or any of its children.
- #
- # @param environment [Sass::Environment] The lexical environment containing
- # variable and mixin values
- # @return [Tree::Node, Array<Tree::Node>] The resulting static nodes
- # @see #perform
- # @see Sass::Tree
- def _perform(environment)
- node = dup
- node.perform!(environment)
- node
- end
-
- # Destructively runs dynamic Sass code in this particular node.
- # This *does* modify this node,
- # but will be run non-destructively by \{#\_perform\}.
- #
- # @param environment [Sass::Environment] The lexical environment containing
- # variable and mixin values
- # @see #perform
- def perform!(environment)
- self.children = perform_children(Environment.new(environment))
- end
-
- # Non-destructively runs \{#perform} on all children of the current node.
- #
- # @param environment [Sass::Environment] The lexical environment containing
- # variable and mixin values
- # @return [Array<Tree::Node>] The resulting static nodes
- def perform_children(environment)
- children.map {|c| c.perform(environment)}.flatten
- end
-
- # Replaces SassScript in a chunk of text (via `#{}`)
- # with the resulting value.
- #
- # @param text [String] The text to interpolate
- # @param environment [Sass::Environment] The lexical environment containing
- # variable and mixin values
- # @return [String] The interpolated text
- def interpolate(text, environment)
- res = ''
- rest = Haml::Shared.handle_interpolation text do |scan|
- escapes = scan[2].size
- res << scan.matched[0...-2 - escapes]
- if escapes % 2 == 1
- res << "\\" * (escapes - 1) << '#{'
- else
- res << "\\" * [0, escapes - 1].max
- res << Script::Parser.new(scan, line, scan.pos - scan.matched_size, filename).
- parse_interpolated.perform(environment).to_s
- end
- end
- res + rest
- end
-
- # @see Haml::Shared.balance
- # @raise [Sass::SyntaxError] if the brackets aren't balanced
- def balance(*args)
- res = Haml::Shared.balance(*args)
- return res if res
- raise Sass::SyntaxError.new("Unbalanced brackets.", line)
- end
-
- # Returns an error message if the given child node is invalid,
- # and false otherwise.
- #
- # By default, all child nodes are valid.
- # This is expected to be overriden by subclasses
- # for which some children are invalid.
- #
- # @param child [Tree::Node] A potential child node
- # @return [Boolean, String] Whether or not the child node is valid,
- # as well as the error message to display if it is invalid
+ # This method should be overridden by subclasses to return an error message
+ # if the given child node is invalid,
+ # and false or nil otherwise.
def invalid_child?(child)
false
end
end
end