wovnrb 1.1.0 → 2.0.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.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +1 -0
  5. data/.rubocop_todo.yml +308 -0
  6. data/Rakefile +13 -14
  7. data/lib/wovnrb.rb +43 -98
  8. data/lib/wovnrb/api_translator.rb +143 -0
  9. data/lib/wovnrb/headers.rb +78 -92
  10. data/lib/wovnrb/helpers/nokogumbo_helper.rb +1 -1
  11. data/lib/wovnrb/lang.rb +93 -125
  12. data/lib/wovnrb/railtie.rb +5 -7
  13. data/lib/wovnrb/services/glob.rb +3 -3
  14. data/lib/wovnrb/services/html_converter.rb +192 -0
  15. data/lib/wovnrb/services/html_replace_marker.rb +38 -0
  16. data/lib/wovnrb/services/wovn_logger.rb +8 -4
  17. data/lib/wovnrb/settings.rb +5 -3
  18. data/lib/wovnrb/store.rb +35 -26
  19. data/lib/wovnrb/text_caches/cache_base.rb +3 -2
  20. data/lib/wovnrb/text_caches/memory_cache.rb +2 -2
  21. data/lib/wovnrb/version.rb +1 -1
  22. data/test/fixtures/html/test.html +8 -0
  23. data/test/fixtures/html/test_translated.html +8 -0
  24. data/test/lib/api_translator_test.rb +109 -0
  25. data/test/lib/headers_test.rb +84 -55
  26. data/test/lib/lang_test.rb +157 -357
  27. data/test/lib/services/glob_test.rb +1 -1
  28. data/test/lib/services/html_converter_test.rb +166 -0
  29. data/test/lib/services/html_replace_marker_test.rb +75 -0
  30. data/test/lib/services/wovn_logger_test.rb +6 -6
  31. data/test/lib/store_test.rb +25 -69
  32. data/test/lib/text_caches/cache_base_test.rb +1 -1
  33. data/test/lib/text_caches/memory_cache_test.rb +10 -11
  34. data/test/lib/wovnrb_test.rb +77 -310
  35. data/test/test_helper.rb +22 -32
  36. data/wovnrb.gemspec +35 -44
  37. metadata +86 -205
  38. data/ext/dom/Makefile +0 -239
  39. data/lib/wovnrb/api_data.rb +0 -59
  40. data/lib/wovnrb/html_replacers/image_replacer.rb +0 -69
  41. data/lib/wovnrb/html_replacers/input_replacer.rb +0 -38
  42. data/lib/wovnrb/html_replacers/link_replacer.rb +0 -78
  43. data/lib/wovnrb/html_replacers/meta_replacer.rb +0 -28
  44. data/lib/wovnrb/html_replacers/replacer_base.rb +0 -49
  45. data/lib/wovnrb/html_replacers/script_replacer.rb +0 -39
  46. data/lib/wovnrb/html_replacers/text_replacer.rb +0 -21
  47. data/lib/wovnrb/html_replacers/unified_values/dst_swapping_targets_creator.rb +0 -76
  48. data/lib/wovnrb/html_replacers/unified_values/element_category.rb +0 -242
  49. data/lib/wovnrb/html_replacers/unified_values/node_swapping_targets_creator.rb +0 -134
  50. data/lib/wovnrb/html_replacers/unified_values/text_replacer.rb +0 -35
  51. data/lib/wovnrb/html_replacers/unified_values/text_scraper.rb +0 -152
  52. data/lib/wovnrb/html_replacers/unified_values/values_stack.rb +0 -65
  53. data/lib/wovnrb/services/url.rb +0 -12
  54. data/lib/wovnrb/services/value_agent.rb +0 -9
  55. data/test/fixtures/unified_values/site_html/simple_actual.html +0 -96
  56. data/test/fixtures/unified_values/site_html/simple_expected.json +0 -251
  57. data/test/fixtures/unified_values/site_html/wovn.io_actual.html +0 -686
  58. data/test/fixtures/unified_values/site_html/wovn.io_expected.json +0 -543
  59. data/test/fixtures/unified_values/site_html/www.yahoo.co.jp_actual.html +0 -1024
  60. data/test/fixtures/unified_values/site_html/www.yahoo.co.jp_expected.json +0 -3345
  61. data/test/fixtures/unified_values/small_html/block_inside_inline_actual.html +0 -12
  62. data/test/fixtures/unified_values/small_html/block_inside_inline_expected.json +0 -22
  63. data/test/fixtures/unified_values/small_html/br_tag_actual.html +0 -10
  64. data/test/fixtures/unified_values/small_html/br_tag_expected.json +0 -12
  65. data/test/fixtures/unified_values/small_html/comment_tag_actual.html +0 -12
  66. data/test/fixtures/unified_values/small_html/comment_tag_expected.json +0 -10
  67. data/test/fixtures/unified_values/small_html/complex_text_with_html_entity_actual.html +0 -7
  68. data/test/fixtures/unified_values/small_html/complex_text_with_html_entity_expected.json +0 -11
  69. data/test/fixtures/unified_values/small_html/deep_nested_block_actual.html +0 -14
  70. data/test/fixtures/unified_values/small_html/deep_nested_block_expected.json +0 -8
  71. data/test/fixtures/unified_values/small_html/deep_nested_inline_actual.html +0 -20
  72. data/test/fixtures/unified_values/small_html/deep_nested_inline_expected.json +0 -20
  73. data/test/fixtures/unified_values/small_html/empty_tag_actual.html +0 -10
  74. data/test/fixtures/unified_values/small_html/empty_tag_expected.json +0 -12
  75. data/test/fixtures/unified_values/small_html/empty_text_actual.html +0 -12
  76. data/test/fixtures/unified_values/small_html/empty_text_expected.json +0 -1
  77. data/test/fixtures/unified_values/small_html/ignore_tag_actual.html +0 -12
  78. data/test/fixtures/unified_values/small_html/ignore_tag_expected.json +0 -16
  79. data/test/fixtures/unified_values/small_html/ignored_class_actual.html +0 -10
  80. data/test/fixtures/unified_values/small_html/ignored_class_expected.json +0 -13
  81. data/test/fixtures/unified_values/small_html/img_actual.html +0 -12
  82. data/test/fixtures/unified_values/small_html/img_expected.json +0 -23
  83. data/test/fixtures/unified_values/small_html/nested_and_complex_wovn_ignore_actual.html +0 -10
  84. data/test/fixtures/unified_values/small_html/nested_and_complex_wovn_ignore_expected.json +0 -16
  85. data/test/fixtures/unified_values/small_html/nested_text_value_actual.html +0 -10
  86. data/test/fixtures/unified_values/small_html/nested_text_value_expected.json +0 -12
  87. data/test/fixtures/unified_values/small_html/nested_text_value_mixed_plan_text_actual.html +0 -10
  88. data/test/fixtures/unified_values/small_html/nested_text_value_mixed_plan_text_expected.json +0 -14
  89. data/test/fixtures/unified_values/small_html/option_tag_actual.html +0 -9
  90. data/test/fixtures/unified_values/small_html/option_tag_expected.json +0 -13
  91. data/test/fixtures/unified_values/small_html/text_different_inline_each_other_actual.html +0 -10
  92. data/test/fixtures/unified_values/small_html/text_different_inline_each_other_expected.json +0 -22
  93. data/test/fixtures/unified_values/small_html/text_in_svg_actual.html +0 -9
  94. data/test/fixtures/unified_values/small_html/text_in_svg_expected.json +0 -8
  95. data/test/fixtures/unified_values/small_html/text_with_html_entity_actual.html +0 -6
  96. data/test/fixtures/unified_values/small_html/text_with_html_entity_expected.json +0 -8
  97. data/test/fixtures/unified_values/small_html/unknown_or_custom_tag_actual.html +0 -12
  98. data/test/fixtures/unified_values/small_html/unknown_or_custom_tag_expected.json +0 -24
  99. data/test/fixtures/unified_values/small_html/unnecessay_top_end_tag_actual.html +0 -12
  100. data/test/fixtures/unified_values/small_html/unnecessay_top_end_tag_expected.json +0 -14
  101. data/test/fixtures/unified_values/small_html/wovn_ignore_actual.html +0 -10
  102. data/test/fixtures/unified_values/small_html/wovn_ignore_expected.json +0 -13
  103. data/test/lib/api_data_test.rb +0 -83
  104. data/test/lib/html_replacers/image_replacer_test.rb +0 -165
  105. data/test/lib/html_replacers/input_replacer_test.rb +0 -140
  106. data/test/lib/html_replacers/link_replacer_test.rb +0 -328
  107. data/test/lib/html_replacers/meta_replacer_test.rb +0 -157
  108. data/test/lib/html_replacers/replacer_base_test.rb +0 -128
  109. data/test/lib/html_replacers/script_replacer_test.rb +0 -139
  110. data/test/lib/html_replacers/text_replacer_test.rb +0 -99
  111. data/test/lib/html_replacers/unified_values/dst_swapping_targets_creator_test.rb +0 -137
  112. data/test/lib/html_replacers/unified_values/element_category_test.rb +0 -49
  113. data/test/lib/html_replacers/unified_values/node_swapping_targets_creator_test.rb +0 -137
  114. data/test/lib/html_replacers/unified_values/text_replacer_test.rb +0 -270
  115. data/test/lib/html_replacers/unified_values/text_scraper_test.rb +0 -121
  116. data/test/lib/html_replacers/unified_values/values_stack_test.rb +0 -122
  117. data/test/lib/services/url_test.rb +0 -9
  118. data/test/lib/services/value_agent_test.rb +0 -32
  119. data/test/services/url_test.rb +0 -163
  120. data/values/values +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e67d9a0a4d2f447222580c5d4e0a00995f8027fa
