Class: AssetsBooster::Merger::CSS

Inherits:
Base
  • Object
show all
Includes:
AssetsBooster::Mixin::Css
Defined in:
lib/assets_booster/merger/css.rb

Instance Attribute Summary

Attributes inherited from Base

#assets

Instance Method Summary collapse

Methods included from AssetsBooster::Mixin::Css

#adjust_relative_urls, #hostify_urls, #unquote

Methods included from AssetsBooster::Mixin::Url

#absolute_url?, #external_url?, #path_difference

Methods inherited from Base

#initialize, #mtime

Constructor Details

This class inherits a constructor from AssetsBooster::Merger::Base

Instance Method Details

#dirname(path) ⇒ Object



58
59
60
# File 'lib/assets_booster/merger/css.rb', line 58

def dirname(path)
  path.include?("/") ? File.dirname(path) : ""
end

#load_source(source) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/assets_booster/merger/css.rb', line 39

def load_source(source)
  super(source)
  asset = assets.pop
  source_folder = dirname(asset[:source])
  source_folder << "/" unless source_folder == ""
  asset[:css].gsub!(/@import\s+([^;\n]+)[;\n]*/).each do |import|
    url = $1.gsub(/^url\((.+)\)/i, '\1')
    url, quotes = unquote(url.strip)
    
    # we don't want to statically import external stylesheets
    next import if external_url?(url)

    # recursively process the imported css
    load_source(source_folder+url)
    ""
  end
  assets << asset
end

#merge(target) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/assets_booster/merger/css.rb', line 12

def merge(target)
  target_folder = dirname(target)
  code = assets.inject("") do |code, asset|
    source_folder = dirname(asset[:source])
    asset[:css]= adjust_relative_urls(asset[:css], source_folder, target_folder)
    code << asset[:css]
    code << "\n"
  end.strip
  
  charset = nil
  code.gsub!(/@charset\s+([^;\n]+)[;\n]*/).each do
    current_charset, quotes = unquote($1)
    current_charset.downcase!
    if charset && charset != current_charset
      raise ArgumentError, "source files have conflicting charsets (#{charset} != #{current_charset})"
    end
    charset = current_charset
    ""
  end
  
  if charset
    code = "@charset \"#{charset}\";\n"+code
  end

  code
end

#nameObject



8
9
10
# File 'lib/assets_booster/merger/css.rb', line 8

def name
  "CSS Merger"
end