nokogiri 1.8.5 → 1.15.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (358) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +40 -18
  3. data/LICENSE-DEPENDENCIES.md +1636 -1024
  4. data/LICENSE.md +5 -28
  5. data/README.md +203 -90
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +33 -61
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +867 -417
  10. data/ext/nokogiri/gumbo.c +594 -0
  11. data/ext/nokogiri/html4_document.c +165 -0
  12. data/ext/nokogiri/html4_element_description.c +299 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +108 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +251 -105
  18. data/ext/nokogiri/nokogiri.h +215 -90
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +42 -37
  21. data/ext/nokogiri/xml_attribute_decl.c +22 -22
  22. data/ext/nokogiri/xml_cdata.c +40 -31
  23. data/ext/nokogiri/xml_comment.c +20 -27
  24. data/ext/nokogiri/xml_document.c +401 -237
  25. data/ext/nokogiri/xml_document_fragment.c +13 -17
  26. data/ext/nokogiri/xml_dtd.c +64 -58
  27. data/ext/nokogiri/xml_element_content.c +63 -55
  28. data/ext/nokogiri/xml_element_decl.c +31 -31
  29. data/ext/nokogiri/xml_encoding_handler.c +54 -21
  30. data/ext/nokogiri/xml_entity_decl.c +37 -35
  31. data/ext/nokogiri/xml_entity_reference.c +17 -19
  32. data/ext/nokogiri/xml_namespace.c +136 -62
  33. data/ext/nokogiri/xml_node.c +1387 -678
  34. data/ext/nokogiri/xml_node_set.c +246 -216
  35. data/ext/nokogiri/xml_processing_instruction.c +18 -20
  36. data/ext/nokogiri/xml_reader.c +347 -212
  37. data/ext/nokogiri/xml_relax_ng.c +86 -77
  38. data/ext/nokogiri/xml_sax_parser.c +149 -124
  39. data/ext/nokogiri/xml_sax_parser_context.c +145 -103
  40. data/ext/nokogiri/xml_sax_push_parser.c +64 -36
  41. data/ext/nokogiri/xml_schema.c +138 -81
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +36 -26
  44. data/ext/nokogiri/xml_xpath_context.c +366 -178
  45. data/ext/nokogiri/xslt_stylesheet.c +335 -189
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +111 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +630 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +103 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/insertion_mode.h +33 -0
  63. data/gumbo-parser/src/macros.h +91 -0
  64. data/gumbo-parser/src/nokogiri_gumbo.h +944 -0
  65. data/gumbo-parser/src/parser.c +4891 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +223 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +170 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +66 -0
  88. data/gumbo-parser/src/util.h +34 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -8
  93. data/lib/nokogiri/css/parser.rb +397 -377
  94. data/lib/nokogiri/css/parser.y +250 -245
  95. data/lib/nokogiri/css/parser_extras.rb +54 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +224 -95
  100. data/lib/nokogiri/css.rb +56 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/encoding_handler.rb +57 -0
  103. data/lib/nokogiri/extension.rb +32 -0
  104. data/lib/nokogiri/gumbo.rb +15 -0
  105. data/lib/nokogiri/html.rb +38 -27
  106. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  107. data/lib/nokogiri/html4/document.rb +214 -0
  108. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  109. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  110. data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
  111. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  112. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  113. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  114. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  115. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  116. data/lib/nokogiri/html4.rb +47 -0
  117. data/lib/nokogiri/html5/document.rb +168 -0
  118. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  119. data/lib/nokogiri/html5/node.rb +103 -0
  120. data/lib/nokogiri/html5.rb +392 -0
  121. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  122. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  123. data/lib/nokogiri/syntax_error.rb +2 -0
  124. data/lib/nokogiri/version/constant.rb +6 -0
  125. data/lib/nokogiri/version/info.rb +223 -0
  126. data/lib/nokogiri/version.rb +3 -108
  127. data/lib/nokogiri/xml/attr.rb +55 -3
  128. data/lib/nokogiri/xml/attribute_decl.rb +6 -2
  129. data/lib/nokogiri/xml/builder.rb +98 -54
  130. data/lib/nokogiri/xml/cdata.rb +3 -1
  131. data/lib/nokogiri/xml/character_data.rb +2 -0
  132. data/lib/nokogiri/xml/document.rb +312 -126
  133. data/lib/nokogiri/xml/document_fragment.rb +104 -48
  134. data/lib/nokogiri/xml/dtd.rb +4 -2
  135. data/lib/nokogiri/xml/element_content.rb +12 -2
  136. data/lib/nokogiri/xml/element_decl.rb +6 -2
  137. data/lib/nokogiri/xml/entity_decl.rb +7 -3
  138. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  139. data/lib/nokogiri/xml/namespace.rb +45 -0
  140. data/lib/nokogiri/xml/node/save_options.rb +23 -8
  141. data/lib/nokogiri/xml/node.rb +1093 -411
  142. data/lib/nokogiri/xml/node_set.rb +173 -67
  143. data/lib/nokogiri/xml/notation.rb +13 -0
  144. data/lib/nokogiri/xml/parse_options.rb +145 -52
  145. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  146. data/lib/nokogiri/xml/pp/node.rb +42 -30
  147. data/lib/nokogiri/xml/pp.rb +4 -2
  148. data/lib/nokogiri/xml/processing_instruction.rb +4 -1
  149. data/lib/nokogiri/xml/reader.rb +21 -28
  150. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  151. data/lib/nokogiri/xml/sax/document.rb +45 -49
  152. data/lib/nokogiri/xml/sax/parser.rb +39 -36
  153. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  154. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  155. data/lib/nokogiri/xml/sax.rb +6 -4
  156. data/lib/nokogiri/xml/schema.rb +19 -9
  157. data/lib/nokogiri/xml/searchable.rb +120 -72
  158. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  159. data/lib/nokogiri/xml/text.rb +2 -0
  160. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  161. data/lib/nokogiri/xml/xpath.rb +15 -4
  162. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  163. data/lib/nokogiri/xml.rb +38 -37
  164. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  165. data/lib/nokogiri/xslt.rb +101 -22
  166. data/lib/nokogiri.rb +59 -75
  167. data/lib/xsd/xmlparser/nokogiri.rb +29 -25
  168. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  169. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  170. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  171. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  172. data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
  173. data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
  174. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  175. data/ports/archives/libxml2-2.11.4.tar.xz +0 -0
  176. data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
  177. metadata +126 -399
  178. data/.autotest +0 -22
  179. data/.cross_rubies +0 -8
  180. data/.editorconfig +0 -17
  181. data/.gemtest +0 -0
  182. data/.travis.yml +0 -63
  183. data/CHANGELOG.md +0 -1368
  184. data/CONTRIBUTING.md +0 -42
  185. data/C_CODING_STYLE.rdoc +0 -33
  186. data/Gemfile-libxml-ruby +0 -3
  187. data/Manifest.txt +0 -370
  188. data/ROADMAP.md +0 -111
  189. data/Rakefile +0 -348
  190. data/SECURITY.md +0 -19
  191. data/STANDARD_RESPONSES.md +0 -47
  192. data/Y_U_NO_GEMSPEC.md +0 -155
  193. data/appveyor.yml +0 -29
  194. data/build_all +0 -44
  195. data/ext/nokogiri/html_document.c +0 -170
  196. data/ext/nokogiri/html_document.h +0 -10
  197. data/ext/nokogiri/html_element_description.c +0 -279
  198. data/ext/nokogiri/html_element_description.h +0 -10
  199. data/ext/nokogiri/html_entity_lookup.c +0 -32
  200. data/ext/nokogiri/html_entity_lookup.h +0 -8
  201. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  202. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  203. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  204. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  205. data/ext/nokogiri/xml_attr.h +0 -9
  206. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  207. data/ext/nokogiri/xml_cdata.h +0 -9
  208. data/ext/nokogiri/xml_comment.h +0 -9
  209. data/ext/nokogiri/xml_document.h +0 -23
  210. data/ext/nokogiri/xml_document_fragment.h +0 -10
  211. data/ext/nokogiri/xml_dtd.h +0 -10
  212. data/ext/nokogiri/xml_element_content.h +0 -10
  213. data/ext/nokogiri/xml_element_decl.h +0 -9
  214. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  215. data/ext/nokogiri/xml_entity_decl.h +0 -10
  216. data/ext/nokogiri/xml_entity_reference.h +0 -9
  217. data/ext/nokogiri/xml_io.c +0 -61
  218. data/ext/nokogiri/xml_io.h +0 -11
  219. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  220. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  221. data/ext/nokogiri/xml_namespace.h +0 -15
  222. data/ext/nokogiri/xml_node.h +0 -13
  223. data/ext/nokogiri/xml_node_set.h +0 -12
  224. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  225. data/ext/nokogiri/xml_reader.h +0 -10
  226. data/ext/nokogiri/xml_relax_ng.h +0 -9
  227. data/ext/nokogiri/xml_sax_parser.h +0 -39
  228. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  229. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  230. data/ext/nokogiri/xml_schema.h +0 -9
  231. data/ext/nokogiri/xml_syntax_error.h +0 -13
  232. data/ext/nokogiri/xml_text.h +0 -9
  233. data/ext/nokogiri/xml_xpath_context.h +0 -10
  234. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  235. data/lib/nokogiri/html/document.rb +0 -335
  236. data/lib/nokogiri/html/document_fragment.rb +0 -49
  237. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  238. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  239. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  240. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  241. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  242. data/patches/sort-patches-by-date +0 -25
  243. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  244. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  245. data/suppressions/README.txt +0 -1
  246. data/suppressions/nokogiri_ruby-2.supp +0 -10
  247. data/tasks/test.rb +0 -100
  248. data/test/css/test_nthiness.rb +0 -226
  249. data/test/css/test_parser.rb +0 -386
  250. data/test/css/test_tokenizer.rb +0 -215
  251. data/test/css/test_xpath_visitor.rb +0 -96
  252. data/test/decorators/test_slop.rb +0 -23
  253. data/test/files/2ch.html +0 -108
  254. data/test/files/GH_1042.html +0 -18
  255. data/test/files/address_book.rlx +0 -12
  256. data/test/files/address_book.xml +0 -10
  257. data/test/files/atom.xml +0 -344
  258. data/test/files/bar/bar.xsd +0 -4
  259. data/test/files/bogus.xml +0 -0
  260. data/test/files/dont_hurt_em_why.xml +0 -422
  261. data/test/files/encoding.html +0 -82
  262. data/test/files/encoding.xhtml +0 -84
  263. data/test/files/exslt.xml +0 -8
  264. data/test/files/exslt.xslt +0 -35
  265. data/test/files/foo/foo.xsd +0 -4
  266. data/test/files/metacharset.html +0 -10
  267. data/test/files/namespace_pressure_test.xml +0 -1684
  268. data/test/files/noencoding.html +0 -47
  269. data/test/files/po.xml +0 -32
  270. data/test/files/po.xsd +0 -66
  271. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  272. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  273. data/test/files/saml/xenc_schema.xsd +0 -146
  274. data/test/files/saml/xmldsig_schema.xsd +0 -318
  275. data/test/files/shift_jis.html +0 -10
  276. data/test/files/shift_jis.xml +0 -5
  277. data/test/files/shift_jis_no_charset.html +0 -9
  278. data/test/files/slow-xpath.xml +0 -25509
  279. data/test/files/snuggles.xml +0 -3
  280. data/test/files/staff.dtd +0 -10
  281. data/test/files/staff.xml +0 -59
  282. data/test/files/staff.xslt +0 -32
  283. data/test/files/test_document_url/bar.xml +0 -2
  284. data/test/files/test_document_url/document.dtd +0 -4
  285. data/test/files/test_document_url/document.xml +0 -6
  286. data/test/files/tlm.html +0 -851
  287. data/test/files/to_be_xincluded.xml +0 -2
  288. data/test/files/valid_bar.xml +0 -2
  289. data/test/files/xinclude.xml +0 -4
  290. data/test/helper.rb +0 -271
  291. data/test/html/sax/test_parser.rb +0 -168
  292. data/test/html/sax/test_parser_context.rb +0 -46
  293. data/test/html/sax/test_parser_text.rb +0 -163
  294. data/test/html/sax/test_push_parser.rb +0 -87
  295. data/test/html/test_attributes.rb +0 -85
  296. data/test/html/test_builder.rb +0 -164
  297. data/test/html/test_document.rb +0 -712
  298. data/test/html/test_document_encoding.rb +0 -143
  299. data/test/html/test_document_fragment.rb +0 -310
  300. data/test/html/test_element_description.rb +0 -105
  301. data/test/html/test_named_characters.rb +0 -14
  302. data/test/html/test_node.rb +0 -212
  303. data/test/html/test_node_encoding.rb +0 -91
  304. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  305. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  306. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  307. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  308. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  309. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  310. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  311. data/test/test_convert_xpath.rb +0 -135
  312. data/test/test_css_cache.rb +0 -47
  313. data/test/test_encoding_handler.rb +0 -48
  314. data/test/test_memory_leak.rb +0 -156
  315. data/test/test_nokogiri.rb +0 -138
  316. data/test/test_soap4r_sax.rb +0 -52
  317. data/test/test_xslt_transforms.rb +0 -314
  318. data/test/xml/node/test_save_options.rb +0 -28
  319. data/test/xml/node/test_subclass.rb +0 -44
  320. data/test/xml/sax/test_parser.rb +0 -402
  321. data/test/xml/sax/test_parser_context.rb +0 -115
  322. data/test/xml/sax/test_parser_text.rb +0 -202
  323. data/test/xml/sax/test_push_parser.rb +0 -265
  324. data/test/xml/test_attr.rb +0 -74
  325. data/test/xml/test_attribute_decl.rb +0 -86
  326. data/test/xml/test_builder.rb +0 -341
  327. data/test/xml/test_c14n.rb +0 -180
  328. data/test/xml/test_cdata.rb +0 -54
  329. data/test/xml/test_comment.rb +0 -40
  330. data/test/xml/test_document.rb +0 -982
  331. data/test/xml/test_document_encoding.rb +0 -31
  332. data/test/xml/test_document_fragment.rb +0 -298
  333. data/test/xml/test_dtd.rb +0 -187
  334. data/test/xml/test_dtd_encoding.rb +0 -31
  335. data/test/xml/test_element_content.rb +0 -56
  336. data/test/xml/test_element_decl.rb +0 -73
  337. data/test/xml/test_entity_decl.rb +0 -122
  338. data/test/xml/test_entity_reference.rb +0 -262
  339. data/test/xml/test_namespace.rb +0 -96
  340. data/test/xml/test_node.rb +0 -1325
  341. data/test/xml/test_node_attributes.rb +0 -115
  342. data/test/xml/test_node_encoding.rb +0 -75
  343. data/test/xml/test_node_inheritance.rb +0 -32
  344. data/test/xml/test_node_reparenting.rb +0 -592
  345. data/test/xml/test_node_set.rb +0 -809
  346. data/test/xml/test_parse_options.rb +0 -64
  347. data/test/xml/test_processing_instruction.rb +0 -30
  348. data/test/xml/test_reader.rb +0 -620
  349. data/test/xml/test_reader_encoding.rb +0 -134
  350. data/test/xml/test_relax_ng.rb +0 -60
  351. data/test/xml/test_schema.rb +0 -142
  352. data/test/xml/test_syntax_error.rb +0 -36
  353. data/test/xml/test_text.rb +0 -60
  354. data/test/xml/test_unparented_node.rb +0 -483
  355. data/test/xml/test_xinclude.rb +0 -83
  356. data/test/xml/test_xpath.rb +0 -470
  357. data/test/xslt/test_custom_functions.rb +0 -133
  358. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,335 +0,0 @@