4
- data.tar.gz: e8544f392fdf10c6c5101914cd7b721ed2e6c4e9
3
+ metadata.gz: 548c84031681d4273db42c24a7ccfd8faaad9b31
4
+ data.tar.gz: 6c82fab859281f1b946f4199a1737daaa5112842
5
5
  SHA512:
6
- metadata.gz: f69d4ccb222bdfb97368d26c3585aaeb433c71d7b1a58b294d8b18cd098c8222149a1b41bb7912de82c88f7594e6d152600ca4e39167ed2f6987769761e2140c
7
- data.tar.gz: 3e4ddf14d6c59a6eee023d878744c40a468874351ea27fe6138038506cef78529618950cf60c6af9670174dacd3ac98e12d70c2b306f54b927793cd7dec10bc7
6
+ metadata.gz: fd388862202899e8d3acbe2d5aa8fe8a55bc5c89684beec438df56da6d7c366bcd71bd72fcb049767586de4bd34f56cfdd275ba7cb1710f22e04dcf27f94c5b3
7
+ data.tar.gz: abee33fc5f353e531363d59001a258bed0b07ae4809b07560d10a0889371b4435e19b53ad00d3796157cbf96b87ae9859abe0baa33eafeaf48277b65d4310a1f
data/.circleci/config.yml CHANGED
@@ -14,4 +14,5 @@ jobs:
14
14
  key: bundler-{{ checksum "Gemfile.lock" }}
