nokogiri 1.8.5 → 1.13.6

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 (356) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -21
  3. data/LICENSE-DEPENDENCIES.md +1159 -868
  4. data/LICENSE.md +5 -28
  5. data/README.md +196 -90
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +13 -59
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +750 -420
  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 +119 -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 -91
  18. data/ext/nokogiri/nokogiri.h +191 -89
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +41 -36
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +13 -18
  23. data/ext/nokogiri/xml_comment.c +19 -26
  24. data/ext/nokogiri/xml_document.c +291 -216
  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 -52
  33. data/ext/nokogiri/xml_node.c +1044 -616
  34. data/ext/nokogiri/xml_node_set.c +174 -162
  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 +112 -112
  39. data/ext/nokogiri/xml_sax_parser_context.c +112 -86
  40. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  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 +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 +218 -91
  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 +103 -105
  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 +17 -16
  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 -108
  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 +224 -86
  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 +2 -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 +895 -377
  139. data/lib/nokogiri/xml/node_set.rb +92 -65
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +22 -8
  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 +38 -34
  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 +112 -72
  155. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  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 +38 -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/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  174. data/ports/archives/libxml2-2.9.14.tar.xz +0 -0
  175. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  176. metadata +220 -266
  177. data/.autotest +0 -22
  178. data/.cross_rubies +0 -8
  179. data/.editorconfig +0 -17
  180. data/.gemtest +0 -0
  181. data/.travis.yml +0 -63
  182. data/CHANGELOG.md +0 -1368
  183. data/CONTRIBUTING.md +0 -42
  184. data/C_CODING_STYLE.rdoc +0 -33
  185. data/Gemfile-libxml-ruby +0 -3
  186. data/Manifest.txt +0 -370
  187. data/ROADMAP.md +0 -111
  188. data/Rakefile +0 -348
  189. data/SECURITY.md +0 -19
  190. data/STANDARD_RESPONSES.md +0 -47
  191. data/Y_U_NO_GEMSPEC.md +0 -155
  192. data/appveyor.yml +0 -29
  193. data/build_all +0 -44
  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 -61
  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 -15
  221. data/ext/nokogiri/xml_node.h +0 -13
  222. data/ext/nokogiri/xml_node_set.h +0 -12
  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 -49
  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/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  238. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  239. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  240. data/patches/sort-patches-by-date +0 -25
  241. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  242. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  243. data/suppressions/README.txt +0 -1
  244. data/suppressions/nokogiri_ruby-2.supp +0 -10
  245. data/tasks/test.rb +0 -100
  246. data/test/css/test_nthiness.rb +0 -226
  247. data/test/css/test_parser.rb +0 -386
  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 -23
  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 -271
  289. data/test/html/sax/test_parser.rb +0 -168
  290. data/test/html/sax/test_parser_context.rb +0 -46
  291. data/test/html/sax/test_parser_text.rb +0 -163
  292. data/test/html/sax/test_push_parser.rb +0 -87
  293. data/test/html/test_attributes.rb +0 -85
  294. data/test/html/test_builder.rb +0 -164
  295. data/test/html/test_document.rb +0 -712
  296. data/test/html/test_document_encoding.rb +0 -143
  297. data/test/html/test_document_fragment.rb +0 -310
  298. data/test/html/test_element_description.rb +0 -105
  299. data/test/html/test_named_characters.rb +0 -14
  300. data/test/html/test_node.rb +0 -212
  301. data/test/html/test_node_encoding.rb +0 -91
  302. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  303. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  304. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  305. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  306. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  307. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  308. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  309. data/test/test_convert_xpath.rb +0 -135
  310. data/test/test_css_cache.rb +0 -47
  311. data/test/test_encoding_handler.rb +0 -48
  312. data/test/test_memory_leak.rb +0 -156
  313. data/test/test_nokogiri.rb +0 -138
  314. data/test/test_soap4r_sax.rb +0 -52
  315. data/test/test_xslt_transforms.rb +0 -314
  316. data/test/xml/node/test_save_options.rb +0 -28
  317. data/test/xml/node/test_subclass.rb +0 -44
  318. data/test/xml/sax/test_parser.rb +0 -402
  319. data/test/xml/sax/test_parser_context.rb +0 -115
  320. data/test/xml/sax/test_parser_text.rb +0 -202
  321. data/test/xml/sax/test_push_parser.rb +0 -265
  322. data/test/xml/test_attr.rb +0 -74
  323. data/test/xml/test_attribute_decl.rb +0 -86
  324. data/test/xml/test_builder.rb +0 -341
  325. data/test/xml/test_c14n.rb +0 -180
  326. data/test/xml/test_cdata.rb +0 -54
  327. data/test/xml/test_comment.rb +0 -40
  328. data/test/xml/test_document.rb +0 -982
  329. data/test/xml/test_document_encoding.rb +0 -31
  330. data/test/xml/test_document_fragment.rb +0 -298
  331. data/test/xml/test_dtd.rb +0 -187
  332. data/test/xml/test_dtd_encoding.rb +0 -31
  333. data/test/xml/test_element_content.rb +0 -56
  334. data/test/xml/test_element_decl.rb +0 -73
  335. data/test/xml/test_entity_decl.rb +0 -122
  336. data/test/xml/test_entity_reference.rb +0 -262
  337. data/test/xml/test_namespace.rb +0 -96
  338. data/test/xml/test_node.rb +0 -1325
  339. data/test/xml/test_node_attributes.rb +0 -115
  340. data/test/xml/test_node_encoding.rb +0 -75
  341. data/test/xml/test_node_inheritance.rb +0 -32
  342. data/test/xml/test_node_reparenting.rb +0 -592
  343. data/test/xml/test_node_set.rb +0 -809
  344. data/test/xml/test_parse_options.rb +0 -64
  345. data/test/xml/test_processing_instruction.rb +0 -30
  346. data/test/xml/test_reader.rb +0 -620
  347. data/test/xml/test_reader_encoding.rb +0 -134
  348. data/test/xml/test_relax_ng.rb +0 -60
  349. data/test/xml/test_schema.rb +0 -142
  350. data/test/xml/test_syntax_error.rb +0 -36
  351. data/test/xml/test_text.rb +0 -60
  352. data/test/xml/test_unparented_node.rb +0 -483
  353. data/test/xml/test_xinclude.rb +0 -83
  354. data/test/xml/test_xpath.rb +0 -470
  355. data/test/xslt/test_custom_functions.rb +0 -133
  356. data/test/xslt/test_exception_handling.rb +0 -37
@@ -0,0 +1,222 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "singleton"
4
+ require "shellwords"
5
+
6
+ module Nokogiri
7
+ class VersionInfo # :nodoc:
8
+ include Singleton
9
+
10
+ def jruby?
11
+ ::JRUBY_VERSION if ::RUBY_PLATFORM == "java"
12
+ end
13
+
14
+ def windows?
15
+ ::RUBY_PLATFORM =~ /mingw|mswin/
16
+ end
17
+
18
+ def ruby_minor
19
+ Gem::Version.new(::RUBY_VERSION).segments[0..1].join(".")
20
+ end
21
+
22
+ def engine
23
+ defined?(::RUBY_ENGINE) ? ::RUBY_ENGINE : "mri"
24
+ end
25
+
26
+ def loaded_libxml_version
27
+ Gem::Version.new(Nokogiri::LIBXML_LOADED_VERSION
28
+ .scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first
29
+ .collect(&:to_i)
30
+ .join("."))
31
+ end
32
+
33
+ def compiled_libxml_version
34
+ Gem::Version.new(Nokogiri::LIBXML_COMPILED_VERSION)
35
+ end
36
+
37
+ def loaded_libxslt_version
38
+ Gem::Version.new(Nokogiri::LIBXSLT_LOADED_VERSION
39
+ .scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first
40
+ .collect(&:to_i)
41
+ .join("."))
42
+ end
43
+
44
+ def compiled_libxslt_version
45
+ Gem::Version.new(Nokogiri::LIBXSLT_COMPILED_VERSION)
46
+ end
47
+
48
+ def libxml2?
49
+ defined?(Nokogiri::LIBXML_COMPILED_VERSION)
50
+ end
51
+
52
+ def libxml2_has_iconv?
53
+ defined?(Nokogiri::LIBXML_ICONV_ENABLED) && Nokogiri::LIBXML_ICONV_ENABLED
54
+ end
55
+
56
+ def libxslt_has_datetime?
57
+ defined?(Nokogiri::LIBXSLT_DATETIME_ENABLED) && Nokogiri::LIBXSLT_DATETIME_ENABLED
58
+ end
59
+
60
+ def libxml2_using_packaged?
61
+ libxml2? && Nokogiri::PACKAGED_LIBRARIES
62
+ end
63
+
64
+ def libxml2_using_system?
65
+ libxml2? && !libxml2_using_packaged?
66
+ end
67
+
68
+ def libxml2_precompiled?
69
+ libxml2_using_packaged? && Nokogiri::PRECOMPILED_LIBRARIES
70
+ end
71
+
72
+ def warnings
73
+ warnings = []
74
+
75
+ if libxml2?
76
+ if compiled_libxml_version != loaded_libxml_version
77
+ warnings << "Nokogiri was built against libxml version #{compiled_libxml_version}, but has dynamically loaded #{loaded_libxml_version}"
78
+ end
79
+
80
+ if compiled_libxslt_version != loaded_libxslt_version
81
+ warnings << "Nokogiri was built against libxslt version #{compiled_libxslt_version}, but has dynamically loaded #{loaded_libxslt_version}"
82
+ end
83
+ end
84
+
85
+ warnings
86
+ end
87
+
88
+ def to_hash
89
+ header_directory = File.expand_path(File.join(File.dirname(__FILE__), "../../../ext/nokogiri"))
90
+
91
+ {}.tap do |vi|
92
+ vi["warnings"] = []
93
+ vi["nokogiri"] = {}.tap do |nokogiri|
94
+ nokogiri["version"] = Nokogiri::VERSION
95
+
96
+ unless jruby?
97
+ # enable gems like nokogumbo to build with the following in their extconf.rb:
98
+ #
99
+ # append_cflags(Nokogiri::VERSION_INFO["nokogiri"]["cppflags"])
100
+ # append_ldflags(Nokogiri::VERSION_INFO["nokogiri"]["ldflags"])
101
+ #
102
+ cppflags = ["-I#{header_directory.shellescape}"]
103
+ ldflags = []
104
+
105
+ if libxml2_using_packaged?
106
+ cppflags << "-I#{File.join(header_directory, "include").shellescape}"
107
+ cppflags << "-I#{File.join(header_directory, "include/libxml2").shellescape}"
108
+
109
+ if windows?
110
+ # on windows, nokogumbo needs to link against nokogiri.so to resolve symbols. see #2167
111
+ lib_directory = File.expand_path(File.join(File.dirname(__FILE__), "../#{ruby_minor}"))
112
+ unless File.exist?(lib_directory)
113
+ lib_directory = File.expand_path(File.join(File.dirname(__FILE__), ".."))
114
+ end
115
+ ldflags << "-L#{lib_directory.shellescape}"
116
+ ldflags << "-l:nokogiri.so"
117
+ end
118
+ end
119
+
120
+ nokogiri["cppflags"] = cppflags
121
+ nokogiri["ldflags"] = ldflags
122
+ end
123
+ end
124
+ vi["ruby"] = {}.tap do |ruby|
125
+ ruby["version"] = ::RUBY_VERSION
126
+ ruby["platform"] = ::RUBY_PLATFORM
127
+ ruby["gem_platform"] = ::Gem::Platform.local.to_s
128
+ ruby["description"] = ::RUBY_DESCRIPTION
129
+ ruby["engine"] = engine
130
+ ruby["jruby"] = jruby? if jruby?
131
+ end
132
+
133
+ if libxml2?
134
+ vi["libxml"] = {}.tap do |libxml|
135
+ if libxml2_using_packaged?
136
+ libxml["source"] = "packaged"
137
+ libxml["precompiled"] = libxml2_precompiled?
138
+ libxml["patches"] = Nokogiri::LIBXML2_PATCHES
139
+
140
+ # this is for nokogumbo and shouldn't be forever
141
+ libxml["libxml2_path"] = header_directory
142
+ else
143
+ libxml["source"] = "system"
144
+ end
145
+ libxml["memory_management"] = Nokogiri::LIBXML_MEMORY_MANAGEMENT
146
+ libxml["iconv_enabled"] = libxml2_has_iconv?
147
+ libxml["compiled"] = compiled_libxml_version.to_s
148
+ libxml["loaded"] = loaded_libxml_version.to_s
149
+ end
150
+
151
+ vi["libxslt"] = {}.tap do |libxslt|
152
+ if libxml2_using_packaged?
153
+ libxslt["source"] = "packaged"
154
+ libxslt["precompiled"] = libxml2_precompiled?
155
+ libxslt["patches"] = Nokogiri::LIBXSLT_PATCHES
156
+ else
157
+ libxslt["source"] = "system"
158
+ end
159
+ libxslt["datetime_enabled"] = libxslt_has_datetime?
160
+ libxslt["compiled"] = compiled_libxslt_version.to_s
161
+ libxslt["loaded"] = loaded_libxslt_version.to_s
162
+ end
163
+
164
+ vi["warnings"] = warnings
165
+ end
166
+
167
+ if defined?(Nokogiri::OTHER_LIBRARY_VERSIONS)
168
+ # see extconf for how this string is assembled: "lib1name:lib1version,lib2name:lib2version"
169
+ vi["other_libraries"] = Hash[*Nokogiri::OTHER_LIBRARY_VERSIONS.split(/[,:]/)]
170
+ elsif jruby?
171
+ vi["other_libraries"] = {}.tap do |ol|
172
+ ol["xerces"] = Nokogiri::XERCES_VERSION
173
+ ol["nekohtml"] = Nokogiri::NEKO_VERSION
174
+ end
175
+ end
176
+ end
177
+ end
178
+
179
+ def to_markdown
180
+ require "yaml"
181
+ "# Nokogiri (#{Nokogiri::VERSION})\n" +
182
+ YAML.dump(to_hash).each_line.map { |line| " #{line}" }.join
183
+ end
184
+
185
+ instance.warnings.each do |warning|
186
+ warn "WARNING: #{warning}"
187
+ end
188
+ end
189
+
190
+ # :nodoc:
191
+ def self.uses_libxml?(requirement = nil)
192
+ return false unless VersionInfo.instance.libxml2?
193
+ return true unless requirement
194
+
195
+ Gem::Requirement.new(requirement).satisfied_by?(VersionInfo.instance.loaded_libxml_version)
196
+ end
197
+
198
+ # :nodoc:
199
+ def self.uses_gumbo?
200
+ uses_libxml? # TODO: replace with Gumbo functionality
201
+ end
202
+
203
+ # :nodoc:
204
+ def self.jruby?
205
+ VersionInfo.instance.jruby?
206
+ end
207
+
208
+ # :nodoc:
209
+ def self.libxml2_patches
210
+ if VersionInfo.instance.libxml2_using_packaged?
211
+ Nokogiri::VERSION_INFO["libxml"]["patches"]
212
+ else
213
+ []
214
+ end
215
+ end
216
+
217
+ require_relative "../jruby/dependencies" if Nokogiri.jruby?
218
+ require_relative "../extension"
219
+
220
+ # Detailed version info about Nokogiri and the installed extension dependencies.
221
+ VERSION_INFO = VersionInfo.instance.to_hash
222
+ end
@@ -1,109 +1,4 @@
1
- module Nokogiri
2
- # The version of Nokogiri you are using
3
- VERSION = '1.8.5'
1
+ # frozen_string_literal: true
4
2
 
