wovnrb 0.1.35 → 0.1.36

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 700600d132d315519350a61fd20a57c7e0181050
4
- data.tar.gz: 5fc85d3db8886950aa4a9ad139d6e00ee0b1f659
3
+ metadata.gz: eb6a923f625d953649b1de0242b1f477947d58c7
4
+ data.tar.gz: 1e75041212f5da667742dde22913779a125b042c
5
5
  SHA512:
6
- metadata.gz: 2e0cf2c5ccf9f1e73d2d4cd59f13c0655c031f6ef425c7257bce762190bd0cb5a44cb91e314d27fad0101891c9620e8768186967f5b6fa60a063e193036f7c40
7
- data.tar.gz: b74aa7c268d8fabba4bb66f069d8f195033f84fad0f41dcda710cacfd63fd94b6af32ecb05453171e8f79dacf3554193bff410937153a8e1f1e819d21c13e059
6
+ metadata.gz: cae95611865c9f2b5e8aaa856c5644b36e6204bd5a4cdf2ab7063764c25f0739160372b3175cc66249f46f5a3a75f7f790b7a142ee6086bc4bd8d350f490c33d
7
+ data.tar.gz: 61eea27872c4b496d83a45cafc6edbeb6291f1711deba5798a83baf1bf7bae6852682ad949e5a189f97895e8055a3dd3d31cc12697c1eca5e4d65b9ce90b332c
data/lib/wovnrb.rb CHANGED
@@ -17,40 +17,30 @@ module Wovnrb
17
17
  end
18
18
 
19
19
  def call(env)
20
- #Rails.logger.error("++++++++++++++++++++++++++ENV++++++++++++++++++++++++")
21
- #Rails.logger.error(env)
22
- #Rails.logger.error("++++++++++++++++++++++++++ENV++++++++++++++++++++++++")
20
+ unless STORE.valid_settings?
21
+ return @app.call(env)
22
+ end
23
23
  @env = env
24
- STORE.refresh_settings
25
24
  headers = Headers.new(env, STORE.settings)
26
25
  # redirect if the path is set to the default language (for SEO purposes)
27
26
  if (headers.path_lang == STORE.settings['default_lang'])
28
27
  redirect_headers = headers.redirect(STORE.settings['default_lang'])
29
28
  return [307, redirect_headers, ['']]
30
29
  end
31
- #if ((headers.path_lang != '' && !STORE.settings['supported_langs'].include?(headers.path_lang)) || headers.path_lang == STORE.settings['default_lang'])
32
- # redirect_headers = headers.redirect(STORE.settings['default_lang'])
33
- # redirect_headers['set-cookie'] = "wovn_selected_lang=#{STORE.settings['default_lang']};"
34
- # return [307, redirect_headers, ['']]
35
- #elsif headers.path_lang == '' && (headers.browser_lang != STORE.settings['default_lang'] && STORE.settings['supported_langs'].include?(headers.browser_lang))
36
- # redirect_headers = headers.redirect(headers.browser_lang)
37
- # return [307, redirect_headers, ['']]
38
- #end
39
30
  lang = headers.lang
40
31
 
41
32
  # pass to application
42
33
  status, res_headers, body = @app.call(headers.request_out)
43
- #binding.pry if res_headers["Content-Type"] =~ /html/ && !body[0].nil?
44
34
 
45
35
  if res_headers["Content-Type"] =~ /html/ && !body[0].nil?
46
- # Can we make this request beforehand?
36
+
47
37
  values = STORE.get_values(headers.redis_url)
48
38
  url = {
49
39
  :protocol => headers.protocol,
50
40
  :host => headers.host,
51
41
  :pathname => headers.pathname
52
42
  }
53
- body = switch_lang(body, values, url, lang) unless status.to_s =~ /^1|302/
43
+ body = switch_lang(body, values, url, lang, headers) unless status.to_s =~ /^1|302/
54
44
 
55
45
  content_length = 0
56
46
  body.each { |b| content_length += b.respond_to?(:bytesize) ? b.bytesize : 0 }
@@ -60,15 +50,12 @@ module Wovnrb
60
50
  end
61
51
 
62
52
  headers.out(res_headers)
63
- # res_headers['Content-Length'] = body.each {|b| break b.length.to_s }
64
- #binding.pry if res_headers["Content-Type"] =~ /html/ && !body[0].nil?
65
53
  [status, res_headers, body]
