class Sass::Tree::RuleNode

A static node representing a CSS rule.

@see Sass::Tree

Constants

PARENT

The character used to include the parent selector

Attributes

group_end[RW]

Whether or not this rule is the last rule in a nested group. This is only set in a CSS tree.

@return [Boolean]

parsed_rules[RW]

The CSS selector for this rule, without any unresolved interpolation but with parent references still intact. It’s only guaranteed to be set once {Tree::Visitors::Perform} has been run, but it may be set before then for optimization reasons.

@return [Selector::CommaSequence]

resolved_rules[RW]

The CSS selector for this rule, without any unresolved interpolation or parent references. It’s only set once {Tree::Visitors::Perform} has been run.

@return [Selector::CommaSequence]

rule[RW]

The CSS selector for this rule, interspersed with {Sass::Script::Tree::Node}s representing ‘#{}`-interpolation. Any adjacent strings will be merged together.

@return [Array<String, Sass::Script::Tree::Node>]

selector_source_range[RW]

The entire selector source range for this rule. @return [Sass::Source::Range]

stack_trace[RW]

The stack trace. This is only readable in a CSS tree as it is written during the perform step and only when the :trace_selectors option is set.

@return [String]

tabs[RW]

How deep this rule is indented relative to a base-level rule. This is only greater than 0 in the case that:

  • This node is in a CSS tree

  • The style is :nested

  • This is a child rule of another rule

  • The parent rule has properties, and thus will be rendered

@return [Integer]

Public Class Methods

new(rule, selector_source_range = nil) click to toggle source

@param rule [Array<String, Sass::Script::Tree::Node>, Sass::Selector::CommaSequence]

The CSS rule, either unparsed or parsed.

@param selector_source_range [Sass::Source::Range]

Calls superclass method Sass::Tree::Node::new
# File lib/sass/tree/rule_node.rb, line 66
def initialize(rule, selector_source_range = nil)
  if rule.is_a?(Sass::Selector::CommaSequence)
    @rule = [rule.to_s]
    @parsed_rules = rule
  else
    merged = Sass::Util.merge_adjacent_strings(rule)
    @rule = Sass::Util.strip_string_array(merged)
    try_to_parse_non_interpolated_rules
  end
  @selector_source_range = selector_source_range
  @tabs = 0
  super()
end

Public Instance Methods

==(other) click to toggle source

Compares the contents of two rules.

@param other [Object] The object to compare with @return [Boolean] Whether or not this node and the other object

are the same
Calls superclass method Sass::Tree::Node#==
# File lib/sass/tree/rule_node.rb, line 97
def ==(other)
  self.class == other.class && rule == other.rule && super
end
add_rules(node) click to toggle source

Adds another {RuleNode}‘s rules to this one’s.

@param node [RuleNode] The other node

# File lib/sass/tree/rule_node.rb, line 104
def add_rules(node)
  @rule = Sass::Util.strip_string_array(
    Sass::Util.merge_adjacent_strings(@rule + ["\n"] + node.rule))
  try_to_parse_non_interpolated_rules
end
continued?() click to toggle source

@return [Boolean] Whether or not this rule is continued on the next line

# File lib/sass/tree/rule_node.rb, line 111
def continued?
  last = @rule.last
  last.is_a?(String) && last[-1] == ?,
end
debug_info() click to toggle source

A hash that will be associated with this rule in the CSS document if the {file:SASS_REFERENCE.md#debug_info-option ‘:debug_info` option} is enabled. This data is used by e.g. [the FireSass Firebug extension](addons.mozilla.org/en-US/firefox/addon/103988).

@return [{#to_s => to_s}]

# File lib/sass/tree/rule_node.rb, line 122
def debug_info
  {:filename => filename &&
     ("file://" + URI::DEFAULT_PARSER.escape(File.expand_path(filename))),
   :line => line}
end
filename=(filename) click to toggle source

If we’ve precached the parsed selector, set the filename on it, too.

Calls superclass method
# File lib/sass/tree/rule_node.rb, line 87
def filename=(filename)
  @parsed_rules.filename = filename if @parsed_rules
  super
end
invisible?() click to toggle source

A rule node is invisible if it has only placeholder selectors.

# File lib/sass/tree/rule_node.rb, line 129
def invisible?
  resolved_rules.members.all? {|seq| seq.invisible?}
end
line=(line) click to toggle source

If we’ve precached the parsed selector, set the line on it, too.

Calls superclass method
# File lib/sass/tree/rule_node.rb, line 81
def line=(line)
  @parsed_rules.line = line if @parsed_rules
  super
end

Private Instance Methods

try_to_parse_non_interpolated_rules() click to toggle source
# File lib/sass/tree/rule_node.rb, line 135
def try_to_parse_non_interpolated_rules
  @parsed_rules = nil
  return unless @rule.all? {|t| t.is_a?(String)}

  # We don't use real filename/line info because we don't have it yet.
  # When we get it, we'll set it on the parsed rules if possible.
  parser = nil
  warnings = Sass.logger.capture do
    parser = Sass::SCSS::StaticParser.new(
      Sass::Util.strip_except_escapes(@rule.join), nil, nil, 1)
    @parsed_rules = parser.parse_selector rescue nil
  end

  # If parsing produces a warning, throw away the result so we can parse
  # later with the real filename info.
  @parsed_rules = nil unless warnings.empty?
end