-
-
Save todesstoss/1c3ac8310de7714a65e6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rake' | |
require 'css_splitter' | |
desc 'split css files' | |
namespace :css do | |
task :split do | |
infile = ENV['infile'] || raise("missing infile") | |
outdir = ENV['outdir'] || File.dirname(infile) | |
max_selectors = ENV['max_selectors'] || 4095 | |
CssSplitter.split(infile, outdir, max_selectors) | |
end | |
task :count_selectors do | |
css_file = ENV['css_file'] || raise("missing css file") | |
CssSplitter.count_selectors(css_file) | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class CssSplitter | |
def self.split(infile, outdir = File.dirname(infile), max_selectors = 4095) | |
raise "infile could not be found" unless File.exists? infile | |
rules = IO.readlines(infile, "}") | |
return if rules.first.nil? | |
charset_statement, rules[0] = rules.first.partition(/^\@charset[^;]+;/)[1,2] | |
return if rules.nil? | |
# The infile remains the first file | |
file_id = 1 | |
selectors_count = 0 | |
output = nil | |
selectors_count = rules.map { |rule| count_selectors_of_rule rule }.inject(:+) | |
# Nothing happens until the selectors limit is reached for the first time | |
if selectors_count > max_selectors | |
# Reset selectors count | |
selectors_count = 0 | |
# Create first file with less than maximum selectors | |
output = create_new_file(file_id, outdir, infile, charset_statement) | |
rules.each do |rule| | |
rule_selectors_count = count_selectors_of_rule rule | |
selectors_count += rule_selectors_count | |
if selectors_count > max_selectors | |
# Close current file if there is already one | |
output.close if output | |
# Prepare next file | |
file_id += 1 | |
output = create_new_file(file_id, outdir, infile, charset_statement) | |
# Reset count with current rule count | |
selectors_count = rule_selectors_count | |
end | |
output.write rule if output | |
end | |
output.close if output | |
end | |
end | |
def self.create_new_file(file_id, outdir, infile, charset_statement) | |
filename = File.join(outdir, File.basename(infile, File.extname(infile)) + "_#{file_id.to_s}" + File.extname(infile)) | |
output = File.new(filename, "w") | |
output.write charset_statement | |
output | |
end | |
def self.count_selectors_of_rule(rule) | |
rule.partition(/\{/).first.scan(/,/).count.to_i + 1 | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is based on https://gist.github.com/1131536
IE have limits not only on selector count but also *.css file size, sometimes fat stylesheets files can throw errors in IE (something like: Out of memory at line XXX.) So we need to split first 4095 selectors in separate file too and include only them.
for example: