Created
July 23, 2013 06:34
-
-
Save monzou/6060266 to your computer and use it in GitHub Desktop.
CSS Spliter for IE's CSS rules limits
This file contains hidden or 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
# lib/css_splitter.rb | |
class CssSplitter | |
CHARSET = '@charset "UTF-8"' | |
def initialize(infile, outdir = File.dirname(infile)) | |
@infile = infile | |
@outdir = outdir | |
@filenames = [] | |
end | |
def split(max_selectors = 4095) | |
rules = IO.readlines(@infile, "}") | |
return if rules.first.nil? | |
id = 0 | |
selectors_count = 0 | |
file = open_file(id += 1) | |
rules.each do |rule| | |
rule_selectors_count = count_selectors_of_rule rule | |
selectors_count += rule_selectors_count | |
if selectors_count > max_selectors | |
file.close() if file | |
file = open_file(id += 1) | |
file.write CHARSET | |
selectors_count = rule_selectors_count | |
end | |
file.write rule if file | |
end | |
if @filenames.length > 0 | |
imports = IO.readlines(@infile).select { |line| line =~ /@import.*/ } | |
open(File.new(@infile), "w") do |f| | |
imports.each do |import| | |
f.puts import | |
end | |
@filenames.each do |filename| | |
f.puts "@import url(\"#{filename}\");" | |
end | |
end | |
end | |
end | |
def count_selectors(path) | |
rules = IO.readlines(path, '}') | |
return if rules.first.nil? | |
rules.inject(0) {|count, rule| count + count_selectors_of_rule(rule)}.tap do |result| | |
puts File.basename(path) + " contains #{result} selectors." | |
end | |
end | |
private | |
def count_selectors_of_rule(rule) | |
rule.partition(/\{/).first.scan(/,/).count.to_i + 1 | |
end | |
def open_file(id) | |
filename = File.basename(@infile, File.extname(@infile)) + "_#{id.to_s}" + File.extname(@infile) | |
@filenames << filename | |
File.new(File.join(@outdir, filename), "w") | |
end | |
end |
This file contains hidden or 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
# bin/splitcss | |
#!/usr/bin/env ruby | |
$LOAD_PATH.unshift File.dirname(__FILE__) + "/../lib" | |
require 'css_splitter' | |
infile = File.dirname(__FILE__) + "/../.tmp/styles/main.css" | |
outdir = File.dirname infile | |
max_selectors = 4000 | |
CssSplitter.new(infile, outdir).split(max_selectors) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment