r2 0.1.0 → 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.
- checksums.yaml +7 -0
- data/.travis.yml +9 -0
- data/Gemfile +3 -0
- data/Guardfile +6 -0
- data/README.md +8 -1
- data/Rakefile +3 -8
- data/lib/r2.rb +29 -15
- data/lib/r2/version.rb +1 -1
- data/r2.gemspec +2 -1
- data/spec/r2_spec.rb +100 -44
- metadata +25 -13
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 11915f30f055af7962245e50b8bb3acd299d72e8
|
4
|
+
data.tar.gz: a536b287f02596d20774cce78c37e81a24eb32fd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6915646f994723a8ea9755e19ea764d00afe85c6f50f8ec356c373778729b08ccf07c0cf3ef1b4342d161902e3bce3365c1e2639fad435d4b97f8d96ab125666
|
7
|
+
data.tar.gz: 36b1614dd763a3c4f5534858f549c97e2fd06a467089437dcf082dfbc1ec0a748bf6121826bbe30e1f382f5ede46b6e331d7630c33dc8a5df6a92bb932e4bcb8
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Guardfile
ADDED
data/README.md
CHANGED
@@ -13,13 +13,20 @@ You can use the handy static method for flipping any CSS string via:
|
|
13
13
|
> R2.r2("/* Comment */\nbody { direction: rtl; }")
|
14
14
|
#=> "body{direction:ltr;}"
|
15
15
|
|
16
|
+
## Build Status
|
17
|
+
|
18
|
+
[](https://travis-ci.org/mzsanford/R2rb)
|
19
|
+
|
16
20
|
## Reporting bugs
|
17
21
|
|
18
22
|
Report bugs in the github project at http://github.com/mzsanford/r2rb
|
19
23
|
|
20
24
|
## Change Log
|
21
25
|
|
22
|
-
* v0.
|
26
|
+
* v0.2.0 – CSS3 additions
|
27
|
+
* [FEATURE] Support `@media` queries by ignoring them (fix from [@haimlankry](https://github.com/haimlankry))
|
28
|
+
* [FEATURE] Correctly flip `box-shadow` values (bug report from [@aviaron](https://github.com/aviaron))
|
29
|
+
* v0.1.0 – [@fractious](https://github.com/fractious) updates
|
23
30
|
* [CLEANUP] Added rspec dev dependency
|
24
31
|
* [CLEANUP] Fixed typo in internal method name
|
25
32
|
* [FEATURE] Added support for background-position
|
data/Rakefile
CHANGED
@@ -1,14 +1,9 @@
|
|
1
1
|
require 'bundler'
|
2
2
|
require 'rake'
|
3
|
-
require '
|
3
|
+
require 'rspec/core/rake_task'
|
4
4
|
|
5
5
|
Bundler::GemHelper.install_tasks
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
desc "Run all examples"
|
10
|
-
Spec::Rake::SpecTask.new('test') do |t|
|
11
|
-
t.spec_files = FileList['spec/*_spec.rb']
|
12
|
-
end
|
13
|
-
|
7
|
+
RSpec::Core::RakeTask.new(:spec)
|
14
8
|
|
9
|
+
task :default => :spec
|
data/lib/r2.rb
CHANGED
@@ -54,9 +54,9 @@ module R2
|
|
54
54
|
'-webkit-border-radius' => lambda {|obj,val| obj.border_radius_swap(val) },
|
55
55
|
'text-align' => lambda {|obj,val| obj.side_swap(val) },
|
56
56
|
'float' => lambda {|obj,val| obj.side_swap(val) },
|
57
|
-
'box-shadow' => lambda {|obj,val| obj.
|
58
|
-
'-webkit-box-shadow' => lambda {|obj,val| obj.
|
59
|
-
'-moz-box-shadow' => lambda {|obj,val| obj.
|
57
|
+
'box-shadow' => lambda {|obj,val| obj.shadow_swap(val) },
|
58
|
+
'-webkit-box-shadow' => lambda {|obj,val| obj.shadow_swap(val) },
|
59
|
+
'-moz-box-shadow' => lambda {|obj,val| obj.shadow_swap(val) },
|
60
60
|
'direction' => lambda {|obj,val| obj.direction_swap(val) },
|
61
61
|
'clear' => lambda {|obj,val| obj.side_swap(val) },
|
62
62
|
'background-position' => lambda {|obj,val| obj.background_position_swap(val) }
|
@@ -66,20 +66,19 @@ module R2
|
|
66
66
|
def r2(original_css)
|
67
67
|
css = minimize(original_css)
|
68
68
|
|
69
|
-
result = css.gsub(/([^\{]
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
69
|
+
result = css.gsub(/([^\{\}]+[^\}]|[\}])+?/) do |rule|
|
70
|
+
if rule.match(/[\{\}]/)
|
71
|
+
#it is a selector with "{" or a closing "}", insert as it is
|
72
|
+
rule_str = rule
|
73
|
+
else
|
74
|
+
#It is a decleration
|
75
|
+
rule_str = ""
|
76
|
+
rule.split(/;(?!base64)/).each do |decl|
|
77
|
+
rule_str << declaration_swap(decl)
|
78
|
+
end
|
78
79
|
end
|
79
|
-
rule_str << "}"
|
80
80
|
rule_str
|
81
81
|
end
|
82
|
-
|
83
82
|
return result
|
84
83
|
end
|
85
84
|
|
@@ -90,7 +89,8 @@ module R2
|
|
90
89
|
css.gsub(/\/\*[\s\S]+?\*\//, ''). # comments
|
91
90
|
gsub(/[\n\r]/, ''). # line breaks and carriage returns
|
92
91
|
gsub(/\s*([:;,\{\}])\s*/, '\1'). # space between selectors, declarations, properties and values
|
93
|
-
gsub(/\s+/, ' ')
|
92
|
+
gsub(/\s+/, ' '). # replace multiple spaces with single spaces
|
93
|
+
gsub(/(\A\s+|\s+\z)/, '') # leading or trailing spaces
|
94
94
|
end
|
95
95
|
|
96
96
|
# Given a single CSS declaration rule (e.g. <tt>padding-left: 4px</tt>) return the opposing rule (so, <tt>padding-right:4px;</tt> in this example)
|
@@ -144,6 +144,20 @@ module R2
|
|
144
144
|
val
|
145
145
|
end
|
146
146
|
end
|
147
|
+
|
148
|
+
# Given the 2-6 variable declaration for box-shadow convert the direction. Conversion requires inverting the
|
149
|
+
# horizontal measure only.
|
150
|
+
def shadow_swap(val)
|
151
|
+
args = val.to_s.split(/\s+/)
|
152
|
+
|
153
|
+
matched = args && args[0].match(/^([-+]?\d+)(\w*)$/)
|
154
|
+
if matched
|
155
|
+
return (["#{(-1 * matched[1].to_i)}#{matched[2]}"] + Array(args.values_at(1..5))).compact.join(' ')
|
156
|
+
else
|
157
|
+
return val
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
147
161
|
# Border radius uses top-left, top-right, bottom-left, bottom-right, so all values need to be swapped. Additionally,
|
148
162
|
# two and three value border-radius declarations need to be swapped as well. Vertical radius, specified with a /,
|
149
163
|
# should be left alone.
|
data/lib/r2/version.rb
CHANGED
data/r2.gemspec
CHANGED
@@ -14,7 +14,8 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
s.rubyforge_project = "r2"
|
16
16
|
|
17
|
-
s.add_development_dependency '
|
17
|
+
s.add_development_dependency 'rake'
|
18
|
+
s.add_development_dependency 'rspec', '~> 2.13.0'
|
18
19
|
|
19
20
|
s.files = `git ls-files`.split("\n")
|
20
21
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/spec/r2_spec.rb
CHANGED
@@ -2,137 +2,192 @@
|
|
2
2
|
require 'r2'
|
3
3
|
|
4
4
|
describe R2 do
|
5
|
-
|
6
|
-
|
5
|
+
|
6
|
+
describe ".r2" do
|
7
|
+
let(:r2) { double("r2") }
|
8
|
+
let(:css) { "body { direction: rtl; }" }
|
9
|
+
|
10
|
+
it "provides a shortcut to .new#r2" do
|
11
|
+
R2::Swapper.should_receive(:new).and_return(r2)
|
12
|
+
r2.should_receive(:r2).with(css)
|
13
|
+
R2.r2(css)
|
14
|
+
end
|
7
15
|
end
|
8
16
|
|
9
|
-
|
17
|
+
end
|
18
|
+
|
19
|
+
describe R2::Swapper do
|
20
|
+
subject(:r2) { R2::Swapper.new }
|
21
|
+
|
22
|
+
describe "#r2" do
|
10
23
|
it "processes CSS" do
|
11
|
-
|
24
|
+
r2.r2("/* comment */\nbody { direction: rtl; }\nimg { padding: 4px;}").should == "body{direction:ltr;}img{padding:4px;}"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "handles media queries" do
|
28
|
+
css = <<-EOS
|
29
|
+
@media all and (max-width: 222px) {
|
30
|
+
p {
|
31
|
+
padding-left: 2px;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
EOS
|
35
|
+
|
36
|
+
expected_result = "@media all and (max-width:222px){p{padding-right:2px;}}"
|
37
|
+
|
38
|
+
flipped_css = r2.r2(css)
|
39
|
+
|
40
|
+
flipped_css.should == expected_result
|
12
41
|
end
|
13
42
|
end
|
14
43
|
|
15
|
-
|
44
|
+
describe "#declaration_swap" do
|
16
45
|
it "should handle nil" do
|
17
|
-
|
46
|
+
r2.declaration_swap(nil).should == ''
|
18
47
|
end
|
19
48
|
|
20
49
|
it "should handle invalid declarations" do
|
21
|
-
|
50
|
+
r2.declaration_swap("not a decl").should == ''
|
22
51
|
end
|
23
52
|
|
24
53
|
it "should swap a swappable parameter" do
|
25
|
-
|
54
|
+
r2.declaration_swap("padding-right:4px").should == 'padding-left:4px;'
|
26
55
|
end
|
27
56
|
|
28
57
|
it "should swap a swappable quad parameter" do
|
29
|
-
|
58
|
+
r2.declaration_swap("padding:1px 2px 3px 4px").should == 'padding:1px 4px 3px 2px;'
|
30
59
|
end
|
31
60
|
|
32
61
|
it "should ignore other parameters" do
|
33
|
-
|
62
|
+
r2.declaration_swap("foo:bar").should == 'foo:bar;'
|
34
63
|
end
|
35
64
|
end
|
36
65
|
|
37
|
-
|
66
|
+
describe "#minimize" do
|
38
67
|
it "should handle nil" do
|
39
|
-
|
68
|
+
r2.minimize(nil).should == ""
|
40
69
|
end
|
41
70
|
|
42
71
|
it "should strip comments" do
|
43
|
-
|
72
|
+
r2.minimize("/* comment */foo").should == "foo"
|
44
73
|
end
|
45
74
|
|
46
75
|
it "should remove newlines" do
|
47
|
-
|
76
|
+
r2.minimize("foo\nbar").should == "foobar"
|
48
77
|
end
|
49
78
|
|
50
79
|
it "should remove carriage returns" do
|
51
|
-
|
80
|
+
r2.minimize("foo\rbar").should == "foobar"
|
52
81
|
end
|
53
82
|
|
54
83
|
it "should collapse multiple spaces into one" do
|
55
|
-
|
84
|
+
r2.minimize("foo bar").should == "foo bar"
|
56
85
|
end
|
57
86
|
end
|
58
87
|
|
59
|
-
|
88
|
+
describe "#direction_swap" do
|
60
89
|
it "should swap 'rtl' to 'ltr'" do
|
61
|
-
|
90
|
+
r2.direction_swap('rtl').should == 'ltr'
|
62
91
|
end
|
63
92
|
|
64
93
|
it "should swap 'ltr' to 'rtl'" do
|
65
|
-
|
94
|
+
r2.direction_swap('ltr').should == 'rtl'
|
66
95
|
end
|
67
96
|
|
68
97
|
it "should ignore values other than 'ltr' and 'rtl'" do
|
69
98
|
[nil, '', 'foo'].each do |val|
|
70
|
-
|
99
|
+
r2.direction_swap(val).should == val
|
71
100
|
end
|
72
101
|
end
|
73
102
|
end
|
74
103
|
|
75
|
-
|
104
|
+
describe "#side_swap" do
|
76
105
|
it "should swap 'right' to 'left'" do
|
77
|
-
|
106
|
+
r2.side_swap('right').should == 'left'
|
78
107
|
end
|
79
108
|
|
80
109
|
it "should swap 'left' to 'right'" do
|
81
|
-
|
110
|
+
r2.side_swap('left').should == 'right'
|
82
111
|
end
|
83
112
|
|
84
113
|
it "should ignore values other than 'left' and 'right'" do
|
85
114
|
[nil, '', 'foo'].each do |val|
|
86
|
-
|
115
|
+
r2.side_swap(val).should == val
|
87
116
|
end
|
88
117
|
end
|
89
118
|
end
|
90
119
|
|
91
|
-
|
120
|
+
describe "#quad_swap" do
|
92
121
|
it "should swap a valid quad value" do
|
93
|
-
|
122
|
+
r2.quad_swap("1px 2px 3px 4px").should == "1px 4px 3px 2px"
|
94
123
|
end
|
95
124
|
|
96
125
|
it "should skip a pair value" do
|
97
|
-
|
126
|
+
r2.quad_swap("1px 2px").should == "1px 2px"
|
98
127
|
end
|
99
128
|
end
|
100
129
|
|
101
|
-
|
130
|
+
describe "#shadow_swap" do
|
131
|
+
it "should swap a 2 arg value" do
|
132
|
+
r2.shadow_swap("1px 2px").should == "-1px 2px"
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should swap a 2 arg value from rtl to ltr" do
|
136
|
+
r2.shadow_swap("-1px 2px").should == "1px 2px"
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should swap a 3 arg value" do
|
140
|
+
r2.shadow_swap("1px 2px #000").should == "-1px 2px #000"
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should swap a 4 arg value" do
|
144
|
+
r2.shadow_swap("1px 2px 3px 4px").should == "-1px 2px 3px 4px"
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should swap a 5 arg value" do
|
148
|
+
r2.shadow_swap("1px 2px 3px 4px #000").should == "-1px 2px 3px 4px #000"
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should swap a 6 arg value" do
|
152
|
+
r2.shadow_swap("1px 2px 3px 4px #000 inset").should == "-1px 2px 3px 4px #000 inset"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe "#border_radius_swap" do
|
102
157
|
it "should swap a valid quad value" do
|
103
|
-
|
158
|
+
r2.border_radius_swap("1px 2px 3px 4px").should == "2px 1px 4px 3px"
|
104
159
|
end
|
105
160
|
|
106
161
|
it "should skip a triple value" do
|
107
|
-
|
162
|
+
r2.border_radius_swap("1px 2px 3px").should == "2px 1px 2px 3px"
|
108
163
|
end
|
109
164
|
|
110
165
|
it "should skip a pair value" do
|
111
|
-
|
166
|
+
r2.border_radius_swap("1px 2px").should == "2px 1px"
|
112
167
|
end
|
113
168
|
end
|
114
169
|
|
115
|
-
|
170
|
+
describe "#background_position_swap" do
|
116
171
|
|
117
172
|
context "with a single value" do
|
118
173
|
it "should ignore a named-vertical" do
|
119
|
-
|
174
|
+
r2.background_position_swap('top').should == 'top'
|
120
175
|
end
|
121
176
|
|
122
177
|
it "should swap a named-horizontal 'left'" do
|
123
|
-
|
178
|
+
r2.background_position_swap('left').should == 'right'
|
124
179
|
end
|
125
180
|
|
126
181
|
it "should swap a named-horizontal 'right'" do
|
127
|
-
|
182
|
+
r2.background_position_swap('right').should == 'left'
|
128
183
|
end
|
129
184
|
|
130
185
|
it "should invert a percentage" do
|
131
|
-
|
186
|
+
r2.background_position_swap('25%').should == '75%'
|
132
187
|
end
|
133
188
|
|
134
189
|
it "should convert a unit value" do
|
135
|
-
|
190
|
+
r2.background_position_swap('25px').should == 'right 25px center'
|
136
191
|
end
|
137
192
|
end
|
138
193
|
|
@@ -143,36 +198,37 @@ describe R2 do
|
|
143
198
|
# See: http://dev.w3.org/csswg/css3-background/#background-position
|
144
199
|
|
145
200
|
it "should swap named-horizontal and ignore named-vertical" do
|
146
|
-
|
201
|
+
r2.background_position_swap('right bottom').should == 'left bottom'
|
147
202
|
end
|
148
203
|
|
149
204
|
it "should swap named-horizontal and ignore unit-vertical" do
|
150
|
-
|
205
|
+
r2.background_position_swap('left 100px').should == 'right 100px'
|
151
206
|
end
|
152
207
|
|
153
208
|
it "should convert unit-horizontal" do
|
154
|
-
|
209
|
+
r2.background_position_swap('100px center').should == 'right 100px center'
|
155
210
|
end
|
156
211
|
|
157
212
|
it "should swap named-horizontal and ignore percentage-vertical" do
|
158
|
-
|
213
|
+
r2.background_position_swap('left 0%').should == 'right 0%'
|
159
214
|
end
|
160
215
|
|
161
216
|
it "should invert first percentage-horizontal value in a pair" do
|
162
|
-
|
217
|
+
r2.background_position_swap('25% 100%').should == '75% 100%'
|
163
218
|
end
|
164
219
|
end
|
165
220
|
|
166
221
|
context "with a triplet of values" do
|
167
222
|
it "should swap named-horizontal" do
|
168
|
-
|
223
|
+
r2.background_position_swap('left 20px center').should == 'right 20px center'
|
169
224
|
end
|
170
225
|
end
|
171
226
|
|
172
227
|
context "with a quad of values" do
|
173
228
|
it "should swap named-horizontal value" do
|
174
|
-
|
229
|
+
r2.background_position_swap('bottom 10px left 20px').should == 'bottom 10px right 20px'
|
175
230
|
end
|
176
231
|
end
|
177
232
|
end
|
233
|
+
|
178
234
|
end
|
metadata
CHANGED
@@ -1,32 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: r2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matt Sanford
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-05-23 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
14
27
|
- !ruby/object:Gem::Dependency
|
15
28
|
name: rspec
|
16
29
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
30
|
requirements:
|
19
31
|
- - ~>
|
20
32
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
33
|
+
version: 2.13.0
|
22
34
|
type: :development
|
23
35
|
prerelease: false
|
24
36
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
37
|
requirements:
|
27
38
|
- - ~>
|
28
39
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
40
|
+
version: 2.13.0
|
30
41
|
description: CSS flipper for right-to-left processing. A Ruby port of https://github.com/ded/r2
|
31
42
|
email:
|
32
43
|
- matt@twitter.com
|
@@ -36,7 +47,9 @@ extensions: []
|
|
36
47
|
extra_rdoc_files: []
|
37
48
|
files:
|
38
49
|
- .gitignore
|
50
|
+
- .travis.yml
|
39
51
|
- Gemfile
|
52
|
+
- Guardfile
|
40
53
|
- LICENSE
|
41
54
|
- README.md
|
42
55
|
- Rakefile
|
@@ -47,27 +60,26 @@ files:
|
|
47
60
|
- spec/r2_spec.rb
|
48
61
|
homepage: ''
|
49
62
|
licenses: []
|
63
|
+
metadata: {}
|
50
64
|
post_install_message:
|
51
65
|
rdoc_options: []
|
52
66
|
require_paths:
|
53
67
|
- lib
|
54
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
-
none: false
|
56
69
|
requirements:
|
57
|
-
- -
|
70
|
+
- - '>='
|
58
71
|
- !ruby/object:Gem::Version
|
59
72
|
version: '0'
|
60
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
74
|
requirements:
|
63
|
-
- -
|
75
|
+
- - '>='
|
64
76
|
- !ruby/object:Gem::Version
|
65
77
|
version: '0'
|
66
78
|
requirements: []
|
67
79
|
rubyforge_project: r2
|
68
|
-
rubygems_version:
|
80
|
+
rubygems_version: 2.0.3
|
69
81
|
signing_key:
|
70
|
-
specification_version:
|
82
|
+
specification_version: 4
|
71
83
|
summary: CSS flipper for right-to-left processing
|
72
84
|
test_files:
|
73
85
|
- spec/r2_spec.rb
|