wovnrb 1.0.11 → 1.0.12
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 +4 -4
- data/README.md +14 -7
- data/lib/wovnrb/headers.rb +8 -0
- data/lib/wovnrb/helpers/nokogumbo_helper.rb +61 -0
- data/lib/wovnrb/html_replacers/image_replacer.rb +1 -1
- data/lib/wovnrb/html_replacers/input_replacer.rb +1 -1
- data/lib/wovnrb/html_replacers/link_replacer.rb +28 -1
- data/lib/wovnrb/html_replacers/meta_replacer.rb +1 -1
- data/lib/wovnrb/html_replacers/replacer_base.rb +1 -1
- data/lib/wovnrb/html_replacers/text_replacer.rb +1 -1
- data/lib/wovnrb/lang.rb +18 -15
- data/lib/wovnrb/store.rb +2 -1
- data/lib/wovnrb/version.rb +1 -1
- data/lib/wovnrb.rb +11 -4
- data/test/lib/html_replacers/image_replacer_test.rb +25 -0
- data/test/lib/html_replacers/input_replacer_test.rb +13 -0
- data/test/lib/html_replacers/link_replacer_test.rb +77 -12
- data/test/lib/html_replacers/meta_replacer_test.rb +42 -0
- data/test/lib/html_replacers/replacer_base_test.rb +27 -0
- data/test/lib/html_replacers/text_replacer_test.rb +46 -0
- data/test/lib/lang_test.rb +45 -36
- data/test/lib/wovnrb_test.rb +64 -0
- data/test/test_helper.rb +2 -0
- data/wovnrb.gemspec +2 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e29488764fb88eeb19e1eff45f80d0ee7bc9e9f
|
4
|
+
data.tar.gz: 7cf695b56bd2808316afb21cca7149a1c671c453
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 669492de84557bbff060615fad054a0895bccc76f66279f5a4fa03d34b7bfa0b3cb837b08cd75004bd9ff1977bd9ab487bd448ecd32d1bc4d81c926d37baa475
|
7
|
+
data.tar.gz: df708dcbd7a1ceb1d346fda5579892af608971199d7e6e70c6966e27a92cd54962fe625c295758aa85f1d1209d7ec6d6a8182537455b729de9fdcd72ed21a12d
|
data/README.md
CHANGED
@@ -66,13 +66,14 @@ After completing setup, start the Ruby Application, and make sure the WOVN.io li
|
|
66
66
|
|
67
67
|
WOVN.io Ruby Library's valid parameters are as follows.
|
68
68
|
|
69
|
-
Parameter Name
|
70
|
-
|
71
|
-
project_token
|
72
|
-
url_pattern
|
73
|
-
query
|
74
|
-
default_lang
|
75
|
-
ignore_class
|
69
|
+
Parameter Name | Required | Default Setting
|
70
|
+
------------------ | -------- | ----------------
|
71
|
+
project_token | yes | ''
|
72
|
+
url_pattern | yes | 'path'
|
73
|
+
query | | []
|
74
|
+
default_lang | yes | 'en'
|
75
|
+
ignore_class | | []
|
76
|
+
translate_fragment | | true
|
76
77
|
|
77
78
|
### 2.1. project_token
|
78
79
|
|
@@ -124,6 +125,12 @@ The library will redirect to the following URL.
|
|
124
125
|
|
125
126
|
This sets "Ignore class" which prevent WOVN translating HTML elements that have one of the array.
|
126
127
|
|
128
|
+
### 2.6 translate_fragment
|
129
|
+
|
130
|
+
This option allows to disable translating partial HTML content. By default,
|
131
|
+
partial HTML content is translated but no widget snippet is added. Set
|
132
|
+
"translate_fragment" to 'false' to stop translating partial HTML content.
|
133
|
+
|
127
134
|
## 3. Contributing
|
128
135
|
|
129
136
|
1. Fork it ( https://github.com/WOVNio/wovnrb/fork )
|
data/lib/wovnrb/headers.rb
CHANGED
@@ -8,6 +8,7 @@ module Wovnrb
|
|
8
8
|
attr_reader :host
|
9
9
|
attr_reader :unmasked_pathname
|
10
10
|
attr_reader :pathname
|
11
|
+
attr_reader :dirname
|
11
12
|
attr_reader :redis_url
|
12
13
|
|
13
14
|
# Generates new instance of Wovnrb::Headers.
|
@@ -231,6 +232,13 @@ module Wovnrb
|
|
231
232
|
headers
|
232
233
|
end
|
233
234
|
|
235
|
+
def dirname
|
236
|
+
if pathname.include?('/')
|
237
|
+
pathname.end_with?('/') ? pathname : pathname[0, pathname.rindex('/') + 1]
|
238
|
+
else
|
239
|
+
'/'
|
240
|
+
end
|
241
|
+
end
|
234
242
|
end
|
235
243
|
|
236
244
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Wovnrb
|
2
|
+
module Helpers
|
3
|
+
module NokogumboHelper
|
4
|
+
def parse_html(html_string, encoding = 'UTF-8')
|
5
|
+
dom = if html_string.strip[0..999] =~ /<html/i
|
6
|
+
d = Nokogiri::HTML5(html_string)
|
7
|
+
d.encoding = encoding
|
8
|
+
d
|
9
|
+
else
|
10
|
+
parse_fragment(html_string, encoding)
|
11
|
+
end
|
12
|
+
|
13
|
+
return dom
|
14
|
+
end
|
15
|
+
|
16
|
+
# https://www.rubydoc.info/gems/nokogumbo/Nokogiri/HTML5#fragment-class_method
|
17
|
+
#
|
18
|
+
# Nokogumbo does not properly support parsing fragment and the current
|
19
|
+
# implementation of Nokogiri::HTML5.fragment does not handle encoding
|
20
|
+
# (second line of code below).
|
21
|
+
def parse_fragment(html_string, encoding = 'UTF-8')
|
22
|
+
doc = Nokogiri::HTML5.parse(html_string)
|
23
|
+
doc.encoding = encoding
|
24
|
+
fragment = Nokogiri::HTML::DocumentFragment.new(doc)
|
25
|
+
|
26
|
+
if doc.children.length != 1 or doc.children.first.name != 'html'
|
27
|
+
# no HTML? Return document as is
|
28
|
+
fragment = doc
|
29
|
+
else
|
30
|
+
# examine children of HTML element
|
31
|
+
children = doc.children.first.children
|
32
|
+
|
33
|
+
# head is always first. If present, take children but otherwise
|
34
|
+
# ignore the head element
|
35
|
+
if children.length > 0 and doc.children.first.name = 'head'
|
36
|
+
fragment << children.shift.children
|
37
|
+
end
|
38
|
+
|
39
|
+
# body may be next, or last. If found, take children but otherwise
|
40
|
+
# ignore the body element. Also take any remaining elements, taking
|
41
|
+
# care to preserve order.
|
42
|
+
if children.length > 0 and doc.children.first.name = 'body'
|
43
|
+
fragment << children.shift.children
|
44
|
+
fragment << children
|
45
|
+
elsif children.length > 0 and doc.children.last.name = 'body'
|
46
|
+
body = children.pop
|
47
|
+
fragment << children
|
48
|
+
fragment << body.children
|
49
|
+
else
|
50
|
+
fragment << children
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# return result
|
55
|
+
fragment
|
56
|
+
end
|
57
|
+
|
58
|
+
module_function :parse_html, :parse_fragment
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -13,7 +13,10 @@ module Wovnrb
|
|
13
13
|
@headers = headers
|
14
14
|
end
|
15
15
|
|
16
|
+
|
16
17
|
def replace(dom, lang)
|
18
|
+
base_url = base_href(dom)
|
19
|
+
|
17
20
|
dom.xpath('//*[match(.)]', MultiTagMatcher.new).each do |node|
|
18
21
|
next if wovn_ignore?(node)
|
19
22
|
|
@@ -21,11 +24,24 @@ module Wovnrb
|
|
21
24
|
next if href =~ /^\s*\{\{.+\}\}\s*$/
|
22
25
|
next if href =~ /^\s*javascript:/i
|
23
26
|
next if is_file?(href)
|
24
|
-
|
27
|
+
|
28
|
+
new_href = href
|
29
|
+
new_href = adjust_link_by_base(new_href, base_url) if base_url
|
30
|
+
new_href = lang.add_lang_code(new_href, @pattern, @headers)
|
31
|
+
|
25
32
|
node.set_attribute('href', new_href)
|
26
33
|
end
|
27
34
|
end
|
28
35
|
|
36
|
+
private
|
37
|
+
|
38
|
+
def adjust_link_by_base(href, base_url)
|
39
|
+
return href if href =~ /^\// # absolute path
|
40
|
+
return href if href =~ /^http(s?):\/\// # full url
|
41
|
+
|
42
|
+
File.join(base_url, href)
|
43
|
+
end
|
44
|
+
|
29
45
|
def is_file?(href)
|
30
46
|
img_files = /^(https?:\/\/)?.*(\.(#{FileExtension::IMG_FILES}))((\?|#).*)?$/i
|
31
47
|
audio_files = /^(https?:\/\/)?.*(\.(#{FileExtension::AUDIO_FILES}))((\?|#).*)?$/i
|
@@ -33,6 +49,17 @@ module Wovnrb
|
|
33
49
|
doc_files = /^(https?:\/\/)?.*(\.(#{FileExtension::DOC_FILES}))((\?|#).*)?$/i
|
34
50
|
href =~ img_files || href =~ audio_files || href =~ video_files || href =~ doc_files
|
35
51
|
end
|
52
|
+
|
53
|
+
def base_href(dom)
|
54
|
+
base_tag = dom.xpath('//base').first
|
55
|
+
return nil unless base_tag
|
56
|
+
|
57
|
+
href = base_tag.get_attribute('href')
|
58
|
+
return href if href =~ /^\// # absolute path
|
59
|
+
return href if href =~ /^http(s?):\/\// # full url
|
60
|
+
|
61
|
+
Addressable::URI.join('/', @headers.dirname, href).to_s
|
62
|
+
end
|
36
63
|
end
|
37
64
|
|
38
65
|
class MultiTagMatcher
|
@@ -8,7 +8,7 @@ module Wovnrb
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def replace(dom, lang)
|
11
|
-
dom.xpath('
|
11
|
+
dom.xpath('.//meta').select { |node|
|
12
12
|
next if wovn_ignore?(node)
|
13
13
|
(node.get_attribute('name') || node.get_attribute('property') || '') =~ /^(description|title|og:title|og:description|og:url|twitter:title|twitter:description)$/
|
14
14
|
}.each do |node|
|
data/lib/wovnrb/lang.rb
CHANGED
@@ -153,27 +153,30 @@ module Wovnrb
|
|
153
153
|
end
|
154
154
|
end
|
155
155
|
end
|
156
|
+
|
156
157
|
new_href
|
157
158
|
end
|
158
159
|
|
159
160
|
def switch_dom_lang(dom, store, values, url, headers)
|
160
161
|
replace_dom_values(dom, values, store, url, headers)
|
161
162
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
163
|
+
if dom.html?
|
164
|
+
# INSERT LANGUAGE METALINKS
|
165
|
+
parent_node = dom.at_css('head') || dom.at_css('body') || dom.at_css('html')
|
166
|
+
published_langs = get_langs(values)
|
167
|
+
all_langs = published_langs.add(store.settings['default_lang'])
|
168
|
+
all_langs.each do |l|
|
169
|
+
insert_node = Nokogiri::XML::Node.new('link', dom)
|
170
|
+
insert_node['rel'] = 'alternate'
|
171
|
+
insert_node['hreflang'] = Lang::iso_639_1_normalization(l)
|
172
|
+
insert_node['href'] = headers.redirect_location(l)
|
173
|
+
parent_node.add_child(insert_node)
|
174
|
+
end
|
173
175
|
|
174
|
-
|
175
|
-
|
176
|
-
|
176
|
+
# set lang property on HTML tag
|
177
|
+
if dom.at_css('html') || dom.at_css('HTML')
|
178
|
+
(dom.at_css('html') || dom.at_css('HTML')).set_attribute('lang', Lang::iso_639_1_normalization(@lang_code))
|
179
|
+
end
|
177
180
|
end
|
178
181
|
|
179
182
|
index_href = index_href_for_encoding_and_decoding(dom)
|
@@ -216,7 +219,7 @@ module Wovnrb
|
|
216
219
|
replacers << MetaReplacer.new(store, text_index, pattern, headers)
|
217
220
|
replacers << InputReplacer.new(store, text_index)
|
218
221
|
replacers << ImageReplacer.new(store, url, text_index, src_index, img_src_prefix, host_aliases)
|
219
|
-
replacers << ScriptReplacer.new(store)
|
222
|
+
replacers << ScriptReplacer.new(store) if dom.html?
|
220
223
|
|
221
224
|
replacers.each do |replacer|
|
222
225
|
replacer.replace(dom, self)
|
data/lib/wovnrb/store.rb
CHANGED
@@ -31,7 +31,8 @@ module Wovnrb
|
|
31
31
|
'ttl_seconds' => nil,
|
32
32
|
'use_proxy' => false, # use env['HTTP_X_FORWARDED_HOST'] instead of env['HTTP_HOST'] and env['SERVER_NAME'] when this setting is true.
|
33
33
|
'custom_lang_aliases' => {},
|
34
|
-
'wovn_dev_mode' => false
|
34
|
+
'wovn_dev_mode' => false,
|
35
|
+
'translate_fragment' => true
|
35
36
|
})
|
36
37
|
end
|
37
38
|
|
data/lib/wovnrb/version.rb
CHANGED
data/lib/wovnrb.rb
CHANGED
@@ -5,6 +5,7 @@ require 'wovnrb/lang'
|
|
5
5
|
require 'nokogumbo'
|
6
6
|
#require 'dom'
|
7
7
|
require 'json'
|
8
|
+
require 'wovnrb/helpers/nokogumbo_helper'
|
8
9
|
require 'wovnrb/api_data'
|
9
10
|
require 'wovnrb/text_caches/cache_base'
|
10
11
|
require 'wovnrb/html_replacers/replacer_base'
|
@@ -99,8 +100,8 @@ module Wovnrb
|
|
99
100
|
noscripts << match
|
100
101
|
b_without_noscripts = b_without_noscripts.sub(match, noscript_identifier)
|
101
102
|
end
|
102
|
-
|
103
|
-
d
|
103
|
+
|
104
|
+
d = Helpers::NokogumboHelper::parse_html(b_without_noscripts)
|
104
105
|
|
105
106
|
# If this page has wovn-ignore in the html tag, don't do anything
|
106
107
|
if ignore_all || !d.xpath('//html[@wovn-ignore]').empty? || is_amp_page?(d)
|
@@ -111,10 +112,10 @@ module Wovnrb
|
|
111
112
|
next
|
112
113
|
end
|
113
114
|
|
114
|
-
if
|
115
|
+
if must_translate?(d, values)
|
115
116
|
output = lang.switch_dom_lang(d, @store, values, url, headers)
|
116
117
|
else
|
117
|
-
ScriptReplacer.new(@store).replace(d, lang)
|
118
|
+
ScriptReplacer.new(@store).replace(d, lang) if d.html?
|
118
119
|
output = d.to_html(save_with: 0)
|
119
120
|
end
|
120
121
|
put_back_noscripts!(output, noscripts)
|
@@ -131,6 +132,12 @@ module Wovnrb
|
|
131
132
|
[status, res_headers, body]
|
132
133
|
end
|
133
134
|
|
135
|
+
def must_translate?(dom, values)
|
136
|
+
can_translate = dom.html? ? true : @store.settings['translate_fragment']
|
137
|
+
|
138
|
+
can_translate && have_data?(values)
|
139
|
+
end
|
140
|
+
|
134
141
|
def have_data?(values)
|
135
142
|
values.count > 0
|
136
143
|
end
|
@@ -29,6 +29,31 @@ module Wovnrb
|
|
29
29
|
assert_equal('wovn-src:Hello', img.previous.content)
|
30
30
|
end
|
31
31
|
|
32
|
+
def test_replace_in_fragment
|
33
|
+
store = Store.instance
|
34
|
+
url = {
|
35
|
+
:protocol => 'http',
|
36
|
+
:host => 'www.example.com',
|
37
|
+
:pathname => 'hello/index.html'
|
38
|
+
}
|
39
|
+
text_index = {
|
40
|
+
'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
|
41
|
+
}
|
42
|
+
src_index = {
|
43
|
+
'http://www.example.com/test.img' => {'ja' => [{'data' => 'http://test.com/ttt.img'}]}
|
44
|
+
}
|
45
|
+
img_src_prefix = 'prefix::'
|
46
|
+
replacer = ImageReplacer.new(store, url, text_index, src_index, img_src_prefix, [])
|
47
|
+
|
48
|
+
dom = Helpers::NokogumboHelper::parse_fragment('<img src="http://www.example.com/test.img" alt="Hello">')
|
49
|
+
replacer.replace(dom, Lang.new('ja'))
|
50
|
+
|
51
|
+
img = dom.xpath('.//img')[0]
|
52
|
+
assert_equal('prefix::http://test.com/ttt.img', img.get_attribute('src'))
|
53
|
+
assert_equal('こんにちは', img.get_attribute('alt'))
|
54
|
+
assert_equal('wovn-src:Hello', img.previous.content)
|
55
|
+
end
|
56
|
+
|
32
57
|
def test_replace_relative_path
|
33
58
|
store = Store.instance
|
34
59
|
url = {
|
@@ -17,6 +17,19 @@ module Wovnrb
|
|
17
17
|
assert_equal('こんにちは', content)
|
18
18
|
end
|
19
19
|
|
20
|
+
def test_replace_in_fragment
|
21
|
+
store = Store.instance
|
22
|
+
replacer = InputReplacer.new(store, {
|
23
|
+
'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
|
24
|
+
})
|
25
|
+
|
26
|
+
dom = Helpers::NokogumboHelper::parse_fragment('<input type="submit" value="Hello">')
|
27
|
+
replacer.replace(dom, Lang.new('ja'))
|
28
|
+
|
29
|
+
content = dom.xpath('.//input')[0].get_attribute('value')
|
30
|
+
assert_equal('こんにちは', content)
|
31
|
+
end
|
32
|
+
|
20
33
|
def test_dont_replace_empty_submit_value
|
21
34
|
store = Store.instance
|
22
35
|
replacer = InputReplacer.new(store, {
|
@@ -109,45 +109,45 @@ module Wovnrb
|
|
109
109
|
def test_replace_link_path_with_canonical
|
110
110
|
store = Store.instance
|
111
111
|
replacer = LinkReplacer.new(store, 'path', get_header)
|
112
|
-
dom = Wovnrb.get_dom('<html><head><link rel="canonical" href="http://
|
112
|
+
dom = Wovnrb.get_dom('<html><head><link rel="canonical" href="http://wovn.io/hello/index.html"></head><body>hello</body></html>')
|
113
113
|
replacer.replace(dom, Lang.new('en'))
|
114
114
|
canonical_href = dom.xpath('//link').find { |d| d.attributes['rel'].value == 'canonical' }.attributes['href'].value
|
115
|
-
assert_equal('http://
|
115
|
+
assert_equal('http://wovn.io/en/hello/index.html', canonical_href)
|
116
116
|
end
|
117
117
|
|
118
118
|
def test_replace_link_with_style
|
119
119
|
store = Store.instance
|
120
120
|
replacer = LinkReplacer.new(store, 'path', get_header)
|
121
|
-
dom = Wovnrb.get_dom('<html><head><link rel="stylesheet" type="text/css" href="http://
|
121
|
+
dom = Wovnrb.get_dom('<html><head><link rel="stylesheet" type="text/css" href="http://wovn.io/hello/index.css"></head><body>hello</body></html>')
|
122
122
|
replacer.replace(dom, Lang.new('en'))
|
123
123
|
href = dom.xpath('//link').find { |d| d.attributes['rel'].value == 'stylesheet' }.attributes['href'].value
|
124
|
-
assert_equal('http://
|
124
|
+
assert_equal('http://wovn.io/hello/index.css', href, 'Should not change the href')
|
125
125
|
end
|
126
126
|
|
127
127
|
def test_replace_img_link_path
|
128
128
|
store = Store.instance
|
129
129
|
replacer = LinkReplacer.new(store, 'path', get_header)
|
130
|
-
dom = Wovnrb.get_dom('<a href="http://
|
130
|
+
dom = Wovnrb.get_dom('<a href="http://wovn.io/index.jpg">link text</a>')
|
131
131
|
replacer.replace(dom, Lang.new('ja'))
|
132
132
|
|
133
133
|
link = dom.xpath('//a')[0].get_attribute('href')
|
134
|
-
assert_equal('http://
|
134
|
+
assert_equal('http://wovn.io/index.jpg', link)
|
135
135
|
end
|
136
136
|
|
137
137
|
def test_replace_img_link_path_with_query_or_hash
|
138
138
|
store = Store.instance
|
139
139
|
replacer = LinkReplacer.new(store, 'path', get_header)
|
140
|
-
dom = Wovnrb.get_dom('<a href="http://
|
140
|
+
dom = Wovnrb.get_dom('<a href="http://wovn.io/index.jpg?test=1">link text</a>')
|
141
141
|
replacer.replace(dom, Lang.new('ja'))
|
142
142
|
|
143
143
|
link = dom.xpath('//a')[0].get_attribute('href')
|
144
|
-
assert_equal('http://
|
144
|
+
assert_equal('http://wovn.io/index.jpg?test=1', link)
|
145
145
|
|
146
|
-
dom = Wovnrb.get_dom('<a href="http://
|
146
|
+
dom = Wovnrb.get_dom('<a href="http://wovn.io/index.jpg#test=1">link text</a>')
|
147
147
|
replacer.replace(dom, Lang.new('ja'))
|
148
148
|
|
149
149
|
link = dom.xpath('//a')[0].get_attribute('href')
|
150
|
-
assert_equal('http://
|
150
|
+
assert_equal('http://wovn.io/index.jpg#test=1', link)
|
151
151
|
end
|
152
152
|
|
153
153
|
def test_replace_audio_link_path
|
@@ -254,10 +254,75 @@ module Wovnrb
|
|
254
254
|
assert_equal(' {{hello}} ', link)
|
255
255
|
end
|
256
256
|
|
257
|
+
def test_with_base_as_previous_directory
|
258
|
+
dom, replacer = create_dom_by_base(base: '../', href: 'm/css/iphone.css')
|
259
|
+
replacer.replace(dom, Lang.new('en'))
|
260
|
+
assert_link(dom, '/en/sp/entry2017/m/css/iphone.css')
|
261
|
+
end
|
262
|
+
|
263
|
+
def test_with_base_as_different_host
|
264
|
+
dom, replacer = create_dom_by_base(base: 'http://test.com', href: 'm/css/iphone.css')
|
265
|
+
replacer.replace(dom, Lang.new('en'))
|
266
|
+
assert_link(dom, 'http://test.com/m/css/iphone.css')
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_with_base_as_different_host_without_protocol
|
270
|
+
dom, replacer = create_dom_by_base(base: '//test.com', href: 'm/css/iphone.css')
|
271
|
+
replacer.replace(dom, Lang.new('en'))
|
272
|
+
assert_link(dom, '//test.com/m/css/iphone.css')
|
273
|
+
end
|
257
274
|
|
275
|
+
def test_with_base_as_relative_path
|
276
|
+
dom, replacer = create_dom_by_base(base: '/test', href: 'm/css/iphone.css')
|
277
|
+
replacer.replace(dom, Lang.new('en'))
|
278
|
+
assert_link(dom, '/en/test/m/css/iphone.css')
|
279
|
+
end
|
258
280
|
|
259
|
-
def
|
260
|
-
|
281
|
+
def test_with_base_as_relative_path_without_starting_slash
|
282
|
+
dom, replacer = create_dom_by_base(base: 'test/', href: 'm/css/iphone.css')
|
283
|
+
replacer.replace(dom, Lang.new('en'))
|
284
|
+
assert_link(dom, '/en/sp/entry2017/m/test/m/css/iphone.css')
|
285
|
+
end
|
286
|
+
|
287
|
+
def test_base_href
|
288
|
+
store = Store.instance
|
289
|
+
tests = [
|
290
|
+
{ pathname: '/dirname/index.php', base: '/absolute/path', expected_href: '/absolute/path' },
|
291
|
+
{ pathname: '/dirname/index.php', base: 'relative/path', expected_href: '/dirname/relative/path' },
|
292
|
+
{ pathname: '/dirname/index.php', base: './dot/path', expected_href: '/dirname/dot/path' },
|
293
|
+
{ pathname: '/dirname/index.php', base: '../doubledot/path', expected_href: '/doubledot/path' },
|
294
|
+
{ pathname: '/', base: '../errordots/path', expected_href: '/errordots/path' },
|
295
|
+
{ pathname: '/dirname/deep/index.php', base: './../.././../../../many/dots', expected_href: '/many/dots' },
|
296
|
+
{ pathname: 'index.php', base: 'no/dir/path', expected_href: '/no/dir/path' },
|
297
|
+
{ pathname: 'index.php', base: '/trailing/slash/', expected_href: '/trailing/slash/' },
|
298
|
+
{ pathname: 'index.php', base: '', expected_href: '/' }
|
299
|
+
]
|
300
|
+
|
301
|
+
tests.each do |test|
|
302
|
+
replacer = LinkReplacer.new(store, 'path', get_header(url_pattern: 'path', pathname: test[:pathname]))
|
303
|
+
dom = Wovnrb.get_dom("<base target=\"_blank\" href=\"#{test[:base]}\"><a href=\"/not_matter\">link text</a>")
|
304
|
+
assert_equal(test[:expected_href], replacer.send(:base_href, dom))
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
def get_header(url_pattern: 'query', pathname: nil)
|
309
|
+
Wovnrb::Headers.new(
|
310
|
+
Wovnrb.get_env('url' => "http://wovn.io#{pathname}"),
|
311
|
+
Wovnrb.get_settings('url_pattern' => url_pattern, 'url_pattern_reg' => '^(?<lang>[^.]+).')
|
312
|
+
)
|
313
|
+
end
|
314
|
+
|
315
|
+
def create_dom_by_base(base:, href:)
|
316
|
+
store = Store.instance
|
317
|
+
replacer = LinkReplacer.new(store, 'path', get_header(url_pattern: 'path', pathname: '/sp/entry2017/m/index.php'))
|
318
|
+
dom = Wovnrb.get_dom("<base target=\"_blank\" href=\"#{base}\"><a href=\"#{href}\">link text</a>")
|
319
|
+
|
320
|
+
[dom, replacer]
|
321
|
+
end
|
322
|
+
|
323
|
+
def assert_link(dom, expected)
|
324
|
+
link = dom.xpath('//a')[0].get_attribute('href')
|
325
|
+
assert_equal(expected, link)
|
261
326
|
end
|
262
327
|
end
|
263
328
|
end
|
@@ -17,6 +17,19 @@ module Wovnrb
|
|
17
17
|
assert_equal('こんにちは', content)
|
18
18
|
end
|
19
19
|
|
20
|
+
def test_replace_description_in_fragment
|
21
|
+
store = Store.instance
|
22
|
+
replacer = MetaReplacer.new(store, {
|
23
|
+
'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
|
24
|
+
})
|
25
|
+
|
26
|
+
dom = Helpers::NokogumboHelper::parse_fragment('<meta name="description" content="Hello">')
|
27
|
+
replacer.replace(dom, Lang.new('ja'))
|
28
|
+
|
29
|
+
content = dom.xpath('.//meta')[0].get_attribute('content')
|
30
|
+
assert_equal('こんにちは', content)
|
31
|
+
end
|
32
|
+
|
20
33
|
def test_replace_og_description
|
21
34
|
store = Store.instance
|
22
35
|
replacer = MetaReplacer.new(store, {
|
@@ -85,6 +98,22 @@ module Wovnrb
|
|
85
98
|
assert_equal('さようなら', content2)
|
86
99
|
end
|
87
100
|
|
101
|
+
def test_replace_multi_in_fragment
|
102
|
+
store = Store.instance
|
103
|
+
replacer = MetaReplacer.new(store, {
|
104
|
+
'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
|
105
|
+
'Bye' => {'ja' => [{'data' => 'さようなら'}]}
|
106
|
+
})
|
107
|
+
|
108
|
+
dom = Helpers::NokogumboHelper::parse_fragment('<meta property="title" content="Hello"><meta property="title" content="Bye">')
|
109
|
+
replacer.replace(dom, Lang.new('ja'))
|
110
|
+
|
111
|
+
content = dom.xpath('.//meta')[0].get_attribute('content')
|
112
|
+
content2 = dom.xpath('.//meta')[1].get_attribute('content')
|
113
|
+
assert_equal('こんにちは', content)
|
114
|
+
assert_equal('さようなら', content2)
|
115
|
+
end
|
116
|
+
|
88
117
|
def test_replace_wovn_ignore
|
89
118
|
store = Store.instance
|
90
119
|
replacer = MetaReplacer.new(store, {
|
@@ -98,6 +127,19 @@ module Wovnrb
|
|
98
127
|
assert_equal('Hello', content)
|
99
128
|
end
|
100
129
|
|
130
|
+
def test_replace_wovn_ignore_on_fragment
|
131
|
+
store = Store.instance
|
132
|
+
replacer = MetaReplacer.new(store, {
|
133
|
+
'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
|
134
|
+
})
|
135
|
+
|
136
|
+
dom = Helpers::NokogumboHelper::parse_fragment('<meta wovn-ignore property="title" content="Hello">')
|
137
|
+
replacer.replace(dom, Lang.new('ja'))
|
138
|
+
|
139
|
+
content = dom.xpath('.//meta')[0].get_attribute('content')
|
140
|
+
assert_equal('Hello', content)
|
141
|
+
end
|
142
|
+
|
101
143
|
def test_replace_wovn_ignore_og
|
102
144
|
store = Store.instance
|
103
145
|
headers = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'https://test.com'), Wovnrb.get_settings)
|
@@ -58,6 +58,33 @@ HTML
|
|
58
58
|
assert(replacer.send(:wovn_ignore?, dom.xpath('//div')[0]))
|
59
59
|
assert(replacer.send(:wovn_ignore?, dom.xpath('//span')[0]))
|
60
60
|
assert_equal(false, replacer.send(:wovn_ignore?, dom.xpath('//p')[0]))
|
61
|
+
|
62
|
+
def test_wovn_ignore_fragment
|
63
|
+
store = Store.instance
|
64
|
+
replacer = ReplacerBase.new(store)
|
65
|
+
dom = Helpers::NokogumboHelper.parse_fragment('<div wovn-ignore></div>')
|
66
|
+
actual = replacer.send(:wovn_ignore?, dom.xpath('.//div')[0])
|
67
|
+
|
68
|
+
assert(actual)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_wovn_ignore_fragment_parent
|
73
|
+
store = Store.instance
|
74
|
+
replacer = ReplacerBase.new(store)
|
75
|
+
dom = Helpers::NokogumboHelper.parse_fragment('<div wovn-ignore><span></span></div>')
|
76
|
+
actual = replacer.send(:wovn_ignore?, dom.xpath('.//span')[0])
|
77
|
+
|
78
|
+
assert(actual)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_wovn_ignore_fragment_no_wovn_ignore
|
82
|
+
store = Store.instance
|
83
|
+
replacer = ReplacerBase.new(store)
|
84
|
+
dom = Helpers::NokogumboHelper.parse_fragment('<div><span></span></div>')
|
85
|
+
actual = replacer.send(:wovn_ignore?, dom.xpath('.//span')[0])
|
86
|
+
|
87
|
+
assert(!actual)
|
61
88
|
end
|
62
89
|
|
63
90
|
def test_replace_text
|
@@ -18,6 +18,20 @@ module Wovnrb
|
|
18
18
|
assert_equal('wovn-src:Hello', node.previous.content)
|
19
19
|
end
|
20
20
|
|
21
|
+
def test_replace_in_fragment
|
22
|
+
store = Store.instance
|
23
|
+
replacer = TextReplacer.new(store,{
|
24
|
+
'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
|
25
|
+
})
|
26
|
+
|
27
|
+
dom = Helpers::NokogumboHelper::parse_fragment('<span>Hello</span>')
|
28
|
+
replacer.replace(dom, Lang.new('ja'))
|
29
|
+
|
30
|
+
node = dom.xpath('.//text()')[0]
|
31
|
+
assert_equal('こんにちは', node.content)
|
32
|
+
assert_equal('wovn-src:Hello', node.previous.content)
|
33
|
+
end
|
34
|
+
|
21
35
|
def test_replace_multiple
|
22
36
|
store = Store.instance
|
23
37
|
replacer = TextReplacer.new(store, {
|
@@ -36,6 +50,24 @@ module Wovnrb
|
|
36
50
|
assert_equal('wovn-src:Bye', node2.previous.content)
|
37
51
|
end
|
38
52
|
|
53
|
+
def test_replace_multiple_in_fragment
|
54
|
+
store = Store.instance
|
55
|
+
replacer = TextReplacer.new(store, {
|
56
|
+
'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
|
57
|
+
'Bye' => {'ja' => [{'data' => 'さようなら'}]}
|
58
|
+
})
|
59
|
+
|
60
|
+
dom = Helpers::NokogumboHelper::parse_fragment('<span>Hello</span><span>Bye</span>')
|
61
|
+
replacer.replace(dom, Lang.new('ja'))
|
62
|
+
|
63
|
+
node = dom.xpath('.//text()')[0]
|
64
|
+
node2 = dom.xpath('.//text()')[1]
|
65
|
+
assert_equal('こんにちは', node.content)
|
66
|
+
assert_equal('wovn-src:Hello', node.previous.content)
|
67
|
+
assert_equal('さようなら', node2.content)
|
68
|
+
assert_equal('wovn-src:Bye', node2.previous.content)
|
69
|
+
end
|
70
|
+
|
39
71
|
def test_replace_wovn_ignore
|
40
72
|
store = Store.instance
|
41
73
|
replacer = TextReplacer.new(store, {
|
@@ -49,5 +81,19 @@ module Wovnrb
|
|
49
81
|
assert_equal('Hello', node.content)
|
50
82
|
assert_nil(node.previous)
|
51
83
|
end
|
84
|
+
|
85
|
+
def test_replace_wovn_ignore_on_fragment
|
86
|
+
store = Store.instance
|
87
|
+
replacer = TextReplacer.new(store, {
|
88
|
+
'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
|
89
|
+
})
|
90
|
+
|
91
|
+
dom = Helpers::NokogumboHelper::parse_fragment('<div wovn-ignore>Hello</div>')
|
92
|
+
replacer.replace(dom, Lang.new('ja'))
|
93
|
+
|
94
|
+
node = dom.xpath('.//text()')[0]
|
95
|
+
assert_equal('Hello', node.content)
|
96
|
+
assert_nil(node.previous)
|
97
|
+
end
|
52
98
|
end
|
53
99
|
end
|
data/test/lib/lang_test.rb
CHANGED
@@ -4,7 +4,6 @@ require 'minitest/autorun'
|
|
4
4
|
|
5
5
|
module Wovnrb
|
6
6
|
class LangTest < WovnMiniTest
|
7
|
-
|
8
7
|
def test_langs_exist
|
9
8
|
refute_nil(Wovnrb::Lang::LANG)
|
10
9
|
end
|
@@ -94,44 +93,44 @@ module Wovnrb
|
|
94
93
|
|
95
94
|
def test_add_lang_code
|
96
95
|
lang = Lang.new('zh-cht')
|
97
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
96
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
98
97
|
assert_equal("http://www.facebook.com", lang.add_lang_code("http://www.facebook.com", 'subdomain', h))
|
99
98
|
end
|
100
99
|
|
101
100
|
def test_add_lang_code_relative_slash_href_url_with_path
|
102
101
|
lang = Lang.new('fr')
|
103
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://fr.
|
104
|
-
assert_equal("http://fr.
|
102
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://fr.wovn.io/topics/44'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
103
|
+
assert_equal("http://fr.wovn.io/topics/50", lang.add_lang_code("/topics/50", 'subdomain', h))
|
105
104
|
end
|
106
105
|
|
107
106
|
def test_add_lang_code_relative_dot_href_url_with_path
|
108
107
|
lang = Lang.new('fr')
|
109
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://fr.
|
110
|
-
assert_equal("http://fr.
|
108
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://fr.wovn.io/topics/44'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
109
|
+
assert_equal("http://fr.wovn.io/topics/44/topics/50", lang.add_lang_code("./topics/50", 'subdomain', h))
|
111
110
|
end
|
112
111
|
|
113
112
|
def test_add_lang_code_relative_two_dots_href_url_with_path
|
114
113
|
lang = Lang.new('fr')
|
115
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://fr.
|
116
|
-
assert_equal("http://fr.
|
114
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://fr.wovn.io/topics/44'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
115
|
+
assert_equal("http://fr.wovn.io/topics/50", lang.add_lang_code("../topics/50", 'subdomain', h))
|
117
116
|
end
|
118
117
|
|
119
118
|
def test_add_lang_code_trad_chinese
|
120
119
|
lang = Lang.new('zh-cht')
|
121
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
122
|
-
assert_equal("http://zh-cht.
|
120
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
121
|
+
assert_equal("http://zh-cht.wovn.io/topics/31", lang.add_lang_code("http://wovn.io/topics/31", 'subdomain', h))
|
123
122
|
end
|
124
123
|
|
125
124
|
def test_add_lang_code_trad_chinese_2
|
126
125
|
lang = Lang.new('zh-cht')
|
127
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://zh-cht.
|
128
|
-
assert_equal("http://zh-cht.
|
126
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://zh-cht.wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
127
|
+
assert_equal("http://zh-cht.wovn.io/topics/31", lang.add_lang_code("/topics/31", 'subdomain', h))
|
129
128
|
end
|
130
129
|
|
131
130
|
def test_add_lang_code_trad_chinese_lang_in_link_already
|
132
131
|
lang = Lang.new('zh-cht')
|
133
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://zh-cht.
|
134
|
-
assert_equal("http://zh-cht.
|
132
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://zh-cht.wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
133
|
+
assert_equal("http://zh-cht.wovn.io/topics/31", lang.add_lang_code("http://zh-cht.wovn.io/topics/31", 'subdomain', h))
|
135
134
|
end
|
136
135
|
|
137
136
|
def test_add_lang_code_no_protocol
|
@@ -142,79 +141,79 @@ module Wovnrb
|
|
142
141
|
|
143
142
|
def test_add_lang_code_no_protocol_2
|
144
143
|
lang = Lang.new('zh-cht')
|
145
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'https://zh-cht.
|
144
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'https://zh-cht.wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
146
145
|
assert_equal("//google.com", lang.add_lang_code("//google.com", 'subdomain', h))
|
147
146
|
end
|
148
147
|
|
149
148
|
def test_add_lang_code_invalid_url
|
150
149
|
lang = Lang.new('zh-cht')
|
151
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
152
|
-
assert_equal("http://www.facebook.com/sharer.php?u=http://
|
150
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
151
|
+
assert_equal("http://www.facebook.com/sharer.php?u=http://wovn.io/topics/50&amp;t=Gourmet Tofu World: Vegetarian-Friendly Japanese Food is Here!", lang.add_lang_code("http://www.facebook.com/sharer.php?u=http://wovn.io/topics/50&amp;t=Gourmet Tofu World: Vegetarian-Friendly Japanese Food is Here!", 'subdomain', h))
|
153
152
|
end
|
154
153
|
|
155
154
|
def test_add_lang_code_path_only_with_slash
|
156
155
|
lang = Lang.new('zh-cht')
|
157
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
158
|
-
assert_equal("http://zh-cht.
|
156
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
157
|
+
assert_equal("http://zh-cht.wovn.io/topics/31", lang.add_lang_code("/topics/31", 'subdomain', h))
|
159
158
|
end
|
160
159
|
|
161
160
|
def test_add_lang_code_path_only_no_slash
|
162
161
|
lang = Lang.new('zh-cht')
|
163
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
164
|
-
assert_equal("http://zh-cht.
|
162
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
163
|
+
assert_equal("http://zh-cht.wovn.io/topics/31", lang.add_lang_code("topics/31", 'subdomain', h))
|
165
164
|
end
|
166
165
|
|
167
166
|
def test_add_lang_code_path_explicit_page_no_slash
|
168
167
|
lang = Lang.new('zh-cht')
|
169
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
170
|
-
assert_equal("http://zh-cht.
|
168
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
169
|
+
assert_equal("http://zh-cht.wovn.io/topics/31.html", lang.add_lang_code("topics/31.html", 'subdomain', h))
|
171
170
|
end
|
172
171
|
|
173
172
|
def test_add_lang_code_path_explicit_page_with_slash
|
174
173
|
lang = Lang.new('zh-cht')
|
175
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
176
|
-
assert_equal("http://zh-cht.
|
174
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
175
|
+
assert_equal("http://zh-cht.wovn.io/topics/31.html", lang.add_lang_code("/topics/31.html", 'subdomain', h))
|
177
176
|
end
|
178
177
|
|
179
178
|
def test_add_lang_code_no_protocol_with_path_explicit_page
|
180
179
|
lang = Lang.new('zh-cht')
|
181
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
180
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
182
181
|
assert_equal("//www.google.com/topics/31.php", lang.add_lang_code("//www.google.com/topics/31.php", 'subdomain', h))
|
183
182
|
end
|
184
183
|
|
185
184
|
def test_add_lang_code_protocol_with_path_explicit_page
|
186
185
|
lang = Lang.new('zh-cht')
|
187
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
186
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
188
187
|
assert_equal("http://www.google.com/topics/31.php", lang.add_lang_code("http://www.google.com/topics/31.php", 'subdomain', h))
|
189
188
|
end
|
190
189
|
|
191
190
|
def test_add_lang_code_relative_path_double_period
|
192
191
|
lang = Lang.new('zh-cht')
|
193
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
194
|
-
assert_equal("http://zh-cht.
|
192
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
193
|
+
assert_equal("http://zh-cht.wovn.io/topics/31", lang.add_lang_code("../topics/31", 'subdomain', h))
|
195
194
|
end
|
196
195
|
|
197
196
|
def test_add_lang_code_relative_path_single_period
|
198
197
|
lang = Lang.new('zh-cht')
|
199
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
200
|
-
assert_equal("http://zh-cht.
|
198
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
199
|
+
assert_equal("http://zh-cht.wovn.io/topics/31", lang.add_lang_code("./topics/31", 'subdomain', h))
|
201
200
|
end
|
202
201
|
|
203
202
|
def test_add_lang_code_empty_href
|
204
203
|
lang = Lang.new('zh-cht')
|
205
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
204
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
206
205
|
assert_equal("", lang.add_lang_code("", 'subdomain', h))
|
207
206
|
end
|
208
207
|
|
209
208
|
def test_add_lang_code_hash_href
|
210
209
|
lang = Lang.new('zh-cht')
|
211
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
210
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
212
211
|
assert_equal("#", lang.add_lang_code("#", 'subdomain', h))
|
213
212
|
end
|
214
213
|
|
215
214
|
def test_add_lang_code_nil_href
|
216
215
|
lang = Lang.new('en')
|
217
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
216
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings)
|
218
217
|
assert_nil(lang.add_lang_code(nil,'path', h))
|
219
218
|
end
|
220
219
|
def test_add_lang_code_absolute_different_host
|
@@ -466,6 +465,16 @@ module Wovnrb
|
|
466
465
|
assert_equal(generate_body('translated_in_japanese'), swapped_body)
|
467
466
|
end
|
468
467
|
|
468
|
+
def test_switch_lang_with_html_fragment
|
469
|
+
lang = Lang.new('ja')
|
470
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://page.com'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
471
|
+
dom = Helpers::NokogumboHelper::parse_fragment('<span>Hello</span>')
|
472
|
+
values = generate_values
|
473
|
+
url = h.url
|
474
|
+
swapped_body = lang.switch_dom_lang(dom, Store.instance, values, url, h)
|
475
|
+
assert_equal('<span><!--wovn-src:Hello-->こんにちは</span>', swapped_body)
|
476
|
+
end
|
477
|
+
|
469
478
|
def test_switch_lang_href_javascript
|
470
479
|
lang = Lang.new('ja')
|
471
480
|
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://page.com'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
@@ -565,8 +574,8 @@ module Wovnrb
|
|
565
574
|
def test_add_lang_code_with_custom_lang_aliases
|
566
575
|
lang = Lang.new('fr')
|
567
576
|
Store.instance.settings['custom_lang_aliases'] = {'fr' => 'staging-fr'}
|
568
|
-
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://
|
569
|
-
assert_equal("http://staging-fr.
|
577
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
578
|
+
assert_equal("http://staging-fr.wovn.io/topics/50", lang.add_lang_code("/topics/50", 'subdomain', h))
|
570
579
|
end
|
571
580
|
|
572
581
|
def test_switch_dom_lang_for_keeping_originl_encoding_decoding
|
data/test/lib/wovnrb_test.rb
CHANGED
@@ -137,6 +137,29 @@ class WovnrbTest < Minitest::Test
|
|
137
137
|
assert_equal([expected_body], swapped_body)
|
138
138
|
end
|
139
139
|
|
140
|
+
def test_switch_lang_of_html_fragment_with_no_translation_values
|
141
|
+
i = Wovnrb::Interceptor.new(get_app)
|
142
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://page.com'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
143
|
+
body = '<select name="test"><option value="1">1</option><option value="2">2</option></select>'
|
144
|
+
values = {}
|
145
|
+
url = h.url
|
146
|
+
swapped_body = i.switch_lang([body], values, url, 'ja', h)
|
147
|
+
|
148
|
+
assert_equal([body], swapped_body)
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_switch_lang_of_html_fragment_with_japanese_translations
|
152
|
+
i = Wovnrb::Interceptor.new(get_app)
|
153
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://page.com'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
154
|
+
body = '<span>Hello</span>'
|
155
|
+
expected_body = '<span><!--wovn-src:Hello-->こんにちは</span>'
|
156
|
+
values = generate_values
|
157
|
+
url = h.url
|
158
|
+
swapped_body = i.switch_lang([body], values, url, 'ja', h)
|
159
|
+
|
160
|
+
assert_equal([expected_body], swapped_body)
|
161
|
+
end
|
162
|
+
|
140
163
|
def test_switch_lang_splitted_body
|
141
164
|
i = Wovnrb::Interceptor.new(get_app)
|
142
165
|
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://page.com'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
@@ -152,6 +175,19 @@ class WovnrbTest < Minitest::Test
|
|
152
175
|
assert_equal([expected_body], swapped_body)
|
153
176
|
end
|
154
177
|
|
178
|
+
def test_switch_lang_of_html_fragment_in_splitted_body
|
179
|
+
i = Wovnrb::Interceptor.new(get_app)
|
180
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://page.com'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
181
|
+
bodies = ['<select name="test"><option value="1">1</option>',
|
182
|
+
'<option value="2">2</option></select>']
|
183
|
+
expected_body = '<select name="test"><option value="1">1</option><option value="2">2</option></select>'
|
184
|
+
values = generate_values
|
185
|
+
url = h.url
|
186
|
+
swapped_body = i.switch_lang(bodies, values, url, 'ja', h)
|
187
|
+
|
188
|
+
assert_equal([expected_body], swapped_body)
|
189
|
+
end
|
190
|
+
|
155
191
|
def test_switch_lang_missing_values
|
156
192
|
i = Wovnrb::Interceptor.new(get_app)
|
157
193
|
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://page.com'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
@@ -169,6 +205,34 @@ class WovnrbTest < Minitest::Test
|
|
169
205
|
assert_equal([expected_body], swapped_body)
|
170
206
|
end
|
171
207
|
|
208
|
+
def test_switch_lang_on_fragment_with_translate_fragment_false
|
209
|
+
Wovnrb::Store.instance.settings['translate_fragment'] = false
|
210
|
+
i = Wovnrb::Interceptor.new(get_app)
|
211
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://page.com'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
212
|
+
body = "<h1>Mr. Belvedere Fan Club</h1>
|
213
|
+
<div><p>Hello</p></div>"
|
214
|
+
values = generate_values
|
215
|
+
url = h.url
|
216
|
+
swapped_body = i.switch_lang([body], values, url, 'ja', h)
|
217
|
+
|
218
|
+
assert_equal([body], swapped_body)
|
219
|
+
end
|
220
|
+
|
221
|
+
def test_switch_lang_on_fragment_with_translate_fragment_true
|
222
|
+
Wovnrb::Store.instance.settings['translate_fragment'] = true
|
223
|
+
i = Wovnrb::Interceptor.new(get_app)
|
224
|
+
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://page.com'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
225
|
+
body = "<h1>Mr. Belvedere Fan Club</h1>
|
226
|
+
<div><p>Hello</p></div>"
|
227
|
+
values = generate_values
|
228
|
+
url = h.url
|
229
|
+
swapped_body = i.switch_lang([body], values, url, 'ja', h)
|
230
|
+
expected_body = "<h1><!--wovn-src:Mr. Belvedere Fan Club-->ベルベデアさんファンクラブ</h1>
|
231
|
+
<div><p><!--wovn-src:Hello-->こんにちは</p></div>"
|
232
|
+
|
233
|
+
assert_equal([expected_body], swapped_body)
|
234
|
+
end
|
235
|
+
|
172
236
|
def test_switch_lang_ignores_amp
|
173
237
|
interceptor = Wovnrb::Interceptor.new(get_app)
|
174
238
|
headers = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://page.com'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
data/test/test_helper.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'simplecov'
|
2
|
+
require 'pry'
|
2
3
|
|
3
4
|
# save to CircleCI's artifacts directory if we're on CircleCI
|
4
5
|
if ENV['CIRCLE_ARTIFACTS']
|
@@ -25,6 +26,7 @@ require 'wovnrb/html_replacers/text_replacer'
|
|
25
26
|
require 'wovnrb/html_replacers/meta_replacer'
|
26
27
|
require 'wovnrb/html_replacers/image_replacer'
|
27
28
|
require 'wovnrb/html_replacers/script_replacer'
|
29
|
+
require 'wovnrb/helpers/nokogumbo_helper'
|
28
30
|
require 'minitest/autorun'
|
29
31
|
|
30
32
|
|
data/wovnrb.gemspec
CHANGED
@@ -47,6 +47,8 @@ Gem::Specification.new do |spec|
|
|
47
47
|
spec.add_development_dependency "pry"
|
48
48
|
spec.add_development_dependency "pry-remote"
|
49
49
|
spec.add_development_dependency "pry-nav"
|
50
|
+
spec.add_development_dependency "pry-byebug"
|
51
|
+
|
50
52
|
#spec.add_development_dependency "rice"
|
51
53
|
spec.add_development_dependency "rake-compiler"
|
52
54
|
spec.add_development_dependency "timecop"
|
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: 1.0.
|
4
|
+
version: 1.0.12
|
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: 2018-09-
|
12
|
+
date: 2018-09-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogumbo
|
@@ -263,6 +263,20 @@ dependencies:
|
|
263
263
|
- - ">="
|
264
264
|
- !ruby/object:Gem::Version
|
265
265
|
version: '0'
|
266
|
+
- !ruby/object:Gem::Dependency
|
267
|
+
name: pry-byebug
|
268
|
+
requirement: !ruby/object:Gem::Requirement
|
269
|
+
requirements:
|
270
|
+
- - ">="
|
271
|
+
- !ruby/object:Gem::Version
|
272
|
+
version: '0'
|
273
|
+
type: :development
|
274
|
+
prerelease: false
|
275
|
+
version_requirements: !ruby/object:Gem::Requirement
|
276
|
+
requirements:
|
277
|
+
- - ">="
|
278
|
+
- !ruby/object:Gem::Version
|
279
|
+
version: '0'
|
266
280
|
- !ruby/object:Gem::Dependency
|
267
281
|
name: rake-compiler
|
268
282
|
requirement: !ruby/object:Gem::Requirement
|
@@ -352,6 +366,7 @@ files:
|
|
352
366
|
- lib/wovnrb.rb
|
353
367
|
- lib/wovnrb/api_data.rb
|
354
368
|
- lib/wovnrb/headers.rb
|
369
|
+
- lib/wovnrb/helpers/nokogumbo_helper.rb
|
355
370
|
- lib/wovnrb/html_replacers/image_replacer.rb
|
356
371
|
- lib/wovnrb/html_replacers/input_replacer.rb
|
357
372
|
- lib/wovnrb/html_replacers/link_replacer.rb
|
@@ -412,7 +427,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
412
427
|
version: '0'
|
413
428
|
requirements: []
|
414
429
|
rubyforge_project:
|
415
|
-
rubygems_version: 2.
|
430
|
+
rubygems_version: 2.2.0
|
416
431
|
signing_key:
|
417
432
|
specification_version: 4
|
418
433
|
summary: Gem for WOVN.io
|