66
54
  #[status, res_headers, d.transform()]
67
55
  end
68
56
 
69
57
 
70
- def switch_lang(body, values, url, lang=STORE.settings['default_lang'])
71
- def_lang = 'en'
58
+ def switch_lang(body, values, url, lang=STORE.settings['default_lang'], headers)
72
59
  text_index = values['text_vals'] || {}
73
60
  src_index = values['img_vals'] || {}
74
61
  img_src_prefix = values['img_src_prefix'] || ''
@@ -76,6 +63,7 @@ module Wovnrb
76
63
  body.map! do |b|
77
64
  d = Nokogiri::HTML5(b)
78
65
  d.encoding = "UTF-8"
66
+ # swap text
79
67
  d.xpath('//text()').each do |node|
80
68
  node_text = node.content.strip
81
69
  # shouldn't need size check, but for now...
@@ -83,6 +71,17 @@ module Wovnrb
83
71
  node.content = node.content.gsub(/^(\s*)[\S\s]*(\s*)$/, '\1' + text_index[node_text][lang][0]['data'] + '\2')
84
72
  end
85
73
  end
74
+ # swap meta tag values
75
+ d.xpath('//meta').select{ |t|
76
+ (t.get_attribute('name') || t.get_attribute('property') || '') =~ /^(description|keywords|og:title|og:description)$/
77
+ }.each do |node|
78
+ node_content = node.get_attribute('content').strip
79
+ # shouldn't need size check, but for now...
80
+ if text_index[node_content] && text_index[node_content][lang] && text_index[node_content][lang].size > 0
81
+ node.set_attribute('content', node_content.gsub(/^(\s*)[\S\s]*(\s*)$/, '\1' + text_index[node_content][lang][0]['data'] + '\2'))
82
+ end
83
+ end
84
+ # swap img srcs
86
85
  d.xpath('//img').each do |node|
87
86
  # use regular expressions to support case insensitivity (right?)
88
87
  if node.to_html =~ /src=['"][^'"]*['"]/i
@@ -105,41 +104,62 @@ module Wovnrb
105
104
  end
106
105
  end
107
106
  end
108
- # INSERTS
109
- #insert_node = Nokogiri::XML::Node.new('script', d)
110
- #insert_node['type'] = 'text/javascript'
111
- #insert_node.content = "window.wovn_backend = function() { return {'currentLang': '#{lang}'}; };"
112
- #parent_node = d.at_css('head') || d.at_css('body') || d.at_css('html')
113
- #parent_node.add_child(insert_node)
114
-
115
- # If dev can't be used on production gem
107
+
108
+ # REMOVE WIDGET
116
109
  d.xpath('//script').each do |script_node|
117
110
  if script_node['src'] && script_node['src'].include?('//j.wovn.io/')
118
111
  script_node.remove
119
112
  end
120
113
  end
114
+
115
+ # PARENT NODE FOR INSERTS
116
+ parent_node = d.at_css('head') || d.at_css('body') || d.at_css('html')
117
+
118
+ # INSERT BACKEND WIDGET
121
119
  insert_node = Nokogiri::XML::Node.new('script', d)
122
120
  insert_node['src'] = '//j.wovn.io/0'
123
- insert_node['data-wovnio'] = "key=#{STORE.settings['user_token']}&backend=true&currentLang=#{lang}&defaultLang=#{STORE.settings['default_lang']}&urlPattern=#{STORE.settings['url_pattern_name']}"
121
+ insert_node['data-wovnio'] = "key=#{STORE.settings['user_token']}&backend=true&currentLang=#{lang}&defaultLang=#{STORE.settings['default_lang']}&urlPattern=#{STORE.settings['url_pattern']}"
124
122
  # do this so that there will be a closing tag (better compatibility with browsers)
125
123
  insert_node.content = ' '
126
- parent_node = d.at_css('head') || d.at_css('body') || d.at_css('html')
127
124
  if parent_node.children.size > 0
128
125
  parent_node.children.first.add_previous_sibling(insert_node)
129
126
  else
130
127
  parent_node.add_child(insert_node)
131
128
  end
132
129
 
