Class: Sass::Tree::RuleNode
Overview
A static node reprenting a CSS rule.
Constant Summary collapse
- PARENT =
The character used to include the parent selector
'&'
Constants inherited from Node
Instance Attribute Summary collapse
-
#group_end ⇒ Boolean
Whether or not this rule is the last rule in a nested group.
-
#parsed_rules ⇒ Selector::CommaSequence
The CSS selector for this rule, without any unresolved interpolation but with parent references still intact.
-
#resolved_rules ⇒ Selector::CommaSequence
The CSS selector for this rule, without any unresolved interpolation or parent references.
-
#rule ⇒ Array<String, Sass::Script::Node>
The CSS selector for this rule, interspersed with Script::Nodes representing
#{}
-interpolation. -
#tabs ⇒ Fixnum
How deep this rule is indented relative to a base-level rule.
Attributes inherited from Node
#children, #filename, #has_children, #line, #options
Instance Method Summary collapse
-
#==(other) ⇒ Boolean
Compares the contents of two rules.
-
#_cssize(extends, parent)
protected
Converts nested rules into a flat list of rules.
-
#_to_s(tabs) ⇒ String
protected
Computes the CSS for the rule.
-
#add_rules(node)
Adds another RuleNode's rules to this one's.
-
#continued? ⇒ Boolean
Whether or not this rule is continued on the next line.
-
#cssize!(extends, parent)
protected
Resolves parent references and nested selectors, and updates the indentation based on the parent's indentation.
-
#debug_info ⇒ {#to_s => #to_s}
protected
A hash that will be associated with this rule in the CSS document if the
:debug_info
option is enabled. -
#do_extend(extends)
Extends this Rule's selector with the given
extends
. -
#initialize(rule) ⇒ RuleNode
constructor
A new instance of RuleNode.
-
#invalid_child?(child) ⇒ Boolean, String
protected
Returns an error message if the given child node is invalid, and false otherwise.
-
#perform!(environment)
protected
Runs SassScript interpolation in the selector, and then parses the result into a Selector::CommaSequence.
- #to_sass(tabs, opts = {})
- #to_scss(tabs, opts = {})
Methods inherited from Node
#<<, #_around_dump, #_perform, #balance, #check_child!, #children_to_src, #cssize, #dasherize, #each, #invisible?, #perform, #perform_children, #run_interp, #selector_to_sass, #selector_to_scss, #selector_to_src, #semi, #style, #to_s, #to_src
Constructor Details
#initialize(rule) ⇒ RuleNode
Returns a new instance of RuleNode.
55 56 57 58 59 60 61 62 63 |
# File 'lib/sass/tree/rule_node.rb', line 55
def initialize(rule)
#p rule
merged = Haml::Util.merge_adjacent_strings(rule)
#p merged
@rule = Haml::Util.strip_string_array(merged)
#p @rule
@tabs = 0
super()
end
|
Instance Attribute Details
#group_end ⇒ Boolean
Whether or not this rule is the last rule in a nested group. This is only set in a CSS tree.
51 52 53 |
# File 'lib/sass/tree/rule_node.rb', line 51
def group_end
@group_end
end
|
#parsed_rules ⇒ Selector::CommaSequence
The CSS selector for this rule, without any unresolved interpolation but with parent references still intact. It's only set once Node#perform has been called.
26 27 28 |
# File 'lib/sass/tree/rule_node.rb', line 26
def parsed_rules
@parsed_rules
end
|
#resolved_rules ⇒ Selector::CommaSequence
The CSS selector for this rule, without any unresolved interpolation or parent references. It's only set once Node#cssize has been called.
33 34 35 |
# File 'lib/sass/tree/rule_node.rb', line 33
def resolved_rules
@resolved_rules
end
|
#rule ⇒ Array<String, Sass::Script::Node>
The CSS selector for this rule,
interspersed with Script::Nodes
representing #{}
-interpolation.
Any adjacent strings will be merged together.
18 19 20 |
# File 'lib/sass/tree/rule_node.rb', line 18
def rule
@rule
end
|
#tabs ⇒ Fixnum
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
45 46 47 |
# File 'lib/sass/tree/rule_node.rb', line 45
def tabs
@tabs
end
|
Instance Method Details
#==(other) ⇒ Boolean
Compares the contents of two rules.
70 71 72 |
# File 'lib/sass/tree/rule_node.rb', line 70
def ==(other)
self.class == other.class && rule == other.rule && super
end
|
#_cssize(extends, parent) (protected)
Converts nested rules into a flat list of rules.
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/sass/tree/rule_node.rb', line 200
def _cssize(extends, parent)
node = super
rules = node.children.select {|c| c.is_a?(RuleNode)}
props = node.children.reject {|c| c.is_a?(RuleNode) || c.invisible?}
unless props.empty?
node.children = props
rules.each {|r| r.tabs += 1} if style == :nested
rules.unshift(node)
end
rules.last.group_end = true unless parent || rules.empty?
rules
end
|
#_to_s(tabs) ⇒ String (protected)
Computes the CSS for the rule.
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
# File 'lib/sass/tree/rule_node.rb', line 123
def _to_s(tabs)
tabs = tabs + self.tabs
rule_separator = style == :compressed ? ',' : ', '
line_separator =
case style
when :nested, :expanded; "\n"
when :compressed; ""
else; " "
end
rule_indent = ' ' * (tabs - 1)
per_rule_indent, total_indent = [:nested, :expanded].include?(style) ? [rule_indent, ''] : ['', rule_indent]
total_rule = total_indent + resolved_rules.members.
map {|seq| seq.to_a.join.gsub("\n", style == :compressed ? " " : "\n")}.
join(rule_separator).split("\n").map do |line|
per_rule_indent + line.strip
end.join(line_separator)
to_return = ''
old_spaces = ' ' * (tabs - 1)
spaces = ' ' * tabs
if style != :compressed
if @options[:debug_info]
to_return << debug_info_rule.to_s(tabs) << "\n"
elsif @options[:line_comments]
to_return << "#{old_spaces}/* line #{line}"
if filename
relative_filename = if @options[:css_filename]
begin
Pathname.new(filename).relative_path_from(
Pathname.new(File.dirname(@options[:css_filename]))).to_s
rescue ArgumentError
nil
end
end
relative_filename ||= filename
to_return << ", #{relative_filename}"
end
to_return << " */\n"
end
end
if style == :compact
properties = children.map { |a| a.to_s(1) }.join(' ')
to_return << "#{total_rule} { #{properties} }#{"\n" if group_end}"
elsif style == :compressed
properties = children.map { |a| a.to_s(1) }.join(';')
to_return << "#{total_rule}{#{properties}}"
else
properties = children.map { |a| a.to_s(tabs + 1) }.join("\n")
end_props = (style == :expanded ? "\n" + old_spaces : ' ')
to_return << "#{total_rule} {\n#{properties}#{end_props}}#{"\n" if group_end}"
end
to_return
end
|
#add_rules(node)
Adds another Sass::Tree::RuleNode's rules to this one's.
77 78 79 80 |
# File 'lib/sass/tree/rule_node.rb', line 77
def add_rules(node)
@rule = Haml::Util.strip_string_array(
Haml::Util.merge_adjacent_strings(@rule + ["\n"] + node.rule))
end
|
#continued? ⇒ Boolean
Returns Whether or not this rule is continued on the next line.
83 84 85 86 |
# File 'lib/sass/tree/rule_node.rb', line 83
def continued?
last = @rule.last
last.is_a?(String) && last[-1] == ?,
end
|
#cssize!(extends, parent) (protected)
Resolves parent references and nested selectors, and updates the indentation based on the parent's indentation.
224 225 226 227 |
# File 'lib/sass/tree/rule_node.rb', line 224
def cssize!(extends, parent)
self.resolved_rules = @parsed_rules.resolve_parent_refs(parent && parent.resolved_rules)
super
end
|
#debug_info ⇒ {#to_s => #to_s} (protected)
A hash that will be associated with this rule in the CSS document
if the :debug_info
option is enabled.
This data is used by e.g. the FireSass Firebug extension.
246 247 248 249 |
# File 'lib/sass/tree/rule_node.rb', line 246
def debug_info
{:filename => filename && ("file://" + URI.escape(File.expand_path(filename))),
:line => self.line}
end
|
#do_extend(extends)
Extends this Rule's selector with the given extends
.
111 112 113 114 115 |
# File 'lib/sass/tree/rule_node.rb', line 111
def do_extend(extends)
node = dup
node.resolved_rules = resolved_rules.do_extend(extends)
node
end
|
#invalid_child?(child) ⇒ Boolean, String (protected)
Returns an error message if the given child node is invalid, and false otherwise.
ExtendNodes are valid within Sass::Tree::RuleNodes.
237 238 239 |
# File 'lib/sass/tree/rule_node.rb', line 237
def invalid_child?(child)
super unless child.is_a?(ExtendNode)
end
|
#perform!(environment) (protected)
Runs SassScript interpolation in the selector, and then parses the result into a Selector::CommaSequence.
188 189 190 191 192 |
# File 'lib/sass/tree/rule_node.rb', line 188
def perform!(environment)
@parsed_rules = Sass::SCSS::StaticParser.new(run_interp(@rule, environment), self.line).
parse_selector(self.filename)
super
end
|
#to_sass(tabs, opts = {})
89 90 91 92 93 |
# File 'lib/sass/tree/rule_node.rb', line 89
def to_sass(tabs, opts = {})
name = selector_to_sass(rule, opts)
name = "\\" + name if name[0] == ?:
name.gsub(/^/, ' ' * tabs) + children_to_src(tabs, opts, :sass)
end
|
#to_scss(tabs, opts = {})
96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/sass/tree/rule_node.rb', line 96
def to_scss(tabs, opts = {})
name = selector_to_scss(rule, tabs, opts)
res = name + children_to_src(tabs, opts, :scss)
if children.last.is_a?(CommentNode) && children.last.silent
res.slice!(-3..-1)
res << "\n" << (' ' * tabs) << "}\n"
end
res
end
|