r2 0.2.6 → 0.2.8
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 +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:
|