130
+
131
+ # INSERT LANGUAGE METALINKS
132
+ published_langs = get_langs(values)
133
+ published_langs.each do |l|
134
+ insert_node = Nokogiri::XML::Node.new('link', d)
135
+ insert_node['rel'] = 'alternate'
136
+ insert_node['hreflang'] = l
137
+ insert_node['href'] = headers.redirect_location(l)
138
+ parent_node.add_child(insert_node)
139
+ end
140
+
141
+ # set lang property on HTML tag
142
+ if d.at_css('html') || d.at_css('HTML')
143
+ (d.at_css('html') || d.at_css('HTML')).set_attribute('lang', lang)
144
+ end
145
+
133
146
  output = d.to_html.gsub(/href="([^"]*)"/) {|m| "href=\"#{URI.decode($1)}\""}
134
- # RAILS
135
- #if Object.const_defined?('ActionView') && ActionView.const_defined?('OutputBuffer')
136
- # output = ActionView::OutputBuffer.new(output)
137
- #end
138
147
  output
139
148
  end
140
149
  body
141
150
  end
142
151
 
152
+ # this clearly needs to be refactored. I'm thinking maybe a Value service? (STORE.values.get_langs)
153
+ def get_langs(values)
154
+ langs = Set.new
155
+ (values['text_vals'] || {}).merge(values['img_vals'] || {}).each do |key, index|
156
+ index.each do |l, val|
157
+ langs.add(l)
158
+ end
159
+ end
160
+ langs
161
+ end
162
+
143
163
  end
144
164
 
145
165
  end
@@ -1,3 +1,4 @@
1
+ require 'pry'
1
2
  module Wovnrb
2
3
 
3
4
  class Headers
@@ -49,7 +50,6 @@ module Wovnrb
49
50
  @query = remove_lang(@query, self.lang)
50
51
  @pathname = @pathname.gsub(/\/$/, '')
51
52
  @redis_url = "#{@host}#{@pathname}#{@query}"
52
- #binding.pry
53
53
  end
54
54
 
55
55
  def lang
@@ -103,7 +103,7 @@ module Wovnrb
103
103
  #return remove_lang("#{@env['HTTP_HOST']}#{@env['REQUEST_URI']}", lang)
104
104
  else
105
105
  location = self.url
106
- case STORE.settings['url_pattern_name']
106
+ case STORE.settings['url_pattern']
107
107
  when 'query'
108
108
  if location !~ /\?/
109
109
  location = "#{location}?wovn=#{lang}"
@@ -121,7 +121,7 @@ module Wovnrb
121
121
  end
122
122
 
123
123
  def request_out(def_lang=STORE.settings['default_lang'])
124
- case STORE.settings['url_pattern_name']
124
+ case STORE.settings['url_pattern']
125
125
  when 'query'
126
126
  @env['REQUEST_URI'] = remove_lang(@env['REQUEST_URI']) if @env.has_key?('REQUEST_URI')
127
127
  @env['QUERY_STRING'] = remove_lang(@env['QUERY_STRING']) if @env.has_key?('QUERY_STRING')
@@ -147,7 +147,7 @@ module Wovnrb
147
147
  end
148
148
 
149
149
  def remove_lang(uri, lang=self.path_lang)
150
- case STORE.settings['url_pattern_name']
150
+ case STORE.settings['url_pattern']
151
151
  when 'query'
