class Sass::Tree::RootNode

Public Instance Methods

old_render()
Alias for: render
render() click to toggle source
# File lib/xass.rb, line 50
def render
  old_render.split('/*').map { |x|
    next x unless x.match(/^ line [0-9]+, /)
    a, b = x.split("\n", 2)
    m = a.match(/#{Rails.root}\/app\/assets\/stylesheets\/([^. ]+)\./)
    d = "#{a}\n#{b}"
    next d unless m
    p = class_prefix(m[1])
    next d unless p
    selector = class_replaced_selector(b.split("\n")[0].strip[0...-1].strip, p)
    "#{a}\n#{selector} {\n#{b.split("\n", 2)[1]}"
  }.join('/*')
end
Also aliased as: old_render

Private Instance Methods

class_prefix(name) click to toggle source
# File lib/xass.rb, line 72
def class_prefix(name)
  names = name.split('/')
  names = names[1..(names.index { |x| x.start_with?('!') } || -1)]
  p = names.join('__')
  p.empty? ? nil : p
end
class_replaced_selector(selector, class_prefix) click to toggle source
# File lib/xass.rb, line 66
def class_replaced_selector(selector, class_prefix)
  doc = CSSPool.CSS("#{selector} {}")
  replace_class(doc, class_prefix)
  doc_to_selector(doc)
end
doc_to_selector(doc) click to toggle source
# File lib/xass.rb, line 96
def doc_to_selector(doc)
  doc.to_css.split("\n")[0][0...-1].strip.gsub(/\\[0-9a-f]{6}/) do |c|
    [c[1..-1].tr('0', '').to_i(16)].pack('U')
  end
end
extended_selector(class_prefix, klass) click to toggle source
# File lib/xass.rb, line 102
def extended_selector(class_prefix, klass)
  if klass == 'root'
    class_prefix
  elsif klass.start_with?('_')
    klass[1..-1]
  else
    "#{class_prefix}___#{klass}"
  end
end
replace_class(doc, class_prefix) click to toggle source
# File lib/xass.rb, line 79
def replace_class(doc, class_prefix)
  doc.rule_sets[0].selectors.map do |selector|
    selector.simple_selectors.each do |simple_selector|
      simple_selector.additional_selectors.each do |additional_selector|
        case additional_selector
        when CSSPool::Selectors::Class
          additional_selector.name = extended_selector(class_prefix, additional_selector.name)
        when CSSPool::Selectors::PseudoClass
          next unless additional_selector.extra
          extra = class_replaced_selector(additional_selector.extra, class_prefix) rescue nil
          additional_selector.extra = extra if extra
        end
      end
    end
  end
end