wovnrb 2.2.3 → 3.0.1

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.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +5 -0
  3. data/README.en.md +198 -0
  4. data/README.ja.md +180 -0
  5. data/README.md +1 -0
  6. data/docker/docker-compose.yml +11 -0
  7. data/docker/rails/Dockerfile +6 -0
  8. data/docker/rails/TestSite/.browserslistrc +1 -0
  9. data/docker/rails/TestSite/.gitignore +63 -0
  10. data/docker/rails/TestSite/Gemfile +56 -0
  11. data/docker/rails/TestSite/README.md +24 -0
  12. data/docker/rails/TestSite/Rakefile +6 -0
  13. data/docker/rails/TestSite/app/assets/config/manifest.js +2 -0
  14. data/docker/rails/TestSite/app/assets/images/.keep +0 -0
  15. data/docker/rails/TestSite/app/assets/stylesheets/application.css +15 -0
  16. data/docker/rails/TestSite/app/assets/stylesheets/redirects.scss +3 -0
  17. data/docker/rails/TestSite/app/channels/application_cable/channel.rb +4 -0
  18. data/docker/rails/TestSite/app/channels/application_cable/connection.rb +4 -0
  19. data/docker/rails/TestSite/app/controllers/application_controller.rb +2 -0
  20. data/docker/rails/TestSite/app/controllers/concerns/.keep +0 -0
  21. data/docker/rails/TestSite/app/controllers/pages_controller.rb +7 -0
  22. data/docker/rails/TestSite/app/controllers/redirects_controller.rb +5 -0
  23. data/docker/rails/TestSite/app/helpers/application_helper.rb +2 -0
  24. data/docker/rails/TestSite/app/helpers/pages_helper.rb +2 -0
  25. data/docker/rails/TestSite/app/helpers/redirects_helper.rb +2 -0
  26. data/docker/rails/TestSite/app/javascript/channels/consumer.js +6 -0
  27. data/docker/rails/TestSite/app/javascript/channels/index.js +5 -0
  28. data/docker/rails/TestSite/app/javascript/packs/application.js +17 -0
  29. data/docker/rails/TestSite/app/jobs/application_job.rb +7 -0
  30. data/docker/rails/TestSite/app/mailers/application_mailer.rb +4 -0
  31. data/docker/rails/TestSite/app/models/application_record.rb +3 -0
  32. data/docker/rails/TestSite/app/models/concerns/.keep +0 -0
  33. data/docker/rails/TestSite/app/views/layouts/application.html.erb +15 -0
  34. data/docker/rails/TestSite/app/views/layouts/mailer.html.erb +13 -0
  35. data/docker/rails/TestSite/app/views/layouts/mailer.text.erb +1 -0
  36. data/docker/rails/TestSite/babel.config.js +72 -0
  37. data/docker/rails/TestSite/bin/bundle +114 -0
  38. data/docker/rails/TestSite/bin/rails +4 -0
  39. data/docker/rails/TestSite/bin/rake +4 -0
  40. data/docker/rails/TestSite/bin/setup +36 -0
  41. data/docker/rails/TestSite/bin/webpack +18 -0
  42. data/docker/rails/TestSite/bin/webpack-dev-server +18 -0
  43. data/docker/rails/TestSite/bin/yarn +11 -0
  44. data/docker/rails/TestSite/config.ru +5 -0
  45. data/docker/rails/TestSite/config/application.rb +26 -0
  46. data/docker/rails/TestSite/config/boot.rb +4 -0
  47. data/docker/rails/TestSite/config/cable.yml +10 -0
  48. data/docker/rails/TestSite/config/credentials.yml.enc +1 -0
  49. data/docker/rails/TestSite/config/database.yml +25 -0
  50. data/docker/rails/TestSite/config/environment.rb +5 -0
  51. data/docker/rails/TestSite/config/environments/development.rb +62 -0
  52. data/docker/rails/TestSite/config/environments/production.rb +112 -0
  53. data/docker/rails/TestSite/config/environments/test.rb +49 -0
  54. data/docker/rails/TestSite/config/initializers/application_controller_renderer.rb +8 -0
  55. data/docker/rails/TestSite/config/initializers/assets.rb +14 -0
  56. data/docker/rails/TestSite/config/initializers/backtrace_silencers.rb +7 -0
  57. data/docker/rails/TestSite/config/initializers/content_security_policy.rb +30 -0
  58. data/docker/rails/TestSite/config/initializers/cookies_serializer.rb +5 -0
  59. data/docker/rails/TestSite/config/initializers/filter_parameter_logging.rb +4 -0
  60. data/docker/rails/TestSite/config/initializers/inflections.rb +16 -0
  61. data/docker/rails/TestSite/config/initializers/mime_types.rb +4 -0
  62. data/docker/rails/TestSite/config/initializers/wrap_parameters.rb +14 -0
  63. data/docker/rails/TestSite/config/locales/en.yml +33 -0
  64. data/docker/rails/TestSite/config/puma.rb +38 -0
  65. data/docker/rails/TestSite/config/routes.rb +4 -0
  66. data/docker/rails/TestSite/config/spring.rb +6 -0
  67. data/docker/rails/TestSite/config/storage.yml +34 -0
  68. data/docker/rails/TestSite/config/webpack/development.js +5 -0
  69. data/docker/rails/TestSite/config/webpack/environment.js +3 -0
  70. data/docker/rails/TestSite/config/webpack/production.js +5 -0
  71. data/docker/rails/TestSite/config/webpack/test.js +5 -0
  72. data/docker/rails/TestSite/config/webpacker.yml +96 -0
  73. data/docker/rails/TestSite/db/seeds.rb +7 -0
  74. data/docker/rails/TestSite/lib/assets/.keep +0 -0
  75. data/docker/rails/TestSite/lib/tasks/.keep +0 -0
  76. data/docker/rails/TestSite/log/.keep +0 -0
  77. data/docker/rails/TestSite/package.json +15 -0
  78. data/docker/rails/TestSite/postcss.config.js +12 -0
  79. data/docker/rails/TestSite/public/index.html +9 -0
  80. data/docker/rails/TestSite/public/page.html +13 -0
  81. data/docker/rails/TestSite/public/pages/files/plaintext_unicode.txt +204 -0
  82. data/docker/rails/TestSite/public/pages/files/simple_css.css +8 -0
  83. data/docker/rails/TestSite/public/pages/files/simple_javascript.js +2 -0
  84. data/docker/rails/TestSite/public/pages/html5test.html +555 -0
  85. data/docker/rails/TestSite/public/pages/oldhtml.html +335 -0
  86. data/docker/rails/TestSite/public/pages/xhtml.xhtml +726 -0
  87. data/docker/rails/TestSite/public/redirection_target.html +10 -0
  88. data/docker/rails/TestSite/public/testdir/testpage-dir.html +9 -0
  89. data/docker/rails/TestSite/public/testdir/testpage-redirect-destination.html +9 -0
  90. data/docker/rails/TestSite/public/testpage.html +9 -0
  91. data/docker/rails/TestSite/public/wovn_index.html +24 -0
  92. data/docker/rails/TestSite/start.sh +13 -0
  93. data/docker/rails/TestSite/storage/.keep +0 -0
  94. data/docker/rails/TestSite/test/application_system_test_case.rb +5 -0
  95. data/docker/rails/TestSite/test/channels/application_cable/connection_test.rb +11 -0
  96. data/docker/rails/TestSite/test/controllers/.keep +0 -0
  97. data/docker/rails/TestSite/test/controllers/pages_controller_test.rb +7 -0
  98. data/docker/rails/TestSite/test/controllers/redirects_controller_test.rb +7 -0
  99. data/docker/rails/TestSite/test/fixtures/.keep +0 -0
  100. data/docker/rails/TestSite/test/fixtures/files/.keep +0 -0
  101. data/docker/rails/TestSite/test/helpers/.keep +0 -0
  102. data/docker/rails/TestSite/test/integration/.keep +0 -0
  103. data/docker/rails/TestSite/test/mailers/.keep +0 -0
  104. data/docker/rails/TestSite/test/models/.keep +0 -0
  105. data/docker/rails/TestSite/test/system/.keep +0 -0
  106. data/docker/rails/TestSite/test/test_helper.rb +13 -0
  107. data/docker/rails/TestSite/yarn.lock +7642 -0
  108. data/lib/wovnrb.rb +1 -1
  109. data/lib/wovnrb/api_translator.rb +1 -1
  110. data/lib/wovnrb/headers.rb +1 -23
  111. data/lib/wovnrb/lang.rb +77 -40
  112. data/lib/wovnrb/railtie.rb +1 -15
  113. data/lib/wovnrb/services/html_converter.rb +9 -10
  114. data/lib/wovnrb/store.rb +3 -3
  115. data/lib/wovnrb/version.rb +1 -1
  116. data/makefile +16 -0
  117. data/test/lib/headers_test.rb +7 -25
  118. data/test/lib/lang_test.rb +10 -40
  119. data/test/lib/services/html_converter_test.rb +39 -17
  120. data/test/lib/store_test.rb +2 -1
  121. data/wovnrb.gemspec +3 -3
  122. metadata +114 -11
  123. data/README.md +0 -182