152
152
  return uri.sub(/(^|\?|&)wovn=#{lang}(&|$)/, '\1').gsub(/(\?|&)$/, '')
153
153
  when 'subdomain'
@@ -161,7 +161,7 @@ module Wovnrb
161
161
 
162
162
  def out(headers)
163
163
  if headers.has_key?("Location")
164
- case STORE.settings['url_pattern_name']
164
+ case STORE.settings['url_pattern']
165
165
  when 'query'
166
166
  if headers["Location"] =~ /\?/
167
167
  headers["Location"] += "&"
data/lib/wovnrb/store.rb CHANGED
@@ -11,11 +11,12 @@ module Wovnrb
11
11
  @settings =
12
12
  {
13
13
  'user_token' => '',
14
- # 'url_pattern_name' => 'query'
14
+ 'secret_key' => '',
15
+ # 'url_pattern' => 'query'
15
16
  # 'url_pattern_reg' => "?.*wovn=(?<lang>[^&]+)(&|$)",
16
- 'url_pattern_name' => 'path',
17
+ 'url_pattern' => 'path',
17
18
  'url_pattern_reg' => "/(?<lang>[^/.?]+)",
18
- #'url_pattern_name' => 'subdomain',
19
+ #'url_pattern' => 'subdomain',
19
20
  #'url_pattern_reg' => "^(?<lang>[^.]+)\.",
20
21
  'query' => [],
21
22
  'backend_host' => 'rs1.wovn.io',
@@ -27,19 +28,55 @@ module Wovnrb
27
28
  @config_loaded = false
28
29
  end
29
30
 
31
+ def valid_settings?
32
+ if !settings.has_key?('user_token') || settings['user_token'].length < 5 || settings['user_token'].length > 6
33
+ return false
34
+ elsif !settings.has_key?('secret_key') || settings['secret_key'].length == 0 #|| settings['secret_key'].length < 5 || settings['secret_key'].length > 6
35
+ return false
36
+ elsif !settings.has_key?('url_pattern') || settings['url_pattern'].length == 0
37
+ return false
38
+ elsif !settings.has_key?('query') || !settings['query'].kind_of?(Array)
39
+ return false
40
+ elsif !settings.has_key?('backend_host') || settings['backend_host'].length == 0
41
+ return false
42
+ elsif !settings.has_key?('backend_port') || settings['backend_port'].length == 0
43
+ return false
44
+ elsif !settings.has_key?('default_lang') || settings['default_lang'].length == 0
45
+ return false
46
+ elsif !settings.has_key?('supported_langs') || !settings['supported_langs'].kind_of?(Array) || settings['supported_langs'].size < 1
47
+ return false
48
+ else
49
+ return true
50
+ end
51
+ end
52
+
30
53
  def settings
31
54
  if !@config_loaded
55
+ # get Rails config.wovnrb
32
56
  if Object.const_defined?('Rails') && Rails.configuration.respond_to?(:wovnrb)
33
57
  config_settings = Rails.configuration.wovnrb.stringify_keys
34
58
  if config_settings.has_key?('url_pattern')
35
59
  if config_settings['url_pattern'] == 'query' || config_settings['url_pattern'] == 'subdomain' || config_settings['url_pattern'] == 'path'
36
- config_settings['url_pattern_name'] = config_settings['url_pattern']
60
+ config_settings['url_pattern'] = config_settings['url_pattern']
37
61
  config_settings.delete('url_pattern')
38
62
  end
39
63
  end
40
64
  @settings.merge!(Rails.configuration.wovnrb.stringify_keys)
41
65
  end
42
- refresh_settings
66
+
67
+ # fix settings object
68
+ @settings['backend_port'] = @settings['backend_port'].to_s
69
+ @settings['default_lang'] = Lang.get_code(@settings['default_lang'])
70
+ if !@settings.has_key?('supported_langs')
71
+ @settings['supported_langs'] = [@settings['default_lang']]
72
+ end
73
+ if @settings['url_pattern'] == 'path'
74
+ @settings['url_pattern_reg'] = "/(?<lang>[^/.?]+)"
75
+ elsif @settings['url_pattern'] == 'query'
76
+ @settings['url_pattern_reg'] = "((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)"
77
+ elsif @settings['url_pattern'] == 'subdomain'
78
+ @settings['url_pattern_reg'] = "^(?<lang>[^.]+)\."
79
+ end
43
80
  @config_loaded = true
44
81
  end
45
82
  @settings
@@ -68,9 +105,9 @@ module Wovnrb
68
105
  if !vals.has_key?('supported_langs')
69
106
  @settings['supported_langs'] = [@settings['default_lang']]
70
107
  end
71
- if @settings['url_pattern_name'] == 'path'
108
+ if @settings['url_pattern'] == 'path'
72
109
  @settings['url_pattern_reg'] = "/(?<lang>[^/.?]+)"
73
- elsif @settings['url_pattern_name'] == 'query'
110
+ elsif @settings['url_pattern'] == 'query'
74
111
  @settings['url_pattern_reg'] = "((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)"
75
112
  end
76
113
  @settings
@@ -1,3 +1,3 @@
1
1
  module Wovnrb
2
- VERSION = "0.1.35"
2
+ VERSION = "0.1.36"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wovnrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.35
4
+ version: 0.1.36
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Sandford
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-20 00:00:00.000000000 Z
12
+ date: 2015-07-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogumbo