nokogiri 1.6.8.1 → 1.13.4

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 (354) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +3 -20
  3. data/LICENSE-DEPENDENCIES.md +1903 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +197 -83
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +16 -22
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +751 -432
  10. data/ext/nokogiri/gumbo.c +584 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +120 -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 +228 -95
  18. data/ext/nokogiri/nokogiri.h +190 -98
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +49 -40
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +24 -23
  23. data/ext/nokogiri/xml_comment.c +19 -26
  24. data/ext/nokogiri/xml_document.c +291 -217
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +56 -50
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +22 -22
  29. data/ext/nokogiri/xml_encoding_handler.c +43 -18
  30. data/ext/nokogiri/xml_entity_decl.c +32 -30
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +61 -58
  33. data/ext/nokogiri/xml_node.c +1194 -729
  34. data/ext/nokogiri/xml_node_set.c +178 -165
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +226 -175
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +115 -114
  39. data/ext/nokogiri/xml_sax_parser_context.c +105 -86
  40. data/ext/nokogiri/xml_sax_push_parser.c +88 -35
  41. data/ext/nokogiri/xml_schema.c +112 -33
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +13 -17
  44. data/ext/nokogiri/xml_xpath_context.c +223 -115
  45. data/ext/nokogiri/xslt_stylesheet.c +265 -173
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +101 -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 +626 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +104 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/gumbo.h +943 -0
  63. data/gumbo-parser/src/insertion_mode.h +33 -0
  64. data/gumbo-parser/src/macros.h +91 -0
  65. data/gumbo-parser/src/parser.c +4875 -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 +222 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +169 -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 +68 -0
  88. data/gumbo-parser/src/util.h +30 -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 +410 -372
  94. data/lib/nokogiri/css/parser.y +260 -244
  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 +7 -6
  99. data/lib/nokogiri/css/xpath_visitor.rb +226 -92
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/extension.rb +31 -0
  103. data/lib/nokogiri/gumbo.rb +15 -0
  104. data/lib/nokogiri/html.rb +38 -27
  105. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  106. data/lib/nokogiri/{html → html4}/document.rb +104 -106
  107. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  108. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  109. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  110. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  111. data/lib/nokogiri/{html → html4}/sax/parser.rb +24 -13
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +91 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +100 -0
  118. data/lib/nokogiri/html5.rb +478 -0
  119. data/lib/nokogiri/jruby/dependencies.rb +21 -0
  120. data/lib/nokogiri/syntax_error.rb +2 -0
  121. data/lib/nokogiri/version/constant.rb +6 -0
  122. data/lib/nokogiri/version/info.rb +222 -0
  123. data/lib/nokogiri/version.rb +3 -107
  124. data/lib/nokogiri/xml/attr.rb +6 -3
  125. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  126. data/lib/nokogiri/xml/builder.rb +97 -53
  127. data/lib/nokogiri/xml/cdata.rb +3 -1
  128. data/lib/nokogiri/xml/character_data.rb +2 -0
  129. data/lib/nokogiri/xml/document.rb +231 -93
  130. data/lib/nokogiri/xml/document_fragment.rb +57 -44
  131. data/lib/nokogiri/xml/dtd.rb +4 -2
  132. data/lib/nokogiri/xml/element_content.rb +2 -0
  133. data/lib/nokogiri/xml/element_decl.rb +3 -1
  134. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  135. data/lib/nokogiri/xml/entity_reference.rb +20 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +10 -5
  138. data/lib/nokogiri/xml/node.rb +911 -337
  139. data/lib/nokogiri/xml/node_set.rb +141 -84
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +23 -9
  142. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  143. data/lib/nokogiri/xml/pp/node.rb +25 -26
  144. data/lib/nokogiri/xml/pp.rb +4 -2
  145. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  146. data/lib/nokogiri/xml/reader.rb +23 -28
  147. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  148. data/lib/nokogiri/xml/sax/document.rb +45 -49
  149. data/lib/nokogiri/xml/sax/parser.rb +43 -40
  150. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  151. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  152. data/lib/nokogiri/xml/sax.rb +6 -4
  153. data/lib/nokogiri/xml/schema.rb +19 -9
  154. data/lib/nokogiri/xml/searchable.rb +138 -89
  155. data/lib/nokogiri/xml/syntax_error.rb +26 -1
  156. data/lib/nokogiri/xml/text.rb +2 -0
  157. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  158. data/lib/nokogiri/xml/xpath.rb +15 -4
  159. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  160. data/lib/nokogiri/xml.rb +39 -37
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +29 -20
  163. data/lib/nokogiri.rb +49 -65
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  166. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  167. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  168. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +3040 -0
  171. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  172. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  173. data/patches/libxml2/0010-Revert-Different-approach-to-fix-quadratic-behavior.patch +45 -0
  174. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  175. data/ports/archives/libxml2-2.9.13.tar.xz +0 -0
  176. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  177. metadata +233 -258
  178. data/.autotest +0 -26
  179. data/.cross_rubies +0 -9
  180. data/.editorconfig +0 -17
  181. data/.gemtest +0 -0
  182. data/.travis.yml +0 -51
  183. data/CHANGELOG.rdoc +0 -1160
  184. data/CONTRIBUTING.md +0 -42
  185. data/C_CODING_STYLE.rdoc +0 -33
  186. data/LICENSE.txt +0 -31
  187. data/Manifest.txt +0 -364
  188. data/ROADMAP.md +0 -111
  189. data/Rakefile +0 -375
  190. data/STANDARD_RESPONSES.md +0 -47
  191. data/Y_U_NO_GEMSPEC.md +0 -155
  192. data/appveyor.yml +0 -22
  193. data/build_all +0 -45
  194. data/ext/nokogiri/html_document.c +0 -170
  195. data/ext/nokogiri/html_document.h +0 -10
  196. data/ext/nokogiri/html_element_description.c +0 -279
  197. data/ext/nokogiri/html_element_description.h +0 -10
  198. data/ext/nokogiri/html_entity_lookup.c +0 -32
  199. data/ext/nokogiri/html_entity_lookup.h +0 -8
  200. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  201. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  202. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  203. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  204. data/ext/nokogiri/xml_attr.h +0 -9
  205. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  206. data/ext/nokogiri/xml_cdata.h +0 -9
  207. data/ext/nokogiri/xml_comment.h +0 -9
  208. data/ext/nokogiri/xml_document.h +0 -23
  209. data/ext/nokogiri/xml_document_fragment.h +0 -10
  210. data/ext/nokogiri/xml_dtd.h +0 -10
  211. data/ext/nokogiri/xml_element_content.h +0 -10
  212. data/ext/nokogiri/xml_element_decl.h +0 -9
  213. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  214. data/ext/nokogiri/xml_entity_decl.h +0 -10
  215. data/ext/nokogiri/xml_entity_reference.h +0 -9
  216. data/ext/nokogiri/xml_io.c +0 -60
  217. data/ext/nokogiri/xml_io.h +0 -11
  218. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  219. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  220. data/ext/nokogiri/xml_namespace.h +0 -13
  221. data/ext/nokogiri/xml_node.h +0 -13
  222. data/ext/nokogiri/xml_node_set.h +0 -13
  223. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  224. data/ext/nokogiri/xml_reader.h +0 -10
  225. data/ext/nokogiri/xml_relax_ng.h +0 -9
  226. data/ext/nokogiri/xml_sax_parser.h +0 -39
  227. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  228. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  229. data/ext/nokogiri/xml_schema.h +0 -9
  230. data/ext/nokogiri/xml_syntax_error.h +0 -13
  231. data/ext/nokogiri/xml_text.h +0 -9
  232. data/ext/nokogiri/xml_xpath_context.h +0 -10
  233. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  234. data/lib/nokogiri/html/document_fragment.rb +0 -39
  235. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  236. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  237. data/patches/sort-patches-by-date +0 -25
  238. data/ports/archives/libxml2-2.9.4.tar.gz +0 -0
  239. data/ports/archives/libxslt-1.1.29.tar.gz +0 -0
  240. data/suppressions/README.txt +0 -1
  241. data/suppressions/nokogiri_ree-1.8.7.358.supp +0 -61
  242. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  243. data/suppressions/nokogiri_ruby-1.9.2.320.supp +0 -28
  244. data/suppressions/nokogiri_ruby-1.9.3.327.supp +0 -28
  245. data/tasks/test.rb +0 -100
  246. data/test/css/test_nthiness.rb +0 -226
  247. data/test/css/test_parser.rb +0 -369
  248. data/test/css/test_tokenizer.rb +0 -215
  249. data/test/css/test_xpath_visitor.rb +0 -96
  250. data/test/decorators/test_slop.rb +0 -20
  251. data/test/files/2ch.html +0 -108
  252. data/test/files/GH_1042.html +0 -18
  253. data/test/files/address_book.rlx +0 -12
  254. data/test/files/address_book.xml +0 -10
  255. data/test/files/atom.xml +0 -344
  256. data/test/files/bar/bar.xsd +0 -4
  257. data/test/files/bogus.xml +0 -0
  258. data/test/files/dont_hurt_em_why.xml +0 -422
  259. data/test/files/encoding.html +0 -82
  260. data/test/files/encoding.xhtml +0 -84
  261. data/test/files/exslt.xml +0 -8
  262. data/test/files/exslt.xslt +0 -35
  263. data/test/files/foo/foo.xsd +0 -4
  264. data/test/files/metacharset.html +0 -10
  265. data/test/files/namespace_pressure_test.xml +0 -1684
  266. data/test/files/noencoding.html +0 -47
  267. data/test/files/po.xml +0 -32
  268. data/test/files/po.xsd +0 -66
  269. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  270. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  271. data/test/files/saml/xenc_schema.xsd +0 -146
  272. data/test/files/saml/xmldsig_schema.xsd +0 -318
  273. data/test/files/shift_jis.html +0 -10
  274. data/test/files/shift_jis.xml +0 -5
  275. data/test/files/shift_jis_no_charset.html +0 -9
  276. data/test/files/slow-xpath.xml +0 -25509
  277. data/test/files/snuggles.xml +0 -3
  278. data/test/files/staff.dtd +0 -10
  279. data/test/files/staff.xml +0 -59
  280. data/test/files/staff.xslt +0 -32
  281. data/test/files/test_document_url/bar.xml +0 -2
  282. data/test/files/test_document_url/document.dtd +0 -4
  283. data/test/files/test_document_url/document.xml +0 -6
  284. data/test/files/tlm.html +0 -851
  285. data/test/files/to_be_xincluded.xml +0 -2
  286. data/test/files/valid_bar.xml +0 -2
  287. data/test/files/xinclude.xml +0 -4
  288. data/test/helper.rb +0 -181
  289. data/test/html/sax/test_parser.rb +0 -141
  290. data/test/html/sax/test_parser_context.rb +0 -46
  291. data/test/html/sax/test_push_parser.rb +0 -87
  292. data/test/html/test_builder.rb +0 -164
  293. data/test/html/test_document.rb +0 -701
  294. data/test/html/test_document_encoding.rb +0 -145
  295. data/test/html/test_document_fragment.rb +0 -301
  296. data/test/html/test_element_description.rb +0 -105
  297. data/test/html/test_named_characters.rb +0 -14
  298. data/test/html/test_node.rb +0 -212
  299. data/test/html/test_node_encoding.rb +0 -85
  300. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  301. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  302. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  303. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  304. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  305. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  306. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  307. data/test/test_convert_xpath.rb +0 -135
  308. data/test/test_css_cache.rb +0 -45
  309. data/test/test_encoding_handler.rb +0 -48
  310. data/test/test_memory_leak.rb +0 -156
  311. data/test/test_nokogiri.rb +0 -138
  312. data/test/test_soap4r_sax.rb +0 -52
  313. data/test/test_xslt_transforms.rb +0 -314
  314. data/test/xml/node/test_save_options.rb +0 -28
  315. data/test/xml/node/test_subclass.rb +0 -44
  316. data/test/xml/sax/test_parser.rb +0 -394
  317. data/test/xml/sax/test_parser_context.rb +0 -115
  318. data/test/xml/sax/test_push_parser.rb +0 -157
  319. data/test/xml/test_attr.rb +0 -67
  320. data/test/xml/test_attribute_decl.rb +0 -86
  321. data/test/xml/test_builder.rb +0 -341
  322. data/test/xml/test_c14n.rb +0 -180
  323. data/test/xml/test_cdata.rb +0 -48
  324. data/test/xml/test_comment.rb +0 -40
  325. data/test/xml/test_document.rb +0 -982
  326. data/test/xml/test_document_encoding.rb +0 -31
  327. data/test/xml/test_document_fragment.rb +0 -271
  328. data/test/xml/test_dtd.rb +0 -187
  329. data/test/xml/test_dtd_encoding.rb +0 -31
  330. data/test/xml/test_element_content.rb +0 -56
  331. data/test/xml/test_element_decl.rb +0 -73
  332. data/test/xml/test_entity_decl.rb +0 -122
  333. data/test/xml/test_entity_reference.rb +0 -251
  334. data/test/xml/test_namespace.rb +0 -96
  335. data/test/xml/test_node.rb +0 -1244
  336. data/test/xml/test_node_attributes.rb +0 -115
  337. data/test/xml/test_node_encoding.rb +0 -69
  338. data/test/xml/test_node_inheritance.rb +0 -32
  339. data/test/xml/test_node_reparenting.rb +0 -549
  340. data/test/xml/test_node_set.rb +0 -775
  341. data/test/xml/test_parse_options.rb +0 -64
  342. data/test/xml/test_processing_instruction.rb +0 -30
  343. data/test/xml/test_reader.rb +0 -589
  344. data/test/xml/test_reader_encoding.rb +0 -134
  345. data/test/xml/test_relax_ng.rb +0 -60
  346. data/test/xml/test_schema.rb +0 -142
  347. data/test/xml/test_syntax_error.rb +0 -30
  348. data/test/xml/test_text.rb +0 -60
  349. data/test/xml/test_unparented_node.rb +0 -440
  350. data/test/xml/test_xinclude.rb +0 -83
  351. data/test/xml/test_xpath.rb +0 -445
  352. data/test/xslt/test_custom_functions.rb +0 -133
  353. data/test/xslt/test_exception_handling.rb +0 -37
  354. data/test_all +0 -107