data/lib/wovnrb.rb CHANGED
@@ -109,7 +109,7 @@ module Wovnrb
109
109
  end
110
110
 
111
111
  def wovn_ignored?(html_body)
112
- !html_body.xpath('//html[@wovn-ignore]').empty?
112
+ !html_body.xpath('//html[@wovn-ignore or @data-wovn-ignore]').empty?
113
113
  end
114
114
 
115
115
  def ignore_path?(path)
@@ -109,7 +109,7 @@ module Wovnrb
109
109
  end
110
110
 
111
111
  def api_uri
112
- Addressable::URI.parse(@store.settings['api_url'])
112
+ Addressable::URI.parse(@store.settings['api_url'] + '/v0/')
113
113
  end
114
114
 
115
115
  def api_timeout
@@ -8,7 +8,6 @@ module Wovnrb
8
8
  attr_reader :unmasked_pathname
9
9
  attr_reader :pathname
10
10
  attr_reader :pathname_with_trailing_slash_if_present
11
- attr_reader :redis_url
12
11
 
13
12
  # Generates new instance of Wovnrb::Headers.
14
13
  # Its parameters are set by parsing env variable.
@@ -62,7 +61,6 @@ module Wovnrb
62
61
  @query = remove_lang(@query, lang_code)
63
62
  @pathname_with_trailing_slash_if_present = @pathname
