class CSSModules::Rewrite::ModuleVisitor
Public Instance Methods
visit_rule(node)
click to toggle source
No need to `yield` here since we run after Sass – it's already flattened. @return [void]
# File lib/css_modules/rewrite.rb, line 38 def visit_rule(node) node.parsed_rules = rebuild_parsed_rules(node.parsed_rules) end
Private Instance Methods
clone_sequence(seq, new_members)
click to toggle source
Make a new kind of `seq`, containing `new_members`
# File lib/css_modules/rewrite.rb, line 95 def clone_sequence(seq, new_members) case seq when Sass::Selector::Sequence seq.class.new(new_members) when Sass::Selector::CommaSequence seq.class.new(new_members) when Sass::Selector::SimpleSequence seq.class.new(new_members, seq.subject?) else raise("Unknown sequence to clone: #{seq.class}") end end
deep_print(seq, indent = "")
click to toggle source
Debug print-out of a sequence:
# File lib/css_modules/rewrite.rb, line 109 def deep_print(seq, indent = "") case seq when Sass::Selector::AbstractSequence puts indent + seq.class.name + " => " seq.members.map { |m| deep_print(m, indent + " ") } else puts indent + seq.class.name + " (#{seq})" end end
deeply_transform(module_name, seq)
click to toggle source
We know this is a modulized rule now we should transform its ID and classes to modulized
# File lib/css_modules/rewrite.rb, line 72 def deeply_transform(module_name, seq) case seq when Sass::Selector::AbstractSequence new_members = seq.members.map { |m| deeply_transform(module_name, m) } new_members.compact! # maybe a module selector returned nil clone_sequence(seq, new_members) when Sass::Selector::Id, Sass::Selector::Class # Sass 3.2 has an array here, Sass 3.4 has a string: selector_name = seq.name.is_a?(Array) ? seq.name.first : seq.name modulized_name = Rewrite.modulize_selector(module_name, selector_name) seq.class.new(modulized_name) when Sass::Selector::Pseudo if seq.to_s =~ /:module/ nil else seq end else seq end end
first_pseudo_selector(seq)
click to toggle source
Get the first Sass::Selector::Pseudo member of `seq`, or nil
# File lib/css_modules/rewrite.rb, line 59 def first_pseudo_selector(seq) case seq when Sass::Selector::AbstractSequence seq.members.find { |m| first_pseudo_selector(m) } when Sass::Selector::Pseudo seq else # eg, String nil end end
rebuild_parsed_rules(parsed_rules)
click to toggle source
# File lib/css_modules/rewrite.rb, line 44 def rebuild_parsed_rules(parsed_rules) new_members = parsed_rules.members.map do |member_seq| leading_rule = first_pseudo_selector(member_seq).to_s matches = leading_rule && Rewrite::RE_MODULE.match(leading_rule) if matches module_name = matches[:module_name] deeply_transform(module_name, member_seq) else member_seq end end Sass::Selector::CommaSequence.new(new_members) end