15
15
  paths:
16
16
  - vendor/bundle
17
+ - run: bundle exec rubocop
17
18
  - run: bundle exec rake test
data/.gitignore CHANGED
@@ -18,3 +18,5 @@ mkmf.log
18
18
  *.iml
19
19
  .ruby-version
20
20
  /*.gem
21
+ wovn_error.log
22
+ .byebug_history
data/.rubocop.yml ADDED
@@ -0,0 +1 @@
1
+ inherit_from: .rubocop_todo.yml
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,308 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2018-11-02 18:52:46 +0900 using RuboCop version 0.60.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # Cop supports --auto-correct.
11
+ Layout/EmptyLinesAroundAccessModifier:
12
+ Exclude:
13
+ - 'lib/wovnrb/text_caches/memory_cache.rb'
14
+
15
+ # Offense count: 1
16
+ # Cop supports --auto-correct.
17
+ Layout/EmptyLinesAroundMethodBody:
18
+ Exclude:
19
+ - 'test/lib/text_caches/memory_cache_test.rb'
20
+
21
+ # Offense count: 11
22
+ # Cop supports --auto-correct.
23
+ # Configuration parameters: AllowForAlignment, ForceEqualSignAlignment.
24
+ Layout/ExtraSpacing:
25
+ Exclude:
26
+ - 'lib/wovnrb/lang.rb'
27
+
28
+ # Offense count: 1
29
+ # Cop supports --auto-correct.
30
+ # Configuration parameters: EnforcedStyle, IndentationWidth.
31
+ # SupportedStyles: special_inside_parentheses, consistent, align_braces
32
+ Layout/IndentHash:
33
+ Exclude:
34
+ - 'lib/wovnrb/text_caches/cache_base.rb'
35
+
36
+ # Offense count: 4
37
+ # Cop supports --auto-correct.
38
+ # Configuration parameters: EnforcedStyle.
39
+ # SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent
40
+ Layout/IndentHeredoc:
41
+ Exclude:
42
+ - 'test/lib/lang_test.rb'
43
+ - 'test/lib/wovnrb_test.rb'
44
+
45
+ # Offense count: 1
46
+ # Cop supports --auto-correct.
47
+ # Configuration parameters: AllowForAlignment.
48
+ Layout/SpaceAroundOperators:
49
+ Exclude:
50
+ - 'lib/wovnrb/text_caches/memory_cache.rb'
51
+
52
+ # Offense count: 3
53
+ # Configuration parameters: AllowSafeAssignment.
54
+ Lint/AssignmentInCondition:
55
+ Exclude:
56
+ - 'lib/wovnrb/helpers/nokogumbo_helper.rb'
57
+
58
+ # Offense count: 1
59
+ Lint/DuplicateMethods:
60
+ Exclude:
61
+ - 'test/lib/headers_test.rb'
62
+
63
+ # Offense count: 1
64
+ Lint/ElseLayout:
65
+ Exclude:
66
+ - 'lib/wovnrb/headers.rb'
67
+
68
+ # Offense count: 1
69
+ Lint/ImplicitStringConcatenation:
70
+ Exclude:
71
+ - 'test/lib/lang_test.rb'
72
+
73
+ # Offense count: 3
74
+ # Cop supports --auto-correct.
75
+ # Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
76
+ Lint/UnusedMethodArgument:
77
+ Exclude:
78
+ - 'lib/wovnrb/text_caches/cache_base.rb'
79
+
80
+ # Offense count: 5
81
+ Lint/UselessAssignment:
82
+ Exclude:
83
+ - 'test/lib/store_test.rb'
84
+
85
+ # Offense count: 22
86
+ Metrics/AbcSize:
87
+ Max: 100
88
+
89
+ # Offense count: 1
90
+ # Configuration parameters: CountComments, ExcludedMethods.
91
+ # ExcludedMethods: refine
92
+ Metrics/BlockLength:
93
+ Max: 40
94
+
95
+ # Offense count: 2
96
+ # Configuration parameters: CountBlocks.
97
+ Metrics/BlockNesting:
98
+ Max: 4
99
+
100
+ # Offense count: 10
101
+ # Configuration parameters: CountComments.
102
+ Metrics/ClassLength:
103
+ Max: 4997
104
+
105
+ # Offense count: 14
106
+ Metrics/CyclomaticComplexity:
107
+ Max: 22
108
+
109
+ # Offense count: 45
110
+ # Configuration parameters: CountComments, ExcludedMethods.
111
+ Metrics/MethodLength:
112
+ Max: 95
113
+
114
+ # Offense count: 12
115
+ Metrics/PerceivedComplexity:
116
+ Max: 22
117
+
118
+ # Offense count: 3
119
+ Naming/AccessorMethodName:
120
+ Exclude:
121
+ - 'lib/wovnrb/services/wovn_logger.rb'
122
+ - 'lib/wovnrb/text_caches/cache_base.rb'
123
+
124
+ # Offense count: 120
125
+ # Configuration parameters: .
126
+ # SupportedStyles: snake_case, camelCase
127
+ Naming/MethodName:
128
+ EnforcedStyle: snake_case
129
+ Exclude:
130
+ - 'test/lib/headers_test.rb'
131
+
132
+ # Offense count: 5
133
+ # Cop supports --auto-correct.
134
+ # Configuration parameters: EnforcedStyle.
135
+ # SupportedStyles: always, conditionals
136
+ Style/AndOr:
137
+ Exclude:
138
+ - 'Rakefile'
139
+ - 'lib/wovnrb/helpers/nokogumbo_helper.rb'
140
+
141
+ # Offense count: 1
142
+ Style/CaseEquality:
143
+ Exclude:
144
+ - 'lib/wovnrb/lang.rb'
145
+
146
+ # Offense count: 5
147
+ # Cop supports --auto-correct.
148
+ # Configuration parameters: EnforcedStyle.
149
+ # SupportedStyles: is_a?, kind_of?
150
+ Style/ClassCheck:
151
+ Exclude:
152
+ - 'lib/wovnrb/store.rb'
153
+
154
+ # Offense count: 6
155
+ Style/ClassVars:
156
+ Exclude:
157
+ - 'lib/wovnrb/text_caches/cache_base.rb'
158
+ - 'lib/wovnrb/text_caches/memory_cache.rb'
159
+
160
+ # Offense count: 1
161
+ # Cop supports --auto-correct.
162
+ # Configuration parameters: Keywords.
163
+ # Keywords: TODO, FIXME, OPTIMIZE, HACK, REVIEW
164
+ Style/CommentAnnotation:
165
+ Exclude:
166
+ - 'lib/wovnrb/headers.rb'
167
+
168
+ # Offense count: 13
169
+ Style/Documentation:
170
+ Exclude:
171
+ - 'spec/**/*'
172
+ - 'test/**/*'
173
+ - 'lib/wovnrb.rb'
174
+ - 'lib/wovnrb/api_translator.rb'
175
+ - 'lib/wovnrb/headers.rb'
176
+ - 'lib/wovnrb/helpers/nokogumbo_helper.rb'
177
+ - 'lib/wovnrb/lang.rb'
178
+ - 'lib/wovnrb/railtie.rb'
179
+ - 'lib/wovnrb/services/html_converter.rb'
180
+ - 'lib/wovnrb/services/html_replace_marker.rb'
181
+ - 'lib/wovnrb/services/wovn_logger.rb'
182
+ - 'lib/wovnrb/settings.rb'
183
+ - 'lib/wovnrb/store.rb'
184
+ - 'lib/wovnrb/text_caches/cache_base.rb'
185
+ - 'lib/wovnrb/text_caches/memory_cache.rb'
186
+
187
+ # Offense count: 2
188
+ Style/DoubleNegation:
189
+ Exclude:
190
+ - 'lib/wovnrb.rb'
191
+ - 'lib/wovnrb/services/html_converter.rb'
192
+
193
+ # Offense count: 3
194
+ # Cop supports --auto-correct.
195
+ # Configuration parameters: EnforcedStyle.
196
+ # SupportedStyles: each, for
197
+ Style/For:
198
+ Exclude:
199
+ - 'test/lib/headers_test.rb'
200
+
201
+ # Offense count: 4
202
+ # Configuration parameters: MinBodyLength.
203
+ Style/GuardClause:
204
+ Exclude:
205
+ - 'lib/wovnrb/services/html_converter.rb'
206
+ - 'lib/wovnrb/store.rb'
207
+ - 'test/lib/api_translator_test.rb'
208
+
209
+ # Offense count: 1
210
+ # Cop supports --auto-correct.
211
+ # Configuration parameters: EnforcedStyle, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols.
212
+ # SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys
213
+ Style/HashSyntax:
214
+ Exclude:
215
+ - 'Rakefile'
216
+
217
+ # Offense count: 13
218
+ # Cop supports --auto-correct.
219
+ Style/IfUnlessModifier:
220
+ Exclude:
221
+ - 'Gemfile'
222
+ - 'Rakefile'
223
+ - 'lib/wovnrb/helpers/nokogumbo_helper.rb'
224
+ - 'lib/wovnrb/store.rb'
225
+ - 'lib/wovnrb/text_caches/memory_cache.rb'
226
+
227
+ # Offense count: 1
228
+ # Cop supports --auto-correct.
229
+ # Configuration parameters: EnforcedStyle.
230
+ # SupportedStyles: both, prefix, postfix
231
+ Style/NegatedIf:
232
+ Exclude:
233
+ - 'lib/wovnrb/store.rb'
234
+
235
+ # Offense count: 2
236
+ # Cop supports --auto-correct.
237
+ # Configuration parameters: AutoCorrect, EnforcedStyle, IgnoredMethods.
238
+ # SupportedStyles: predicate, comparison
239
+ Style/NumericPredicate:
240
+ Exclude:
241
+ - 'spec/**/*'
242
+ - 'lib/wovnrb/store.rb'
243
+
244
+ # Offense count: 9
245
+ # Cop supports --auto-correct.
246
+ # Configuration parameters: EnforcedStyle.
247
+ # SupportedStyles: short, verbose
248
+ Style/PreferredHashMethods:
249
+ Exclude:
250
+ - 'lib/wovnrb/store.rb'
251
+ - 'lib/wovnrb/text_caches/memory_cache.rb'
252
+
253
+ # Offense count: 2
254
+ # Cop supports --auto-correct.
255
+ # Configuration parameters: .
256
+ # SupportedStyles: compact, exploded
257
+ Style/RaiseArgs:
258
+ EnforcedStyle: compact
259
+
260
+ # Offense count: 22
261
+ # Cop supports --auto-correct.
262
+ # Configuration parameters: EnforcedStyle, AllowInnerSlashes.
263
+ # SupportedStyles: slashes, percent_r, mixed
264
+ Style/RegexpLiteral:
265
+ Exclude:
266
+ - 'lib/wovnrb/api_translator.rb'
267
+ - 'lib/wovnrb/headers.rb'
268
+ - 'lib/wovnrb/lang.rb'
269
+ - 'lib/wovnrb/services/html_converter.rb'
270
+
271
+ # Offense count: 4
272
+ # Cop supports --auto-correct.
273
+ # Configuration parameters: EnforcedStyle.
274
+ # SupportedStyles: implicit, explicit
275
+ Style/RescueStandardError:
276
+ Exclude:
277
+ - 'lib/wovnrb/api_translator.rb'
278
+ - 'lib/wovnrb/lang.rb'
279
+ - 'lib/wovnrb/services/wovn_logger.rb'
280
+
281
+ # Offense count: 1
282
+ # Cop supports --auto-correct.
283
+ Style/StderrPuts:
284
+ Exclude:
285
+ - 'lib/wovnrb/services/wovn_logger.rb'
286
+
287
+ # Offense count: 4
288
+ # Cop supports --auto-correct.
289
+ # Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
290
+ # SupportedStyles: single_quotes, double_quotes
291
+ Style/StringLiterals:
292
+ Exclude:
293
+ - 'Rakefile'
294
+ - 'lib/wovnrb/store.rb'
295
+
296
+ # Offense count: 7
297
+ # Cop supports --auto-correct.
298
+ Style/ZeroLengthPredicate:
299
+ Exclude:
300
+ - 'Rakefile'
301
+ - 'lib/wovnrb/helpers/nokogumbo_helper.rb'
302
+ - 'lib/wovnrb/store.rb'
303
+
304
+ # Offense count: 1436
305
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
306
+ # URISchemes: http, https
307
+ Metrics/LineLength:
308
+ Max: 1424
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
- #require "bundler/gem_tasks"
2
- #require 'rake/extensiontask'
1
+ # require "bundler/gem_tasks"
2
+ # require 'rake/extensiontask'
3
3
  require 'rake/testtask'
