# 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(@rule.join.strip, nil, nil, 1)
        # rubocop:disable RescueModifier
        @parsed_rules = parser.parse_selector rescue nil
        # rubocop:enable RescueModifier
      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