5
- class VersionInfo # :nodoc:
6
- def jruby?
7
- ::JRUBY_VERSION if RUBY_PLATFORM == "java"
8
- end
9
-
10
- def engine
11
- defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'mri'
12
- end
13
-
14
- def loaded_parser_version
15
- LIBXML_PARSER_VERSION.
16
- scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first.
17
- collect(&:to_i).
18
- join(".")
19
- end
20
-
21
- def compiled_parser_version
22
- LIBXML_VERSION
23
- end
24
-
25
- def libxml2?
26
- defined?(LIBXML_VERSION)
27
- end
28
-
29
- def libxml2_using_system?
30
- ! libxml2_using_packaged?
31
- end
32
-
33
- def libxml2_using_packaged?
34
- NOKOGIRI_USE_PACKAGED_LIBRARIES
35
- end
36
-
37
- def warnings
38
- return [] unless libxml2?
39
-
40
- if compiled_parser_version != loaded_parser_version
41
- ["Nokogiri was built against LibXML version #{compiled_parser_version}, but has dynamically loaded #{loaded_parser_version}"]
42
- else
43
- []
44
- end
45
- end
46
-
47
- def to_hash
48
- hash_info = {}
49
- hash_info['warnings'] = []
50
- hash_info['nokogiri'] = Nokogiri::VERSION
51
- hash_info['ruby'] = {}
52
- hash_info['ruby']['version'] = ::RUBY_VERSION
53
- hash_info['ruby']['platform'] = ::RUBY_PLATFORM
54
- hash_info['ruby']['description'] = ::RUBY_DESCRIPTION
55
- hash_info['ruby']['engine'] = engine
56
- hash_info['ruby']['jruby'] = jruby? if jruby?
57
-
58
- if libxml2?
59
- hash_info['libxml'] = {}
60
- hash_info['libxml']['binding'] = 'extension'
61
- if libxml2_using_packaged?
62
- hash_info['libxml']['source'] = "packaged"
63
- hash_info['libxml']['libxml2_path'] = NOKOGIRI_LIBXML2_PATH
64
- hash_info['libxml']['libxslt_path'] = NOKOGIRI_LIBXSLT_PATH
65
- hash_info['libxml']['libxml2_patches'] = NOKOGIRI_LIBXML2_PATCHES
66
- hash_info['libxml']['libxslt_patches'] = NOKOGIRI_LIBXSLT_PATCHES
67
- else
68
- hash_info['libxml']['source'] = "system"
69
- end
70
- hash_info['libxml']['compiled'] = compiled_parser_version
71
- hash_info['libxml']['loaded'] = loaded_parser_version
72
- hash_info['warnings'] = warnings
73
- elsif jruby?
74
- hash_info['xerces'] = Nokogiri::XERCES_VERSION
75
- hash_info['nekohtml'] = Nokogiri::NEKO_VERSION
76
- end
77
-
78
- hash_info
79
- end
80
-
81
- def to_markdown
82
- begin
83
- require 'psych'
84
- rescue LoadError
85
- end
86
- require 'yaml'
87
- "# Nokogiri (#{Nokogiri::VERSION})\n" +
88
- YAML.dump(to_hash).each_line.map { |line| " #{line}" }.join
89
- end
90
-
91
- # FIXME: maybe switch to singleton?
92
- @@instance = new
93
- @@instance.warnings.each do |warning|
94
- warn "WARNING: #{warning}"
95
- end
96
- def self.instance; @@instance; end
97
- end
98
-
99
- # More complete version information about libxml
100
- VERSION_INFO = VersionInfo.instance.to_hash
101
-
102
- def self.uses_libxml? # :nodoc:
103
- VersionInfo.instance.libxml2?
104
- end
105
-
106
- def self.jruby? # :nodoc:
107
- VersionInfo.instance.jruby?
108
- end
109
- end
3
+ require_relative "version/constant"
4
+ require_relative "version/info"
@@ -1,11 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class Attr < Node
4
- alias :value :content
5
- alias :to_s :content
6
- alias :content= :value=
6
+ alias_method :value, :content
7
+ alias_method :to_s, :content
8
+ alias_method :content=, :value=
7
9
 