1
- module Nokogiri
2
- module HTML
3
- class Document < Nokogiri::XML::Document
4
- ###
5
- # Get the meta tag encoding for this document. If there is no meta tag,
6
- # then nil is returned.
7
- def meta_encoding
8
- case
9
- when meta = at('//meta[@charset]')
10
- meta[:charset]
11
- when meta = meta_content_type
12
- meta['content'][/charset\s*=\s*([\w-]+)/i, 1]
13
- end
14
- end
15
-
16
- ###
17
- # Set the meta tag encoding for this document.
18
- #
19
- # If an meta encoding tag is already present, its content is
20
- # replaced with the given text.
21
- #
22
- # Otherwise, this method tries to create one at an appropriate
23
- # place supplying head and/or html elements as necessary, which
24
- # is inside a head element if any, and before any text node or
25
- # content element (typically <body>) if any.
26
- #
27
- # The result when trying to set an encoding that is different
28
- # from the document encoding is undefined.
29
- #
30
- # Beware in CRuby, that libxml2 automatically inserts a meta tag
31
- # into a head element.
32
- def meta_encoding= encoding
33
- case
34
- when meta = meta_content_type
35
- meta['content'] = 'text/html; charset=%s' % encoding
36
- encoding
37
- when meta = at('//meta[@charset]')
38
- meta['charset'] = encoding
39
- else
40
- meta = XML::Node.new('meta', self)
41
- if dtd = internal_subset and dtd.html5_dtd?
42
- meta['charset'] = encoding
43
- else
44
- meta['http-equiv'] = 'Content-Type'
45
- meta['content'] = 'text/html; charset=%s' % encoding
46
- end
47
-
48
- case
49
- when head = at('//head')
50
- head.prepend_child(meta)
51
- else
52
- set_metadata_element(meta)
53
- end
54
- encoding
55
- end
56
- end
57
-
58
- def meta_content_type
59
- xpath('//meta[@http-equiv and boolean(@content)]').find { |node|
60
- node['http-equiv'] =~ /\AContent-Type\z/i
61
- }
62
- end
63
- private :meta_content_type
64
-
65
- ###
66
- # Get the title string of this document. Return nil if there is
67
- # no title tag.
68
- def title
69
- title = at('//title') and title.inner_text
70
- end
71
-
72
- ###
73
- # Set the title string of this document.
74
- #
75
- # If a title element is already present, its content is replaced
76
- # with the given text.
77
- #
78
- # Otherwise, this method tries to create one at an appropriate
79
- # place supplying head and/or html elements as necessary, which
80
- # is inside a head element if any, right after a meta
81
- # encoding/charset tag if any, and before any text node or
82
- # content element (typically <body>) if any.
83
- def title=(text)
84
- tnode = XML::Text.new(text, self)
85
- if title = at('//title')
86
- title.children = tnode
87
- return text
88
- end
89
-
90
- title = XML::Node.new('title', self) << tnode
91
- case
92
- when head = at('//head')
93
- head << title
94
- when meta = at('//meta[@charset]') || meta_content_type
95
- # better put after charset declaration
96
- meta.add_next_sibling(title)
97
- else
98
- set_metadata_element(title)
99
- end
100
- text
101
- end
102
-
103
- def set_metadata_element(element)
104
- case
105
- when head = at('//head')
106
- head << element
107
- when html = at('//html')
108
- head = html.prepend_child(XML::Node.new('head', self))
109
- head.prepend_child(element)
110
- when first = children.find { |node|
111
- case node
112
- when XML::Element, XML::Text
113
- true
114
- end
115
- }
116
- # We reach here only if the underlying document model
117
- # allows <html>/<head> elements to be omitted and does not
118
- # automatically supply them.
119
- first.add_previous_sibling(element)
120
- else
121
- html = add_child(XML::Node.new('html', self))
122
- head = html.add_child(XML::Node.new('head', self))
123
- head.prepend_child(element)
124
- end
125
- end
126
- private :set_metadata_element
127
-
128
- ####
129
- # Serialize Node using +options+. Save options can also be set using a
130
- # block. See SaveOptions.
131
- #
132
- # These two statements are equivalent:
133
- #
134
- # node.serialize(:encoding => 'UTF-8', :save_with => FORMAT | AS_XML)
135
- #
136
- # or
137
- #
138
- # node.serialize(:encoding => 'UTF-8') do |config|
139
- # config.format.as_xml
140
- # end
141
- #
142
- def serialize options = {}
143
- options[:save_with] ||= XML::Node::SaveOptions::DEFAULT_HTML
144
- super
145
- end
146
-
147
- ####
148
- # Create a Nokogiri::XML::DocumentFragment from +tags+
149
- def fragment tags = nil
150
- DocumentFragment.new(self, tags, self.root)
151
- end
152
-
153
- class << self
154
- ###
155
- # Parse HTML. +string_or_io+ may be a String, or any object that
156
- # responds to _read_ and _close_ such as an IO, or StringIO.
157
- # +url+ is resource where this document is located. +encoding+ is the
158
- # encoding that should be used when processing the document. +options+
159
- # is a number that sets options in the parser, such as
160
- # Nokogiri::XML::ParseOptions::RECOVER. See the constants in
161
- # Nokogiri::XML::ParseOptions.
162
- def parse string_or_io, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML
163
-
164
- options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
165
- # Give the options to the user
166
- yield options if block_given?
167
-
168
- if string_or_io.respond_to?(:encoding)
169
- unless string_or_io.encoding.name == "ASCII-8BIT"
170
- encoding ||= string_or_io.encoding.name
171
- end
172
- end
173
-
174
- if string_or_io.respond_to?(:read)
175
- url ||= string_or_io.respond_to?(:path) ? string_or_io.path : nil
176
- unless encoding
177
- # Libxml2's parser has poor support for encoding
178
- # detection. First, it does not recognize the HTML5
179
- # style meta charset declaration. Secondly, even if it
180
- # successfully detects an encoding hint, it does not
181
- # re-decode or re-parse the preceding part which may be
182
- # garbled.
183
- #
184
- # EncodingReader aims to perform advanced encoding
185
- # detection beyond what Libxml2 does, and to emulate
186
- # rewinding of a stream and make Libxml2 redo parsing
187
- # from the start when an encoding hint is found.
188
- string_or_io = EncodingReader.new(string_or_io)
189
- begin
190
- return read_io(string_or_io, url, encoding, options.to_i)
191
- rescue EncodingFound => e
192
- encoding = e.found_encoding
193
- end
194
- end
195
- return read_io(string_or_io, url, encoding, options.to_i)
196
- end
197
-
198
- # read_memory pukes on empty docs
199
- if string_or_io.nil? or string_or_io.empty?
200
- return encoding ? new.tap { |i| i.encoding = encoding } : new
201
- end
202
-
203
- encoding ||= EncodingReader.detect_encoding(string_or_io)
204
-
205
- read_memory(string_or_io, url, encoding, options.to_i)
206
- end
207
- end
208
-
209
- class EncodingFound < StandardError # :nodoc:
210
- attr_reader :found_encoding
211
-
212
- def initialize(encoding)
213
- @found_encoding = encoding
214
- super("encoding found: %s" % encoding)
215
- end
216
- end
217
-
218
- class EncodingReader # :nodoc:
219
- class SAXHandler < Nokogiri::XML::SAX::Document # :nodoc:
220
- attr_reader :encoding
221
-
222
- def initialize
223
- @encoding = nil
224
- super()
225
- end
226
-
227
- def start_element(name, attrs = [])
228
- return unless name == 'meta'
229
- attr = Hash[attrs]
230
- charset = attr['charset'] and
231
- @encoding = charset
232
- http_equiv = attr['http-equiv'] and
233
- http_equiv.match(/\AContent-Type\z/i) and
234
- content = attr['content'] and
235
- m = content.match(/;\s*charset\s*=\s*([\w-]+)/) and
236
- @encoding = m[1]
237
- end
238
- end
239
-
240
- class JumpSAXHandler < SAXHandler
241
- def initialize(jumptag)
242
- @jumptag = jumptag
243
- super()
244
- end
245
-
246
- def start_element(name, attrs = [])
247
- super
248
- throw @jumptag, @encoding if @encoding
249
- throw @jumptag, nil if name =~ /\A(?:div|h1|img|p|br)\z/
250
- end
251
- end
252
-
253
- def self.detect_encoding(chunk)
254
- if Nokogiri.jruby? && EncodingReader.is_jruby_without_fix?
255
- return EncodingReader.detect_encoding_for_jruby_without_fix(chunk)
256
- end
257
- m = chunk.match(/\A(<\?xml[ \t\r\n]+[^>]*>)/) and
258
- return Nokogiri.XML(m[1]).encoding
259
-
260
- if Nokogiri.jruby?
261
- m = chunk.match(/(<meta\s)(.*)(charset\s*=\s*([\w-]+))(.*)/i) and
262
- return m[4]
263
- catch(:encoding_found) {
264
- Nokogiri::HTML::SAX::Parser.new(JumpSAXHandler.new(:encoding_found)).parse(chunk)
265
- nil
266
- }
267
- else
268
- handler = SAXHandler.new
269
- parser = Nokogiri::HTML::SAX::PushParser.new(handler)
270
- parser << chunk rescue Nokogiri::SyntaxError
271
- handler.encoding
272
- end
273
- end
274
-
275
- def self.is_jruby_without_fix?
276
- JRUBY_VERSION.split('.').join.to_i < 165
277
- end
278
-
279
- def self.detect_encoding_for_jruby_without_fix(chunk)
280
- m = chunk.match(/\A(<\?xml[ \t\r\n]+[^>]*>)/) and
281
- return Nokogiri.XML(m[1]).encoding
282
-
283
- m = chunk.match(/(<meta\s)(.*)(charset\s*=\s*([\w-]+))(.*)/i) and
284
- return m[4]
285
-
286
- catch(:encoding_found) {
287
- Nokogiri::HTML::SAX::Parser.new(JumpSAXHandler.new(:encoding_found.to_s)).parse(chunk)
288
- nil
289
- }
290
- rescue Nokogiri::SyntaxError, RuntimeError
291
- # Ignore parser errors that nokogiri may raise
292
- nil
293
- end
294
-
295
- def initialize(io)
296
- @io = io
297
- @firstchunk = nil
298
- @encoding_found = nil
299
- end
300
-
301
- # This method is used by the C extension so that
302
- # Nokogiri::HTML::Document#read_io() does not leak memory when
303
- # EncodingFound is raised.
304
- attr_reader :encoding_found
305
-
306
- def read(len)
307
- # no support for a call without len
308
-
309
- if !@firstchunk
310
- @firstchunk = @io.read(len) or return nil
311
-
312
- # This implementation expects that the first call from
313
- # htmlReadIO() is made with a length long enough (~1KB) to
314
- # achieve advanced encoding detection.
315
- if encoding = EncodingReader.detect_encoding(@firstchunk)
316
- # The first chunk is stored for the next read in retry.
317
- raise @encoding_found = EncodingFound.new(encoding)
318
- end
319
- end
320
- @encoding_found = nil
321
-
322
- ret = @firstchunk.slice!(0, len)
323
- if (len -= ret.length) > 0
324
- rest = @io.read(len) and ret << rest
325
- end
326
- if ret.empty?
327
- nil
328
- else
329
- ret
330
- end
331
- end
332
- end
333
- end
334
- end
335
- end
@@ -1,49 +0,0 @@
1
- module Nokogiri
2
- module HTML
3
- class DocumentFragment < Nokogiri::XML::DocumentFragment
4
- ####
5
- # Create a Nokogiri::XML::DocumentFragment from +tags+, using +encoding+
6
- def self.parse tags, encoding = nil
7
- doc = HTML::Document.new
8
-
9
- encoding ||= if tags.respond_to?(:encoding)
10
- encoding = tags.encoding
11
- if encoding == ::Encoding::ASCII_8BIT
12
- 'UTF-8'
13
- else
14
- encoding.name
15
- end
16
- else
17
- 'UTF-8'
18
- end
19
-
20
- doc.encoding = encoding
21
-
22
- new(doc, tags)
23
- end
24
-
25
- def initialize document, tags = nil, ctx = nil
26
- return self unless tags
27
-
28
- if ctx
29
- preexisting_errors = document.errors.dup
30
- node_set = ctx.parse("<div>#{tags}</div>")
31
- node_set.first.children.each { |child| child.parent = self } unless node_set.empty?
32
- self.errors = document.errors - preexisting_errors
33
- else
34
- # This is a horrible hack, but I don't care
35
- if tags.strip =~ /^<body/i
36
- path = "/html/body"
37
- else
38
- path = "/html/body/node()"
39
- end
40
-
41
- temp_doc = HTML::Document.parse "<html><body>#{tags}", nil, document.encoding
42
- temp_doc.xpath(path).each { |child| child.parent = self }
43
- self.errors = temp_doc.errors
44
- end
45
- children
46
- end
47
- end
48
- end
49
- end