64
63
  @pathname = @pathname.gsub(/\/$/, '')
65
- @redis_url = "#{@host}#{@pathname}#{@query}"
66
64
  end
67
65
 
68
66
  def unmasked_pathname_without_trailing_slash
@@ -98,27 +96,7 @@ module Wovnrb
98
96
  @path_lang
99
97
  end
100
98
 
101
- def browser_lang
102
- if @browser_lang.nil?
103
- match = (@env['HTTP_COOKIE'] || '').match(/wovn_selected_lang\s*=\s*(?<lang>[^;\s]+)/)
104
- if match && match[:lang] && Lang.get_lang(match[:lang])
105
- @browser_lang = match[:lang]
106
- else
107
- # IS THIS RIGHT?
108
- @browser_lang = ''
109
- accept_langs = (@env['HTTP_ACCEPT_LANGUAGE'] || '').split(/[,;]/)
110
- accept_langs.each do |l|
111
- if Lang.get_lang(l)
112
- @browser_lang = l
113
- break
114
- end
115
- end
116
- end
117
- end
118
- @browser_lang
119
- end
120
-
121
- def redirect(lang = browser_lang)
99
+ def redirect(lang)
122
100
  redirect_headers = {}
123
101
  redirect_headers['location'] = redirect_location(lang)
124
102
  redirect_headers['content-length'] = '0'
data/lib/wovnrb/lang.rb CHANGED
@@ -3,46 +3,83 @@ require 'addressable'
3
3
  module Wovnrb
4
4
  class Lang