8
10
  private
11
+
9
12
  def inspect_attributes
10
13
  [:name, :namespace, :value]
11
14
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  ###
@@ -11,7 +13,7 @@ module Nokogiri
11
13
  undef_method :line if method_defined?(:line)
12
14
 
13
15
  def inspect
14
- "#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{to_s.inspect}>"
16
+ "#<#{self.class.name}:#{format("0x%x", object_id)} #{to_s.inspect}>"
15
17
  end
16
18
  end
17
19
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  ###
@@ -195,6 +197,41 @@ module Nokogiri
195
197
  #
196
198
  # Note the "foo:object" tag.
197
199
  #
200
+ # === Namespace inheritance
201
+ #
202
+ # In the Builder context, children will inherit their parent's namespace. This is the same
203
+ # behavior as if the underlying {XML::Document} set +namespace_inheritance+ to +true+:
204
+ #
205
+ # result = Nokogiri::XML::Builder.new do |xml|
206
+ # xml["soapenv"].Envelope("xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/") do
207
+ # xml.Header
208
+ # end
209
+ # end
210
+ # result.doc.to_xml
211
+ # # => <?xml version="1.0" encoding="utf-8"?>
212
+ # # <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
213
+ # # <soapenv:Header/>
214
+ # # </soapenv:Envelope>
215
+ #
216
+ # Users may turn this behavior off by passing a keyword argument +namespace_inheritance:false+
217
+ # to the initializer:
218
+ #
219
+ # result = Nokogiri::XML::Builder.new(namespace_inheritance: false) do |xml|
220
+ # xml["soapenv"].Envelope("xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/") do
221
+ # xml.Header
222
+ # xml["soapenv"].Body # users may explicitly opt into the namespace
223
+ # end
224
+ # end
225
+ # result.doc.to_xml
226
+ # # => <?xml version="1.0" encoding="utf-8"?>
227
+ # # <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
228
+ # # <Header/>
229
+ # # <soapenv:Body/>
230
+ # # </soapenv:Envelope>
231
+ #
232
+ # For more information on namespace inheritance, please see {XML::Document#namespace_inheritance}
233
+ #
234
+ #
198
235
  # == Document Types
