wovnrb 2.6.0 → 3.1.0
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/.circleci/config.yml +21 -10
- data/.rubocop_todo.yml +13 -43
- data/Gemfile +0 -5
- data/README.en.md +24 -0
- data/docker/docker-compose.yml +16 -0
- data/docker/rails/Dockerfile +6 -0
- data/docker/rails/TestSite/.browserslistrc +1 -0
- data/docker/rails/TestSite/.gitignore +63 -0
- data/docker/rails/TestSite/Gemfile +56 -0
- data/docker/rails/TestSite/README.md +24 -0
- data/docker/rails/TestSite/Rakefile +6 -0
- data/docker/rails/TestSite/app/assets/config/manifest.js +2 -0
- data/docker/rails/TestSite/app/assets/images/.keep +0 -0
- data/docker/rails/TestSite/app/assets/stylesheets/application.css +15 -0
- data/docker/rails/TestSite/app/assets/stylesheets/redirects.scss +3 -0
- data/docker/rails/TestSite/app/channels/application_cable/channel.rb +4 -0
- data/docker/rails/TestSite/app/channels/application_cable/connection.rb +4 -0
- data/docker/rails/TestSite/app/controllers/application_controller.rb +2 -0
- data/docker/rails/TestSite/app/controllers/concerns/.keep +0 -0
- data/docker/rails/TestSite/app/controllers/custom_response_controller.rb +16 -0
- data/docker/rails/TestSite/app/controllers/pages_controller.rb +7 -0
- data/docker/rails/TestSite/app/controllers/redirects_controller.rb +5 -0
- data/docker/rails/TestSite/app/helpers/application_helper.rb +2 -0
- data/docker/rails/TestSite/app/helpers/pages_helper.rb +2 -0
- data/docker/rails/TestSite/app/helpers/redirects_helper.rb +2 -0
- data/docker/rails/TestSite/app/javascript/channels/consumer.js +6 -0
- data/docker/rails/TestSite/app/javascript/channels/index.js +5 -0
- data/docker/rails/TestSite/app/javascript/packs/application.js +17 -0
- data/docker/rails/TestSite/app/jobs/application_job.rb +7 -0
- data/docker/rails/TestSite/app/mailers/application_mailer.rb +4 -0
- data/docker/rails/TestSite/app/models/application_record.rb +3 -0
- data/docker/rails/TestSite/app/models/concerns/.keep +0 -0
- data/docker/rails/TestSite/app/views/layouts/application.html.erb +15 -0
- data/docker/rails/TestSite/app/views/layouts/mailer.html.erb +13 -0
- data/docker/rails/TestSite/app/views/layouts/mailer.text.erb +1 -0
- data/docker/rails/TestSite/babel.config.js +72 -0
- data/docker/rails/TestSite/bin/bundle +114 -0
- data/docker/rails/TestSite/bin/rails +4 -0
- data/docker/rails/TestSite/bin/rake +4 -0
- data/docker/rails/TestSite/bin/setup +36 -0
- data/docker/rails/TestSite/bin/webpack +18 -0
- data/docker/rails/TestSite/bin/webpack-dev-server +18 -0
- data/docker/rails/TestSite/bin/yarn +11 -0
- data/docker/rails/TestSite/config/application.rb +26 -0
- data/docker/rails/TestSite/config/boot.rb +4 -0
- data/docker/rails/TestSite/config/cable.yml +10 -0
- data/docker/rails/TestSite/config/credentials.yml.enc +1 -0
- data/docker/rails/TestSite/config/database.yml +25 -0
- data/docker/rails/TestSite/config/environment.rb +5 -0
- data/docker/rails/TestSite/config/environments/development.rb +62 -0
- data/docker/rails/TestSite/config/environments/production.rb +112 -0
- data/docker/rails/TestSite/config/environments/test.rb +49 -0
- data/docker/rails/TestSite/config/initializers/application_controller_renderer.rb +8 -0
- data/docker/rails/TestSite/config/initializers/assets.rb +14 -0
- data/docker/rails/TestSite/config/initializers/backtrace_silencers.rb +7 -0
- data/docker/rails/TestSite/config/initializers/content_security_policy.rb +30 -0
- data/docker/rails/TestSite/config/initializers/cookies_serializer.rb +5 -0
- data/docker/rails/TestSite/config/initializers/filter_parameter_logging.rb +4 -0
- data/docker/rails/TestSite/config/initializers/inflections.rb +16 -0
- data/docker/rails/TestSite/config/initializers/mime_types.rb +4 -0
- data/docker/rails/TestSite/config/initializers/wrap_parameters.rb +14 -0
- data/docker/rails/TestSite/config/locales/en.yml +33 -0
- data/docker/rails/TestSite/config/puma.rb +38 -0
- data/docker/rails/TestSite/config/routes.rb +5 -0
- data/docker/rails/TestSite/config/spring.rb +6 -0
- data/docker/rails/TestSite/config/storage.yml +34 -0
- data/docker/rails/TestSite/config/webpack/development.js +5 -0
- data/docker/rails/TestSite/config/webpack/environment.js +3 -0
- data/docker/rails/TestSite/config/webpack/production.js +5 -0
- data/docker/rails/TestSite/config/webpack/test.js +5 -0
- data/docker/rails/TestSite/config/webpacker.yml +96 -0
- data/docker/rails/TestSite/config.ru +5 -0
- data/docker/rails/TestSite/db/seeds.rb +7 -0
- data/docker/rails/TestSite/lib/assets/.keep +0 -0
- data/docker/rails/TestSite/lib/tasks/.keep +0 -0
- data/docker/rails/TestSite/log/.keep +0 -0
- data/docker/rails/TestSite/package.json +15 -0
- data/docker/rails/TestSite/postcss.config.js +12 -0
- data/docker/rails/TestSite/public/index.html +9 -0
- data/docker/rails/TestSite/public/page.html +13 -0
- data/docker/rails/TestSite/public/pages/files/plaintext_unicode.txt +204 -0
- data/docker/rails/TestSite/public/pages/files/simple_css.css +8 -0
- data/docker/rails/TestSite/public/pages/files/simple_javascript.js +2 -0
- data/docker/rails/TestSite/public/pages/html5test.html +555 -0
- data/docker/rails/TestSite/public/pages/oldhtml.html +335 -0
- data/docker/rails/TestSite/public/pages/xhtml.xhtml +726 -0
- data/docker/rails/TestSite/public/redirection_target.html +10 -0
- data/docker/rails/TestSite/public/testdir/testpage-dir.html +9 -0
- data/docker/rails/TestSite/public/testdir/testpage-redirect-destination.html +9 -0
- data/docker/rails/TestSite/public/testpage.html +9 -0
- data/docker/rails/TestSite/public/wovn_index.html +24 -0
- data/docker/rails/TestSite/start.sh +13 -0
- data/docker/rails/TestSite/storage/.keep +0 -0
- data/docker/rails/TestSite/test/application_system_test_case.rb +5 -0
- data/docker/rails/TestSite/test/channels/application_cable/connection_test.rb +11 -0
- data/docker/rails/TestSite/test/controllers/.keep +0 -0
- data/docker/rails/TestSite/test/controllers/pages_controller_test.rb +7 -0
- data/docker/rails/TestSite/test/controllers/redirects_controller_test.rb +7 -0
- data/docker/rails/TestSite/test/fixtures/.keep +0 -0
- data/docker/rails/TestSite/test/fixtures/files/.keep +0 -0
- data/docker/rails/TestSite/test/helpers/.keep +0 -0
- data/docker/rails/TestSite/test/integration/.keep +0 -0
- data/docker/rails/TestSite/test/mailers/.keep +0 -0
- data/docker/rails/TestSite/test/models/.keep +0 -0
- data/docker/rails/TestSite/test/system/.keep +0 -0
- data/docker/rails/TestSite/test/test_helper.rb +13 -0
- data/docker/rails/TestSite/yarn.lock +7642 -0
- data/lib/wovnrb/api_translator.rb +1 -1
- data/lib/wovnrb/headers.rb +30 -39
- data/lib/wovnrb/helpers/nokogumbo_helper.rb +7 -9
- data/lib/wovnrb/lang.rb +15 -14
- data/lib/wovnrb/railtie.rb +3 -15
- data/lib/wovnrb/services/html_converter.rb +8 -8
- data/lib/wovnrb/store.rb +8 -14
- data/lib/wovnrb/version.rb +1 -1
- data/lib/wovnrb.rb +1 -3
- data/makefile +16 -0
- data/test/lib/api_translator_test.rb +3 -4
- data/test/lib/lang_test.rb +5 -136
- data/test/lib/services/html_converter_test.rb +14 -14
- data/test/lib/store_test.rb +8 -6
- data/test/lib/wovnrb_test.rb +16 -16
- data/wovnrb.gemspec +5 -4
- metadata +117 -16
- data/.travis.yml +0 -14
- data/lib/wovnrb/text_caches/cache_base.rb +0 -53
- data/lib/wovnrb/text_caches/memory_cache.rb +0 -51
- data/test/lib/text_caches/cache_base_test.rb +0 -31
- data/test/lib/text_caches/memory_cache_test.rb +0 -91
data/lib/wovnrb/headers.rb
CHANGED
@@ -1,17 +1,10 @@
|
|
1
1
|
module Wovnrb
|
2
2
|
class Headers
|
3
|
-
attr_reader :unmasked_url
|
4
|
-
attr_reader :url
|
5
|
-
attr_reader :protocol
|
6
|
-
attr_reader :unmasked_host
|
7
|
-
attr_reader :host
|
8
|
-
attr_reader :unmasked_pathname
|
9
|
-
attr_reader :pathname
|
10
|
-
attr_reader :pathname_with_trailing_slash_if_present
|
3
|
+
attr_reader :unmasked_url, :url, :protocol, :unmasked_host, :host, :unmasked_pathname, :pathname, :pathname_with_trailing_slash_if_present
|
11
4
|
|
12
5
|
# Generates new instance of Wovnrb::Headers.
|
13
6
|
# Its parameters are set by parsing env variable.
|
14
|
-
|
7
|
+
|
15
8
|
def initialize(env, settings)
|
16
9
|
request = Rack::Request.new(env)
|
17
10
|
|
@@ -42,21 +35,21 @@ module Wovnrb
|
|
42
35
|
@pathname, @query = @env['REQUEST_URI'].split('?')
|
43
36
|
@pathname = settings['url_pattern'] == 'path' ? remove_lang(@pathname, lang_code) : @pathname
|
44
37
|
@query ||= ''
|
45
|
-
@url = "#{@host}#{@pathname}#{(
|
46
|
-
if
|
38
|
+
@url = "#{@host}#{@pathname}#{(@query.empty? ? '' : '?') + remove_lang(@query, lang_code)}"
|
39
|
+
if settings['query'].empty?
|
40
|
+
@query = ''
|
41
|
+
else
|
47
42
|
query_vals = []
|
48
43
|
settings['query'].each do |qv|
|
49
44
|
rx = Regexp.new("(^|&)(?<query_val>#{qv}[^&]+)(&|$)")
|
50
45
|
m = @query.match(rx)
|
51
46
|
query_vals.push(m[:query_val]) if m && m[:query_val]
|
52
47
|
end
|
53
|
-
@query = if
|
54
|
-
"?#{query_vals.sort.join('&')}"
|
55
|
-
else
|
48
|
+
@query = if query_vals.empty?
|
56
49
|
''
|
50
|
+
else
|
51
|
+
"?#{query_vals.sort.join('&')}"
|
57
52
|
end
|
58
|
-
else
|
59
|
-
@query = ''
|
60
53
|
end
|
61
54
|
@query = remove_lang(@query, lang_code)
|
62
55
|
@pathname_with_trailing_slash_if_present = @pathname
|
@@ -115,11 +108,11 @@ module Wovnrb
|
|
115
108
|
case @settings['url_pattern']
|
116
109
|
when 'query'
|
117
110
|
lang_param_name = @settings['lang_param_name']
|
118
|
-
if location
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
111
|
+
location = if location =~ /\?/
|
112
|
+
"#{location}&#{lang_param_name}=#{lang_code}"
|
113
|
+
else
|
114
|
+
"#{location}?#{lang_param_name}=#{lang_code}"
|
115
|
+
end
|
123
116
|
when 'subdomain'
|
124
117
|
location = "#{lang_code.downcase}.#{location}"
|
125
118
|
# when 'path'
|
@@ -173,7 +166,7 @@ module Wovnrb
|
|
173
166
|
lang_param_name = @settings['lang_param_name']
|
174
167
|
uri.sub(/(^|\?|&)#{lang_param_name}=#{lang_code}(&|$)/, '\1').gsub(/(\?|&)$/, '')
|
175
168
|
when 'subdomain'
|
176
|
-
rp = Regexp.new(
|
169
|
+
rp = Regexp.new("(^|(//))#{lang_code}\\.", 'i')
|
177
170
|
uri.sub(rp, '\1')
|
178
171
|
# when 'path'
|
179
172
|
else
|
@@ -182,24 +175,22 @@ module Wovnrb
|
|
182
175
|
end
|
183
176
|
|
184
177
|
def out(headers)
|
185
|
-
r = Regexp.new(
|
178
|
+
r = Regexp.new("//#{@host}")
|
186
179
|
lang_code = Store.instance.settings['custom_lang_aliases'][self.lang_code] || self.lang_code
|
187
|
-
if lang_code != @settings['default_lang'] && headers.key?('Location') && headers['Location'] =~ r
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
headers['Location'] = headers['Location'].sub(/(\/\/[^\/]+)/, '\1/' + lang_code)
|
202
|
-
end
|
180
|
+
if lang_code != @settings['default_lang'] && headers.key?('Location') && headers['Location'] =~ r && !@settings['ignore_globs'].ignore?(headers['Location'])
|
181
|
+
case @settings['url_pattern']
|
182
|
+
when 'query'
|
183
|
+
headers['Location'] += if headers['Location'] =~ /\?/
|
184
|
+
'&'
|
185
|
+
else
|
186
|
+
'?'
|
187
|
+
end
|
188
|
+
headers['Location'] += "#{@settings['lang_param_name']}=#{lang_code}"
|
189
|
+
when 'subdomain'
|
190
|
+
headers['Location'] = headers['Location'].sub(/\/\/([^.]+)/, "//#{lang_code}.\\1")
|
191
|
+
# when 'path'
|
192
|
+
else
|
193
|
+
headers['Location'] = headers['Location'].sub(/(\/\/[^\/]+)/, "\\1/#{lang_code}")
|
203
194
|
end
|
204
195
|
end
|
205
196
|
headers
|
@@ -2,15 +2,13 @@ module Wovnrb
|
|
2
2
|
module Helpers
|
3
3
|
module NokogumboHelper
|
4
4
|
def parse_html(html_string, encoding = 'UTF-8')
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
dom
|
5
|
+
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
|
14
12
|
end
|
15
13
|
|
16
14
|
# https://www.rubydoc.info/gems/nokogumbo/Nokogiri/HTML5#fragment-class_method
|
data/lib/wovnrb/lang.rb
CHANGED
@@ -146,46 +146,47 @@ module Wovnrb
|
|
146
146
|
if uri.host.downcase === headers.host.downcase
|
147
147
|
case pattern
|
148
148
|
when 'subdomain'
|
149
|
-
sub_d = href.match(/\/\/([
|
149
|
+
sub_d = href.match(/\/\/([^.]*)\./)[1]
|
150
150
|
sub_code = Lang.get_code(sub_d)
|
151
151
|
new_href = if sub_code && sub_code.casecmp(code_to_add).zero?
|
152
152
|
href.sub(Regexp.new(code_to_add, 'i'), code_to_add.downcase)
|
153
153
|
else
|
154
|
-
href.sub(/(\/\/)([
|
154
|
+
href.sub(/(\/\/)([^.]*)/, "\\1#{code_to_add.downcase}.\\2")
|
155
155
|
end
|
156
156
|
when 'query'
|
157
157
|
new_href = add_query_lang_code(href, code_to_add, lang_param_name)
|
158
158
|
else # path
|
159
|
-
new_href = href.sub(/([
|
159
|
+
new_href = href.sub(/([^.]*\.[^\/]*)(\/|$)/, "\\1/#{code_to_add}/")
|
160
160
|
end
|
161
161
|
end
|
162
162
|
elsif href
|
163
163
|
case pattern
|
164
164
|
when 'subdomain'
|
165
|
-
lang_url = headers.protocol
|
166
|
-
current_dir = headers.pathname.sub(/[^\/]*\.[
|
167
|
-
new_href =
|
165
|
+
lang_url = "#{headers.protocol}://#{code_to_add.downcase}.#{headers.host}"
|
166
|
+
current_dir = headers.pathname.sub(/[^\/]*\.[^.]{2,6}$/, '')
|
167
|
+
new_href = case href
|
168
|
+
when /^\.\..*$/
|
168
169
|
# ../path
|
169
|
-
lang_url
|
170
|
-
|
170
|
+
"#{lang_url}/#{href.gsub(/^\.\.\//, '')}"
|
171
|
+
when /^\..*$/
|
171
172
|
# ./path
|
172
|
-
lang_url
|
173
|
-
|
173
|
+
"#{lang_url}#{current_dir}/#{href.gsub(/^\.\//, '')}"
|
174
|
+
when /^\/.*$/
|
174
175
|
# /path
|
175
176
|
lang_url + href
|
176
177
|
else
|
177
178
|
# path
|
178
|
-
lang_url
|
179
|
+
"#{lang_url}#{current_dir}/#{href}"
|
179
180
|
end
|
180
181
|
when 'query'
|
181
182
|
new_href = add_query_lang_code(href, code_to_add, lang_param_name)
|
182
183
|
else # path
|
183
184
|
if href =~ /^\//
|
184
|
-
new_href =
|
185
|
+
new_href = "/#{code_to_add}#{href}"
|
185
186
|
else
|
186
|
-
current_dir = headers.pathname.sub(/[^\/]*\.[
|
187
|
+
current_dir = headers.pathname.sub(/[^\/]*\.[^.]{2,6}$/, '')
|
187
188
|
current_dir = '/' if current_dir == ''
|
188
|
-
new_href =
|
189
|
+
new_href = "/#{code_to_add}#{current_dir}#{href}"
|
189
190
|
end
|
190
191
|
end
|
191
192
|
end
|
data/lib/wovnrb/railtie.rb
CHANGED
@@ -1,21 +1,9 @@
|
|
1
1
|
module Wovnrb
|
2
|
-
def self.middleware_inserted?(app, middleware)
|
3
|
-
app.middleware.send(:operations).each do |_, middlewares, _|
|
4
|
-
return true if middlewares&.include?(middleware)
|
5
|
-
end
|
6
|
-
|
7
|
-
false
|
8
|
-
end
|
9
|
-
|
10
2
|
class Railtie < Rails::Railtie
|
11
3
|
initializer 'wovnrb.configure_rails_initialization' do |app|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
else
|
16
|
-
app.middleware.insert_before(0, Wovnrb::Interceptor)
|
17
|
-
end
|
18
|
-
end
|
4
|
+
install_middleware = Rails.configuration.wovnrb.fetch(:install_middleware, true)
|
5
|
+
|
6
|
+
app.middleware.insert_before(0, Wovnrb::Interceptor) if install_middleware
|
19
7
|
end
|
20
8
|
end
|
21
9
|
end
|
@@ -41,7 +41,7 @@ module Wovnrb
|
|
41
41
|
|
42
42
|
@dom.traverse { |node| transform_node(node, marker) }
|
43
43
|
|
44
|
-
insert_snippet(true)
|
44
|
+
insert_snippet(adds_backend_error_mark: true)
|
45
45
|
insert_hreflang_tags
|
46
46
|
inject_lang_html_tag
|
47
47
|
|
@@ -79,7 +79,7 @@ module Wovnrb
|
|
79
79
|
return unless classes.present?
|
80
80
|
|
81
81
|
ignored_classes = @store.settings['ignore_class']
|
82
|
-
should_be_ignored = (ignored_classes & classes.split
|
82
|
+
should_be_ignored = (ignored_classes & classes.split).present?
|
83
83
|
|
84
84
|
put_replace_marker(node, marker) if should_be_ignored
|
85
85
|
end
|
@@ -147,25 +147,25 @@ module Wovnrb
|
|
147
147
|
end
|
148
148
|
|
149
149
|
def widget_urls
|
150
|
-
[@store.settings['api_url']
|
150
|
+
["#{@store.settings['api_url']}/widget", 'j.wovn.io', 'j.dev-wovn.io:3000']
|
151
151
|
end
|
152
152
|
|
153
|
-
def insert_snippet(adds_backend_error_mark
|
153
|
+
def insert_snippet(adds_backend_error_mark: true)
|
154
154
|
parent_node = @dom.at_css('head') || @dom.at_css('body') || @dom.at_css('html')
|
155
155
|
return unless parent_node
|
156
156
|
|
157
157
|
insert_node = Nokogiri::XML::Node.new('script', @dom)
|
158
|
-
insert_node['src'] =
|
158
|
+
insert_node['src'] = @store.widget_url
|
159
159
|
insert_node['async'] = true
|
160
160
|
insert_node['data-wovnio'] = data_wovnio
|
161
161
|
insert_node['data-wovnio-type'] = 'fallback_snippet' if adds_backend_error_mark
|
162
162
|
# do this so that there will be a closing tag (better compatibility with browsers)
|
163
163
|
insert_node.content = ''
|
164
164
|
|
165
|
-
if
|
166
|
-
parent_node.children.first.add_previous_sibling(insert_node)
|
167
|
-
else
|
165
|
+
if parent_node.children.empty?
|
168
166
|
parent_node.add_child(insert_node)
|
167
|
+
else
|
168
|
+
parent_node.children.first.add_previous_sibling(insert_node)
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
data/lib/wovnrb/store.rb
CHANGED
@@ -34,6 +34,7 @@ module Wovnrb
|
|
34
34
|
'use_proxy' => false, # use env['HTTP_X_FORWARDED_HOST'] instead of env['HTTP_HOST'] and env['SERVER_NAME'] when this setting is true.
|
35
35
|
'custom_lang_aliases' => {},
|
36
36
|
'translate_fragment' => true,
|
37
|
+
'widget_url' => 'https://j.wovn.io/1',
|
37
38
|
'wovn_dev_mode' => false
|
38
39
|
)
|
39
40
|
end
|
@@ -141,19 +142,16 @@ module Wovnrb
|
|
141
142
|
end
|
142
143
|
@settings.delete('user_token')
|
143
144
|
|
144
|
-
|
145
|
+
case @settings['url_pattern']
|
146
|
+
when 'path'
|
145
147
|
@settings['url_pattern_reg'] = "/(?<lang>[^/.?]+)"
|
146
|
-
|
148
|
+
when 'query'
|
147
149
|
@settings['url_pattern_reg'] = "((\\?.*&)|\\?)#{@settings['lang_param_name']}=(?<lang>[^&]+)(&|$)"
|
148
|
-
|
150
|
+
when 'subdomain'
|
149
151
|
@settings['url_pattern_reg'] = "^(?<lang>[^.]+)\."
|
150
152
|
end
|
151
153
|
|
152
|
-
@settings['test_mode'] =
|
153
|
-
false
|
154
|
-
else
|
155
|
-
true
|
156
|
-
end
|
154
|
+
@settings['test_mode'] = !(@settings['test_mode'] != true || @settings['test_mode'] != 'on')
|
157
155
|
|
158
156
|
if @settings['wovn_dev_mode']
|
159
157
|
if @settings['api_url'] == self.class.default_settings['api_url']
|
@@ -183,12 +181,8 @@ module Wovnrb
|
|
183
181
|
@settings['supported_langs'] || []
|
184
182
|
end
|
185
183
|
|
186
|
-
def
|
187
|
-
|
188
|
-
'dev-wovn.io'
|
189
|
-
else
|
190
|
-
'wovn.io'
|
191
|
-
end
|
184
|
+
def widget_url
|
185
|
+
@settings['widget_url'] || 'https://j.wovn.io/1'
|
192
186
|
end
|
193
187
|
|
194
188
|
def dev_mode?
|
data/lib/wovnrb/version.rb
CHANGED
data/lib/wovnrb.rb
CHANGED
@@ -9,7 +9,6 @@ require 'nokogumbo'
|
|
9
9
|
require 'active_support'
|
10
10
|
require 'json'
|
11
11
|
require 'wovnrb/helpers/nokogumbo_helper'
|
12
|
-
require 'wovnrb/text_caches/cache_base'
|
13
12
|
require 'wovnrb/railtie' if defined?(Rails)
|
14
13
|
require 'wovnrb/version'
|
15
14
|
|
@@ -18,9 +17,8 @@ module Wovnrb
|
|
18
17
|
def initialize(app, opts = {})
|
19
18
|
@app = app
|
20
19
|
@store = Store.instance
|
21
|
-
opts = opts.
|
20
|
+
opts = opts.transform_keys(&:to_s)
|
22
21
|
@store.update_settings(opts)
|
23
|
-
CacheBase.set_single(@store.settings)
|
24
22
|
end
|
25
23
|
|
26
24
|
def call(env)
|
data/makefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
DOCKER_COMPOSE_YML = docker/docker-compose.yml
|
2
|
+
|
3
|
+
.PHONY: build stop start clean
|
4
|
+
|
5
|
+
build:
|
6
|
+
docker-compose -f $(DOCKER_COMPOSE_YML) build
|
7
|
+
|
8
|
+
stop:
|
9
|
+
docker-compose -f $(DOCKER_COMPOSE_YML) rm -sf
|
10
|
+
|
11
|
+
start:
|
12
|
+
docker-compose -f $(DOCKER_COMPOSE_YML) up
|
13
|
+
|
14
|
+
clean:
|
15
|
+
docker-compose -f $(DOCKER_COMPOSE_YML) down --rmi all --volumes
|
16
|
+
|
@@ -85,11 +85,10 @@ module Wovnrb
|
|
85
85
|
compress(stub_response_json)
|
86
86
|
end
|
87
87
|
response_headers = { 'Content-Encoding' => response[:encoding] || 'gzip' }
|
88
|
-
|
89
|
-
|
90
|
-
|
88
|
+
stub_request(:post, api_url)
|
89
|
+
.with(body: compressed_data, headers: headers)
|
90
|
+
.to_return(status: response[:status_code] || 200, body: stub_response, headers: response_headers)
|
91
91
|
|
92
|
-
stub
|
93
92
|
end
|
94
93
|
end
|
95
94
|
|
data/test/lib/lang_test.rb
CHANGED
@@ -21,9 +21,10 @@ module Wovnrb
|
|
21
21
|
|
22
22
|
def test_iso_639_1_normalization
|
23
23
|
Wovnrb::Lang::LANG.each do |_, l|
|
24
|
-
|
24
|
+
case l[:code]
|
25
|
+
when 'zh-CHS'
|
25
26
|
assert_equal('zh-Hans', Lang.iso_639_1_normalization('zh-CHS'))
|
26
|
-
|
27
|
+
when 'zh-CHT'
|
27
28
|
assert_equal('zh-Hant', Lang.iso_639_1_normalization('zh-CHT'))
|
28
29
|
else
|
29
30
|
assert_equal(l[:code], Lang.iso_639_1_normalization(l[:code]))
|
@@ -89,7 +90,7 @@ module Wovnrb
|
|
89
90
|
assert_equal('http://zh-cht.wovn.io/topics/31', lang.add_lang_code('http://wovn.io/topics/31', 'subdomain', h))
|
90
91
|
end
|
91
92
|
|
92
|
-
def
|
93
|
+
def test_add_lang_code_trad_chinese2
|
93
94
|
lang = Lang.new('zh-cht')
|
94
95
|
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://zh-cht.wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
95
96
|
assert_equal('http://zh-cht.wovn.io/topics/31', lang.add_lang_code('/topics/31', 'subdomain', h))
|
@@ -107,7 +108,7 @@ module Wovnrb
|
|
107
108
|
assert_equal('//zh-cht.google.com', lang.add_lang_code('//google.com', 'subdomain', h))
|
108
109
|
end
|
109
110
|
|
110
|
-
def
|
111
|
+
def test_add_lang_code_no_protocol2
|
111
112
|
lang = Lang.new('zh-cht')
|
112
113
|
h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'https://zh-cht.wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
|
113
114
|
assert_equal('//google.com', lang.add_lang_code('//google.com', 'subdomain', h))
|
@@ -311,138 +312,6 @@ module Wovnrb
|
|
311
312
|
assert_equal('/fr/index.html', lang.add_lang_code('index.html', 'path', headers))
|
312
313
|
end
|
313
314
|
|
314
|
-
def generate_body(param = '')
|
315
|
-
body = case param
|
316
|
-
when 'ignore_parent'
|
317
|
-
"<html><body><h1>Mr. Belvedere Fan Club</h1>
|
318
|
-
<div wovn-ignore><p>Hello</p></div>
|
319
|
-
</body></html>"
|
320
|
-
when 'ignore_everything'
|
321
|
-
"<html><body wovn-ignore><h1>Mr. Belvedere Fan Club</h1>
|
322
|
-
<div><p>Hello</p></div>
|
323
|
-
</body></html>"
|
324
|
-
when 'ignore_parent_translated_in_japanese'
|
325
|
-
"<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1><!--wovn-src:Mr. Belvedere Fan Club-->ベルベデアさんファンクラブ</h1>
|
326
|
-
<div wovn-ignore=\"\"><p>Hello</p></div>
|
327
|
-
</body></html>
|
328
|
-
"
|
329
|
-
when 'translated_in_japanese'
|
330
|
-
"<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://page.com/\"></head><body><h1><!--wovn-src:Mr. Belvedere Fan Club-->ベルベデアさんファンクラブ</h1>
|
331
|
-
<div><p><!--wovn-src:Hello-->こんにちは</p></div>
|
332
|
-
</body></html>
|
333
|
-
"
|
334
|
-
when 'ignore_everything_translated'
|
335
|
-
"<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body wovn-ignore=\"\"><h1>Mr. Belvedere Fan Club</h1>
|
336
|
-
<div><p>Hello</p></div>
|
337
|
-
</body></html>
|
338
|
-
"
|
339
|
-
when 'empty'
|
340
|
-
'<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore><p>Hello</p></div></body></html>'
|
341
|
-
when 'empty_single_quote'
|
342
|
-
"<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=''><p>Hello</p></div></body></html>"
|
343
|
-
when 'empty_double_quote'
|
344
|
-
'<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=''><p>Hello</p></div></body></html>'
|
345
|
-
when 'value_single_quote'
|
346
|
-
"<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore='value'><p>Hello</p></div></body></html>"
|
347
|
-
when 'value_double_quote'
|
348
|
-
'<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore="value"><p>Hello</p></div></body></html>'
|
349
|
-
when 'empty_translated'
|
350
|
-
"<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"\"><p>Hello</p></div></body></html>\n"
|
351
|
-
when 'empty_single_quote_translated'
|
352
|
-
"<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"\"><p>Hello</p></div></body></html>\n"
|
353
|
-
when 'empty_double_quote_translated'
|
354
|
-
"<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"\"><p>Hello</p></div></body></html>\n"
|
355
|
-
when 'value_single_quote_translated'
|
356
|
-
"<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"value\"><p>Hello</p></div></body></html>\n"
|
357
|
-
when 'value_double_quote_translated'
|
358
|
-
"<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"value\"><p>Hello</p></div></body></html>\n"
|
359
|
-
when 'meta_img_alt_tags_translated'
|
360
|
-
"<html lang=\"ja\"><head><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta name=\"description\" content=\"こんにちは\">\n<meta name=\"title\" content=\"こんにちは\">\n<meta property=\"og:title\" content=\"こんにちは\">\n<meta property=\"og:description\" content=\"こんにちは\">\n<meta property=\"twitter:title\" content=\"こんにちは\">\n<meta property=\"twitter:description\" content=\"こんにちは\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://page.com/\"></head>\n<body><h1><!--wovn-src:Mr. Belvedere Fan Club-->ベルベデアさんファンクラブ</h1>\n<div><p><!--wovn-src:Hello-->こんにちは</p></div>\n<!--wovn-src:Hello--><img src=\"http://example.com/photo.png\" alt=\"こんにちは\">\n</body></html>\n"
|
361
|
-
when 'meta_img_alt_tags'
|
362
|
-
"<html><head><meta name =\"description\" content=\"Hello\">\n<meta name=\"title\" content=\"Hello\">\n<meta property=\"og:title\" content=\"Hello\">\n<meta property=\"og:description\" content=\"Hello\">\n<meta property=\"twitter:title\" content=\"Hello\">\n<meta property=\"twitter:description\" content=\"Hello\"></head>
|
363
|
-
<body><h1>Mr. Belvedere Fan Club</h1>
|
364
|
-
<div><p>Hello</p></div>
|
365
|
-
<img src=\"http://example.com/photo.png\" alt=\"Hello\">
|
366
|
-
</body></html>"
|
367
|
-
when 'a_href_javascript'
|
368
|
-
"<html><body><h1>Mr. Belvedere Fan Club</h1>
|
369
|
-
<div><p><a href=\"javascript:void(0)\">Hello</a></p></div>
|
370
|
-
</body></html>"
|
371
|
-
when 'a_href_javascript_translated'
|
372
|
-
"<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://page.com/\"></head><body><h1><!--wovn-src:Mr. Belvedere Fan Club-->ベルベデアさんファンクラブ</h1>
|
373
|
-
<div><p><a href=\"javascript:void(0)\"><!--wovn-src:Hello-->こんにちは</a></p></div>
|
374
|
-
</body></html>
|
375
|
-
"
|
376
|
-
when 'unified_values'
|
377
|
-
<<-HTML
|
378
|
-
<html><body>
|
379
|
-
<div>
|
380
|
-
a <span>b</span> c
|
381
|
-
</div>
|
382
|
-
<div>
|
383
|
-
a<span>b</span>
|
384
|
-
</div>
|
385
|
-
<div>
|
386
|
-
<span> b </span>c
|
387
|
-
</div>
|
388
|
-
</body></html>
|
389
|
-
HTML
|
390
|
-
|
391
|
-
when 'unified_values_ja'
|
392
|
-
<<-HTML
|
393
|
-
<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&backend=true&currentLang=ja&defaultLang=en&urlPattern=path&langCodeAliases={}&version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"en\" href=\"http://page.com/\"></head><body>
|
394
|
-
<div><!--wovn-src:
|
395
|
-
a -->\u3042<span><!--wovn-src:b-->\u3044</span><!--wovn-src: c
|
396
|
-
-->\u3046</div>
|
397
|
-
<div><!--wovn-src:
|
398
|
-
a-->\u200B<span><!--wovn-src:b-->\u3044</span><!--wovn-src:-->\u3046
|
399
|
-
</div>
|
400
|
-
<div>
|
401
|
-
<!--wovn-src:-->\u3042<span><!--wovn-src: b -->\u3044</span><!--wovn-src:c
|
402
|
-
-->\u200B</div>
|
403
|
-
|
404
|
-
</body></html>
|
405
|
-
HTML
|
406
|
-
|
407
|
-
else # "" case
|
408
|
-
"<html><body><h1>Mr. Belvedere Fan Club</h1>
|
409
|
-
<div><p>Hello</p></div>
|
410
|
-
</body></html>"
|
411
|
-
end
|
412
|
-
|
413
|
-
body
|
414
|
-
end
|
415
|
-
|
416
|
-
def generate_dom(param = '')
|
417
|
-
Wovnrb.to_dom(generate_body(param))
|
418
|
-
end
|
419
|
-
|
420
|
-
def generate_values
|
421
|
-
values = {}
|
422
|
-
values['text_vals'] = {
|
423
|
-
'Hello' => { 'ja' => [{ 'data' => 'こんにちは' }] },
|
424
|
-
'Mr. Belvedere Fan Club' => { 'ja' => [{ 'data' => 'ベルベデアさんファンクラブ' }] }
|
425
|
-
}
|
426
|
-
values
|
427
|
-
end
|
428
|
-
|
429
|
-
def generate_unified_values
|
430
|
-
{
|
431
|
-
'html_text_vals' => {
|
432
|
-
'a<span>b</span>c' =>
|
433
|
-
{ 'ja' =>
|
434
|
-
[{ 'data' => 'あ<span>い</span>う' }] },
|
435
|
-
'a<span>b</span>' =>
|
436
|
-
{ 'ja' =>
|
437
|
-
[{ 'data' => '<span>い</span>う' }] },
|
438
|
-
'<span>b</span>c' =>
|
439
|
-
{ 'ja' =>
|
440
|
-
[{ 'data' => 'あ<span>い</span>' }] }
|
441
|
-
|
442
|
-
}
|
443
|
-
}
|
444
|
-
end
|
445
|
-
|
446
315
|
def test_get_code_from_custom_lang
|
447
316
|
store = Store.instance
|
448
317
|
store.settings['custom_lang_aliases'] = { 'ja' => 'staging-ja' }
|