Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@monzou
Created July 23, 2013 06:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save monzou/6060266 to your computer and use it in GitHub Desktop.
Save monzou/6060266 to your computer and use it in GitHub Desktop.
CSS Spliter for IE's CSS rules limits
# 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
# 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