199
236
  #
200
237
  # To create a document type (DTD), access use the Builder#doc method to get
@@ -213,7 +250,7 @@ module Nokogiri
213
250
  # xml.foo
214
251
  # end
215
252
  # end
216
- #
253
+ #
217
254
  # puts builder.to_xml
218
255
  #
219
256
  # Will output this xml:
@@ -225,6 +262,10 @@ module Nokogiri
225
262
  # </root>
226
263
  #
227
264
  class Builder
265
+ include Nokogiri::ClassResolver
266
+
267
+ DEFAULT_DOCUMENT_OPTIONS = { namespace_inheritance: true }
268
+
228
269
  # The current Document object being built
229
270
  attr_accessor :doc
230
271
 
@@ -244,13 +285,13 @@ module Nokogiri
244
285
  #
245
286
  # For example:
246
287
  #
247
- # doc = Nokogiri::XML(open('somedoc.xml'))
248
- # Nokogiri::XML::Builder.with(doc.at('some_tag')) do |xml|
288
+ # doc = Nokogiri::XML(File.read('somedoc.xml'))
289
+ # Nokogiri::XML::Builder.with(doc.at_css('some_tag')) do |xml|
249
290
  # # ... Use normal builder methods here ...
250
291
  # xml.awesome # add the "awesome" tag below "some_tag"
