class CSSDeadClass

Public Class Methods

config() click to toggle source
# File lib/css_dead_class.rb, line 11
def self.config
        @_config ||= Config.new
end
new(opts={}) click to toggle source
# File lib/css_dead_class.rb, line 21
def initialize(opts={})
        @options = self.class.config.dup
        opts.each do |k, v|
                @options[k] = v
        end
end
option(key, default=nil, description=nil, options={}) click to toggle source
# File lib/css_dead_class.rb, line 14
def self.option(key, default=nil, description=nil, options={})
        self.config[key] = Config.new(default: default, description: description, options: {})
end

Public Instance Methods

parse() click to toggle source
# File lib/css_dead_class.rb, line 28
def parse
        cssSelectors = []
        cssFiles = @options.css_files
        htmlFiles = @options.html_files
        classesToKeep = @options.classes_to_keep
        if cssFiles.length > 0
                parser = CssParser::Parser.new
                cssFiles.each do |cssFile|
                        parser.load_file!(cssFile)
                end  
                parser.each_selector(:screen).each do |rule|
                        rule = rule[:rules]
                        rule.selectors.each do |segment|
                                segment.split(/(?: |\+|>)/).each do |r|
                                        next if r.include? ":"
                                        if(r[0] == ".")
                                                cssSelectors.push(r)
                                        elsif(r.include? ".")
                                                s = r.split(".")
                                                s.shift
                                                s.each { |v| cssSelectors.push('.' + v)}
                                        end
                                end
                        end
                end
                cssSelectors.uniq!
        end
        if cssSelectors.length > 0
                htmlFiles.each do |htmlFile|
                        htmlDoc = Nokogiri::HTML(IO.read(htmlFile))
                        htmlDoc.css('*').each do |node|
                                next if node.attributes.nil? or node.attributes['class'].nil?
                                node['class'] = node.attributes['class'].value.split(/ /).select{ |cn| 
                                        cssSelectors.include?('.' + cn) || classesToKeep.include?(cn) || classesToKeep.include?('.' + cn)
                                }.join(" ")
                                if(node.attributes['class'].value == "")
                                        node.attributes['class'].remove
                                end
                        end
                        File.open(htmlFile, "w") do |fp|
                                fp.puts htmlDoc.to_s
                        end
                end
        end
end