5
5
  LANG = {
6
- # http://msdn.microsoft.com/en-us/library/hh456380.aspx
7
- 'ar' => { name: 'العربية', code: 'ar', en: 'Arabic' },
8
- 'eu' => { name: 'Euskara', code: 'eu', en: 'Basque' },
9
- 'bn' => { name: 'বাংলা ভাষা', code: 'bn', en: 'Bengali' },
10
- 'bg' => { name: 'Български', code: 'bg', en: 'Bulgarian' },
11
- 'ca' => { name: 'Català', code: 'ca', en: 'Catalan' },
12
- 'zh-CHS' => { name: '简体中文', code: 'zh-CHS', en: 'Simp Chinese' },
13
- 'zh-CHT' => { name: '繁體中文', code: 'zh-CHT', en: 'Trad Chinese' },
14
- 'da' => { name: 'Dansk', code: 'da', en: 'Danish' },
15
- 'nl' => { name: 'Nederlands', code: 'nl', en: 'Dutch' },
16
- 'en' => { name: 'English', code: 'en', en: 'English' },
17
- 'fi' => { name: 'Suomi', code: 'fi', en: 'Finnish' },
18
- 'fr' => { name: 'Français', code: 'fr', en: 'French' },
19
- 'gl' => { name: 'Galego', code: 'gl', en: 'Galician' },
20
- 'de' => { name: 'Deutsch', code: 'de', en: 'German' },
21
- 'el' => { name: 'Ελληνικά', code: 'el', en: 'Greek' },
22
- 'he' => { name: 'עברית', code: 'he', en: 'Hebrew' },
23
- 'hu' => { name: 'Magyar', code: 'hu', en: 'Hungarian' },
24
- 'id' => { name: 'Bahasa Indonesia', code: 'id', en: 'Indonesian' },
25
- 'it' => { name: 'Italiano', code: 'it', en: 'Italian' },
26
- 'ja' => { name: '日本語', code: 'ja', en: 'Japanese' },
27
- 'ko' => { name: '한국어', code: 'ko', en: 'Korean' },
28
- 'lv' => { name: 'Latviešu', code: 'lv', en: 'Latvian' },
29
- 'ms' => { name: 'Bahasa Melayu', code: 'ms', en: 'Malay' },
30
- 'my' => { name: 'ဗမာစာ', code: 'my', en: 'Burmese' },
31
- 'ne' => { name: 'नेपाली भाषा', code: 'ne', en: 'Nepali' },
32
- 'fa' => { name: 'زبان_فارسی', code: 'fa', en: 'Persian' },
33
- 'no' => { name: 'Norsk', code: 'no', en: 'Norwegian' },
34
- 'pl' => { name: 'Polski', code: 'pl', en: 'Polish' },
35
- 'pt' => { name: 'Português', code: 'pt', en: 'Portuguese' },
36
- 'ru' => { name: 'Русский', code: 'ru', en: 'Russian' },
37
- 'es' => { name: 'Español', code: 'es', en: 'Spanish' },
38
- 'sw' => { name: 'Kiswahili', code: 'sw', en: 'Swahili' },
39
- 'sv' => { name: 'Svensk', code: 'sv', en: 'Swedish' },
40
- 'th' => { name: 'ภาษาไทย', code: 'th', en: 'Thai' },
41
- 'hi' => { name: 'हिन्दी', code: 'hi', en: 'Hindi' },
42
- 'tr' => { name: 'Türkçe', code: 'tr', en: 'Turkish' },
43
- 'uk' => { name: 'Українська', code: 'uk', en: 'Ukrainian' },
44
- 'ur' => { name: 'اردو', code: 'ur', en: 'Urdu' },
45
- 'vi' => { name: 'Tiếng Việt', code: 'vi', en: 'Vietnamese' }
6
+ 'ar' => { name: 'العربية', code: 'ar', en: 'Arabic' },
7
+ 'eu' => { name: 'Euskara', code: 'eu', en: 'Basque' },
8
+ 'bn' => { name: 'বাংলা ভাষা', code: 'bn', en: 'Bengali' },
9
+ 'bg' => { name: 'Български', code: 'bg', en: 'Bulgarian' },
10
+ 'ca' => { name: 'Català', code: 'ca', en: 'Catalan' },
11
+ 'zh-CN' => { name: '简体中文(中国)', code: 'zh-CN', en: 'Simp Chinese (China)' },
12
+ 'zh-CHS' => { name: '简体中文', code: 'zh-CHS', en: 'Simp Chinese' },
13
+ 'zh-Hant-HK' => { name: '繁體中文(香港)', code: 'zh-Hant-HK', en: 'Trad Chinese (Hong Kong)' },
14
+ 'zh-Hant-TW' => { name: '繁體中文(台湾)', code: 'zh-Hant-TW', en: 'Trad Chinese (Taiwan)' },
15
+ 'zh-CHT' => { name: '繁體中文', code: 'zh-CHT', en: 'Trad Chinese' },
16
+ 'da' => { name: 'Dansk', code: 'da', en: 'Danish' },
17
+ 'nl' => { name: 'Nederlands', code: 'nl', en: 'Dutch' },
18
+ 'en' => { name: 'English', code: 'en', en: 'English' },
19
+ 'en-AU' => { name: 'English (Australia)', code: 'en-AU', en: 'English (Australia)' },
20
+ 'en-CA' => { name: 'English (Canada)', code: 'en-CA', en: 'English (Canada)' },
21
+ 'en-IN' => { name: 'English (India)', code: 'en-IN', en: 'English (India)' },
22
+ 'en-NZ' => { name: 'English (New Zealand)', code: 'en-NZ', en: 'English (New Zealand)' },
23
+ 'en-ZA' => { name: 'English (South Africa)', code: 'en-ZA', en: 'English (South Africa)' },
24
+ 'en-GB' => { name: 'English (United Kingdom)', code: 'en-GB', en: 'English (United Kingdom)' },
25
+ 'en-SG' => { name: 'English (Singapore)', code: 'en-SG', en: 'English (Singapore)' },
26
+ 'en-US' => { name: 'English (United States)', code: 'en-US', en: 'English (United States)' },
27
+ 'fi' => { name: 'Suomi', code: 'fi', en: 'Finnish' },
28
+ 'fr' => { name: 'Français', code: 'fr', en: 'French' },
29
+ 'fr-CA' => { name: 'Français (Canada)', code: 'fr-CA', en: 'French (Canada)' },
30
+ 'fr-FR' => { name: 'Français (France)', code: 'fr-FR', en: 'French (France)' },
31
+ 'fr-CH' => { name: 'Français (Suisse)', code: 'fr-CH', en: 'French (Switzerland)' },
32
+ 'gl' => { name: 'Galego', code: 'gl', en: 'Galician' },
33
+ 'de' => { name: 'Deutsch', code: 'de', en: 'German' },
34
+ 'de-AT' => { name: 'Deutsch (Österreich)', code: 'de-AT', en: 'German (Austria)' },
35
+ 'de-DE' => { name: 'Deutsch (Deutschland)', code: 'de-DE', en: 'German (Germany)' },
36
+ 'de-LI' => { name: 'Deutsch (Liechtenstien)', code: 'de-LI', en: 'German (Liechtenstien)' },
37
+ 'de-CH' => { name: 'Deutsch (Schweiz)', code: 'de-CH', en: 'German (Switzerland)' },
38
+ 'el' => { name: 'Ελληνικά', code: 'el', en: 'Greek' },
39
+ 'he' => { name: 'עברית', code: 'he', en: 'Hebrew' },
40
+ 'hu' => { name: 'Magyar', code: 'hu', en: 'Hungarian' },
41
+ 'id' => { name: 'Bahasa Indonesia', code: 'id', en: 'Indonesian' },
42
+ 'it' => { name: 'Italiano', code: 'it', en: 'Italian' },
43
+ 'it-IT' => { name: 'Italiano (Italia)', code: 'it-IT', en: 'Italian (Italy)' },
44
+ 'it-CH' => { name: 'Italiano (Svizzera)', code: 'it-CH', en: 'Italian (Switzerland)' },
45
+ 'ja' => { name: '日本語', code: 'ja', en: 'Japanese' },
46
+ 'ko' => { name: '한국어', code: 'ko', en: 'Korean' },
47
+ 'lv' => { name: 'Latviešu', code: 'lv', en: 'Latvian' },
48
+ 'ms' => { name: 'Bahasa Melayu', code: 'ms', en: 'Malay' },
49
+ 'my' => { name: 'ဗမာစာ', code: 'my', en: 'Burmese' },
50
+ 'ne' => { name: 'नेपाली भाषा', code: 'ne', en: 'Nepali' },
51
+ 'no' => { name: 'Norsk', code: 'no', en: 'Norwegian' },
52
+ 'fa' => { name: 'زبان_فارسی', code: 'fa', en: 'Persian' },
53
+ 'pl' => { name: 'Polski', code: 'pl', en: 'Polish' },
54
+ 'pt' => { name: 'Português', code: 'pt', en: 'Portuguese' },
55
+ 'pt-BR' => { name: 'Português (Brasil)', code: 'pt-BR', en: 'Portuguese (Brazil)' },
56
+ 'pt-PT' => { name: 'Português (Portugal)', code: 'pt-PT', en: 'Portuguese (Portugal)' },
57
+ 'ru' => { name: 'Русский', code: 'ru', en: 'Russian' },
58
+ 'es' => { name: 'Español', code: 'es', en: 'Spanish' },
59
+ 'es-RA' => { name: 'Español (Argentina)', code: 'es-RA', en: 'Spanish (Argentina)' },
60
+ 'es-CL' => { name: 'Español (Chile)', code: 'es-CL', en: 'Spanish (Chile)' },
61
+ 'es-CO' => { name: 'Español (Colombia)', code: 'es-CO', en: 'Spanish (Colombia)' },
62
+ 'es-CR' => { name: 'Español (Costa Rica)', code: 'es-CR', en: 'Spanish (Costa Rica)' },
63
+ 'es-HN' => { name: 'Español (Honduras)', code: 'es-HN', en: 'Spanish (Honduras)' },
64
+ 'es-419' => { name: 'Español (Latinoamérica)', code: 'es-419', en: 'Spanish (Latin America)' },
65
+ 'es-MX' => { name: 'Español (México)', code: 'es-MX', en: 'Spanish (Mexico)' },
66
+ 'es-PE' => { name: 'Español (Perú)', code: 'es-PE', en: 'Spanish (Peru)' },
67
+ 'es-ES' => { name: 'Español (España)', code: 'es-ES', en: 'Spanish (Spain)' },
68
+ 'es-US' => { name: 'Español (Estados Unidos)', code: 'es-US', en: 'Spanish (United States)' },
69
+ 'es-UY' => { name: 'Español (Uruguay)', code: 'es-UY', en: 'Spanish (Uruguay)' },
70
+ 'es-VE' => { name: 'Español (Venezuela)', code: 'es-VE', en: 'Spanish (Venezuela)' },
71
+ 'sw' => { name: 'Kiswahili', code: 'sw', en: 'Swahili' },
72
+ 'sv' => { name: 'Svensk', code: 'sv', en: 'Swedish' },
73
+ 'tl' => { name: 'Tagalog', code: 'tl', en: 'Tagalog' },
74
+ 'th' => { name: 'ภาษาไทย', code: 'th', en: 'Thai' },
75
+ 'hi' => { name: 'हिन्दी', code: 'hi', en: 'Hindi' },
76
+ 'tr' => { name: 'Türkçe', code: 'tr', en: 'Turkish' },
77
+ 'uk' => { name: 'Українська', code: 'uk', en: 'Ukrainian' },
78
+ 'ur' => { name: 'اردو', code: 'ur', en: 'Urdu' },
79
+ 'vi' => { name: 'Tiếng Việt', code: 'vi', en: 'Vietnamese' },
80
+ 'km' => { name: 'ភាសាខ្មែរ', code: 'km', en: 'Khmer' },
81
+ 'ta' => { name: 'தமிழ்', code: 'ta', en: 'Tamil' },
82
+ 'si' => { name: 'සිංහල', code: 'si', en: 'Sinhala' }
46
83
  }.freeze