251
292
  # end
252
293
  #
253
- def self.with root, &block
294
+ def self.with(root, &block)
254
295
  new({}, root, &block)
255
296
  end
256
297
 
@@ -263,31 +304,28 @@ module Nokogiri
263
304
  # Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
264
305
  # ...
265
306
  # end
266
- def initialize options = {}, root = nil, &block
267
-
307
+ def initialize(options = {}, root = nil, &block)
268
308
  if root
269
- @doc = root.document
309
+ @doc = root.document
270
310
  @parent = root
271
311
  else
272
- namespace = self.class.name.split('::')
273
- namespace[-1] = 'Document'
274
- @doc = eval(namespace.join('::')).new
275
- @parent = @doc
312
+ @parent = @doc = related_class("Document").new
276
313
  end
277
314
 
278
- @context = nil
279
- @arity = nil
280
- @ns = nil
315
+ @context = nil
316
+ @arity = nil
317
+ @ns = nil
281
318
 
282
- options.each do |k,v|
319
+ options = DEFAULT_DOCUMENT_OPTIONS.merge(options)
320
+ options.each do |k, v|
283
321
  @doc.send(:"#{k}=", v)
284
322
  end
285
323
 
286
- return unless block_given?
324
+ return unless block
287
325
 
288
326
  @arity = block.arity