4
4
  require 'pry'
5
5
 
@@ -24,18 +24,17 @@ end
24
24
  desc 'Run tests'
25
25
  task :default => :test
26
26
 
27
- #Rake::ExtensionTask.new 'dom' do |ext|
27
+ # Rake::ExtensionTask.new 'dom' do |ext|
28
28
  # ext.lib_dir = 'lib/wovnrb'
29
- #end
29
+ # end
30
30
 
31
- #gemspec = Gem::Specification.load('wovnrb.gemspec')
32
- #Rake::ExtensionTask.new do |ext|
33
- # ext.name = 'dom'
34
- # ext.source_pattern = "*.{cpp,h}"
35
- # ext.ext_dir = 'ext/wovnrb'
36
- # ext.lib_dir = 'lib/wovnrb'
37
- # ext.gem_spec = gemspec
38
- #end
31
+ # gemspec = Gem::Specification.load('wovnrb.gemspec')
32
+ # Rake::ExtensionTask.new do |ext|
33
+ # ext.name = 'dom'
34
+ # ext.source_pattern = "*.{cpp,h}"
35
+ # ext.ext_dir = 'ext/wovnrb'
36
+ # ext.lib_dir = 'lib/wovnrb'
37
+ # ext.gem_spec = gemspec
38
+ # end
39
39
  #