47
84
 
48
85
  # Provides the ISO639-1 code for a given lang code.
@@ -1,21 +1,7 @@
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
- unless Wovnrb.middleware_inserted?(app, Wovnrb::Interceptor)
13
- if defined?(Rack::Deflater) && Wovnrb.middleware_inserted?(app, Rack::Deflater)
14
- app.middleware.insert_after(Rack::Deflater, Wovnrb::Interceptor)
15
- else
16
- app.middleware.insert_before(0, Wovnrb::Interceptor)
17
- end
18
- end
4
+ app.middleware.insert_before(0, Wovnrb::Interceptor) if Rails.configuration.wovnrb[:install_middleware]
19
5
  end
20
6
  end
21
7
  end
@@ -43,6 +43,7 @@ module Wovnrb
43
43
 
44
44
  insert_snippet(true)
45
45
  insert_hreflang_tags
46
+ inject_lang_html_tag
46
47
 
47
48
  html
48
49
  end
@@ -84,7 +85,7 @@ module Wovnrb
84
85
  end
85
86
 
86
87
  def strip_wovn_ignore(node, marker)
87
- put_replace_marker(node, marker) if node && node.get_attribute('wovn-ignore')
88
+ put_replace_marker(node, marker) if node && (node.get_attribute('wovn-ignore') || node.get_attribute('data-wovn-ignore'))
88
89
  end