289
327
  if @arity <= 0
290
- @context = eval('self', block.binding)
328
+ @context = eval("self", block.binding)
291
329
  instance_eval(&block)
292
330
  else
293
331
  yield self
@@ -298,26 +336,26 @@ module Nokogiri
298
336
 
299
337
  ###
300
338
  # Create a Text Node with content of +string+
301
- def text string
302
- insert @doc.create_text_node(string)
339
+ def text(string)
340
+ insert(@doc.create_text_node(string))
303
341
  end
304
342
 
305
343
  ###
306
344
  # Create a CDATA Node with content of +string+
307
- def cdata string
308
- insert doc.create_cdata(string)
345
+ def cdata(string)
346
+ insert(doc.create_cdata(string))
309
347
  end
310
348
 
311
349
  ###
312
350
  # Create a Comment Node with content of +string+
313
- def comment string
314
- insert doc.create_comment(string)
351
+ def comment(string)
352
+ insert(doc.create_comment(string))
315
353
  end
316
354
 
317
355
  ###
318
356
  # Build a tag that is associated with namespace +ns+. Raises an
319
357
  # ArgumentError if +ns+ has not been defined higher in the tree.
320
- def [] ns
358
+ def [](ns)
321
359
  if @parent != @doc
322
360
  @ns = @parent.namespace_definitions.find { |x| x.prefix == ns.to_s }
323
361
  end
@@ -325,12 +363,13 @@ module Nokogiri
325
363
 
326
364
  @parent.ancestors.each do |a|
327
365
  next if a == doc
366
+
328
367
  @ns = a.namespace_definitions.find { |x| x.prefix == ns.to_s }
329
368
  return self if @ns
330
369
  end
331
370
 
332
- @ns = { :pending => ns.to_s }
333
- return self
371
+ @ns = { pending: ns.to_s }
372
+ self
334
373
  end
335
374
 
336
375
  ###
@@ -338,7 +377,7 @@ module Nokogiri
338
377
  def to_xml(*args)
339
378
  if Nokogiri.jruby?
340
379
  options = args.first.is_a?(Hash) ? args.shift : {}
341
- if !options[:save_with]
380
+ unless options[:save_with]
342
381
  options[:save_with] = Node::SaveOptions::AS_BUILDER
343
382
  end
344
383
  args.insert(0, options)
@@ -348,27 +387,28 @@ module Nokogiri
348
387
 
349
388
  ###
350
389
  # Append the given raw XML +string+ to the document
351
- def << string
390
+ def <<(string)
352
391
  @doc.fragment(string).children.each { |x| insert(x) }
353
392
  end
354
393
 
355
- def method_missing method, *args, &block # :nodoc:
356
- if @context && @context.respond_to?(method)
394
+ def method_missing(method, *args, &block) # :nodoc:
395
+ if @context&.respond_to?(method)
357
396
  @context.send(method, *args, &block)
358
397
  else
