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