wovnrb 1.0.11 → 1.0.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 274e9d1ea5626374cca8b50cca8f5d30af8a620d
4
- data.tar.gz: 15b157e5a422abdb7d57c12f01c353669119177a
3
+ metadata.gz: 1e29488764fb88eeb19e1eff45f80d0ee7bc9e9f
4
+ data.tar.gz: 7cf695b56bd2808316afb21cca7149a1c671c453
5
5
  SHA512:
6
- metadata.gz: 7c26c9d1fbebf7e377bdb1a5b120746e7bcd2ff14375f19b60254fb7a369d222949e86f36573b291c804c209803c1d03b745ffbb93886fedf9244138afe121ab
7
- data.tar.gz: 721a90f4191ea051d0b5c31263db0802f1640dadeaf9ac284f7bc4b6c35ece7047d13c52babcea5e5ffa60e204d237f82834360639b662f6fead5f3bdc551ca5
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 | Required | Default Setting
70
- -------------- | -------- | ----------------
71
- project_token | yes | ''
72
- url_pattern | yes | 'path'
73
- query | | []
74
- default_lang | yes | 'en'
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 )
@@ -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
@@ -10,7 +10,7 @@ module Wovnrb
10
10
  end
11
11
 
12
12
  def replace(dom, lang)
13
- dom.xpath('//img').each do |node|
13
+ dom.xpath('.//img').each do |node|
14
14
  next if wovn_ignore?(node)
15
15
 
16
16
  # use regular expressions to support case insensitivity (right?)
@@ -6,7 +6,7 @@ module Wovnrb
6
6
  end
7
7
 
8
8
  def replace(dom, lang)
9
- dom.xpath('//input').each do |node|
9
+ dom.xpath('.//input').each do |node|
10
10
  next if wovn_ignore?(node)
11
11
 
12
12
  set_attribute('value', node, lang) if replaceable_value? node
@@ -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
- new_href = lang.add_lang_code(href, @pattern, @headers)
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('//meta').select { |node|
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|
@@ -12,7 +12,7 @@ module Wovnrb
12
12
  def wovn_ignore?(node)
13
13
  if !node.get_attribute('wovn-ignore').nil?
14
14
  return true
15
- elsif node.name === 'html'
15
+ elsif node.name === 'html' || node.parent.nil?
16
16
  return false
17
17
  end
18
18
 
@@ -6,7 +6,7 @@ module Wovnrb
6
6
  end
7
7
 
8
8
  def replace(dom, lang)
9
- dom.xpath('//text()').each do |node|
9
+ dom.xpath('.//text()').each do |node|
10
10
  next if wovn_ignore?(node)
11
11
 
12
12
  node_text = node.content.strip
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
- # INSERT LANGUAGE METALINKS
163
- parent_node = dom.at_css('head') || dom.at_css('body') || dom.at_css('html')
164
- published_langs = get_langs(values)
165
- all_langs = published_langs.add(store.settings['default_lang'])
166
- all_langs.each do |l|
167
- insert_node = Nokogiri::XML::Node.new('link', dom)
168
- insert_node['rel'] = 'alternate'
169
- insert_node['hreflang'] = Lang::iso_639_1_normalization(l)
170
- insert_node['href'] = headers.redirect_location(l)
171
- parent_node.add_child(insert_node)
172
- end
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
- # set lang property on HTML tag
175
- if dom.at_css('html') || dom.at_css('HTML')
176
- (dom.at_css('html') || dom.at_css('HTML')).set_attribute('lang', Lang::iso_639_1_normalization(@lang_code))
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
 
@@ -1,3 +1,3 @@
1
1
  module Wovnrb
2
- VERSION = "1.0.11"
2
+ VERSION = "1.0.12"
3
3
  end
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
- d = Nokogiri::HTML5(b_without_noscripts)
103
- d.encoding = "UTF-8"
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 have_data?(values)
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://favy.tips/hello/index.html"></head><body>hello</body></html>')
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://favy.tips/en/hello/index.html', canonical_href)
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://favy.tips/hello/index.css"></head><body>hello</body></html>')
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://favy.tips/hello/index.css', href, 'Should not change the href')
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://favy.tips/index.jpg">link text</a>')
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://favy.tips/index.jpg', link)
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://favy.tips/index.jpg?test=1">link text</a>')
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://favy.tips/index.jpg?test=1', link)
144
+ assert_equal('http://wovn.io/index.jpg?test=1', link)
145
145
 
146
- dom = Wovnrb.get_dom('<a href="http://favy.tips/index.jpg#test=1">link text</a>')
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://favy.tips/index.jpg#test=1', link)
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 get_header
260
- h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://favy.tips'), Wovnrb.get_settings('url_pattern' => 'query', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
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
@@ -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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
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.favy.tips/topics/44'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
104
- assert_equal("http://fr.favy.tips/topics/50", lang.add_lang_code("/topics/50", 'subdomain', h))
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.favy.tips/topics/44'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
110
- assert_equal("http://fr.favy.tips/topics/44/topics/50", lang.add_lang_code("./topics/50", 'subdomain', h))
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.favy.tips/topics/44'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
116
- assert_equal("http://fr.favy.tips/topics/50", lang.add_lang_code("../topics/50", 'subdomain', h))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
122
- assert_equal("http://zh-cht.favy.tips/topics/31", lang.add_lang_code("http://favy.tips/topics/31", 'subdomain', h))
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.favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
128
- assert_equal("http://zh-cht.favy.tips/topics/31", lang.add_lang_code("/topics/31", 'subdomain', h))
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.favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
134
- assert_equal("http://zh-cht.favy.tips/topics/31", lang.add_lang_code("http://zh-cht.favy.tips/topics/31", 'subdomain', h))
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.favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
152
- assert_equal("http://www.facebook.com/sharer.php?u=http://favy.tips/topics/50&amp;amp;t=Gourmet Tofu World: Vegetarian-Friendly Japanese Food is Here!", lang.add_lang_code("http://www.facebook.com/sharer.php?u=http://favy.tips/topics/50&amp;amp;t=Gourmet Tofu World: Vegetarian-Friendly Japanese Food is Here!", 'subdomain', h))
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;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;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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
158
- assert_equal("http://zh-cht.favy.tips/topics/31", lang.add_lang_code("/topics/31", 'subdomain', h))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
164
- assert_equal("http://zh-cht.favy.tips/topics/31", lang.add_lang_code("topics/31", 'subdomain', h))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
170
- assert_equal("http://zh-cht.favy.tips/topics/31.html", lang.add_lang_code("topics/31.html", 'subdomain', h))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
176
- assert_equal("http://zh-cht.favy.tips/topics/31.html", lang.add_lang_code("/topics/31.html", 'subdomain', h))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
194
- assert_equal("http://zh-cht.favy.tips/topics/31", lang.add_lang_code("../topics/31", 'subdomain', h))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
200
- assert_equal("http://zh-cht.favy.tips/topics/31", lang.add_lang_code("./topics/31", 'subdomain', h))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
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://favy.tips'), Wovnrb.get_settings)
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://favy.tips'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
569
- assert_equal("http://staging-fr.favy.tips/topics/50", lang.add_lang_code("/topics/50", 'subdomain', h))
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
@@ -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.11
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-14 00:00:00.000000000 Z
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.6.11
430
+ rubygems_version: 2.2.0
416
431
  signing_key:
417
432
  specification_version: 4
418
433
  summary: Gem for WOVN.io