Class: SC::Helpers::CSSPacker

Inherits:
Object
  • Object
show all
Defined in:
lib/sproutcore/helpers/cssmin.rb

Overview

Information

This is the main class of Rainpress, create an instance of it to compress your CSS-styles.

Simple Usage

packer = SproutCore::CSSPacker.new
compressed_style = packer.compress(style)

Instance Method Summary collapse

Instance Method Details

#compress(style, options = {}) ⇒ Object

Use always this functions if you want to compress your CSS-style

Options:

  • :preserveComments - if set to true, comments will not be removed

  • :preserveNewline - if set to true, newlines will not be removed

  • :preserveSpaces - if set to true, spaces will not be removed

  • :preserveColors - if set to true, colors will not be modified

  • :skipMisc - if set to true, miscellaneous compression parts will be skipped



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/sproutcore/helpers/cssmin.rb', line 57

def compress(style, options = {})
     # remove comments
     style = remove_comments(style) unless options[:preserveComments]
   	
 	  # remove newlines
     style = remove_newlines(style) unless options[:preserveNewlines]
   	
  # remove unneeded spaces
     style = remove_spaces(style) unless options[:preserveSpaces]
   	
  # replace colours with shorter names
     style = shorten_colors(style) unless options[:preserveColors]
     
     # make all other things
     style = do_misc(style) unless options[:skipMisc]
     
  style
end

#do_misc(script) ⇒ Object

Do miscellaneous compression methods on the style



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/sproutcore/helpers/cssmin.rb', line 161

def do_misc(script)
  # Replace 0(pt,px,em,%) with 0 but only when preceded by : or a white-space
  script = script.gsub(/([\s:]+)(0)(px|em|%|in|cm|mm|pc|pt|ex)/) do |match|
    match.gsub(/(px|em|%|in|cm|mm|pc|pt|ex)/,'')
  end
  # Replace 0 0 0 0; with 0.
  script = script.gsub(':0 0 0 0;', ':0;')
  script = script.gsub(':0 0 0 0}', ':0}')
  script = script.gsub(':0 0 0;', ':0;')
  script = script.gsub(':0 0 0}', ':0}')
  script = script.gsub(':0 0}', ':0}')
  script = script.gsub(':0 0;', ':0;')
  # Replace background-position:0; with background-position:0 0;
  script = script.gsub('background-position:0;', 'background-position:0 0;');
  # Replace 0.6 to .6, but only when preceded by : or a white-space
  script = script.gsub(/[:\s]0+\.(\d+)/) do |match|
    match.sub('0', '') # only first '0' !!
  end
  # Replace ;;;; with ;
  script = script.gsub(/[;]+/, ';')
  # Replace ;} with }
  script = script.gsub(';}', '}')
  # Replace background-color: with background:
  script = script.gsub('background-color:', 'background:')
  # Replace font-weight:normal; with 400, bold with 700
  script = script.gsub(/font-weight[\s]*:[\s]*normal[\s]*;/,'font-weight:400;')
  script = script.gsub(/font-weight[\s]*:[\s]*normal[\s]*\}/,'font-weight:400}')
  script = script.gsub(/font[\s]*:[\s]*normal[\s;\}]*/) do |match|
    match.sub('normal', '400')
  end
  script = script.gsub(/font-weight[\s]*:[\s]*bold[\s]*;/,'font-weight:700;')
  script = script.gsub(/font-weight[\s]*:[\s]*bold[\s]*\}/,'font-weight:700}')
  script = script.gsub(/font[\s]*:[\s]*bold[\s;\}]*/) do |match|
    match.sub('bold', '700')
  end
  
  script
end

#remove_comments(script) ⇒ Object

Remove all comments out of the CSS-Document



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/sproutcore/helpers/cssmin.rb', line 77

def remove_comments(script)
   input = script
   script = ''
   
   while input.length > 0 do
     pos = input.index("/*");
     
     # No more comments
     if pos == nil
       script += input
       input = '';
     else # Comment beginning at pos
       script += input[0..(pos-1)] if pos > 0 # only append text if there is some
       input = input[(pos+2)..-1]
       # Comment ending at pos
       pos = input.index("*/")
       input = input[(pos+2)..-1]
     end
   end
   
   # return
	script
end

#remove_newlines(script) ⇒ Object

Remove all newline characters



102
103
104
# File 'lib/sproutcore/helpers/cssmin.rb', line 102

def remove_newlines(script)
	script.gsub(/\n|\r/,'')
end

#remove_spaces(script) ⇒ Object

  1. Turn mutiple spaces into a single

  2. Remove spaces around ;:{},

  3. Remove tabs



109
110
111
112
113
114
115
116
117
# File 'lib/sproutcore/helpers/cssmin.rb', line 109

def remove_spaces(script)
  script = script.gsub(/(\s(\s)+)/, ' ')
   script = script.gsub(/\s*;\s*/,';')
   script = script.gsub(/\s*:\s*/,':')
   script = script.gsub(/\s*\{\s*/,'{')
   script = script.gsub(/\s*\}\s*/,'}')
   script = script.gsub(/\s*,\s*/,',')
   script.gsub("\t",'');
end

#shorten_colors(style) ⇒ Object

  1. Replace #-values with their shorter name

    • #f00 -> red



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/sproutcore/helpers/cssmin.rb', line 128

def shorten_colors(style)
 # rgb(50,101,152) to #326598
  style = style.gsub(/rgb\s*\(\s*([0-9,\s]+)\s*\)/) do |match|
    out = '#'
    $1.split(',').each do |num|
      if num.to_i < 16 
        out += '0'
      end
      out += num.to_i.to_s(16) # convert to hex
    end
    out
  end
  # #AABBCC to #ABC, keep if preceed by a '='
  style = style.gsub(/([^\"'=\s])(\s*)#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/) do |match|
    out = match        
    if ($3.downcase == $4.downcase) and ($5.downcase == $6.downcase) and ($7.downcase == $8.downcase)
      out = $1 + '#' + $3.downcase + $5.downcase + $7.downcase 
    end
    out
  end
  # shorten several names to numbers
  style = style.gsub(/:[\s]*white[\s]*;/, ':#fff;')
  style = style.gsub(/:[\s]*white[\s]*\}/, ':#fff}')
  style = style.gsub(/:[\s]*black[\s]*;/, ':#000;')
  style = style.gsub(/:[\s]*black[\s]*\}/, ':#000}')
  # shotern several numbers to names
  style = style.gsub(/:[\s]*#([fF]00|[fF]{2}0000);/, ':red;')
  style = style.gsub(/:[\s]*#([fF]00|[fF]{2}0000)\}/, ':red}')
  
 style
end