40
- #task :default => [:compile]
41
-
40
+ # task :default => [:compile]
data/lib/wovnrb.rb CHANGED
@@ -1,135 +1,88 @@
1
1
  require 'rack'
2
- require 'wovnrb/store'
2
+ require 'wovnrb/api_translator'
3
3
  require 'wovnrb/headers'
4
+ require 'wovnrb/store'
4
5
  require 'wovnrb/lang'
6
+ require 'wovnrb/services/html_converter'
7
+ require 'wovnrb/services/html_replace_marker'
5
8
  require 'nokogumbo'
6
9
  require 'active_support'
7
- #require 'dom'
8
10
  require 'json'
9
11
  require 'wovnrb/helpers/nokogumbo_helper'
10
- require 'wovnrb/api_data'
11
12
  require 'wovnrb/text_caches/cache_base'
12
- require 'wovnrb/html_replacers/replacer_base'
13
- require 'wovnrb/html_replacers/link_replacer'
14
- require 'wovnrb/html_replacers/text_replacer'
15
- require 'wovnrb/html_replacers/meta_replacer'
16
- require 'wovnrb/html_replacers/input_replacer'
17
- require 'wovnrb/html_replacers/image_replacer'
18
- require 'wovnrb/html_replacers/script_replacer'
19
- require 'wovnrb/html_replacers/unified_values/text_replacer'
20
- require 'wovnrb/html_replacers/unified_values/text_scraper'
21
- require 'wovnrb/html_replacers/unified_values/values_stack'
22
- require 'wovnrb/html_replacers/unified_values/element_category'
23
- require 'wovnrb/html_replacers/unified_values/dst_swapping_targets_creator'
24
- require 'wovnrb/html_replacers/unified_values/node_swapping_targets_creator'
25
13
  require 'wovnrb/railtie' if defined?(Rails)
