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
@@ -0,0 +1,41 @@
1
+ #ifndef GUMBO_PARSER_H_
2
+ #define GUMBO_PARSER_H_
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ // Contains the definition of the top-level GumboParser structure that's
9
+ // threaded through basically every internal function in the library.
10
+
11
+ struct GumboInternalParserState;
12
+ struct GumboInternalOutput;
13
+ struct GumboInternalOptions;
14
+ struct GumboInternalTokenizerState;
15
+
16
+ // An overarching struct that's threaded through (nearly) all functions in the
17
+ // library, OOP-style. This gives each function access to the options and
18
+ // output, along with any internal state needed for the parse.
19
+ typedef struct GumboInternalParser {
20
+ // Settings for this parse run.
21
+ const struct GumboInternalOptions* _options;
22
+
23
+ // Output for the parse.
24
+ struct GumboInternalOutput* _output;
25
+
26
+ // The internal tokenizer state, defined as a pointer to avoid a cyclic
27
+ // dependency on html5tokenizer.h. The main parse routine is responsible for
28
+ // initializing this on parse start, and destroying it on parse end.
29
+ // End-users will never see a non-garbage value in this pointer.
30
+ struct GumboInternalTokenizerState* _tokenizer_state;
31
+
32
+ // The internal parser state. Initialized on parse start and destroyed on
33
+ // parse end; end-users will never see a non-garbage value in this pointer.
34
+ struct GumboInternalParserState* _parser_state;
35
+ } GumboParser;
36
+
37
+ #ifdef __cplusplus
38
+ }
39
+ #endif
40
+
41
+ #endif // GUMBO_PARSER_H_
@@ -0,0 +1,33 @@
1
+ #ifndef GUMBO_REPLACEMENT_H_
2
+ #define GUMBO_REPLACEMENT_H_
3
+
4
+ #include <stddef.h>
5
+ #include "nokogiri_gumbo.h"
6
+
7
+ typedef struct {
8
+ const char *const from;
9
+ const char *const to;
10
+ } StringReplacement;
11
+
12
+ const StringReplacement *gumbo_get_svg_tag_replacement (
13
+ const char* str,
14
+ size_t len
15
+ );
16
+
17
+ const StringReplacement *gumbo_get_svg_attr_replacement (
18
+ const char* str,
19
+ size_t len
20
+ );
21
+
22
+ typedef struct {
23
+ const char *const from;
24
+ const char *const local_name;
25
+ const GumboAttributeNamespaceEnum attr_namespace;
26
+ } ForeignAttrReplacement;
27
+
28
+ const ForeignAttrReplacement *gumbo_get_foreign_attr_replacement (
29
+ const char* str,
30
+ size_t len
31
+ );
32
+
33
+ #endif // GUMBO_REPLACEMENT_H_
@@ -0,0 +1,103 @@
1
+ /*
2
+ Copyright 2010 Google Inc.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ #include <string.h>
18
+ #include "string_buffer.h"
19
+ #include "util.h"
20
+
21
+ // Size chosen via statistical analysis of ~60K websites.
22
+ // 99% of text nodes and 98% of attribute names/values fit in this initial size.
23
+ static const size_t kDefaultStringBufferSize = 5;
24
+
25
+ static void maybe_resize_string_buffer (
26
+ size_t additional_chars,
27
+ GumboStringBuffer* buffer
28
+ ) {
29
+ size_t new_length = buffer->length + additional_chars;
30
+ size_t new_capacity = buffer->capacity;
31
+ while (new_capacity < new_length) {
32
+ new_capacity *= 2;
33
+ }
34
+ if (new_capacity != buffer->capacity) {
35
+ buffer->data = gumbo_realloc(buffer->data, new_capacity);
36
+ buffer->capacity = new_capacity;
37
+ }
38
+ }
39
+
40
+ void gumbo_string_buffer_init(GumboStringBuffer* output) {
41
+ output->data = gumbo_alloc(kDefaultStringBufferSize);
42
+ output->length = 0;
43
+ output->capacity = kDefaultStringBufferSize;
44
+ }
45
+
46
+ void gumbo_string_buffer_reserve (
47
+ size_t min_capacity,
48
+ GumboStringBuffer* output
49
+ ) {
50
+ maybe_resize_string_buffer(min_capacity - output->length, output);
51
+ }
52
+
53
+ void gumbo_string_buffer_append_codepoint (
54
+ int c,
55
+ GumboStringBuffer* output
56
+ ) {
57
+ // num_bytes is actually the number of continuation bytes, 1 less than the
58
+ // total number of bytes. This is done to keep the loop below simple and
59
+ // should probably change if we unroll it.
60
+ int num_bytes, prefix;
61
+ if (c <= 0x7f) {
62
+ num_bytes = 0;
63
+ prefix = 0;
64
+ } else if (c <= 0x7ff) {
65
+ num_bytes = 1;
66
+ prefix = 0xc0;
67
+ } else if (c <= 0xffff) {
68
+ num_bytes = 2;
69
+ prefix = 0xe0;
70
+ } else {
71
+ num_bytes = 3;
72
+ prefix = 0xf0;
73
+ }
74
+ maybe_resize_string_buffer(num_bytes + 1, output);
75
+ output->data[output->length++] = prefix | (c >> (num_bytes * 6));
76
+ for (int i = num_bytes - 1; i >= 0; --i) {
77
+ output->data[output->length++] = 0x80 | (0x3f & (c >> (i * 6)));
78
+ }
79
+ }
80
+
81
+ void gumbo_string_buffer_append_string (
82
+ const GumboStringPiece* str,
83
+ GumboStringBuffer* output
84
+ ) {
85
+ maybe_resize_string_buffer(str->length, output);
86
+ memcpy(output->data + output->length, str->data, str->length);
87
+ output->length += str->length;
88
+ }
89
+
90
+ char* gumbo_string_buffer_to_string(const GumboStringBuffer* input) {
91
+ char* buffer = gumbo_alloc(input->length + 1);
92
+ memcpy(buffer, input->data, input->length);
93
+ buffer[input->length] = '\0';
94
+ return buffer;
95
+ }
96
+
97
+ void gumbo_string_buffer_clear(GumboStringBuffer* input) {
98
+ input->length = 0;
99
+ }
100
+
101
+ void gumbo_string_buffer_destroy(GumboStringBuffer* buffer) {
102
+ gumbo_free(buffer->data);
103
+ }
@@ -0,0 +1,68 @@
1
+ #ifndef GUMBO_STRING_BUFFER_H_
2
+ #define GUMBO_STRING_BUFFER_H_
3
+
4
+ #include <stdbool.h>
5
+ #include <stddef.h>
6
+
7
+ #include "nokogiri_gumbo.h"
8
+
9
+ #ifdef __cplusplus
10
+ extern "C" {
11
+ #endif
12
+
13
+ // A struct representing a mutable, growable string. This consists of a
14
+ // heap-allocated buffer that may grow (by doubling) as necessary. When
15
+ // converting to a string, this allocates a new buffer that is only as long as
16
+ // it needs to be. Note that the internal buffer here is *not* nul-terminated,
17
+ // so be sure not to use ordinary string manipulation functions on it.
18
+ typedef struct {
19
+ // A pointer to the beginning of the string. NULL if length == 0.
20
+ char* data;
21
+
22
+ // The length of the string fragment, in bytes. May be zero.
23
+ size_t length;
24
+
25
+ // The capacity of the buffer, in bytes.
26
+ size_t capacity;
27
+ } GumboStringBuffer;
28
+
29
+ // Initializes a new GumboStringBuffer.
30
+ void gumbo_string_buffer_init(GumboStringBuffer* output);
31
+
32
+ // Ensures that the buffer contains at least a certain amount of space. Most
33
+ // useful with snprintf and the other length-delimited string functions, which
34
+ // may want to write directly into the buffer.
35
+ void gumbo_string_buffer_reserve (
36
+ size_t min_capacity,
37
+ GumboStringBuffer* output
38
+ );
39
+
40
+ // Appends a single Unicode codepoint onto the end of the GumboStringBuffer.
41
+ // This is essentially a UTF-8 encoder, and may add 1-4 bytes depending on the
42
+ // value of the codepoint.
43
+ void gumbo_string_buffer_append_codepoint (
44
+ int c,
45
+ GumboStringBuffer* output
46
+ );
47
+
48
+ // Appends a string onto the end of the GumboStringBuffer.
49
+ void gumbo_string_buffer_append_string (
50
+ const GumboStringPiece* str,
51
+ GumboStringBuffer* output
52
+ );
53
+
54
+ // Converts this string buffer to const char*, alloctaing a new buffer for it.
55
+ char* gumbo_string_buffer_to_string(const GumboStringBuffer* input);
56
+
57
+ // Reinitialize this string buffer. This clears it by setting length=0. It
58
+ // does not zero out the buffer itself.
59
+ void gumbo_string_buffer_clear(GumboStringBuffer* input);
60
+
61
+ // Deallocates this GumboStringBuffer.
62
+ void gumbo_string_buffer_destroy(GumboStringBuffer* buffer);
63
+
64
+ #ifdef __cplusplus
65
+ }
66
+ #endif
67
+
68
+ #endif // GUMBO_STRING_BUFFER_H_
@@ -0,0 +1,48 @@
1
+ /*
2
+ Copyright 2018 Craig Barnes.
3
+ Copyright 2010 Google Inc.
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ https://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+ */
17
+
18
+ #include <stddef.h>
19
+ #include <string.h>
20
+ #include "nokogiri_gumbo.h"
21
+ #include "ascii.h"
22
+
23
+ bool gumbo_string_equals (
24
+ const GumboStringPiece* str1,
25
+ const GumboStringPiece* str2
26
+ ) {
27
+ return
28
+ str1->length == str2->length
29
+ && !memcmp(str1->data, str2->data, str1->length);
30
+ }
31
+
32
+ bool gumbo_string_equals_ignore_case (
33
+ const GumboStringPiece* str1,
34
+ const GumboStringPiece* str2
35
+ ) {
36
+ return
37
+ str1->length == str2->length
38
+ && !gumbo_ascii_strncasecmp(str1->data, str2->data, str1->length);
39
+ }
40
+
41
+ bool gumbo_string_prefix_ignore_case (
42
+ const GumboStringPiece* prefix,
43
+ const GumboStringPiece* str
44
+ ) {
45
+ return
46
+ prefix->length <= str->length
47
+ && !gumbo_ascii_strncasecmp(prefix->data, str->data, prefix->length);
48
+ }
@@ -0,0 +1,174 @@
1
+ /* ANSI-C code produced by gperf version 3.1 */
2
+ /* Command-line: gperf -m100 src/svg_attrs.gperf */
3
+ /* Computed positions: -k'1,10,$' */
4
+ /* Filtered by: gperf-filter.sed */
5
+
6
+ #include "replacement.h"
7
+ #include "macros.h"
8
+ #include "ascii.h"
9
+ #include <string.h>
10
+
11
+ #define TOTAL_KEYWORDS 58
12
+ #define MIN_WORD_LENGTH 4
13
+ #define MAX_WORD_LENGTH 19
14
+ #define MIN_HASH_VALUE 5
15
+ #define MAX_HASH_VALUE 77
16
+ /* maximum key range = 73, duplicates = 0 */
17
+
18
+
19
+
20
+ static inline unsigned int
21
+ hash (register const char *str, register size_t len)
22
+ {
23
+ static const unsigned char asso_values[] =
24
+ {
25
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
26
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
27
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
28
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
29
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
30
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
31
+ 78, 78, 78, 78, 78, 5, 78, 39, 14, 1,
32
+ 31, 31, 13, 13, 78, 78, 22, 25, 10, 2,
33
+ 7, 78, 22, 0, 1, 3, 1, 78, 0, 36,
34
+ 14, 17, 20, 78, 78, 78, 78, 5, 78, 39,
35
+ 14, 1, 31, 31, 13, 13, 78, 78, 22, 25,
36
+ 10, 2, 7, 78, 22, 0, 1, 3, 1, 78,
37
+ 0, 36, 14, 17, 20, 78, 78, 78, 78, 78,
38
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
39
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
40
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
41
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
42
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
43
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
44
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
45
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
46
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
47
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
48
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
49
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
50
+ 78, 78, 78, 78, 78, 78, 78, 78
51
+ };
52
+ register unsigned int hval = len;
53
+
54
+ switch (hval)
55
+ {
56
+ default:
57
+ hval += asso_values[(unsigned char)str[9]];
58
+ /*FALLTHROUGH*/
59
+ case 9:
60
+ case 8:
61
+ case 7:
62
+ case 6:
63
+ case 5:
64
+ case 4:
65
+ case 3:
66
+ case 2:
67
+ case 1:
68
+ hval += asso_values[(unsigned char)str[0]+2];
69
+ break;
70
+ }
71
+ return hval + asso_values[(unsigned char)str[len - 1]];
72
+ }
73
+
74
+ const StringReplacement *
75
+ gumbo_get_svg_attr_replacement (register const char *str, register size_t len)
76
+ {
77
+ static const unsigned char lengthtable[] =
78
+ {
79
+ 0, 0, 0, 0, 0, 4, 0, 7, 7, 0, 8, 9, 10, 11,
80
+ 11, 11, 11, 10, 16, 18, 16, 12, 16, 11, 13, 11, 12, 11,
81
+ 16, 0, 17, 9, 9, 8, 9, 10, 13, 10, 12, 14, 8, 4,
82
+ 12, 19, 7, 9, 12, 12, 11, 14, 10, 19, 8, 16, 13, 16,
83
+ 16, 15, 10, 12, 0, 0, 13, 13, 13, 0, 0, 9, 16, 0,
84
+ 0, 0, 0, 0, 0, 0, 0, 17
85
+ };
86
+ static const StringReplacement wordlist[] =
87
+ {
88
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
89
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
90
+ {(char*)0,(char*)0},
91
+ {"refx", "refX"},
92
+ {(char*)0,(char*)0},
93
+ {"viewbox", "viewBox"},
94
+ {"targetx", "targetX"},
95
+ {(char*)0,(char*)0},
96
+ {"calcmode", "calcMode"},
97
+ {"maskunits", "maskUnits"},
98
+ {"viewtarget", "viewTarget"},
99
+ {"tablevalues", "tableValues"},
100
+ {"markerunits", "markerUnits"},
101
+ {"stitchtiles", "stitchTiles"},
102
+ {"startoffset", "startOffset"},
103
+ {"numoctaves", "numOctaves"},
104
+ {"requiredfeatures", "requiredFeatures"},
105
+ {"requiredextensions", "requiredExtensions"},
106
+ {"specularexponent", "specularExponent"},
107
+ {"surfacescale", "surfaceScale"},
108
+ {"specularconstant", "specularConstant"},
109
+ {"repeatcount", "repeatCount"},
110
+ {"clippathunits", "clipPathUnits"},
111
+ {"filterunits", "filterUnits"},
112
+ {"lengthadjust", "lengthAdjust"},
113
+ {"markerwidth", "markerWidth"},
114
+ {"maskcontentunits", "maskContentUnits"},
115
+ {(char*)0,(char*)0},
116
+ {"limitingconeangle", "limitingConeAngle"},
117
+ {"pointsatx", "pointsAtX"},
118
+ {"repeatdur", "repeatDur"},
119
+ {"keytimes", "keyTimes"},
120
+ {"keypoints", "keyPoints"},
121
+ {"keysplines", "keySplines"},
122
+ {"gradientunits", "gradientUnits"},
123
+ {"textlength", "textLength"},
124
+ {"stddeviation", "stdDeviation"},
125
+ {"primitiveunits", "primitiveUnits"},
126
+ {"edgemode", "edgeMode"},
127
+ {"refy", "refY"},
128
+ {"spreadmethod", "spreadMethod"},
129
+ {"preserveaspectratio", "preserveAspectRatio"},
130
+ {"targety", "targetY"},
131
+ {"pointsatz", "pointsAtZ"},
132
+ {"markerheight", "markerHeight"},
133
+ {"patternunits", "patternUnits"},
134
+ {"baseprofile", "baseProfile"},
135
+ {"systemlanguage", "systemLanguage"},
136
+ {"zoomandpan", "zoomAndPan"},
137
+ {"patterncontentunits", "patternContentUnits"},
138
+ {"glyphref", "glyphRef"},
139
+ {"xchannelselector", "xChannelSelector"},
140
+ {"attributetype", "attributeType"},
141
+ {"kernelunitlength", "kernelUnitLength"},
142
+ {"ychannelselector", "yChannelSelector"},
143
+ {"diffuseconstant", "diffuseConstant"},
144
+ {"pathlength", "pathLength"},
145
+ {"kernelmatrix", "kernelMatrix"},
146
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
147
+ {"preservealpha", "preserveAlpha"},
148
+ {"attributename", "attributeName"},
149
+ {"basefrequency", "baseFrequency"},
150
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
151
+ {"pointsaty", "pointsAtY"},
152
+ {"patterntransform", "patternTransform"},
153
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
154
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
155
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
156
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
157
+ {"gradienttransform", "gradientTransform"}
158
+ };
159
+
160
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
161
+ {
162
+ register unsigned int key = hash (str, len);
163
+
164
+ if (key <= MAX_HASH_VALUE)
165
+ if (len == lengthtable[key])
166
+ {
167
+ register const char *s = wordlist[key].from;
168
+
169
+ if (s && (((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gumbo_ascii_strncasecmp(str, s, len))
170
+ return &wordlist[key];
171
+ }
172
+ }
173
+ return 0;
174
+ }
@@ -0,0 +1,77 @@
1
+ %{
2
+ #include "replacement.h"
3
+ #include "macros.h"
4
+ #include "ascii.h"
5
+ %}
6
+
7
+ %ignore-case
8
+ %struct-type
9
+ %omit-struct-type
10
+ %compare-lengths
11
+ %readonly-tables
12
+ %null-strings
13
+ %includes
14
+ %define lookup-function-name gumbo_get_svg_attr_replacement
15
+ %define slot-name from
16
+ %define initializer-suffix ,(char*)0
17
+ StringReplacement;
18
+
19
+ %%
20
+ "attributename", "attributeName"
21
+ "attributetype", "attributeType"
22
+ "basefrequency", "baseFrequency"
23
+ "baseprofile", "baseProfile"
24
+ "calcmode", "calcMode"
25
+ "clippathunits", "clipPathUnits"
26
+ "diffuseconstant", "diffuseConstant"
27
+ "edgemode", "edgeMode"
28
+ "filterunits", "filterUnits"
29
+ "glyphref", "glyphRef"
30
+ "gradienttransform", "gradientTransform"
31
+ "gradientunits", "gradientUnits"
32
+ "kernelmatrix", "kernelMatrix"
33
+ "kernelunitlength", "kernelUnitLength"
34
+ "keypoints", "keyPoints"
35
+ "keysplines", "keySplines"
36
+ "keytimes", "keyTimes"
37
+ "lengthadjust", "lengthAdjust"
38
+ "limitingconeangle", "limitingConeAngle"
39
+ "markerheight", "markerHeight"
40
+ "markerunits", "markerUnits"
41
+ "markerwidth", "markerWidth"
42
+ "maskcontentunits", "maskContentUnits"
43
+ "maskunits", "maskUnits"
44
+ "numoctaves", "numOctaves"
45
+ "pathlength", "pathLength"
46
+ "patterncontentunits", "patternContentUnits"
47
+ "patterntransform", "patternTransform"
48
+ "patternunits", "patternUnits"
49
+ "pointsatx", "pointsAtX"
50
+ "pointsaty", "pointsAtY"
51
+ "pointsatz", "pointsAtZ"
52
+ "preservealpha", "preserveAlpha"
53
+ "preserveaspectratio", "preserveAspectRatio"
54
+ "primitiveunits", "primitiveUnits"
55
+ "refx", "refX"
56
+ "refy", "refY"
57
+ "repeatcount", "repeatCount"
58
+ "repeatdur", "repeatDur"
59
+ "requiredextensions", "requiredExtensions"
60
+ "requiredfeatures", "requiredFeatures"
61
+ "specularconstant", "specularConstant"
62
+ "specularexponent", "specularExponent"
63
+ "spreadmethod", "spreadMethod"
64
+ "startoffset", "startOffset"
65
+ "stddeviation", "stdDeviation"
66
+ "stitchtiles", "stitchTiles"
67
+ "surfacescale", "surfaceScale"
68
+ "systemlanguage", "systemLanguage"
69
+ "tablevalues", "tableValues"
70
+ "targetx", "targetX"
71
+ "targety", "targetY"
72
+ "textlength", "textLength"
73
+ "viewbox", "viewBox"
74
+ "viewtarget", "viewTarget"
75
+ "xchannelselector", "xChannelSelector"
76
+ "ychannelselector", "yChannelSelector"
77
+ "zoomandpan", "zoomAndPan"
@@ -0,0 +1,137 @@
1
+ /* ANSI-C code produced by gperf version 3.1 */
2
+ /* Command-line: gperf -m100 src/svg_tags.gperf */
3
+ /* Computed positions: -k'3,7' */
4
+ /* Filtered by: gperf-filter.sed */
5
+
6
+ #include "replacement.h"
7
+ #include "macros.h"
8
+ #include "ascii.h"
9
+ #include <string.h>
10
+
11
+ #define TOTAL_KEYWORDS 36
12
+ #define MIN_WORD_LENGTH 6
13
+ #define MAX_WORD_LENGTH 19
14
+ #define MIN_HASH_VALUE 6
15
+ #define MAX_HASH_VALUE 42
16
+ /* maximum key range = 37, duplicates = 0 */
17
+
18
+
19
+
20
+ static inline unsigned int
21
+ hash (register const char *str, register size_t len)
22
+ {
23
+ static const unsigned char asso_values[] =
24
+ {
25
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
26
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
27
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
28
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
29
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
30
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
31
+ 43, 43, 43, 43, 43, 43, 12, 2, 10, 22,
32
+ 1, 28, 15, 1, 43, 43, 43, 0, 9, 26,
33
+ 3, 17, 1, 11, 0, 22, 5, 43, 3, 2,
34
+ 43, 43, 43, 43, 43, 43, 43, 43, 12, 2,
35
+ 10, 22, 1, 28, 15, 1, 43, 43, 43, 0,
36
+ 9, 26, 3, 17, 1, 11, 0, 22, 5, 43,
37
+ 3, 2, 43, 43, 43, 43, 43, 43, 43, 43,
38
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
39
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
40
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
41
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
42
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
43
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
44
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
45
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
46
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
47
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
48
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
49
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
50
+ 43, 43, 43, 43, 43, 43, 43
51
+ };
52
+ register unsigned int hval = len;
53
+
54
+ switch (hval)
55
+ {
56
+ default:
57
+ hval += asso_values[(unsigned char)str[6]+1];
58
+ /*FALLTHROUGH*/
59
+ case 6:
60
+ case 5:
61
+ case 4:
62
+ case 3:
63
+ hval += asso_values[(unsigned char)str[2]];
64
+ break;
65
+ }
66
+ return hval;
67
+ }
68
+
69
+ const StringReplacement *
70
+ gumbo_get_svg_tag_replacement (register const char *str, register size_t len)
71
+ {
72
+ static const unsigned char lengthtable[] =
73
+ {
74
+ 0, 0, 0, 0, 0, 0, 6, 0, 7, 7, 7, 8, 11, 12,
75
+ 12, 13, 11, 12, 16, 7, 7, 16, 11, 7, 19, 8, 13, 17,
76
+ 11, 12, 7, 8, 17, 8, 18, 8, 14, 12, 14, 14, 13, 7,
77
+ 14
78
+ };
79
+ static const StringReplacement wordlist[] =
80
+ {
81
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
82
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
83
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
84
+ {"fetile", "feTile"},
85
+ {(char*)0,(char*)0},
86
+ {"femerge", "feMerge"},
87
+ {"feimage", "feImage"},
88
+ {"fefuncb", "feFuncB"},
89
+ {"glyphref", "glyphRef"},
90
+ {"femergenode", "feMergeNode"},
91
+ {"femorphology", "feMorphology"},
92
+ {"animatecolor", "animateColor"},
93
+ {"animatemotion", "animateMotion"},
94
+ {"fecomposite", "feComposite"},
95
+ {"feturbulence", "feTurbulence"},
96
+ {"animatetransform", "animateTransform"},
97
+ {"fefuncr", "feFuncR"},
98
+ {"fefunca", "feFuncA"},
99
+ {"feconvolvematrix", "feConvolveMatrix"},
100
+ {"fespotlight", "feSpotLight"},
101
+ {"fefuncg", "feFuncG"},
102
+ {"fecomponenttransfer", "feComponentTransfer"},
103
+ {"altglyph", "altGlyph"},
104
+ {"fecolormatrix", "feColorMatrix"},
105
+ {"fedisplacementmap", "feDisplacementMap"},
106
+ {"altglyphdef", "altGlyphDef"},
107
+ {"altglyphitem", "altGlyphItem"},
108
+ {"feflood", "feFlood"},
109
+ {"clippath", "clipPath"},
110
+ {"fediffuselighting", "feDiffuseLighting"},
111
+ {"textpath", "textPath"},
112
+ {"fespecularlighting", "feSpecularLighting"},
113
+ {"feoffset", "feOffset"},
114
+ {"fedistantlight", "feDistantLight"},
115
+ {"fepointlight", "fePointLight"},
116
+ {"lineargradient", "linearGradient"},
117
+ {"radialgradient", "radialGradient"},
118
+ {"foreignobject", "foreignObject"},
119
+ {"feblend", "feBlend"},
120
+ {"fegaussianblur", "feGaussianBlur"}
121
+ };
122
+
123
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
124
+ {
125
+ register unsigned int key = hash (str, len);
126
+
127
+ if (key <= MAX_HASH_VALUE)
128
+ if (len == lengthtable[key])
129
+ {
130
+ register const char *s = wordlist[key].from;
131
+
132
+ if (s && (((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gumbo_ascii_strncasecmp(str, s, len))
133
+ return &wordlist[key];
134
+ }
135
+ }
136
+ return 0;
137
+ }