r2 0.2.6 → 0.2.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +1 -1
- data/README.md +1 -0
- data/lib/r2/version.rb +1 -1
- data/lib/r2.rb +53 -26
- data/spec/r2_spec.rb +27 -0
- metadata +6 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 790a1c3403b43e80a07f3353d0f683483aff2f50367d95b0c55759202e02626c
|
4
|
+
data.tar.gz: af54fe9e6ee0d53be9b88683af39cae8f5ad40adb8c6a39a3e46f3356d3ce050
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 274cd78b0fd61476c37dcc87c474587ef60e57ad2cf2cdd3aeb803cf08c3abed8226b940ff563b5f98c87c7a55108264194f292663658f19bcfd7ec85a84b7d6
|
7
|
+
data.tar.gz: 6aa114c12414912ad7c1d4f26f93548e1c9eb85565e4b5f27599105c4c47e416b3138dbbce8df6dd14f152848ba9dea19dd92cb7dde5c0ee7f3f32d4eb8786a2
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -23,6 +23,7 @@ Report bugs in the github project at http://github.com/mzsanford/r2rb
|
|
23
23
|
|
24
24
|
## Change Log
|
25
25
|
|
26
|
+
* v0.2.7 - Add an option to skip R2 processing on a CSS block (error report from [@mapmeld](https://github.com/mapmeld))
|
26
27
|
* v0.2.6 - Handle multi-row selectors (fix from [@n0nick](https://github.com/n0nick))
|
27
28
|
* v0.2.5 - Handle `background:` shorthand
|
28
29
|
* v0.2.4 - Handle `url()` properties better
|
data/lib/r2/version.rb
CHANGED
data/lib/r2.rb
CHANGED
@@ -10,6 +10,12 @@ require 'r2/shadow_flipper'
|
|
10
10
|
|
11
11
|
module R2
|
12
12
|
|
13
|
+
# A string that indicates this block should be skipped
|
14
|
+
SKIP_TOKEN = 'SKIP_R2'
|
15
|
+
|
16
|
+
# Important declarations are removed and then re-added after swapping
|
17
|
+
IMPORTANT_DECLARATION = '!important'
|
18
|
+
|
13
19
|
# Short cut method for providing a one-time CSS change
|
14
20
|
def self.r2(css)
|
15
21
|
::R2::Swapper.new.r2(css)
|
@@ -77,9 +83,13 @@ module R2
|
|
77
83
|
# it is a selector with "{" or a closing "}", insert as it is. This is
|
78
84
|
# things like ".foo {" and its matching "}"
|
79
85
|
rule_str = rule
|
86
|
+
elsif rule.match(/#{SKIP_TOKEN}/)
|
87
|
+
# A body that is being skipped
|
88
|
+
rule_str = rule.sub(SKIP_TOKEN, '')
|
80
89
|
else
|
81
90
|
# It is a declaration body, like "padding-left:4px;margin-left:5px;"
|
82
91
|
rule_str = ""
|
92
|
+
|
83
93
|
# Split up the individual rules in the body and process each swap. To handle the
|
84
94
|
# possible ";" in the url() definitions, like
|
85
95
|
# url("data;base64") and url("data:image/svg+xml;charset=...")
|
@@ -109,11 +119,12 @@ module R2
|
|
109
119
|
def minimize(css)
|
110
120
|
return '' unless css
|
111
121
|
|
112
|
-
css.gsub(
|
113
|
-
gsub(
|
114
|
-
gsub(
|
115
|
-
gsub(/\s
|
116
|
-
gsub(
|
122
|
+
css.gsub(/\/\*\s*no-r2\s*\*\//, SKIP_TOKEN). # special skip comment
|
123
|
+
gsub(/\/\*[\s\S]+?\*\//, ''). # comments
|
124
|
+
gsub(/[\n\r]+/, ' '). # line breaks and carriage returns
|
125
|
+
gsub(/\s*([:;,\{\}])\s*/, '\1'). # space between selectors, declarations, properties and values
|
126
|
+
gsub(/\s+/, ' '). # replace multiple spaces with single spaces
|
127
|
+
gsub(/(\A\s+|\s+\z)/, '') # leading or trailing spaces
|
117
128
|
end
|
118
129
|
|
119
130
|
# 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)
|
@@ -157,14 +168,17 @@ module R2
|
|
157
168
|
# Given a 4-argument CSS declaration value (like that of <tt>padding</tt> or <tt>margin</tt>) return the opposing
|
158
169
|
# value. The opposing value swaps the left and right but not the top or bottom. Any unrecognized argument is returned
|
159
170
|
# unmolested (for example, 2-argument values)
|
160
|
-
def quad_swap(
|
171
|
+
def quad_swap(css_value)
|
172
|
+
points_str, is_important = extract_important(css_value)
|
161
173
|
# 1px 2px 3px 4px => 1px 4px 3px 2px
|
162
|
-
points =
|
174
|
+
points = points_str.to_s.split(/\s+/)
|
163
175
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
176
|
+
append_important(is_important) do
|
177
|
+
if points && points.length == 4
|
178
|
+
[points[0], points[3], points[2], points[1]].join(' ')
|
179
|
+
else
|
180
|
+
points_str
|
181
|
+
end
|
168
182
|
end
|
169
183
|
end
|
170
184
|
|
@@ -204,22 +218,25 @@ module R2
|
|
204
218
|
# Border radius uses top-left, top-right, bottom-left, bottom-right, so all values need to be swapped. Additionally,
|
205
219
|
# two and three value border-radius declarations need to be swapped as well. Vertical radius, specified with a /,
|
206
220
|
# should be left alone.
|
207
|
-
def border_radius_swap(
|
221
|
+
def border_radius_swap(css_value)
|
208
222
|
# 1px 2px 3px 4px => 1px 4px 3px 2px
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
223
|
+
points_str, is_important = extract_important(css_value)
|
224
|
+
points = points_str.to_s.split(/\s+/)
|
225
|
+
|
226
|
+
append_important(is_important) do
|
227
|
+
if points && points.length > 1 && !points_str.to_s.include?('/')
|
228
|
+
case points.length
|
229
|
+
when 4
|
230
|
+
[points[1], points[0], points[3], points[2]].join(' ')
|
231
|
+
when 3
|
232
|
+
[points[1], points[0], points[1], points[2]].join(' ')
|
233
|
+
when 2
|
234
|
+
[points[1], points[0]].join(' ')
|
235
|
+
else points_str
|
236
|
+
end
|
237
|
+
else
|
238
|
+
points_str
|
220
239
|
end
|
221
|
-
else
|
222
|
-
val
|
223
240
|
end
|
224
241
|
end
|
225
242
|
|
@@ -241,12 +258,22 @@ module R2
|
|
241
258
|
end
|
242
259
|
|
243
260
|
# If first point is a unit-value
|
244
|
-
if match = points[0].match(/^(
|
261
|
+
if match = points[0].match(/^(-?\d+[a-z]{2,3})/)
|
245
262
|
val = ["right", match[1], points[1] || "center"].compact.join(' ')
|
246
263
|
end
|
247
264
|
|
248
265
|
val
|
249
266
|
end
|
267
|
+
|
268
|
+
def extract_important(css)
|
269
|
+
is_important = css =~ /#{IMPORTANT_DECLARATION}/
|
270
|
+
return css.sub(/ #{IMPORTANT_DECLARATION}/, ''), is_important
|
271
|
+
end
|
272
|
+
|
273
|
+
def append_important(is_important, &block)
|
274
|
+
css_value = yield
|
275
|
+
css_value + (is_important ? " #{IMPORTANT_DECLARATION}" : '')
|
276
|
+
end
|
250
277
|
end
|
251
278
|
|
252
279
|
end
|
data/spec/r2_spec.rb
CHANGED
@@ -107,6 +107,19 @@ describe R2::Swapper do
|
|
107
107
|
|
108
108
|
expect(r2.r2(css)).to eq(expected)
|
109
109
|
end
|
110
|
+
|
111
|
+
it "handles no-r2 comment" do
|
112
|
+
css = <<-EOS
|
113
|
+
.sprite.foo {
|
114
|
+
/* no-r2 */
|
115
|
+
background-position: 0px -50px;
|
116
|
+
}
|
117
|
+
EOS
|
118
|
+
|
119
|
+
expected = ".sprite.foo{ background-position:0px -50px;}"
|
120
|
+
|
121
|
+
expect(r2.r2(css)).to eq(expected)
|
122
|
+
end
|
110
123
|
end
|
111
124
|
|
112
125
|
describe "#declaration_swap" do
|
@@ -197,6 +210,11 @@ describe R2::Swapper do
|
|
197
210
|
it "should skip a pair value" do
|
198
211
|
expect(r2.quad_swap("1px 2px")).to eq("1px 2px")
|
199
212
|
end
|
213
|
+
|
214
|
+
it "should handle !important" do
|
215
|
+
expect(r2.quad_swap("1px 2px 3px 4px !important")).to eq("1px 4px 3px 2px !important")
|
216
|
+
expect(r2.quad_swap("1px 2px !important")).to eq("1px 2px !important")
|
217
|
+
end
|
200
218
|
end
|
201
219
|
|
202
220
|
describe "#shadow_swap" do
|
@@ -236,6 +254,9 @@ describe R2::Swapper do
|
|
236
254
|
expect(r2.shadow_swap("inset 1px 2px rgba(0,0,0,0.2), 1px 2px #000")).to eq("-1px 2px rgba(0,0,0,0.2) inset, -1px 2px #000")
|
237
255
|
end
|
238
256
|
|
257
|
+
it "should handle !important correctly" do
|
258
|
+
expect(r2.shadow_swap("1px 2px !important")).to eq("-1px 2px !important")
|
259
|
+
end
|
239
260
|
end
|
240
261
|
|
241
262
|
describe "#border_radius_swap" do
|
@@ -250,6 +271,11 @@ describe R2::Swapper do
|
|
250
271
|
it "should skip a pair value" do
|
251
272
|
expect(r2.border_radius_swap("1px 2px")).to eq("2px 1px")
|
252
273
|
end
|
274
|
+
|
275
|
+
it "should corectly handle !important" do
|
276
|
+
expect(r2.border_radius_swap("1px !important")).to eq("1px !important")
|
277
|
+
expect(r2.border_radius_swap("1px 2px !important")).to eq("2px 1px !important")
|
278
|
+
end
|
253
279
|
end
|
254
280
|
|
255
281
|
describe "#background_position_swap" do
|
@@ -274,6 +300,7 @@ describe R2::Swapper do
|
|
274
300
|
it "should convert a unit value" do
|
275
301
|
expect(r2.background_position_swap('25px')).to eq('right 25px center')
|
276
302
|
end
|
303
|
+
|
277
304
|
end
|
278
305
|
|
279
306
|
context "with a pair of values" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: r2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Sanford
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -88,7 +88,7 @@ files:
|
|
88
88
|
homepage: https://github.com/mzsanford/R2rb
|
89
89
|
licenses: []
|
90
90
|
metadata: {}
|
91
|
-
post_install_message:
|
91
|
+
post_install_message:
|
92
92
|
rdoc_options: []
|
93
93
|
require_paths:
|
94
94
|
- lib
|
@@ -103,9 +103,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: '0'
|
105
105
|
requirements: []
|
106
|
-
|
107
|
-
|
108
|
-
signing_key:
|
106
|
+
rubygems_version: 3.1.6
|
107
|
+
signing_key:
|
109
108
|
specification_version: 4
|
110
109
|
summary: CSS flipper for right-to-left processing
|
111
110
|
test_files:
|