@@ -1,19 +1,23 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require "pathname"
5
+
1
6
  module Nokogiri
2
7
  module XML
3
- ##
4
- # Nokogiri::XML::Document is the main entry point for dealing with
5
- # XML documents. The Document is created by parsing an XML document.
6
- # See Nokogiri::XML::Document.parse() for more information on parsing.
8
+ # Nokogiri::XML::Document is the main entry point for dealing with XML documents. The Document
9
+ # is created by parsing an XML document. See Nokogiri::XML::Document.parse for more information
10
+ # on parsing.
7
11
  #
8
12
  # For searching a Document, see Nokogiri::XML::Searchable#css and
9
13
  # Nokogiri::XML::Searchable#xpath
10
- #
11
14
  class Document < Nokogiri::XML::Node
12
- # I'm ignoring unicode characters here.
13
- # See http://www.w3.org/TR/REC-xml-names/#ns-decl for more details.
15
+ # See http://www.w3.org/TR/REC-xml-names/#ns-decl for more details. Note that we're not
16
+ # attempting to handle unicode characters partly because libxml2 doesn't handle unicode
17
+ # characters in NCNAMEs.
14
18
  NCNAME_START_CHAR = "A-Za-z_"
15
- NCNAME_CHAR = NCNAME_START_CHAR + "\\-.0-9"
16
- NCNAME_RE = /^xmlns(:[#{NCNAME_START_CHAR}][#{NCNAME_CHAR}]*)?$/
19
+ NCNAME_CHAR = NCNAME_START_CHAR + "\\-\\.0-9"
20
+ NCNAME_RE = /^xmlns(?::([#{NCNAME_START_CHAR}][#{NCNAME_CHAR}]*))?$/
17
21
 
18
22
  ##
19
23
  # Parse an XML file.
@@ -33,28 +37,35 @@ module Nokogiri
33
37
  # +block+ (optional) is passed a configuration object on which
34
38
  # parse options may be set.
35
39
  #
36
- # When parsing untrusted documents, it's recommended that the
37
- # +nonet+ option be used, as shown in this example code:
38
- #
39
- # Nokogiri::XML::Document.parse(xml_string) { |config| config.nonet }
40
+ # By default, Nokogiri treats documents as untrusted, and so
41
+ # does not attempt to load DTDs or access the network. See
42
+ # Nokogiri::XML::ParseOptions for a complete list of options;
43
+ # and that module's DEFAULT_XML constant for what's set (and not
44
+ # set) by default.
40
45
  #
41
46
  # Nokogiri.XML() is a convenience method which will call this method.
42
47
  #
43
- def self.parse string_or_io, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML, &block
44
- options = Nokogiri::XML::ParseOptions.new(options) if Fixnum === options
45
- # Give the options to the user
48
+ def self.parse(string_or_io, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML)
49
+ options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
46
50
  yield options if block_given?
47
51
 
52
+ url ||= string_or_io.respond_to?(:path) ? string_or_io.path : nil
53
+
48
54
  if empty_doc?(string_or_io)
49
55
  if options.strict?
50
- raise Nokogiri::XML::SyntaxError.new("Empty document")
56
+ raise Nokogiri::XML::SyntaxError, "Empty document"
51
57
  else
52
58
  return encoding ? new.tap { |i| i.encoding = encoding } : new
53
59
  end
54
60
  end
55
61
 
56
62
  doc = if string_or_io.respond_to?(:read)
57
- url ||= string_or_io.respond_to?(:path) ? string_or_io.path : nil
63
+ if string_or_io.is_a?(Pathname)
64
+ # resolve the Pathname to the file and open it as an IO object, see #2110
65
+ string_or_io = string_or_io.expand_path.open
66
+ url ||= string_or_io.path
67
+ end
68
+
58
69
  read_io(string_or_io, url, encoding, options.to_i)
59
70
  else
60
71
  # read_memory pukes on empty docs
@@ -64,68 +75,192 @@ module Nokogiri
64
75
  # do xinclude processing
65
76
  doc.do_xinclude(options) if options.xinclude?
66
77
 
67
- return doc
78
+ doc
68
79
  end
69
80
 
70
- # A list of Nokogiri::XML::SyntaxError found when parsing a document
81
+ ##
82
+ # :singleton-method: wrap
83
+ # :call-seq: wrap(java_document) → Nokogiri::XML::Document
84
+ #
85
+ # ⚠ This method is only available when running JRuby.
86
+ #
87
+ # Create a Document using an existing Java DOM document object.
88
+ #
89
+ # The returned Document shares the same underlying data structure as the Java object, so
90
+ # changes in one are reflected in the other.
91
+ #
92
+ # [Parameters]
93
+ # - `java_document` (Java::OrgW3cDom::Document)
94
+ # (The class `Java::OrgW3cDom::Document` is also accessible as `org.w3c.dom.Document`.)
95
+ #
96
+ # [Returns] Nokogiri::XML::Document
97
+ #
98
+ # See also \#to_java
99
+
100
+ # :method: to_java
101
+ # :call-seq: to_java() → Java::OrgW3cDom::Document
102
+ #
103
+ # ⚠ This method is only available when running JRuby.
104
+ #
105
+ # Returns the underlying Java DOM document object for this document.
106
+ #
107
+ # The returned Java object shares the same underlying data structure as this document, so
108
+ # changes in one are reflected in the other.
109
+ #
110
+ # [Returns]
111
+ # Java::OrgW3cDom::Document
112
+ # (The class `Java::OrgW3cDom::Document` is also accessible as `org.w3c.dom.Document`.)
113
+ #
114
+ # See also Document.wrap
115
+
116
+ # The errors found while parsing a document.
117
+ #
118
+ # [Returns] Array<Nokogiri::XML::SyntaxError>
71
119
  attr_accessor :errors
72
120
 
73
- def initialize *args # :nodoc:
121
+ # When `true`, reparented elements without a namespace will inherit their new parent's
122
+ # namespace (if one exists). Defaults to `false`.
123
+ #
124
+ # [Returns] Boolean
125
+ #
126
+ # *Example:* Default behavior of namespace inheritance
127
+ #
128
+ # xml = <<~EOF
129
+ # <root xmlns:foo="http://nokogiri.org/default_ns/test/foo">
130
+ # <foo:parent>
131
+ # </foo:parent>
132
+ # </root>
133
+ # EOF
134
+ # doc = Nokogiri::XML(xml)
135
+ # parent = doc.at_xpath("//foo:parent", "foo" => "http://nokogiri.org/default_ns/test/foo")
136
+ # parent.add_child("<child></child>")
137
+ # doc.to_xml
138
+ # # => <?xml version="1.0"?>
139
+ # # <root xmlns:foo="http://nokogiri.org/default_ns/test/foo">
140
+ # # <foo:parent>
141
+ # # <child/>
142
+ # # </foo:parent>
143
+ # # </root>
144
+ #
145
+ # *Example:* Setting namespace inheritance to `true`
146
+ #
147
+ # xml = <<~EOF
148
+ # <root xmlns:foo="http://nokogiri.org/default_ns/test/foo">
149
+ # <foo:parent>
150
+ # </foo:parent>
151
+ # </root>
152
+ # EOF
153
+ # doc = Nokogiri::XML(xml)
154
+ # doc.namespace_inheritance = true
155
+ # parent = doc.at_xpath("//foo:parent", "foo" => "http://nokogiri.org/default_ns/test/foo")
156
+ # parent.add_child("<child></child>")
157
+ # doc.to_xml
158
+ # # => <?xml version="1.0"?>
159
+ # # <root xmlns:foo="http://nokogiri.org/default_ns/test/foo">
160
+ # # <foo:parent>
161
+ # # <foo:child/>
162
+ # # </foo:parent>
163
+ # # </root>
164
+ #
165
+ # Since v1.12.4
166
+ attr_accessor :namespace_inheritance
167
+
168
+ def initialize(*args) # :nodoc:
74
169
  @errors = []
75
170
  @decorators = nil
171
+ @namespace_inheritance = false
76
172
  end
77
173
 
78
- ##
79
- # Create an element with +name+, and optionally setting the content and attributes.
174
+ # :call-seq:
175
+ # create_element(name, *contents_or_attrs, &block) Nokogiri::XML::Element
176
+ #
177
+ # Create a new Element with `name` belonging to this document, optionally setting contents or
178
+ # attributes.
179
+ #
180
+ # This method is _not_ the most user-friendly option if your intention is to add a node to the
181
+ # document tree. Prefer one of the Nokogiri::XML::Node methods like Node#add_child,
182
+ # Node#add_next_sibling, Node#replace, etc. which will both create an element (or subtree) and
183
+ # place it in the document tree.
184
+ #
185
+ # Arguments may be passed to initialize the element:
186
+ #
187
+ # - a Hash argument will be used to set attributes
188
+ # - a non-Hash object that responds to \#to_s will be used to set the new node's contents
80
189
  #
81
- # doc.create_element "div" # <div></div>
82
- # doc.create_element "div", :class => "container" # <div class='container'></div>
83
- # doc.create_element "div", "contents" # <div>contents</div>
84
- # doc.create_element "div", "contents", :class => "container" # <div class='container'>contents</div>
85
- # doc.create_element "div" { |node| node['class'] = "container" } # <div class='container'></div>
190
+ # A block may be passed to mutate the node.
86
191
  #
87
- def create_element name, *args, &block
192
+ # [Parameters]
193
+ # - `name` (String)
194
+ # - `contents_or_attrs` (\#to_s, Hash)
195
+ # [Yields] `node` (Nokogiri::XML::Element)
196
+ # [Returns] Nokogiri::XML::Element
197
+ #
198
+ # *Example:* An empty element without attributes
199
+ #
200
+ # doc.create_element("div")
201
+ # # => <div></div>
202
+ #
203
+ # *Example:* An element with contents
204
+ #
205
+ # doc.create_element("div", "contents")
206
+ # # => <div>contents</div>
207
+ #
208
+ # *Example:* An element with attributes
209
+ #
210
+ # doc.create_element("div", {"class" => "container"})
211
+ # # => <div class='container'></div>
212
+ #
213
+ # *Example:* An element with contents and attributes
214
+ #
215
+ # doc.create_element("div", "contents", {"class" => "container"})
216
+ # # => <div class='container'>contents</div>
217
+ #
218
+ # *Example:* Passing a block to mutate the element
219
+ #
220
+ # doc.create_element("div") { |node| node["class"] = "blue" if before_noon? }
221
+ #
222
+ def create_element(name, *contents_or_attrs, &block)
88
223
  elm = Nokogiri::XML::Element.new(name, self, &block)
89
- args.each do |arg|
224
+ contents_or_attrs.each do |arg|
90
225
  case arg
91
226
  when Hash
92
- arg.each { |k,v|
227
+ arg.each do |k, v|
93
228
  key = k.to_s
94
229
  if key =~ NCNAME_RE
95
- ns_name = key.split(":", 2)[1]
96
- elm.add_namespace_definition ns_name, v
230
+ ns_name = Regexp.last_match(1)
231
+ elm.add_namespace_definition(ns_name, v)
97
232
  else
98
233
  elm[k.to_s] = v.to_s
99
234
  end
100
- }
235
+ end
101
236
  else
102
237
  elm.content = arg
103
238
  end
104
239
  end
105
- if ns = elm.namespace_definitions.find { |n| n.prefix.nil? or n.prefix == '' }
240
+ if (ns = elm.namespace_definitions.find { |n| n.prefix.nil? || (n.prefix == "") })
106
241
  elm.namespace = ns
107
242
  end
108
243
  elm
109
244
  end
110
245
 
111
246
  # Create a Text Node with +string+
112
- def create_text_node string, &block
113
- Nokogiri::XML::Text.new string.to_s, self, &block
247
+ def create_text_node(string, &block)
248
+ Nokogiri::XML::Text.new(string.to_s, self, &block)
114
249
  end
115
250
 
116
251
  # Create a CDATA Node containing +string+
117
- def create_cdata string, &block
118
- Nokogiri::XML::CDATA.new self, string.to_s, &block
252
+ def create_cdata(string, &block)
253
+ Nokogiri::XML::CDATA.new(self, string.to_s, &block)
119
254
  end
120
255
 
121
256
  # Create a Comment Node containing +string+
122
- def create_comment string, &block
123
- Nokogiri::XML::Comment.new self, string.to_s, &block
257
+ def create_comment(string, &block)
258
+ Nokogiri::XML::Comment.new(self, string.to_s, &block)
124
259
  end
125
260
 
126
261
  # The name of this document. Always returns "document"
127
262
  def name
128
- 'document'
263
+ "document"
129
264
  end
130
265
 
131
266
  # A reference to +self+
@@ -133,46 +268,51 @@ module Nokogiri
133
268
  self
134
269
  end
135
270
 
136
- ##
137
- # Recursively get all namespaces from this node and its subtree and
138
- # return them as a hash.
271
+ # :call-seq:
272
+ # collect_namespaces() Hash<String(Namespace#prefix) String(Namespace#href)>
139
273
  #
140
- # For example, given this document:
274
+ # Recursively get all namespaces from this node and its subtree and return them as a
275
+ # hash.
141
276
  #
142
- # <root xmlns:foo="bar">
277
+ # ⚠ This method will not handle duplicate namespace prefixes, since the return value is a hash.
278
+ #
279
+ # Note that this method does an xpath lookup for nodes with namespaces, and as a result the
280
+ # order (and which duplicate prefix "wins") may be dependent on the implementation of the
281
+ # underlying XML library.
282
+ #
283
+ # *Example:* Basic usage
284
+ #
285
+ # Given this document:
286
+ #
287
+ # <root xmlns="default" xmlns:foo="bar">
143
288
  # <bar xmlns:hello="world" />
144
289
  # </root>
145
290
  #
146
291
  # This method will return:
147
292
  #
148
- # { 'xmlns:foo' => 'bar', 'xmlns:hello' => 'world' }
293
+ # {"xmlns:foo"=>"bar", "xmlns"=>"default", "xmlns:hello"=>"world"}
149
294
  #
150
- # WARNING: this method will clobber duplicate names in the keys.
151
- # For example, given this document:
295
+ # *Example:* Duplicate prefixes
296
+ #
297
+ # Given this document:
152
298
  #
153
299
  # <root xmlns:foo="bar">
154
300
  # <bar xmlns:foo="baz" />
155
301
  # </root>
156
302
  #
157
- # The hash returned will look like this: { 'xmlns:foo' => 'bar' }
158
- #
159
- # Non-prefixed default namespaces (as in "xmlns=") are not included
160
- # in the hash.
303
+ # The hash returned will be something like:
161
304
  #
162
- # Note that this method does an xpath lookup for nodes with
163
- # namespaces, and as a result the order may be dependent on the
164
- # implementation of the underlying XML library.
305
+ # {"xmlns:foo" => "baz"}
165
306
  #
166
307
  def collect_namespaces
167
- xpath("//namespace::*").inject({}) do |hash, ns|
168
- hash[["xmlns",ns.prefix].compact.join(":")] = ns.href if ns.prefix != "xml"
169
- hash
308
+ xpath("//namespace::*").each_with_object({}) do |ns, hash|
309
+ hash[["xmlns", ns.prefix].compact.join(":")] = ns.href if ns.prefix != "xml"
170
310
  end
171
311
  end
172
312
 
173
313
  # Get the list of decorators given +key+
174
- def decorators key
175
- @decorators ||= Hash.new
314
+ def decorators(key)
315
+ @decorators ||= {}
176
316
  @decorators[key] ||= []
177
317
  end
178
318
 
@@ -181,7 +321,8 @@ module Nokogiri
181
321
  # the document or +nil+ when there is no DTD.
182
322
  def validate
183
323
  return nil unless internal_subset
184
- internal_subset.validate self
324
+
325
+ internal_subset.validate(self)
185
326
  end
186
327
 
187
328
  ##
@@ -201,7 +342,7 @@ module Nokogiri
201
342
  # ... which does absolutely nothing.
202
343
  #
203
344
  def slop!
204
- unless decorators(XML::Node).include? Nokogiri::Decorators::Slop
345
+ unless decorators(XML::Node).include?(Nokogiri::Decorators::Slop)
205
346
  decorators(XML::Node) << Nokogiri::Decorators::Slop
206
347
  decorate!
207
348
  end
@@ -211,16 +352,18 @@ module Nokogiri
211
352
 
212
353
  ##
213
354
  # Apply any decorators to +node+
214
- def decorate node
355
+ def decorate(node)
215
356
  return unless @decorators
216
- @decorators.each { |klass,list|
357
+
358
+ @decorators.each do |klass, list|
217
359
  next unless node.is_a?(klass)
360
+
218
361
  list.each { |moodule| node.extend(moodule) }
219
- }
362
+ end
220
363
  end
221
364
 
222
- alias :to_xml :serialize
223
- alias :clone :dup
365
+ alias_method :to_xml, :serialize
366
+ alias_method :clone, :dup
224
367
 
225
368
  # Get the hash of namespaces on the root Nokogiri::XML::Node
226
369
  def namespaces
@@ -230,52 +373,47 @@ module Nokogiri
230
373
  ##
231
374
  # Create a Nokogiri::XML::DocumentFragment from +tags+
232
375
  # Returns an empty fragment if +tags+ is nil.
233
- def fragment tags = nil
234
- DocumentFragment.new(self, tags, self.root)
376
+ def fragment(tags = nil)
377
+ DocumentFragment.new(self, tags, root)
235
378
  end
236
379
 
237
380
  undef_method :swap, :parent, :namespace, :default_namespace=
238
381
  undef_method :add_namespace_definition, :attributes
239
382
  undef_method :namespace_definitions, :line, :add_namespace
240
383
 
241
- def add_child node_or_tags
242
- raise "Document already has a root node" if root && root.name != 'nokogiri_text_wrapper'
384
+ def add_child(node_or_tags)
385
+ raise "A document may not have multiple root nodes." if (root && root.name != "nokogiri_text_wrapper") && !(node_or_tags.comment? || node_or_tags.processing_instruction?)
386
+
243
387
  node_or_tags = coerce(node_or_tags)
244
388
  if node_or_tags.is_a?(XML::NodeSet)
245
- raise "Document cannot have multiple root nodes" if node_or_tags.size > 1
389
+ raise "A document may not have multiple root nodes." if node_or_tags.size > 1
390
+
246
391
  super(node_or_tags.first)
247
392
  else
248
393
  super
249
394
  end
250
395
  end
251
- alias :<< :add_child
396
+ alias_method :<<, :add_child
252
397
 
253
- ##
254
- # +JRuby+
255
- # Wraps Java's org.w3c.dom.document and returns Nokogiri::XML::Document
256
- def self.wrap document
257
- raise "JRuby only method" unless Nokogiri.jruby?
258
- return wrapJavaDocument(document)
259
- end
260
-
261
- ##
262
- # +JRuby+
263
- # Returns Java's org.w3c.dom.document of this Document.
264
- def to_java
265
- raise "JRuby only method" unless Nokogiri.jruby?
266
- return toJavaDocument()
398
+ # :call-seq:
399
+ # xpath_doctype() → Nokogiri::CSS::XPathVisitor::DoctypeConfig
400
+ #
401
+ # [Returns] The document type which determines CSS-to-XPath translation.
402
+ #
403
+ # See XPathVisitor for more information.
404
+ def xpath_doctype
405
+ Nokogiri::CSS::XPathVisitor::DoctypeConfig::XML
267
406
  end
268
407
 
269
408
  private
270
- def self.empty_doc? string_or_io
409
+
410
+ def self.empty_doc?(string_or_io)
271
411
  string_or_io.nil? ||
272
412
  (string_or_io.respond_to?(:empty?) && string_or_io.empty?) ||
273
413
  (string_or_io.respond_to?(:eof?) && string_or_io.eof?)
274
414
  end
275
415
 
276
- def implied_xpath_contexts # :nodoc:
277
- ["//"]
278
- end
416
+ IMPLIED_XPATH_CONTEXTS = ["//"].freeze # :nodoc:
279
417
 
280
418
  def inspect_attributes
281
419
  [:name, :children]
@@ -1,34 +1,57 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class DocumentFragment < Nokogiri::XML::Node
6
+ ####
7
+ # Create a Nokogiri::XML::DocumentFragment from +tags+
8
+ def self.parse(tags, options = ParseOptions::DEFAULT_XML, &block)
9
+ new(XML::Document.new, tags, nil, options, &block)
10
+ end
11
+
4
12
  ##
5
13
  # Create a new DocumentFragment from +tags+.
6
14
  #
7
15
  # If +ctx+ is present, it is used as a context node for the
8
16
  # subtree created, e.g., namespaces will be resolved relative
9
17
  # to +ctx+.
10
- def initialize document, tags = nil, ctx = nil
18
+ def initialize(document, tags = nil, ctx = nil, options = ParseOptions::DEFAULT_XML)
11
19
  return self unless tags
12
20
 
21
+ options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
22
+ yield options if block_given?
23
+
13
24
  children = if ctx
14
- # Fix for issue#490
15
- if Nokogiri.jruby?
16
- # fix for issue #770
17
- ctx.parse("<root #{namespace_declarations(ctx)}>#{tags}</root>").children
18
- else
19
- ctx.parse(tags)
20
- end
21
- else
22
- XML::Document.parse("<root>#{tags}</root>") \
23
- .xpath("/root/node()")
24
- end
25
+ # Fix for issue#490
26
+ if Nokogiri.jruby?
27
+ # fix for issue #770
28
+ ctx.parse("<root #{namespace_declarations(ctx)}>#{tags}</root>", options).children
29
+ else
30
+ ctx.parse(tags, options)
31
+ end
32
+ else
33
+ wrapper_doc = XML::Document.parse("<root>#{tags}</root>", nil, nil, options)
34
+ self.errors = wrapper_doc.errors
35
+ wrapper_doc.xpath("/root/node()")
36
+ end
25
37
  children.each { |child| child.parent = self }
26
38
  end
27
39
 
40
+ if Nokogiri.uses_libxml?
41
+ def dup
42
+ new_document = document.dup
43
+ new_fragment = self.class.new(new_document)
44
+ children.each do |child|
45
+ child.dup(1, new_document).parent = new_fragment
46
+ end
47
+ new_fragment
48
+ end
49
+ end
50
+
28
51
  ###
29
52
  # return the name for DocumentFragment
30
53
  def name
31
- '#document-fragment'
54
+ "#document-fragment"
32
55
  end
33
56
 
34
57
  ###
@@ -40,10 +63,10 @@ module Nokogiri
40
63
  ###
41
64
  # Convert this DocumentFragment to html
42
65
  # See Nokogiri::XML::NodeSet#to_html
43
- def to_html *args
66
+ def to_html(*args)
44
67
  if Nokogiri.jruby?
45
68
  options = args.first.is_a?(Hash) ? args.shift : {}
46
- if !options[:save_with]
69
+ unless options[:save_with]
47
70
  options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
48
71
  end
49
72
  args.insert(0, options)
@@ -54,10 +77,10 @@ module Nokogiri
54
77
  ###
55
78
  # Convert this DocumentFragment to xhtml
56
79
  # See Nokogiri::XML::NodeSet#to_xhtml
57
- def to_xhtml *args
80
+ def to_xhtml(*args)
58
81
  if Nokogiri.jruby?
59
82
  options = args.first.is_a?(Hash) ? args.shift : {}
60
- if !options[:save_with]
83
+ unless options[:save_with]
61
84
  options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_XHTML
62
85
  end
63
86
  args.insert(0, options)
@@ -68,7 +91,7 @@ module Nokogiri
68
91
  ###
69
92
  # Convert this DocumentFragment to xml
70
93
  # See Nokogiri::XML::NodeSet#to_xml
71
- def to_xml *args
94
+ def to_xml(*args)
72
95
  children.to_xml(*args)
73
96
  end
74
97
 
@@ -79,7 +102,7 @@ module Nokogiri
79
102
  # selectors. For example:
80
103
  #
81
104
  # For more information see Nokogiri::XML::Searchable#css
82
- def css *args
105
+ def css(*args)
83
106
  if children.any?
84
107
  children.css(*args) # 'children' is a smell here
85
108
  else
@@ -98,51 +121,41 @@ module Nokogiri
98
121
  # Search this fragment for +paths+. +paths+ must be one or more XPath or CSS queries.
99
122
  #
100
123
  # For more information see Nokogiri::XML::Searchable#search
101
- def search *rules
124
+ def search(*rules)
102
125
  rules, handler, ns, binds = extract_params(rules)
103
126
 
104
127
  rules.inject(NodeSet.new(document)) do |set, rule|
105
- set += if rule =~ Searchable::LOOKS_LIKE_XPATH
106
- xpath(*([rule, ns, handler, binds].compact))
107
- else
108
- children.css(*([rule, ns, handler].compact)) # 'children' is a smell here
109
- end
128
+ set + if Searchable::LOOKS_LIKE_XPATH.match?(rule)
129
+ xpath(*[rule, ns, handler, binds].compact)
130
+ else
131
+ children.css(*[rule, ns, handler].compact) # 'children' is a smell here
132
+ end
110
133
  end
111
134
  end
112
135
 
113
- alias :serialize :to_s
114
-
115
- class << self
116
- ####
117
- # Create a Nokogiri::XML::DocumentFragment from +tags+
118
- def parse tags
119
- self.new(XML::Document.new, tags)
120
- end
121
- end
136
+ alias_method :serialize, :to_s
122
137
 
123
138
  # A list of Nokogiri::XML::SyntaxError found when parsing a document
124
139
  def errors
125
140
  document.errors
126
141
  end
127
142
 
128
- def errors= things # :nodoc:
143
+ def errors=(things) # :nodoc:
129
144
  document.errors = things
130
145
  end
131
146
 
147
+ def fragment(data)
148
+ document.fragment(data)
149
+ end
150
+
132
151
  private
133
152
 
134
153
  # fix for issue 770
135
- def namespace_declarations ctx
154
+ def namespace_declarations(ctx)
136
155
  ctx.namespace_scopes.map do |namespace|
137
156
  prefix = namespace.prefix.nil? ? "" : ":#{namespace.prefix}"
138
- %Q{xmlns#{prefix}="#{namespace.href}"}
139
- end.join ' '
140
- end
141
-
142
- def coerce data
143
- return super unless String === data
144
-
145
- document.fragment(data).children
157
+ %{xmlns#{prefix}="#{namespace.href}"}
158
+ end.join(" ")
146
159
  end
147
160
  end
148
161
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class DTD < Nokogiri::XML::Node
@@ -19,13 +21,13 @@ module Nokogiri
19
21
  end
20
22
 
21
23
  def html_dtd?
22
- name.casecmp('html').zero?
24
+ name.casecmp("html").zero?
23
25
  end
24
26
 
25
27
  def html5_dtd?
26
28
  html_dtd? &&
27
29
  external_id.nil? &&
28
- (system_id.nil? || system_id == 'about:legacy-compat')
30
+ (system_id.nil? || system_id == "about:legacy-compat")
29
31
  end
30
32
  end
31
33
  end