89
90
 
90
91
  def put_replace_marker(node, marker)
@@ -108,15 +109,9 @@ module Wovnrb
108
109
  def inject_lang_html_tag
109
110
  root = @dom.at_css('html')
110
111
  return unless root
112
+ return if root['lang']
111
113
 
112
- current_lang = @headers.lang_code
113
- default_lang = @store.default_lang
114
-
115
- if current_lang != default_lang
116
- root['lang'] = current_lang
117
- else
118
- root.delete('lang')
119
- end
114
+ root['lang'] = @store.default_lang
120
115
  end
121
116
 
122
117
  def replace_hreflangs
@@ -147,10 +142,14 @@ module Wovnrb
147
142
  # Remove wovn snippet code from dom
148
143
  def strip_snippet
149
144
  @dom.xpath('//script').each do |script_node|
150
- script_node.remove if script_node['src'] && script_node['src'] =~ /^\/\/j.(dev-)?wovn.io(:3000)?\//
145
+ script_node.remove if (script_node['src'] && widget_urls.any? { |url| script_node['src'].include? url }) || script_node['data-wovnio'].present?
151
146
  end
152
147
  end
153
148
 
149
+ def widget_urls
150
+ [@store.settings['api_url'] + '/widget', 'j.wovn.io', 'j.dev-wovn.io:3000']
151
+ end
152
+
154
153
  def insert_snippet(adds_backend_error_mark = true)
155
154
  parent_node = @dom.at_css('head') || @dom.at_css('body') || @dom.at_css('html')
156
155
  return unless parent_node
data/lib/wovnrb/store.rb CHANGED
@@ -23,7 +23,7 @@ module Wovnrb
23
23
  'lang_param_name' => 'wovn',
24
24
  'query' => [],
25
25
  'ignore_class' => [],
26
- 'api_url' => 'https://wovn.global.ssl.fastly.net/v0/',
26
+ 'api_url' => 'https://wovn.global.ssl.fastly.net',
27
27
  'api_timeout_seconds' => 1.0,
28
28
  'default_lang' => 'en',
29
29
  'supported_langs' => ['en'],
@@ -157,7 +157,7 @@ module Wovnrb
157
157
 
158
158
  if @settings['wovn_dev_mode']
159
159
  if @settings['api_url'] == self.class.default_settings['api_url']
160
- @settings['api_url'] = 'http://dev-wovn.io:3001/v0/'
160
+ @settings['api_url'] = 'http://dev-wovn.io:3001'
161
161
  end
162
162
 
163
163
  if @settings['api_timeout_seconds'] == self.class.default_settings['api_timeout_seconds']
@@ -185,7 +185,7 @@ module Wovnrb
185
185
 
186
186
  def wovn_host
187
187
  if @settings['wovn_dev_mode']
188
- 'dev-wovn.io:3000'
188
+ 'dev-wovn.io'
189
189
  else
190
190
  'wovn.io'
191
191
  end
@@ -1,3 +1,3 @@
1
1
  module Wovnrb