26
14
  require 'wovnrb/version'
27
15
 
28
16
  module Wovnrb
29
17
  class Interceptor
30
- def initialize(app, opts={})
18
+ def initialize(app, opts = {})
31
19
  @app = app
32
20
  @store = Store.instance
33
- opts = opts.each_with_object({}){|(k,v),memo| memo[k.to_s]=v}
21
+ opts = opts.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v }
34
22
  @store.update_settings(opts)
35
23
  CacheBase.set_single(@store.settings)
36
24
  end
37
25
 
38
26
  def call(env)
39
27
  @store.settings.clear_dynamic_settings!
40
- unless Store.instance.valid_settings?
41
- return @app.call(env)
42
- end
28
+ return @app.call(env) unless Store.instance.valid_settings?
29
+
43
30
  @env = env
44
31
  headers = Headers.new(env, @store.settings)
45
- if @store.settings['test_mode'] && @store.settings['test_url'] != headers.url
46
- return @app.call(env)
47
- end
48
- #redirect if the path is set to the default language (for SEO purposes)
49
- if (headers.path_lang == @store.settings['default_lang'])
32
+ return @app.call(env) if @store.settings['test_mode'] && @store.settings['test_url'] != headers.url
33
+
34
+ # redirect if the path is set to the default language (for SEO purposes)
35
+ if headers.path_lang == @store.settings['default_lang']
50
36
  redirect_headers = headers.redirect(@store.settings['default_lang'])