359
- node = @doc.create_element(method.to_s.sub(/[_!]$/, ''),*args) { |n|
398
+ node = @doc.create_element(method.to_s.sub(/[_!]$/, ""), *args) do |n|
360
399
  # Set up the namespace
361
- if @ns.is_a? Nokogiri::XML::Namespace
400
+ if @ns.is_a?(Nokogiri::XML::Namespace)
362
401
  n.namespace = @ns
363
402
  @ns = nil
364
403
  end
365
- }
404
+ end
366
405
 
367
- if @ns.is_a? Hash
406
+ if @ns.is_a?(Hash)
368
407
  node.namespace = node.namespace_definitions.find { |x| x.prefix == @ns[:pending] }
369
408
  if node.namespace.nil?
370
409
  raise ArgumentError, "Namespace #{@ns[:pending]} has not been defined"
371
410
  end
411
+
372
412
  @ns = nil
373
413
  end
374
414
 
@@ -377,35 +417,39 @@ module Nokogiri
377
417
  end
378
418
 
379
419
  private
420
+
380
421
  ###
381
422
  # Insert +node+ as a child of the current Node
382
423
  def insert(node, &block)
383
424
  node = @parent.add_child(node)
384
- if block_given?
385
- old_parent = @parent
386
- @parent = node
387
- @arity ||= block.arity
388
- if @arity <= 0
389
- instance_eval(&block)
390
- else
391
- block.call(self)
425
+ if block
426
+ begin
427
+ old_parent = @parent
428
+ @parent = node
429
+ @arity ||= block.arity
430
+ if @arity <= 0
431
+ instance_eval(&block)
432
+ else
433
+ yield(self)
434
+ end
435
+ ensure
436
+ @parent = old_parent
392
437
  end
393
- @parent = old_parent
394
438
  end
395
439
  NodeBuilder.new(node, self)
396
440
  end
397
441
 
398
442
  class NodeBuilder # :nodoc:
399
- def initialize node, doc_builder
443
+ def initialize(node, doc_builder)
400
444
  @node = node
401
445
  @doc_builder = doc_builder
402
446
  end
403
447
 
404
- def []= k, v
448
+ def []=(k, v)
405
449
  @node[k] = v
406
450
  end
407
451
 
408
- def [] k
452
+ def [](k)
409
453
  @node[k]
410
454
  end
411
455
 
@@ -413,22 +457,22 @@ module Nokogiri
413
457
  opts = args.last.is_a?(Hash) ? args.pop : {}
414
458
  case method.to_s
415
459
  when /^(.*)!$/
416
- @node['id'] = $1
460
+ @node["id"] = Regexp.last_match(1)
417
461
  @node.content = args.first if args.first
418
462
  when /^(.*)=/
419
- @node[$1] = args.first
463
+ @node[Regexp.last_match(1)] = args.first
420
464
  else
421
- @node['class'] =
422
- ((@node['class'] || '').split(/\s/) + [method.to_s]).join(' ')
465
+ @node["class"] =
466
+ ((@node["class"] || "").split(/\s/) + [method.to_s]).join(" ")
423
467
  @node.content = args.first if args.first
424
468
  end
425
469
 
426
470
  # Assign any extra options
427
- opts.each do |k,v|
428
- @node[k.to_s] = ((@node[k.to_s] || '').split(/\s/) + [v]).join(' ')
471
+ opts.each do |k, v|
472
+ @node[k.to_s] = ((@node[k.to_s] || "").split(/\s/) + [v]).join(" ")
429
473
  end
430
474
 
431
- if block_given?
475
+ if block
432
476
  old_parent = @doc_builder.parent
433
477
  @doc_builder.parent = @node
434
478
  value = @doc_builder.instance_eval(&block)
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class CDATA < Nokogiri::XML::Text
4
6
  ###
5
7
  # Get the name of this CDATA node
6
8
  def name
7
- '#cdata-section'
9
+ "#cdata-section"
8
10
  end
9
11
  end
10
12
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class CharacterData < Nokogiri::XML::Node