2
- VERSION = '2.2.3'.freeze
2
+ VERSION = '3.0.1'.freeze
3
3
  end
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
+
@@ -74,24 +74,6 @@ module Wovnrb
74
74
  assert_equal('localhost', env['SERVER_NAME'])
75
75
  end
76
76
 
77
- def test_initialize_without_query
78
- env = Wovnrb.get_env
79
- h = Wovnrb::Headers.new(env, Wovnrb.get_settings)
80
- assert_equal('wovn.io/dashboard', h.redis_url)
81
- end
82
-
83
- def test_initialize_with_query
84
- env = Wovnrb.get_env
85
- h = Wovnrb::Headers.new(env, Wovnrb.get_settings('query' => ['param']))
86
- assert_equal('wovn.io/dashboard?param=val', h.redis_url)
87
- end
88
-
89
- def test_initialize_with_not_matching_query
90
- env = Wovnrb.get_env
91
- h = Wovnrb::Headers.new(env, Wovnrb.get_settings('query' => ['aaa']))
92
- assert_equal('wovn.io/dashboard', h.redis_url)
93
- end
94
-
95
77
  def test_initialize_with_proto_header
96
78
  env = Wovnrb.get_env('url' => 'http://page.com', 'HTTP_X_FORWARDED_PROTO' => 'https')
97
79
  h = Wovnrb::Headers.new(env, Wovnrb.get_settings('query' => ['aaa']))
@@ -6232,7 +6214,7 @@ module Wovnrb
6232
6214
  h = Wovnrb::Headers.new(Wovnrb.get_env, Wovnrb.get_settings)
6233
6215
 
6234
6216
  keys = Wovnrb::Lang::LANG.keys
6235
- assert_equal(39, keys.size)
6217
+ assert_equal(77, keys.size)
6236
6218
 
6237
6219
  for key in keys
6238
6220
  uri_without_scheme = h.remove_lang("wovn.io/#{key}", key)
@@ -6246,7 +6228,7 @@ module Wovnrb
6246
6228
  def test_remove_lang_path_with_nil_lang
6247
6229
  h = Wovnrb::Headers.new(Wovnrb.get_env, Wovnrb.get_settings)
6248
6230
  keys = Wovnrb::Lang::LANG.keys
6249
- assert_equal(39, keys.size)
6231
+ assert_equal(77, keys.size)
6250
6232
 
6251
6233
  uri_without_scheme = h.remove_lang('wovn.io', nil)
6252
6234
  assert_equal('wovn.io', uri_without_scheme)
@@ -6269,7 +6251,7 @@ module Wovnrb
6269
6251
  h = Wovnrb::Headers.new(Wovnrb.get_env, Wovnrb.get_settings('url_pattern' => 'query'))
6270
6252
 
6271
6253
  keys = Wovnrb::Lang::LANG.keys
6272
- assert_equal(39, keys.size)
6254
+ assert_equal(77, keys.size)
6273
6255
 
6274
6256
  for key in keys
6275
6257
  uri_without_scheme = h.remove_lang("wovn.io/?wovn=#{key}", key)
@@ -6284,7 +6266,7 @@ module Wovnrb
6284
6266
  sut = Wovnrb::Headers.new(Wovnrb.get_env, Wovnrb.get_settings('url_pattern' => 'query', 'lang_param_name' => 'lang'))
6285
6267
 
6286
6268
  keys = Wovnrb::Lang::LANG.keys
6287
- assert_equal(39, keys.size)
6269
+ assert_equal(77, keys.size)
6288
6270
 
6289
6271
  for key in keys
6290
6272
  uri_without_custom_lang_param = "wovn.io/?wovn=#{key}"
@@ -6302,7 +6284,7 @@ module Wovnrb
6302
6284
  def test_remove_lang_query_with_nil_lang
6303
6285
  h = Wovnrb::Headers.new(Wovnrb.get_env, Wovnrb.get_settings('url_pattern' => 'query'))
6304
6286
  keys = Wovnrb::Lang::LANG.keys
6305
- assert_equal(39, keys.size)
6287
+ assert_equal(77, keys.size)
6306
6288
 
6307
6289
  uri_without_scheme = h.remove_lang('wovn.io', nil)
6308
6290
  assert_equal('wovn.io', uri_without_scheme)
@@ -6325,7 +6307,7 @@ module Wovnrb
6325
6307
  h = Wovnrb::Headers.new(Wovnrb.get_env, Wovnrb.get_settings('url_pattern' => 'subdomain'))
6326
6308
 
6327
6309
  keys = Wovnrb::Lang::LANG.keys
6328
- assert_equal(39, keys.size)
6310
+ assert_equal(77, keys.size)
6329
6311
 
6330
6312
  for key in keys
6331
6313
  uri_without_scheme = h.remove_lang("#{key.downcase}.wovn.io/", key)