51
37
  return [307, redirect_headers, ['']]
52
38
  end
53
- lang = headers.lang_code
54
39
 
55
40
  # pass to application
56
41
  status, res_headers, body = @app.call(headers.request_out)
57
42
 
58
- unless res_headers["Content-Type"] =~ /html/
59
- return output(headers, status, res_headers, body)
60
- end
43
+ return output(headers, status, res_headers, body) unless res_headers['Content-Type'] =~ /html/
61
44
 
62
45
  request = Rack::Request.new(env)
63
46
 
64
- if request.params['wovn_disable'] == true
65
- return output(headers, status, res_headers, body)
66
- end
47
+ return output(headers, status, res_headers, body) if request.params['wovn_disable'] == true
67
48
 
68
49
  @store.settings.update_dynamic_settings!(request.params)
69
- if @store.settings['ignore_globs'].any?{|g| g.match?(headers.pathname)}
70
- return output(headers, status, res_headers, body)
71
- end
50
+ return output(headers, status, res_headers, body) if @store.settings['ignore_globs'].any? { |g| g.match?(headers.pathname) }
72
51
 
73
- # ApiData creates request for external server, but cannot use async.
74
- # Because some server not allow multi thread. (env['async.callback'] is not supported at all Server).
75
- api_data = ApiData.new(headers.redis_url, @store)
76
- values = api_data.get_data
77
-
78
- url = {
79
- :protocol => headers.protocol,
80
- :host => headers.host,
81
- :pathname => headers.pathname
82
- }
83
- body = switch_lang(body, values, url, lang, headers) unless status.to_s =~ /^1|302/
52
+ body = switch_lang(headers, body) unless status.to_s =~ /^1|302/
84
53
 
85
54
  content_length = 0
86
55
  body.each { |b| content_length += b.respond_to?(:bytesize) ? b.bytesize : 0 }
87
- res_headers["Content-Length"] = content_length.to_s
56
+ res_headers['Content-Length'] = content_length.to_s
88
57
 
89
58
  output(headers, status, res_headers, body)
90
59
  end
91
60
 
