wovnrb 0.1.73 → 0.1.74
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/wovnrb/version.rb +1 -1
- data/lib/wovnrb.rb +20 -13
- data/test/lib/wovnrb_test.rb +160 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51a6555bd22447e63a037e35da135602df0dd6bf
|
4
|
+
data.tar.gz: cfec1c9ec7244ce8837d59604a2c529e10117e85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d05d528781813b39f5858bde8f18b04350f947077362d3fd4ce676a0d0f0c495ece6513bb9104fc302bcda3cc11fa172577824c7730a446338cabf4dd88e4fea
|
7
|
+
data.tar.gz: b045b5b0813f1e99d141d809fbdf5a72e421d204801c35850e6856663d8210fe891618a857ad8bbe352ff0718ad413b9254073913078aa555c30a0558018fa51
|
data/lib/wovnrb/version.rb
CHANGED
data/lib/wovnrb.rb
CHANGED
@@ -26,25 +26,16 @@ module Wovnrb
|
|
26
26
|
return @app.call(env)
|
27
27
|
end
|
28
28
|
# redirect if the path is set to the default language (for SEO purposes)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
if (headers.path_lang == STORE.settings['default_lang'])
|
30
|
+
redirect_headers = headers.redirect(STORE.settings['default_lang'])
|
31
|
+
return [307, redirect_headers, ['']]
|
32
|
+
end
|
33
33
|
lang = headers.lang_code
|
34
34
|
|
35
35
|
# pass to application
|
36
36
|
status, res_headers, body = @app.call(headers.request_out)
|
37
37
|
|
38
38
|
if res_headers["Content-Type"] =~ /html/ # && !body[0].nil?
|
39
|
-
puts ""
|
40
|
-
puts ""
|
41
|
-
puts "WOVNRB LOGGING"
|
42
|
-
puts "H-PATHLANG: " + headers.path_lang
|
43
|
-
puts "DEF_LANG: " + STORE.settings['default_lang']
|
44
|
-
puts "WOVNRB LOGGING"
|
45
|
-
puts ""
|
46
|
-
puts ""
|
47
|
-
|
48
39
|
values = STORE.get_values(headers.redis_url)
|
49
40
|
url = {
|
50
41
|
:protocol => headers.protocol,
|
@@ -124,6 +115,16 @@ module Wovnrb
|
|
124
115
|
new_href
|
125
116
|
end
|
126
117
|
|
118
|
+
# returns true if a wovn_ignore is found in the tree from the node to the body tag
|
119
|
+
def check_wovn_ignore(node)
|
120
|
+
if !node.get_attribute('wovn-ignore').nil?
|
121
|
+
return true
|
122
|
+
elsif node.name === 'html'
|
123
|
+
return false
|
124
|
+
end
|
125
|
+
check_wovn_ignore(node.parent)
|
126
|
+
end
|
127
|
+
|
127
128
|
def switch_lang(body, values, url, lang=STORE.settings['default_lang'], headers)
|
128
129
|
lang = Lang.get_code(lang)
|
129
130
|
text_index = values['text_vals'] || {}
|
@@ -138,6 +139,7 @@ module Wovnrb
|
|
138
139
|
# add lang code to anchors href if not default lang
|
139
140
|
if lang != STORE.settings['default_lang']
|
140
141
|
d.xpath('//a').each do |a|
|
142
|
+
next if check_wovn_ignore(a)
|
141
143
|
href = a.get_attribute('href')
|
142
144
|
new_href = add_lang_code(href, STORE.settings['url_pattern'], lang, headers)
|
143
145
|
a.set_attribute('href', new_href)
|
@@ -146,6 +148,7 @@ module Wovnrb
|
|
146
148
|
|
147
149
|
# swap text
|
148
150
|
d.xpath('//text()').each do |node|
|
151
|
+
next if check_wovn_ignore(node)
|
149
152
|
node_text = node.content.strip
|
150
153
|
# shouldn't need size check, but for now...
|
151
154
|
if text_index[node_text] && text_index[node_text][lang] && text_index[node_text][lang].size > 0
|
@@ -154,6 +157,7 @@ module Wovnrb
|
|
154
157
|
end
|
155
158
|
# swap meta tag values
|
156
159
|
d.xpath('//meta').select { |t|
|
160
|
+
next if check_wovn_ignore(t)
|
157
161
|
(t.get_attribute('name') || t.get_attribute('property') || '') =~ /^(description|keywords|og:title|og:description)$/
|
158
162
|
}.each do |node|
|
159
163
|
node_content = node.get_attribute('content').strip
|
@@ -164,6 +168,7 @@ module Wovnrb
|
|
164
168
|
end
|
165
169
|
# swap img srcs
|
166
170
|
d.xpath('//img').each do |node|
|
171
|
+
next if check_wovn_ignore(node)
|
167
172
|
# use regular expressions to support case insensitivity (right?)
|
168
173
|
if node.to_html =~ /src=['"][^'"]*['"]/i
|
169
174
|
src = node.to_html.match(/src=['"]([^'"]*)['"]/i)[1]
|
@@ -198,7 +203,9 @@ module Wovnrb
|
|
198
203
|
|
199
204
|
# INSERT BACKEND WIDGET
|
200
205
|
insert_node = Nokogiri::XML::Node.new('script', d)
|
206
|
+
# TODO: CHANGE THIS BACK; Should be '//j.wovn.io/0' in production
|
201
207
|
insert_node['src'] = '//j.wovn.io/0'
|
208
|
+
# insert_node['src'] = '//j.dev-wovn.io:3000/0'
|
202
209
|
version = defined?(VERSION) ? VERSION : ''
|
203
210
|
insert_node['data-wovnio'] = "key=#{STORE.settings['user_token']}&backend=true¤tLang=#{lang}&defaultLang=#{STORE.settings['default_lang']}&urlPattern=#{STORE.settings['url_pattern']}&version=#{version}"
|
204
211
|
# do this so that there will be a closing tag (better compatibility with browsers)
|
data/test/lib/wovnrb_test.rb
CHANGED
@@ -26,7 +26,6 @@ class WovnrbTest < Minitest::Test
|
|
26
26
|
# def test_get_langs(values)
|
27
27
|
# end
|
28
28
|
|
29
|
-
|
30
29
|
def test_add_lang_code
|
31
30
|
i = Wovnrb::Interceptor.new(get_app)
|
32
31
|
h = Wovnrb::Headers.new(get_env('url' => 'http://favy.tips'), get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
@@ -263,6 +262,166 @@ class WovnrbTest < Minitest::Test
|
|
263
262
|
# headers.expects(:pathname).returns('/hello/tab.html')
|
264
263
|
# assert_equal('/fr/hello/hey/index.html', i.add_lang_code('hey/index.html', 'path', 'fr', headers))
|
265
264
|
# end
|
265
|
+
def generate_body(param = "")
|
266
|
+
case param
|
267
|
+
when "ignore_parent"
|
268
|
+
body = "<html><body><h1>Mr. Belvedere Fan Club</h1>
|
269
|
+
<div wovn-ignore><p>Hello</p></div>
|
270
|
+
</body></html>"
|
271
|
+
when "ignore_everything"
|
272
|
+
body = "<html><body wovn-ignore><h1>Mr. Belvedere Fan Club</h1>
|
273
|
+
<div><p>Hello</p></div>
|
274
|
+
</body></html>"
|
275
|
+
when "ignore_parent_translated_in_japanese"
|
276
|
+
body = "<html lang=\"ja\">
|
277
|
+
<head>
|
278
|
+
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
|
279
|
+
<script src=\"//j.wovn.io/0\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\">
|
280
|
+
</head>
|
281
|
+
<body>
|
282
|
+
<h1>ベルベデアさんファンクラブ</h1>
|
283
|
+
<div wovn-ignore=\"\"><p>Hello</p></div>
|
284
|
+
</body>
|
285
|
+
</html>
|
286
|
+
"
|
287
|
+
when "translated_in_japanese"
|
288
|
+
body = "<html lang=\"ja\">
|
289
|
+
<head>
|
290
|
+
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
|
291
|
+
<script src=\"//j.wovn.io/0\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.page.com/\">
|
292
|
+
</head>
|
293
|
+
<body>
|
294
|
+
<h1>ベルベデアさんファンクラブ</h1>
|
295
|
+
<div><p>こんにちは</p></div>
|
296
|
+
</body>
|
297
|
+
</html>
|
298
|
+
"
|
299
|
+
when "ignore_everything_translated"
|
300
|
+
body = "<html lang=\"ja\">
|
301
|
+
<head>
|
302
|
+
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
|
303
|
+
<script src=\"//j.wovn.io/0\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\">
|
304
|
+
</head>
|
305
|
+
<body wovn-ignore=\"\">
|
306
|
+
<h1>Mr. Belvedere Fan Club</h1>
|
307
|
+
<div><p>Hello</p></div>
|
308
|
+
</body>
|
309
|
+
</html>
|
310
|
+
"
|
311
|
+
when "empty"
|
312
|
+
body = "<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore><p>Hello</p></div></body></html>"
|
313
|
+
when "empty_single_quote"
|
314
|
+
body = "<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=''><p>Hello</p></div></body></html>"
|
315
|
+
when "empty_double_quote"
|
316
|
+
body = "<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=""><p>Hello</p></div></body></html>"
|
317
|
+
when "value_single_quote"
|
318
|
+
body = "<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore='value'><p>Hello</p></div></body></html>"
|
319
|
+
when "value_double_quote"
|
320
|
+
body = "<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"value\"><p>Hello</p></div></body></html>"
|
321
|
+
when "empty_translated"
|
322
|
+
body = "<html lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<script src=\"//j.wovn.io/0\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&version=0.1.74\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\">\n</head>\n<body>\n<h1>Mr.BelvedereFanClub</h1>\n<div wovn-ignore=\"\"><p>Hello</p></div>\n</body>\n</html>\n"
|
323
|
+
when "empty_single_quote_translated"
|
324
|
+
body = "<html lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<script src=\"//j.wovn.io/0\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&version=0.1.74\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\">\n</head>\n<body>\n<h1>Mr.BelvedereFanClub</h1>\n<div wovn-ignore=\"\"><p>Hello</p></div>\n</body>\n</html>\n"
|
325
|
+
when "empty_double_quote_translated"
|
326
|
+
body = "<html lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<script src=\"//j.wovn.io/0\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&version=0.1.74\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\">\n</head>\n<body>\n<h1>Mr.BelvedereFanClub</h1>\n<div wovn-ignore=\"\"><p>Hello</p></div>\n</body>\n</html>\n"
|
327
|
+
when "value_single_quote_translated"
|
328
|
+
body = "<html lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<script src=\"//j.wovn.io/0\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&version=0.1.74\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\">\n</head>\n<body>\n<h1>Mr.BelvedereFanClub</h1>\n<div wovn-ignore=\"value\"><p>Hello</p></div>\n</body>\n</html>\n"
|
329
|
+
when "value_double_quote_translated"
|
330
|
+
body = "<html lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<script src=\"//j.wovn.io/0\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&version=0.1.74\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\">\n</head>\n<body>\n<h1>Mr.BelvedereFanClub</h1>\n<div wovn-ignore=\"value\"><p>Hello</p></div>\n</body>\n</html>\n"
|
331
|
+
else # "" case
|
332
|
+
body = "<html><body><h1>Mr. Belvedere Fan Club</h1>
|
333
|
+
<div><p>Hello</p></div>
|
334
|
+
</body></html>"
|
335
|
+
end
|
336
|
+
return [body]
|
337
|
+
end
|
338
|
+
|
339
|
+
def generate_values
|
340
|
+
values = {}
|
341
|
+
values['text_vals'] = {'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
|
342
|
+
'Mr. Belvedere Fan Club' => {'ja' => [{'data' => 'ベルベデアさんファンクラブ'}]}}
|
343
|
+
return values
|
344
|
+
end
|
345
|
+
|
346
|
+
def test_switch_lang
|
347
|
+
i = Wovnrb::Interceptor.new(get_app)
|
348
|
+
h = Wovnrb::Headers.new(get_env('url' => 'http://page.com'), get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
349
|
+
body = generate_body()
|
350
|
+
values = generate_values
|
351
|
+
url = h.url
|
352
|
+
swapped_body = i.switch_lang(body, values, url, 'ja', h)
|
353
|
+
assert_equal(generate_body('translated_in_japanese'), swapped_body)
|
354
|
+
end
|
355
|
+
|
356
|
+
def test_switch_lang_wovn_ignore
|
357
|
+
i = Wovnrb::Interceptor.new(get_app)
|
358
|
+
h = Wovnrb::Headers.new(get_env('url' => 'http://ignore-page.com'), get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
359
|
+
body = generate_body('ignore_parent')
|
360
|
+
values = generate_values
|
361
|
+
url = h.url
|
362
|
+
swapped_body = i.switch_lang(body, values, url, 'ja', h)
|
363
|
+
assert_equal(generate_body('ignore_parent_translated_in_japanese'), swapped_body)
|
364
|
+
end
|
365
|
+
|
366
|
+
def test_switch_lang_wovn_ignore_everything
|
367
|
+
i = Wovnrb::Interceptor.new(get_app)
|
368
|
+
h = Wovnrb::Headers.new(get_env('url' => 'http://ignore-page.com'), get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
369
|
+
body = generate_body('ignore_everything')
|
370
|
+
values = generate_values
|
371
|
+
url = h.url
|
372
|
+
swapped_body = i.switch_lang(body, values, url, 'ja', h)
|
373
|
+
assert_equal(generate_body('ignore_everything_translated'), swapped_body)
|
374
|
+
end
|
375
|
+
|
376
|
+
def test_switch_lang_wovn_ignore_empty
|
377
|
+
i = Wovnrb::Interceptor.new(get_app)
|
378
|
+
h = Wovnrb::Headers.new(get_env('url' => 'http://ignore-page.com'), get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
379
|
+
body = generate_body('empty')
|
380
|
+
values = generate_values
|
381
|
+
url = h.url
|
382
|
+
swapped_body = i.switch_lang(body, values, url, 'ja', h)
|
383
|
+
assert_equal(generate_body('empty_translated'), swapped_body)
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_switch_lang_wovn_ignore_empty_single_quote
|
387
|
+
i = Wovnrb::Interceptor.new(get_app)
|
388
|
+
h = Wovnrb::Headers.new(get_env('url' => 'http://ignore-page.com'), get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
389
|
+
body = generate_body('empty_single_quote')
|
390
|
+
values = generate_values
|
391
|
+
url = h.url
|
392
|
+
swapped_body = i.switch_lang(body, values, url, 'ja', h)
|
393
|
+
assert_equal(generate_body('empty_single_quote_translated'), swapped_body)
|
394
|
+
end
|
395
|
+
|
396
|
+
def test_switch_lang_wovn_ignore_empty_double_quote
|
397
|
+
i = Wovnrb::Interceptor.new(get_app)
|
398
|
+
h = Wovnrb::Headers.new(get_env('url' => 'http://ignore-page.com'), get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
399
|
+
body = generate_body('empty_double_quote')
|
400
|
+
values = generate_values
|
401
|
+
url = h.url
|
402
|
+
swapped_body = i.switch_lang(body, values, url, 'ja', h)
|
403
|
+
assert_equal(generate_body('empty_double_quote_translated'), swapped_body)
|
404
|
+
end
|
405
|
+
|
406
|
+
def test_switch_lang_wovn_ignore_value_single_quote
|
407
|
+
i = Wovnrb::Interceptor.new(get_app)
|
408
|
+
h = Wovnrb::Headers.new(get_env('url' => 'http://ignore-page.com'), get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
409
|
+
body = generate_body('value_single_quote')
|
410
|
+
values = generate_values
|
411
|
+
url = h.url
|
412
|
+
swapped_body = i.switch_lang(body, values, url, 'ja', h)
|
413
|
+
assert_equal(generate_body('value_single_quote_translated'), swapped_body)
|
414
|
+
end
|
415
|
+
|
416
|
+
def test_switch_lang_wovn_ignore_value_double_quote
|
417
|
+
i = Wovnrb::Interceptor.new(get_app)
|
418
|
+
h = Wovnrb::Headers.new(get_env('url' => 'http://ignore-page.com'), get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
419
|
+
body = generate_body('value_double_quote')
|
420
|
+
values = generate_values
|
421
|
+
url = h.url
|
422
|
+
swapped_body = i.switch_lang(body, values, url, 'ja', h)
|
423
|
+
assert_equal(generate_body('value_double_quote_translated'), swapped_body)
|
424
|
+
end
|
266
425
|
|
267
426
|
def get_settings(options={})
|
268
427
|
settings = {}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wovnrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.74
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Sandford
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-11-
|
12
|
+
date: 2015-11-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogumbo
|