@@ -6339,7 +6321,7 @@ module Wovnrb
6339
6321
  def test_remove_lang_subdomain_with_nil_lang
6340
6322
  h = Wovnrb::Headers.new(Wovnrb.get_env, Wovnrb.get_settings('url_pattern' => 'subdomain'))
6341
6323
  keys = Wovnrb::Lang::LANG.keys
6342
- assert_equal(39, keys.size)
6324
+ assert_equal(77, keys.size)
6343
6325
 
6344
6326
  uri_without_scheme = h.remove_lang('wovn.io', nil)
6345
6327
  assert_equal('wovn.io', uri_without_scheme)
@@ -7,7 +7,7 @@ module Wovnrb
7
7
  end
8
8
 
9
9
  def test_langs_length
10
- assert_equal(39, Wovnrb::Lang::LANG.length)
10
+ assert_equal(77, Wovnrb::Lang::LANG.length)
11
11
  end
12
12
 
13
13
  def test_keys_exist
@@ -20,45 +20,15 @@ module Wovnrb
20
20
  end
21
21
 
22
22
  def test_iso_639_1_normalization
23
- assert_equal('ar', Lang.iso_639_1_normalization('ar'))
24
- assert_equal('eu', Lang.iso_639_1_normalization('eu'))
25
- assert_equal('bn', Lang.iso_639_1_normalization('bn'))
26
- assert_equal('bg', Lang.iso_639_1_normalization('bg'))
27
- assert_equal('ca', Lang.iso_639_1_normalization('ca'))
28
- assert_equal('zh-Hans', Lang.iso_639_1_normalization('zh-CHS'))
29
- assert_equal('zh-Hant', Lang.iso_639_1_normalization('zh-CHT'))
30
- assert_equal('da', Lang.iso_639_1_normalization('da'))
31
- assert_equal('nl', Lang.iso_639_1_normalization('nl'))
32
- assert_equal('en', Lang.iso_639_1_normalization('en'))
33
- assert_equal('fi', Lang.iso_639_1_normalization('fi'))
34
- assert_equal('fr', Lang.iso_639_1_normalization('fr'))
35
- assert_equal('gl', Lang.iso_639_1_normalization('gl'))
36
- assert_equal('de', Lang.iso_639_1_normalization('de'))
37
- assert_equal('el', Lang.iso_639_1_normalization('el'))
38
- assert_equal('he', Lang.iso_639_1_normalization('he'))
39
- assert_equal('hu', Lang.iso_639_1_normalization('hu'))
40
- assert_equal('id', Lang.iso_639_1_normalization('id'))
41
- assert_equal('it', Lang.iso_639_1_normalization('it'))
42
- assert_equal('ja', Lang.iso_639_1_normalization('ja'))
43
- assert_equal('ko', Lang.iso_639_1_normalization('ko'))
44
- assert_equal('lv', Lang.iso_639_1_normalization('lv'))
45
- assert_equal('ms', Lang.iso_639_1_normalization('ms'))
46
- assert_equal('my', Lang.iso_639_1_normalization('my'))
47
- assert_equal('ne', Lang.iso_639_1_normalization('ne'))
48
- assert_equal('fa', Lang.iso_639_1_normalization('fa'))
49
- assert_equal('no', Lang.iso_639_1_normalization('no'))
50
- assert_equal('pl', Lang.iso_639_1_normalization('pl'))
51
- assert_equal('pt', Lang.iso_639_1_normalization('pt'))
52
- assert_equal('ru', Lang.iso_639_1_normalization('ru'))
53
- assert_equal('es', Lang.iso_639_1_normalization('es'))
54
- assert_equal('sw', Lang.iso_639_1_normalization('sw'))
55
- assert_equal('sv', Lang.iso_639_1_normalization('sv'))
56
- assert_equal('th', Lang.iso_639_1_normalization('th'))
57
- assert_equal('hi', Lang.iso_639_1_normalization('hi'))
58
- assert_equal('tr', Lang.iso_639_1_normalization('tr'))
59
- assert_equal('uk', Lang.iso_639_1_normalization('uk'))
60
- assert_equal('ur', Lang.iso_639_1_normalization('ur'))
61
- assert_equal('vi', Lang.iso_639_1_normalization('vi'))
23
+ Wovnrb::Lang::LANG.each do |_, l|
24
+ if l[:code] == 'zh-CHS'
25
+ assert_equal('zh-Hans', Lang.iso_639_1_normalization('zh-CHS'))
26
+ elsif l[:code] == 'zh-CHT'
27
+ assert_equal('zh-Hant', Lang.iso_639_1_normalization('zh-CHT'))
28
+ else
29
+ assert_equal(l[:code], Lang.iso_639_1_normalization(l[:code]))
30
+ end
31
+ end
62
32
  end
63
33
 
64
34
  def test_get_code_with_valid_code