92
- def switch_lang(body, values, url, lang=@store.settings['default_lang'], headers)
93
- lang = Lang.new(lang)
94
- ignore_all = false
95
- new_body = []
96
-
97
- # generate full_body to intercept
98
- full_body = ''
99
- body.each { |b| full_body += b }
100
-
101
- [full_body].each do |b|
102
- # temporarily remove noscripts
103
- noscripts = []
104
- b_without_noscripts = b
105
- b.scan /<noscript.*?>.*?<\/noscript>/m do |match|
106
- noscript_identifier = "<noscript wovn-id=\"#{noscripts.count}\"></noscript>"
107
- noscripts << match
108
- b_without_noscripts = b_without_noscripts.sub(match, noscript_identifier)
109
- end
61
+ def switch_lang(headers, body)
62
+ translated_body = []
110
63
 
111
- d = Helpers::NokogumboHelper::parse_html(b_without_noscripts)
64
+ # Must use `.each` for to support multiple-chunks in Sinatra
65
+ string_body = ''
66
+ body.each { |chunk| string_body += chunk }
67
+ html_body = Helpers::NokogumboHelper.parse_html(string_body)
112
68
 
113
- # If this page has wovn-ignore in the html tag, don't do anything
114
- if ignore_all || !d.xpath('//html[@wovn-ignore]').empty? || is_amp_page?(d)
115
- ignore_all = true
116
- output = d.to_html(save_with: 0).gsub(/href="([^"]*)"/) { |m| "href=\"#{URI.decode($1)}\"" }
117
- put_back_noscripts!(output, noscripts)
118
- new_body.push(output)
119
- next
120
- end
69
+ if !wovn_ignored?(html_body) && !amp_page?(html_body)
70
+ html_converter = HtmlConverter.new(html_body, @store, headers)
121
71
 
122
- if must_translate?(d, values)
123
- output = lang.switch_dom_lang(d, @store, values, url, headers)
72
+ if needs_api?(html_body, headers)
73
+ converted_html, marker = html_converter.build_api_compatible_html
74
+ translated_content = ApiTranslator.new(@store, headers).translate(converted_html)
75
+ translated_body.push(marker.revert(translated_content))
124
76
  else
125
- ScriptReplacer.new(@store).replace(d, lang) if d.html?
126
- output = d.to_html(save_with: 0)
77
+ string_body = html_converter.build if html_body.html?
78
+ translated_body.push(string_body)
127
79
  end
128
- put_back_noscripts!(output, noscripts)
129
- new_body.push(output)
80
+ else
81
+ translated_body.push(string_body)
130
82
  end
83
+
131
84
  body.close if body.respond_to?(:close)
132
- new_body
85
+ translated_body
133
86
  end
134
87
 
135
88
  private
@@ -139,21 +92,13 @@ module Wovnrb
139
92
  [status, res_headers, body]
140
93
  end
141
94
 
142
- def must_translate?(dom, values)
143
- can_translate = dom.html? ? true : @store.settings['translate_fragment']
144
-
145
- can_translate && have_data?(values)
146
- end
147
-
148
- def have_data?(values)
149
- values.count > 0
95
+ def needs_api?(html_body, headers)
96
+ headers.lang_code != @store.settings['default_lang'] &&
97
+ (html_body.html? || @store.settings['translate_fragment'])
150
98
  end
151
99
 
152
- def put_back_noscripts!(output, noscripts)
153
- noscripts.each_with_index do |noscript, index|
154
- noscript_identifier = "<noscript wovn-id=\"#{index}\"></noscript>"
155
- output.sub!(noscript_identifier, noscript)
156
- end
100
+ def wovn_ignored?(html_body)
101
+ !html_body.xpath('//html[@wovn-ignore]').empty?
157
102
  end
158
103
 
159
104
  # Checks if a given HTML body is an Accelerated Mobile Page (AMP).
@@ -163,10 +108,10 @@ module Wovnrb
163
108
  # @param {Nokogiri::HTML5::Document} body The HTML body to check.
164
109
  #
165
110
  # @returns {Boolean} True is the HTML body is an AMP, false otherwise.
166
- def is_amp_page?(body)
167
- html_attributes = body.xpath('//html')[0].try(:attributes) || {}
111
+ def amp_page?(html_body)
112
+ html_attributes = html_body.xpath('//html')[0].try(:attributes) || {}
168
113
 
169
- html_attributes['amp'] || html_attributes["\u26A1"]
114
+ !!(html_attributes['amp'] || html_attributes["\u26A1"])
170
115
  end
171
116
  end
172
117
  end