sqwish 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +35 -9
- data/Rakefile +6 -0
- data/lib/sqwish.rb +7 -4
- data/sqwish/src/index.js +38 -36
- metadata +36 -39
data/README.md
CHANGED
@@ -1,21 +1,47 @@
|
|
1
1
|
# Sqwish-ruby
|
2
2
|
#### A CSS compressor
|
3
3
|
|
4
|
-
This as a Ruby bridge to [Sqwish](https://github.com/ded/sqwish) by Dustin
|
5
|
-
|
4
|
+
This as a Ruby bridge to [Sqwish](https://github.com/ded/sqwish) by Dustin Diaz
|
5
|
+
to compress CSS very efficiently.
|
6
|
+
|
7
|
+
### Ruby usage
|
8
|
+
|
9
|
+
Just install it:
|
6
10
|
|
7
11
|
$ gem install sqwish
|
8
12
|
|
9
|
-
|
13
|
+
Then use it like so:
|
14
|
+
|
15
|
+
``` ruby
|
16
|
+
require 'sqwish'
|
17
|
+
|
18
|
+
Sqwish.minify "div { color: red; } div { background: black; }"
|
19
|
+
#=> "div{color:red}div{background:black}"
|
20
|
+
````
|
21
|
+
|
22
|
+
You can also use the `strict: true` flag (it defaults to false):
|
23
|
+
|
24
|
+
``` ruby
|
25
|
+
Sqwish.minify "div { color: red; } div { background: black; }", strict: true
|
26
|
+
#=> "div{color:red;background:black}"
|
27
|
+
```
|
28
|
+
|
29
|
+
## Rails usage
|
30
|
+
|
31
|
+
In your Gemfile:
|
32
|
+
|
33
|
+
``` ruby
|
34
|
+
gem 'sqwish'
|
10
35
|
|
11
|
-
|
12
|
-
|
13
|
-
|
36
|
+
# or optionally:
|
37
|
+
gem 'sqwish', github: 'rstacruz/sqwish.rb'
|
38
|
+
```
|
14
39
|
|
15
|
-
|
40
|
+
In your `config/environments/production.rb`:
|
16
41
|
|
17
|
-
|
18
|
-
|
42
|
+
``` ruby
|
43
|
+
config.assets.css_compressor = Sqwish
|
44
|
+
```
|
19
45
|
|
20
46
|
## Authors
|
21
47
|
|
data/Rakefile
ADDED
data/lib/sqwish.rb
CHANGED
@@ -2,16 +2,19 @@ require 'execjs'
|
|
2
2
|
|
3
3
|
module Sqwish
|
4
4
|
class << self
|
5
|
-
def minify(src, options={:strict =>
|
6
|
-
|
5
|
+
def minify(src, options={:strict => false})
|
6
|
+
is_strict = !! options[:strict]
|
7
|
+
sqwish_js.call "sqwish", src, is_strict
|
7
8
|
end
|
8
9
|
|
10
|
+
alias compress minify
|
11
|
+
|
9
12
|
def sqwish_js
|
10
13
|
@squish_js ||= ExecJS.compile(sqwish_wrapper)
|
11
14
|
end
|
12
15
|
|
13
16
|
def sqwish_wrapper
|
14
|
-
#
|
17
|
+
# Since we're not using node, some things will have to be stubbed.
|
15
18
|
%{
|
16
19
|
var require = function() { return {}; };
|
17
20
|
var module = { exports: {} };
|
@@ -28,7 +31,7 @@ module Sqwish
|
|
28
31
|
end
|
29
32
|
|
30
33
|
def version
|
31
|
-
"0.
|
34
|
+
"0.2.0"
|
32
35
|
end
|
33
36
|
end
|
34
37
|
end
|
data/sqwish/src/index.js
CHANGED
@@ -13,12 +13,12 @@ function uniq(ar) {
|
|
13
13
|
for (i = ar.length - 1; i >= 0; i--) {
|
14
14
|
for (j = a.length - 1; j >= 0; j--) {
|
15
15
|
if (a[j] == ar[i]) {
|
16
|
-
continue label
|
16
|
+
continue label
|
17
17
|
}
|
18
18
|
}
|
19
|
-
a[a.length] = ar[i]
|
19
|
+
a[a.length] = ar[i]
|
20
20
|
}
|
21
|
-
return a
|
21
|
+
return a
|
22
22
|
}
|
23
23
|
|
24
24
|
function sqwish(css, strict) {
|
@@ -50,24 +50,24 @@ function sqwish(css, strict) {
|
|
50
50
|
.replace(/#([a-fA-F0-9])\1([a-fA-F0-9])\2([a-fA-F0-9])\3/g, '#$1$2$3')
|
51
51
|
|
52
52
|
// replace longhand values with shorthand '5px 5px 5px 5px' => '5px'
|
53
|
-
.replace(
|
53
|
+
.replace(/\b(\d+[a-z]{2}) \1 \1 \1/gi, '$1')
|
54
54
|
|
55
55
|
// replace double-specified longhand values with shorthand '5px 2px 5px 2px' => '5px 2px'
|
56
|
-
.replace(
|
56
|
+
.replace(/\b(\d+[a-z]{2}) (\d+[a-z]{2}) \1 \2/gi, '$1 $2')
|
57
57
|
|
58
58
|
// replace 0px with 0
|
59
|
-
.replace(/([\s|:])[0]+px/g, '$10')
|
59
|
+
.replace(/([\s|:])[0]+px/g, '$10')
|
60
60
|
|
61
61
|
if (strict) {
|
62
|
-
css = strict_css(css)
|
62
|
+
css = strict_css(css)
|
63
63
|
}
|
64
64
|
|
65
65
|
// put back in copyrights
|
66
66
|
if (comments) {
|
67
|
-
comments = comments ? comments.join('\n') : ''
|
68
|
-
css = comments + '\n' + css
|
67
|
+
comments = comments ? comments.join('\n') : ''
|
68
|
+
css = comments + '\n' + css
|
69
69
|
}
|
70
|
-
return css
|
70
|
+
return css
|
71
71
|
}
|
72
72
|
|
73
73
|
function strict_css(css) {
|
@@ -75,59 +75,61 @@ function strict_css(css) {
|
|
75
75
|
// into combined rules
|
76
76
|
|
77
77
|
// store global dict of all rules
|
78
|
-
var ruleList = {}
|
79
|
-
|
78
|
+
var ruleList = {}
|
79
|
+
, rules = css.match(/([^{]+\{[^}]+\})+?/g)
|
80
80
|
|
81
81
|
// lets find the dups
|
82
82
|
rules.forEach(function (rule) {
|
83
83
|
// break rule into selector|declaration parts
|
84
|
-
var parts = rule.match(/([^{]+)\{([^}]+)/)
|
85
|
-
|
86
|
-
|
84
|
+
var parts = rule.match(/([^{]+)\{([^}]+)/)
|
85
|
+
, selector = parts[1]
|
86
|
+
, declarations = parts[2]
|
87
87
|
|
88
88
|
// start new list if it wasn't created already
|
89
89
|
if (!ruleList[selector]) {
|
90
|
-
ruleList[selector] = []
|
90
|
+
ruleList[selector] = []
|
91
91
|
}
|
92
92
|
|
93
|
-
declarations = declarations.split(';')
|
93
|
+
declarations = declarations.split(';')
|
94
94
|
// filter out duplicate properties
|
95
95
|
ruleList[selector] = ruleList[selector].filter(function (decl) {
|
96
|
-
var prop = decl.match(/[^:]+/)[0]
|
96
|
+
var prop = decl.match(/[^:]+/)[0]
|
97
97
|
// pre-existing properties are not wanted anymore
|
98
98
|
return !declarations.some(function (dec) {
|
99
99
|
// must include '^' as to not confuse "color" with "border-color" etc.
|
100
|
-
return dec.match(new RegExp('^' + prop + ':'))
|
101
|
-
})
|
102
|
-
})
|
100
|
+
return dec.match(new RegExp('^' + prop + ':'))
|
101
|
+
})
|
102
|
+
})
|
103
103
|
|
104
104
|
// latter takes presedence :)
|
105
105
|
ruleList[selector] = ruleList[selector].concat(declarations);
|
106
106
|
// still dups? just in case
|
107
|
-
ruleList[selector] = uniq(ruleList[selector])
|
108
|
-
})
|
107
|
+
ruleList[selector] = uniq(ruleList[selector])
|
108
|
+
})
|
109
109
|
|
110
110
|
// reset css because we're gonna recreate the whole shabang.
|
111
|
-
css = ''
|
111
|
+
css = ''
|
112
112
|
for (var selector in ruleList) {
|
113
|
-
var joinedRuleList = ruleList[selector].join(';')
|
114
|
-
css += selector + '{' + (joinedRuleList).replace(/;$/, '') + '}'
|
113
|
+
var joinedRuleList = ruleList[selector].join(';')
|
114
|
+
css += selector + '{' + (joinedRuleList).replace(/;$/, '') + '}'
|
115
115
|
}
|
116
|
-
return css
|
116
|
+
return css
|
117
117
|
}
|
118
118
|
|
119
119
|
module.exports.exec = function (args) {
|
120
|
-
var out
|
121
|
-
|
120
|
+
var out, data
|
121
|
+
, read = args[0]
|
122
122
|
if (out = args.indexOf('-o') != -1) {
|
123
|
-
out = args[out + 1]
|
123
|
+
out = args[out + 1]
|
124
124
|
} else {
|
125
|
-
out = read.replace(/\.css$/, '.min.css')
|
125
|
+
out = read.replace(/\.css$/, '.min.css')
|
126
126
|
}
|
127
|
-
|
128
|
-
|
129
|
-
|
127
|
+
if (args.indexOf('-v') != -1) {
|
128
|
+
console.log('compressing ' + read + ' to ' + out + '...')
|
129
|
+
}
|
130
|
+
data = fs.readFileSync(read, 'utf8')
|
131
|
+
fs.writeFileSync(out, sqwish(data, (~args.indexOf('--strict'))), 'utf8')
|
130
132
|
};
|
131
133
|
module.exports.minify = function (css, strict) {
|
132
|
-
return sqwish(css, strict)
|
133
|
-
};
|
134
|
+
return sqwish(css, strict)
|
135
|
+
};
|
metadata
CHANGED
@@ -1,71 +1,68 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqwish
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Rico Sta. Cruz
|
9
9
|
- Dustin Diaz
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
dependencies:
|
17
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2012-07-18 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
18
16
|
name: execjs
|
19
|
-
|
20
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
21
18
|
none: false
|
22
|
-
requirements:
|
23
|
-
- -
|
24
|
-
- !ruby/object:Gem::Version
|
25
|
-
version:
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
26
23
|
type: :runtime
|
27
|
-
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
28
31
|
description: Compresses CSS.
|
29
|
-
email:
|
32
|
+
email:
|
30
33
|
- rico@sinefunc.com
|
31
34
|
executables: []
|
32
|
-
|
33
35
|
extensions: []
|
34
|
-
|
35
36
|
extra_rdoc_files: []
|
36
|
-
|
37
|
-
files:
|
37
|
+
files:
|
38
38
|
- lib/sqwish.rb
|
39
39
|
- sqwish/src/index.js
|
40
40
|
- HISTORY.md
|
41
41
|
- README.md
|
42
|
-
|
43
|
-
homepage: http://github.com/rstacruz/sqwish
|
42
|
+
- Rakefile
|
43
|
+
homepage: http://github.com/rstacruz/sqwish.rb
|
44
44
|
licenses: []
|
45
|
-
|
46
45
|
post_install_message:
|
47
46
|
rdoc_options: []
|
48
|
-
|
49
|
-
require_paths:
|
47
|
+
require_paths:
|
50
48
|
- lib
|
51
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
50
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version:
|
57
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
56
|
none: false
|
59
|
-
requirements:
|
60
|
-
- -
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version:
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
63
61
|
requirements: []
|
64
|
-
|
65
62
|
rubyforge_project:
|
66
|
-
rubygems_version: 1.
|
63
|
+
rubygems_version: 1.8.23
|
67
64
|
signing_key:
|
68
65
|
specification_version: 3
|
69
66
|
summary: A node-based CSS compressor
|
70
67
|
test_files: []
|
71
|
-
|
68
|
+
has_rdoc:
|