html-to-markdown 2.24.6 → 2.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +2 -2
  3. data/README.md +1 -1
  4. data/ext/html-to-markdown-rb/native/Cargo.lock +9 -32
  5. data/ext/html-to-markdown-rb/native/Cargo.toml +1 -1
  6. data/lib/html_to_markdown/version.rb +1 -1
  7. data/rust-vendor/html-to-markdown-rs/Cargo.toml +0 -1
  8. data/rust-vendor/html-to-markdown-rs/src/converter/main_helpers.rs +1 -1
  9. data/rust-vendor/html-to-markdown-rs/src/hocr/converter/hierarchy.rs +20 -5
  10. data/rust-vendor/html-to-markdown-rs/src/lib.rs +1 -0
  11. data/rust-vendor/{markup5ever_rcdom/lib.rs → html-to-markdown-rs/src/rcdom.rs} +56 -91
  12. data/rust-vendor/html-to-markdown-rs/tests/hocr_compliance_test.rs +157 -0
  13. data/rust-vendor/memmap2/.cargo-checksum.json +1 -1
  14. data/rust-vendor/memmap2/.cargo_vcs_info.json +1 -1
  15. data/rust-vendor/memmap2/CHANGELOG.md +8 -0
  16. data/rust-vendor/memmap2/Cargo.lock +1 -1
  17. data/rust-vendor/memmap2/Cargo.toml +2 -1
  18. data/rust-vendor/memmap2/Cargo.toml.orig +2 -1
  19. data/rust-vendor/memmap2/src/lib.rs +25 -1
  20. data/rust-vendor/memmap2/src/stub.rs +1 -4
  21. data/rust-vendor/memmap2/src/unix.rs +14 -1
  22. data/rust-vendor/png/.cargo-checksum.json +1 -1
  23. data/rust-vendor/png/.cargo_vcs_info.json +1 -1
  24. data/rust-vendor/png/CHANGES.md +44 -0
  25. data/rust-vendor/png/Cargo.lock +124 -171
  26. data/rust-vendor/png/Cargo.toml +1 -1
  27. data/rust-vendor/png/Cargo.toml.orig +1 -1
  28. data/rust-vendor/png/benches/expand_paletted.rs +5 -5
  29. data/rust-vendor/png/benches/unfilter.rs +3 -3
  30. data/rust-vendor/png/src/adam7.rs +17 -10
  31. data/rust-vendor/png/src/common.rs +8 -8
  32. data/rust-vendor/png/src/decoder/mod.rs +53 -20
  33. data/rust-vendor/png/src/decoder/stream.rs +263 -78
  34. data/rust-vendor/png/src/decoder/unfiltering_buffer.rs +210 -53
  35. data/rust-vendor/png/src/decoder/zlib.rs +130 -90
  36. data/rust-vendor/png/src/encoder.rs +4 -2
  37. data/rust-vendor/png/src/{filter.rs → filter/mod.rs} +100 -367
  38. data/rust-vendor/png/src/filter/optimization-notes.md +104 -0
  39. data/rust-vendor/png/src/filter/paeth.rs +398 -0
  40. data/rust-vendor/png/src/filter/simd.rs +308 -0
  41. data/rust-vendor/png/src/lib.rs +1 -0
  42. data/rust-vendor/syn/.cargo-checksum.json +1 -1
  43. data/rust-vendor/syn/.cargo_vcs_info.json +1 -1
  44. data/rust-vendor/syn/Cargo.lock +40 -41
  45. data/rust-vendor/syn/Cargo.toml +1 -1
  46. data/rust-vendor/syn/Cargo.toml.orig +1 -1
  47. data/rust-vendor/syn/src/item.rs +61 -40
  48. data/rust-vendor/syn/src/lib.rs +2 -1
  49. data/rust-vendor/syn/tests/test_item.rs +54 -0
  50. data/rust-vendor/unicode-ident/.cargo-checksum.json +1 -1
  51. data/rust-vendor/unicode-ident/.cargo_vcs_info.json +1 -1
  52. data/rust-vendor/unicode-ident/Cargo.lock +21 -21
  53. data/rust-vendor/unicode-ident/Cargo.toml +1 -1
  54. data/rust-vendor/unicode-ident/Cargo.toml.orig +1 -1
  55. data/rust-vendor/unicode-ident/src/lib.rs +1 -1
  56. data/rust-vendor/unicode-ident/src/tables.rs +87 -97
  57. data/rust-vendor/unicode-ident/tests/static_size.rs +1 -1
  58. metadata +7 -177
  59. data/rust-vendor/markup5ever_rcdom/.cargo-checksum.json +0 -1
  60. data/rust-vendor/markup5ever_rcdom/.cargo_vcs_info.json +0 -7
  61. data/rust-vendor/markup5ever_rcdom/Cargo.lock +0 -658
  62. data/rust-vendor/markup5ever_rcdom/Cargo.toml +0 -109
  63. data/rust-vendor/markup5ever_rcdom/Cargo.toml.orig +0 -42
  64. data/rust-vendor/markup5ever_rcdom/LICENSE-APACHE +0 -201
  65. data/rust-vendor/markup5ever_rcdom/LICENSE-MIT +0 -25
  66. data/rust-vendor/markup5ever_rcdom/README.md +0 -7
  67. data/rust-vendor/markup5ever_rcdom/custom-html5lib-tokenizer-tests/regression.test +0 -69
  68. data/rust-vendor/markup5ever_rcdom/data/test/ignore +0 -1
  69. data/rust-vendor/markup5ever_rcdom/examples/hello_xml.rs +0 -39
  70. data/rust-vendor/markup5ever_rcdom/examples/html2html.rs +0 -51
  71. data/rust-vendor/markup5ever_rcdom/examples/print-rcdom.rs +0 -78
  72. data/rust-vendor/markup5ever_rcdom/examples/xml_tree_printer.rs +0 -67
  73. data/rust-vendor/markup5ever_rcdom/html5lib-tests/.gitattributes +0 -2
  74. data/rust-vendor/markup5ever_rcdom/html5lib-tests/.github/workflows/downstream.yml +0 -76
  75. data/rust-vendor/markup5ever_rcdom/html5lib-tests/.github/workflows/lint.yml +0 -25
  76. data/rust-vendor/markup5ever_rcdom/html5lib-tests/.gitignore +0 -79
  77. data/rust-vendor/markup5ever_rcdom/html5lib-tests/AUTHORS.rst +0 -34
  78. data/rust-vendor/markup5ever_rcdom/html5lib-tests/LICENSE +0 -21
  79. data/rust-vendor/markup5ever_rcdom/html5lib-tests/encoding/chardet/test_big5.txt +0 -51
  80. data/rust-vendor/markup5ever_rcdom/html5lib-tests/encoding/scripted/tests1.dat +0 -5
  81. data/rust-vendor/markup5ever_rcdom/html5lib-tests/encoding/test-yahoo-jp.dat +0 -10
  82. data/rust-vendor/markup5ever_rcdom/html5lib-tests/encoding/tests1.dat +0 -388
  83. data/rust-vendor/markup5ever_rcdom/html5lib-tests/encoding/tests2.dat +0 -115
  84. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint +0 -6
  85. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/__init__.py +0 -0
  86. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/__init__.py +0 -0
  87. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/funcparserlib/LICENSE +0 -18
  88. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/funcparserlib/__init__.py +0 -0
  89. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/funcparserlib/lexer.py +0 -211
  90. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/funcparserlib/lexer.pyi +0 -34
  91. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/funcparserlib/parser.py +0 -872
  92. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/funcparserlib/parser.pyi +0 -83
  93. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/funcparserlib/py.typed +0 -0
  94. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/funcparserlib/util.py +0 -72
  95. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/funcparserlib/util.pyi +0 -7
  96. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor/vendor.txt +0 -1
  97. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/_vendor-patches/funcparserlib.patch +0 -24
  98. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/lint.py +0 -280
  99. data/rust-vendor/markup5ever_rcdom/html5lib-tests/lint_lib/parser.py +0 -177
  100. data/rust-vendor/markup5ever_rcdom/html5lib-tests/pyproject.toml +0 -7
  101. data/rust-vendor/markup5ever_rcdom/html5lib-tests/serializer/core.test +0 -125
  102. data/rust-vendor/markup5ever_rcdom/html5lib-tests/serializer/injectmeta.test +0 -66
  103. data/rust-vendor/markup5ever_rcdom/html5lib-tests/serializer/optionaltags.test +0 -965
  104. data/rust-vendor/markup5ever_rcdom/html5lib-tests/serializer/options.test +0 -60
  105. data/rust-vendor/markup5ever_rcdom/html5lib-tests/serializer/whitespace.test +0 -51
  106. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/README.md +0 -107
  107. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/contentModelFlags.test +0 -93
  108. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/domjs.test +0 -335
  109. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/entities.test +0 -542
  110. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/escapeFlag.test +0 -36
  111. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/namedEntities.test +0 -42422
  112. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/numericEntities.test +0 -1677
  113. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/pendingSpecChanges.test +0 -9
  114. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/test1.test +0 -353
  115. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/test2.test +0 -275
  116. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/test3.test +0 -11233
  117. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/test4.test +0 -532
  118. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/unicodeChars.test +0 -1577
  119. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/unicodeCharsProblematic.test +0 -41
  120. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tokenizer/xmlViolation.test +0 -20
  121. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/README.md +0 -108
  122. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/adoption01.dat +0 -354
  123. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/adoption02.dat +0 -39
  124. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/blocks.dat +0 -695
  125. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/comments01.dat +0 -217
  126. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/doctype01.dat +0 -474
  127. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/domjs-unsafe.dat +0 -0
  128. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/entities01.dat +0 -943
  129. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/entities02.dat +0 -309
  130. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/foreign-fragment.dat +0 -645
  131. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/html5test-com.dat +0 -301
  132. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/inbody01.dat +0 -54
  133. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/isindex.dat +0 -49
  134. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/main-element.dat +0 -46
  135. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/math.dat +0 -104
  136. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/menuitem-element.dat +0 -240
  137. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/namespace-sensitivity.dat +0 -22
  138. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/noscript01.dat +0 -237
  139. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/pending-spec-changes-plain-text-unsafe.dat +0 -0
  140. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/pending-spec-changes.dat +0 -46
  141. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/plain-text-unsafe.dat +0 -0
  142. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/quirks01.dat +0 -53
  143. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/ruby.dat +0 -302
  144. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/scriptdata01.dat +0 -372
  145. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/scripted/adoption01.dat +0 -16
  146. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/scripted/ark.dat +0 -27
  147. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/scripted/webkit01.dat +0 -30
  148. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/search-element.dat +0 -46
  149. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/svg.dat +0 -104
  150. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tables01.dat +0 -322
  151. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/template.dat +0 -1673
  152. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests1.dat +0 -1956
  153. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests10.dat +0 -849
  154. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests11.dat +0 -523
  155. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests12.dat +0 -62
  156. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests14.dat +0 -75
  157. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests15.dat +0 -216
  158. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests16.dat +0 -2602
  159. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests17.dat +0 -179
  160. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests18.dat +0 -558
  161. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests19.dat +0 -1398
  162. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests2.dat +0 -831
  163. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests20.dat +0 -842
  164. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests21.dat +0 -306
  165. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests22.dat +0 -190
  166. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests23.dat +0 -168
  167. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests24.dat +0 -79
  168. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests25.dat +0 -288
  169. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests26.dat +0 -453
  170. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests3.dat +0 -305
  171. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests4.dat +0 -74
  172. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests5.dat +0 -210
  173. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests6.dat +0 -663
  174. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests7.dat +0 -453
  175. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests8.dat +0 -165
  176. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests9.dat +0 -472
  177. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tests_innerHTML_1.dat +0 -843
  178. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/tricky01.dat +0 -336
  179. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/webkit01.dat +0 -785
  180. data/rust-vendor/markup5ever_rcdom/html5lib-tests/tree-construction/webkit02.dat +0 -554
  181. data/rust-vendor/markup5ever_rcdom/tests/foreach_html5lib_test/mod.rs +0 -41
  182. data/rust-vendor/markup5ever_rcdom/tests/html-driver.rs +0 -29
  183. data/rust-vendor/markup5ever_rcdom/tests/html-serializer.rs +0 -265
  184. data/rust-vendor/markup5ever_rcdom/tests/html-tokenizer.rs +0 -487
  185. data/rust-vendor/markup5ever_rcdom/tests/html-tree-builder.rs +0 -298
  186. data/rust-vendor/markup5ever_rcdom/tests/html-tree-sink.rs +0 -141
  187. data/rust-vendor/markup5ever_rcdom/tests/util/find_tests.rs +0 -34
  188. data/rust-vendor/markup5ever_rcdom/tests/util/runner.rs +0 -48
  189. data/rust-vendor/markup5ever_rcdom/tests/xml-driver.rs +0 -101
  190. data/rust-vendor/markup5ever_rcdom/tests/xml-tokenizer.rs +0 -374
  191. data/rust-vendor/markup5ever_rcdom/tests/xml-tree-builder.rs +0 -237
  192. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/AUTHORS.rst +0 -9
  193. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/LICENSE +0 -21
  194. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tokenizer/README.md +0 -92
  195. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tokenizer/comments.test +0 -274
  196. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tokenizer/doctype.test +0 -3232
  197. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tokenizer/entities.test +0 -283
  198. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tokenizer/eof.test +0 -113
  199. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tokenizer/namedEntities.test +0 -42210
  200. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tokenizer/numericEntities.test +0 -1349
  201. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tokenizer/test1.test +0 -162
  202. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tokenizer/test2.test +0 -64
  203. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tokenizer/unicodeChars.test +0 -1295
  204. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tree-construction/README.md +0 -104
  205. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tree-construction/namespace.dat +0 -119
  206. data/rust-vendor/markup5ever_rcdom/xml5lib-tests/tree-construction/test1.dat +0 -124
  207. data/rust-vendor/xml5ever/.cargo-checksum.json +0 -1
  208. data/rust-vendor/xml5ever/.cargo_vcs_info.json +0 -6
  209. data/rust-vendor/xml5ever/Cargo.lock +0 -752
  210. data/rust-vendor/xml5ever/Cargo.toml +0 -69
  211. data/rust-vendor/xml5ever/Cargo.toml.orig +0 -29
  212. data/rust-vendor/xml5ever/LICENSE-APACHE +0 -201
  213. data/rust-vendor/xml5ever/LICENSE-MIT +0 -25
  214. data/rust-vendor/xml5ever/README.md +0 -72
  215. data/rust-vendor/xml5ever/benches/xml5ever.rs +0 -77
  216. data/rust-vendor/xml5ever/data/bench/strong.xml +0 -1
  217. data/rust-vendor/xml5ever/examples/README.md +0 -223
  218. data/rust-vendor/xml5ever/examples/example.xml +0 -3
  219. data/rust-vendor/xml5ever/examples/simple_xml_tokenizer.rs +0 -81
  220. data/rust-vendor/xml5ever/examples/xml_tokenizer.rs +0 -115
  221. data/rust-vendor/xml5ever/src/driver.rs +0 -90
  222. data/rust-vendor/xml5ever/src/lib.rs +0 -47
  223. data/rust-vendor/xml5ever/src/macros.rs +0 -18
  224. data/rust-vendor/xml5ever/src/serialize/mod.rs +0 -216
  225. data/rust-vendor/xml5ever/src/tokenizer/char_ref/mod.rs +0 -456
  226. data/rust-vendor/xml5ever/src/tokenizer/interface.rs +0 -116
  227. data/rust-vendor/xml5ever/src/tokenizer/mod.rs +0 -1344
  228. data/rust-vendor/xml5ever/src/tokenizer/qname.rs +0 -84
  229. data/rust-vendor/xml5ever/src/tokenizer/states.rs +0 -167
  230. data/rust-vendor/xml5ever/src/tree_builder/mod.rs +0 -774
  231. data/rust-vendor/xml5ever/src/tree_builder/types.rs +0 -37
@@ -1,774 +0,0 @@
1
- // Copyright 2014-2017 The html5ever Project Developers. See the
2
- // COPYRIGHT file at the top-level directory of this distribution.
3
- //
4
- // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
5
- // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6
- // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7
- // option. This file may not be copied, modified, or distributed
8
- // except according to those terms.
9
-
10
- mod types;
11
-
12
- use log::{debug, warn};
13
- use markup5ever::{local_name, namespace_prefix, ns};
14
- use std::borrow::Cow;
15
- use std::borrow::Cow::Borrowed;
16
- use std::cell::{Cell, Ref, RefCell};
17
- use std::collections::btree_map::Iter;
18
- use std::collections::{BTreeMap, HashSet, VecDeque};
19
- use std::fmt::{Debug, Error, Formatter};
20
- use std::mem;
21
-
22
- pub use self::interface::{ElemName, NodeOrText, Tracer, TreeSink};
23
- use self::types::*;
24
- use crate::interface::{self, create_element, AppendNode, Attribute, QualName};
25
- use crate::interface::{AppendText, ExpandedName};
26
- use crate::tokenizer::{self, EndTag, ProcessResult, StartTag, Tag, TokenSink};
27
- use crate::tokenizer::{Doctype, EmptyTag, Pi, ShortTag};
28
- use crate::{LocalName, Namespace, Prefix};
29
-
30
- use crate::tendril::{StrTendril, Tendril};
31
-
32
- static XML_URI: &str = "http://www.w3.org/XML/1998/namespace";
33
- static XMLNS_URI: &str = "http://www.w3.org/2000/xmlns/";
34
-
35
- type InsResult = Result<(), Cow<'static, str>>;
36
-
37
- #[derive(Debug)]
38
- struct NamespaceMapStack(Vec<NamespaceMap>);
39
-
40
- impl NamespaceMapStack {
41
- fn new() -> NamespaceMapStack {
42
- NamespaceMapStack(vec![NamespaceMap::default()])
43
- }
44
-
45
- fn push(&mut self, map: NamespaceMap) {
46
- self.0.push(map);
47
- }
48
-
49
- fn pop(&mut self) {
50
- self.0.pop();
51
- }
52
- }
53
-
54
- pub(crate) struct NamespaceMap {
55
- // Map that maps prefixes to URI.
56
- //
57
- // Key denotes namespace prefix, and value denotes
58
- // URI it maps to.
59
- //
60
- // If value of value is None, that means the namespace
61
- // denoted by key has been undeclared.
62
- scope: BTreeMap<Option<Prefix>, Option<Namespace>>,
63
- }
64
-
65
- impl Debug for NamespaceMap {
66
- fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
67
- write!(f, "\nNamespaceMap[")?;
68
- for (key, value) in &self.scope {
69
- writeln!(f, " {key:?} : {value:?}")?;
70
- }
71
- write!(f, "]")
72
- }
73
- }
74
-
75
- impl NamespaceMap {
76
- // Returns an empty namespace.
77
- pub(crate) fn empty() -> NamespaceMap {
78
- NamespaceMap {
79
- scope: BTreeMap::new(),
80
- }
81
- }
82
-
83
- fn default() -> NamespaceMap {
84
- NamespaceMap {
85
- scope: {
86
- let mut map = BTreeMap::new();
87
- map.insert(None, None);
88
- map.insert(Some(namespace_prefix!("xml")), Some(ns!(xml)));
89
- map.insert(Some(namespace_prefix!("xmlns")), Some(ns!(xmlns)));
90
- map
91
- },
92
- }
93
- }
94
-
95
- pub(crate) fn get(&self, prefix: &Option<Prefix>) -> Option<&Option<Namespace>> {
96
- self.scope.get(prefix)
97
- }
98
-
99
- pub(crate) fn get_scope_iter(&self) -> Iter<'_, Option<Prefix>, Option<Namespace>> {
100
- self.scope.iter()
101
- }
102
-
103
- pub(crate) fn insert(&mut self, name: &QualName) {
104
- let prefix = name.prefix.as_ref().cloned();
105
- let namespace = Some(Namespace::from(&*name.ns));
106
- self.scope.insert(prefix, namespace);
107
- }
108
-
109
- fn insert_ns(&mut self, attr: &Attribute) -> InsResult {
110
- if &*attr.value == XMLNS_URI {
111
- return Err(Borrowed("Can't declare XMLNS URI"));
112
- };
113
-
114
- let opt_uri = if attr.value.is_empty() {
115
- None
116
- } else {
117
- Some(Namespace::from(&*attr.value))
118
- };
119
-
120
- let result = match (&attr.name.prefix, &*attr.name.local) {
121
- (&Some(namespace_prefix!("xmlns")), "xml") => {
122
- if &*attr.value != XML_URI {
123
- Err(Borrowed("XML namespace can't be redeclared"))
124
- } else {
125
- Ok(())
126
- }
127
- },
128
-
129
- (&Some(namespace_prefix!("xmlns")), "xmlns") => {
130
- Err(Borrowed("XMLNS namespaces can't be changed"))
131
- },
132
-
133
- (&Some(namespace_prefix!("xmlns")), _) | (&None, "xmlns") => {
134
- // We can have two cases of properly defined xmlns
135
- // First with default namespace e.g.
136
- //
137
- // <a xmlns = "www.uri.org" />
138
- let ns_prefix = if &*attr.name.local == "xmlns" {
139
- None
140
-
141
- // Second is with named namespace e.g.
142
- //
143
- // <a xmlns:a = "www.uri.org" />
144
- } else {
145
- Some(Prefix::from(&*attr.name.local))
146
- };
147
-
148
- if opt_uri.is_some() && self.scope.contains_key(&ns_prefix) {
149
- Err(Borrowed("Namespace already defined"))
150
- } else {
151
- self.scope.insert(ns_prefix, opt_uri);
152
- Ok(())
153
- }
154
- },
155
-
156
- (_, _) => Err(Borrowed("Invalid namespace declaration.")),
157
- };
158
- result
159
- }
160
- }
161
-
162
- /// Tree builder options, with an impl for Default.
163
- #[derive(Copy, Clone, Default)]
164
- pub struct XmlTreeBuilderOpts {}
165
-
166
- /// The XML tree builder.
167
- pub struct XmlTreeBuilder<Handle, Sink> {
168
- /// Configuration options for XmlTreeBuilder
169
- _opts: XmlTreeBuilderOpts,
170
-
171
- /// Consumer of tree modifications.
172
- pub sink: Sink,
173
-
174
- /// The document node, which is created by the sink.
175
- doc_handle: Handle,
176
-
177
- /// Stack of open elements, most recently added at end.
178
- open_elems: RefCell<Vec<Handle>>,
179
-
180
- /// Current element pointer.
181
- curr_elem: RefCell<Option<Handle>>,
182
-
183
- /// Stack of namespace identifiers and namespaces.
184
- namespace_stack: RefCell<NamespaceMapStack>,
185
-
186
- /// Current namespace identifier
187
- current_namespace: RefCell<NamespaceMap>,
188
-
189
- /// Current tree builder phase.
190
- phase: Cell<XmlPhase>,
191
- }
192
- impl<Handle, Sink> XmlTreeBuilder<Handle, Sink>
193
- where
194
- Handle: Clone,
195
- Sink: TreeSink<Handle = Handle>,
196
- {
197
- /// Create a new tree builder which sends tree modifications to a particular `TreeSink`.
198
- ///
199
- /// The tree builder is also a `TokenSink`.
200
- pub fn new(sink: Sink, opts: XmlTreeBuilderOpts) -> XmlTreeBuilder<Handle, Sink> {
201
- let doc_handle = sink.get_document();
202
- XmlTreeBuilder {
203
- _opts: opts,
204
- sink,
205
- doc_handle,
206
- open_elems: RefCell::new(vec![]),
207
- curr_elem: RefCell::new(None),
208
- namespace_stack: RefCell::new(NamespaceMapStack::new()),
209
- current_namespace: RefCell::new(NamespaceMap::empty()),
210
- phase: Cell::new(XmlPhase::Start),
211
- }
212
- }
213
-
214
- /// Call the `Tracer`'s `trace_handle` method on every `Handle` in the tree builder's
215
- /// internal state. This is intended to support garbage-collected DOMs.
216
- pub fn trace_handles(&self, tracer: &dyn Tracer<Handle = Handle>) {
217
- tracer.trace_handle(&self.doc_handle);
218
- for e in self.open_elems.borrow().iter() {
219
- tracer.trace_handle(e);
220
- }
221
- if let Some(h) = self.curr_elem.borrow().as_ref() {
222
- tracer.trace_handle(h);
223
- }
224
- }
225
-
226
- // Debug helper
227
- #[cfg(not(for_c))]
228
- #[allow(dead_code)]
229
- fn dump_state(&self, label: String) {
230
- debug!("dump_state on {label}");
231
- debug!(" open_elems:");
232
- for node in self.open_elems.borrow().iter() {
233
- debug!(" {:?}", self.sink.elem_name(node));
234
- }
235
- debug!("");
236
- }
237
-
238
- #[cfg(for_c)]
239
- fn debug_step(&self, _mode: XmlPhase, _token: &Token) {}
240
-
241
- #[cfg(not(for_c))]
242
- fn debug_step(&self, mode: XmlPhase, token: &Token) {
243
- debug!(
244
- "processing {:?} in insertion mode {:?}",
245
- format!("{:?}", token),
246
- mode
247
- );
248
- }
249
-
250
- fn declare_ns(&self, attr: &mut Attribute) {
251
- if let Err(msg) = self.current_namespace.borrow_mut().insert_ns(attr) {
252
- self.sink.parse_error(msg);
253
- } else {
254
- attr.name.ns = ns!(xmlns);
255
- }
256
- }
257
-
258
- fn find_uri(&self, prefix: &Option<Prefix>) -> Result<Option<Namespace>, Cow<'static, str>> {
259
- let mut uri = Err(Borrowed("No appropriate namespace found"));
260
-
261
- let current_namespace = self.current_namespace.borrow();
262
- for ns in self
263
- .namespace_stack
264
- .borrow()
265
- .0
266
- .iter()
267
- .chain(Some(&*current_namespace))
268
- .rev()
269
- {
270
- if let Some(el) = ns.get(prefix) {
271
- uri = Ok(el.clone());
272
- break;
273
- }
274
- }
275
- uri
276
- }
277
-
278
- fn bind_qname(&self, name: &mut QualName) {
279
- match self.find_uri(&name.prefix) {
280
- Ok(uri) => {
281
- let ns_uri = match uri {
282
- Some(e) => e,
283
- None => ns!(),
284
- };
285
- name.ns = ns_uri;
286
- },
287
- Err(msg) => {
288
- self.sink.parse_error(msg);
289
- },
290
- }
291
- }
292
-
293
- // This method takes in name qualified name and binds it to the
294
- // existing namespace context.
295
- //
296
- // Returns false if the attribute is a duplicate, returns true otherwise.
297
- fn bind_attr_qname(
298
- &self,
299
- present_attrs: &mut HashSet<(Namespace, LocalName)>,
300
- name: &mut QualName,
301
- ) -> bool {
302
- // Attributes don't have default namespace
303
- let mut not_duplicate = true;
304
-
305
- if name.prefix.is_some() {
306
- self.bind_qname(name);
307
- not_duplicate = Self::check_duplicate_attr(present_attrs, name);
308
- }
309
- not_duplicate
310
- }
311
-
312
- fn check_duplicate_attr(
313
- present_attrs: &mut HashSet<(Namespace, LocalName)>,
314
- name: &QualName,
315
- ) -> bool {
316
- let pair = (name.ns.clone(), name.local.clone());
317
-
318
- if present_attrs.contains(&pair) {
319
- return false;
320
- }
321
- present_attrs.insert(pair);
322
- true
323
- }
324
-
325
- fn process_namespaces(&self, tag: &mut Tag) {
326
- // List of already present namespace local name attribute pairs.
327
- let mut present_attrs: HashSet<(Namespace, LocalName)> = Default::default();
328
-
329
- let mut new_attr = vec![];
330
- // First we extract all namespace declarations
331
- for attr in tag.attrs.iter_mut().filter(|attr| {
332
- attr.name.prefix == Some(namespace_prefix!("xmlns"))
333
- || attr.name.local == local_name!("xmlns")
334
- }) {
335
- self.declare_ns(attr);
336
- }
337
-
338
- // Then we bind those namespace declarations to attributes
339
- for attr in tag.attrs.iter_mut().filter(|attr| {
340
- attr.name.prefix != Some(namespace_prefix!("xmlns"))
341
- && attr.name.local != local_name!("xmlns")
342
- }) {
343
- if self.bind_attr_qname(&mut present_attrs, &mut attr.name) {
344
- new_attr.push(attr.clone());
345
- }
346
- }
347
- tag.attrs = new_attr;
348
-
349
- // Then we bind the tags namespace.
350
- self.bind_qname(&mut tag.name);
351
-
352
- // Finally, we dump current namespace if its unneeded.
353
- let x = mem::replace(
354
- &mut *self.current_namespace.borrow_mut(),
355
- NamespaceMap::empty(),
356
- );
357
-
358
- // Only start tag doesn't dump current namespace. However, <script /> is treated
359
- // differently than every other empty tag, so it needs to retain the current
360
- // namespace as well.
361
- if tag.kind == StartTag || (tag.kind == EmptyTag && tag.name.local == local_name!("script"))
362
- {
363
- self.namespace_stack.borrow_mut().push(x);
364
- }
365
- }
366
-
367
- fn process_to_completion(
368
- &self,
369
- mut token: Token,
370
- ) -> ProcessResult<<Self as TokenSink>::Handle> {
371
- // Queue of additional tokens yet to be processed.
372
- // This stays empty in the common case where we don't split whitespace.
373
- let mut more_tokens = VecDeque::new();
374
-
375
- loop {
376
- let phase = self.phase.get();
377
-
378
- #[allow(clippy::unused_unit)]
379
- match self.step(phase, token) {
380
- XmlProcessResult::Done => {
381
- let Some(popped_token) = more_tokens.pop_front() else {
382
- return ProcessResult::Continue;
383
- };
384
- token = popped_token;
385
- },
386
- XmlProcessResult::Reprocess(m, t) => {
387
- self.phase.set(m);
388
- token = t;
389
- },
390
- XmlProcessResult::Script(node) => {
391
- assert!(more_tokens.is_empty());
392
- return ProcessResult::Script(node);
393
- },
394
- }
395
- }
396
- }
397
- }
398
-
399
- impl<Handle, Sink> TokenSink for XmlTreeBuilder<Handle, Sink>
400
- where
401
- Handle: Clone,
402
- Sink: TreeSink<Handle = Handle>,
403
- {
404
- type Handle = Handle;
405
-
406
- fn process_token(&self, token: tokenizer::Token) -> ProcessResult<Self::Handle> {
407
- // Handle `ParseError` and `DoctypeToken`; convert everything else to the local `Token` type.
408
- let token = match token {
409
- tokenizer::Token::ParseError(e) => {
410
- self.sink.parse_error(e);
411
- return ProcessResult::Done;
412
- },
413
-
414
- tokenizer::Token::Doctype(d) => Token::Doctype(d),
415
- tokenizer::Token::ProcessingInstruction(instruction) => Token::Pi(instruction),
416
- tokenizer::Token::Tag(x) => Token::Tag(x),
417
- tokenizer::Token::Comment(x) => Token::Comment(x),
418
- tokenizer::Token::NullCharacter => Token::NullCharacter,
419
- tokenizer::Token::EndOfFile => Token::Eof,
420
- tokenizer::Token::Characters(x) => Token::Characters(x),
421
- };
422
-
423
- self.process_to_completion(token)
424
- }
425
-
426
- fn end(&self) {
427
- for node in self.open_elems.borrow_mut().drain(..).rev() {
428
- self.sink.pop(&node);
429
- }
430
- }
431
- }
432
-
433
- fn current_node<Handle>(open_elems: &[Handle]) -> &Handle {
434
- open_elems.last().expect("no current element")
435
- }
436
-
437
- impl<Handle, Sink> XmlTreeBuilder<Handle, Sink>
438
- where
439
- Handle: Clone,
440
- Sink: TreeSink<Handle = Handle>,
441
- {
442
- fn current_node(&self) -> Ref<'_, Handle> {
443
- Ref::map(self.open_elems.borrow(), |elems| {
444
- elems.last().expect("no current element")
445
- })
446
- }
447
-
448
- fn insert_appropriately(&self, child: NodeOrText<Handle>) {
449
- let open_elems = self.open_elems.borrow();
450
- let target = current_node(&open_elems);
451
- self.sink.append(target, child);
452
- }
453
-
454
- fn insert_tag(&self, tag: Tag) -> XmlProcessResult<Handle> {
455
- let child = create_element(&self.sink, tag.name, tag.attrs);
456
- self.insert_appropriately(AppendNode(child.clone()));
457
- self.add_to_open_elems(child)
458
- }
459
-
460
- fn append_tag(&self, tag: Tag) -> XmlProcessResult<Handle> {
461
- let child = create_element(&self.sink, tag.name, tag.attrs);
462
- self.insert_appropriately(AppendNode(child.clone()));
463
- self.sink.pop(&child);
464
- XmlProcessResult::Done
465
- }
466
-
467
- fn append_tag_to_doc(&self, tag: Tag) -> Handle {
468
- let child = create_element(&self.sink, tag.name, tag.attrs);
469
-
470
- self.sink
471
- .append(&self.doc_handle, AppendNode(child.clone()));
472
- child
473
- }
474
-
475
- fn add_to_open_elems(&self, el: Handle) -> XmlProcessResult<Handle> {
476
- self.open_elems.borrow_mut().push(el);
477
-
478
- XmlProcessResult::Done
479
- }
480
-
481
- fn append_comment_to_doc(&self, text: StrTendril) -> XmlProcessResult<Handle> {
482
- let comment = self.sink.create_comment(text);
483
- self.sink.append(&self.doc_handle, AppendNode(comment));
484
- XmlProcessResult::Done
485
- }
486
-
487
- fn append_comment_to_tag(&self, text: StrTendril) -> XmlProcessResult<Handle> {
488
- let open_elems = self.open_elems.borrow();
489
- let target = current_node(&open_elems);
490
- let comment = self.sink.create_comment(text);
491
- self.sink.append(target, AppendNode(comment));
492
- XmlProcessResult::Done
493
- }
494
-
495
- fn append_doctype_to_doc(&self, doctype: Doctype) -> XmlProcessResult<Handle> {
496
- fn get_tendril(opt: Option<StrTendril>) -> StrTendril {
497
- match opt {
498
- Some(expr) => expr,
499
- None => Tendril::new(),
500
- }
501
- }
502
- self.sink.append_doctype_to_document(
503
- get_tendril(doctype.name),
504
- get_tendril(doctype.public_id),
505
- get_tendril(doctype.system_id),
506
- );
507
- XmlProcessResult::Done
508
- }
509
-
510
- fn append_pi_to_doc(&self, pi: Pi) -> XmlProcessResult<Handle> {
511
- let pi = self.sink.create_pi(pi.target, pi.data);
512
- self.sink.append(&self.doc_handle, AppendNode(pi));
513
- XmlProcessResult::Done
514
- }
515
-
516
- fn append_pi_to_tag(&self, pi: Pi) -> XmlProcessResult<Handle> {
517
- let open_elems = self.open_elems.borrow();
518
- let target = current_node(&open_elems);
519
- let pi = self.sink.create_pi(pi.target, pi.data);
520
- self.sink.append(target, AppendNode(pi));
521
- XmlProcessResult::Done
522
- }
523
-
524
- fn append_text(&self, chars: StrTendril) -> XmlProcessResult<Handle> {
525
- self.insert_appropriately(AppendText(chars));
526
- XmlProcessResult::Done
527
- }
528
-
529
- fn tag_in_open_elems(&self, tag: &Tag) -> bool {
530
- self.open_elems
531
- .borrow()
532
- .iter()
533
- .any(|a| self.sink.elem_name(a).expanded() == tag.name.expanded())
534
- }
535
-
536
- // Pop elements until an element from the set has been popped.
537
- fn pop_until<P>(&self, pred: P)
538
- where
539
- P: Fn(ExpandedName) -> bool,
540
- {
541
- loop {
542
- if self.current_node_in(&pred) {
543
- break;
544
- }
545
- self.pop();
546
- }
547
- }
548
-
549
- fn current_node_in<TagSet>(&self, set: TagSet) -> bool
550
- where
551
- TagSet: Fn(ExpandedName) -> bool,
552
- {
553
- // FIXME: take namespace into consideration:
554
- set(self.sink.elem_name(&self.current_node()).expanded())
555
- }
556
-
557
- fn close_tag(&self, tag: Tag) -> XmlProcessResult<Handle> {
558
- debug!(
559
- "Close tag: current_node.name {:?} \n Current tag {:?}",
560
- self.sink.elem_name(&self.current_node()),
561
- &tag.name
562
- );
563
-
564
- if *self.sink.elem_name(&self.current_node()).local_name() != tag.name.local {
565
- self.sink
566
- .parse_error(Borrowed("Current node doesn't match tag"));
567
- }
568
-
569
- let is_closed = self.tag_in_open_elems(&tag);
570
-
571
- if is_closed {
572
- self.pop_until(|p| p == tag.name.expanded());
573
- self.pop();
574
- }
575
-
576
- XmlProcessResult::Done
577
- }
578
-
579
- fn no_open_elems(&self) -> bool {
580
- self.open_elems.borrow().is_empty()
581
- }
582
-
583
- fn pop(&self) -> Handle {
584
- self.namespace_stack.borrow_mut().pop();
585
- let node = self
586
- .open_elems
587
- .borrow_mut()
588
- .pop()
589
- .expect("no current element");
590
- self.sink.pop(&node);
591
- node
592
- }
593
-
594
- fn stop_parsing(&self) -> XmlProcessResult<Handle> {
595
- warn!("stop_parsing for XML5 not implemented, full speed ahead!");
596
- XmlProcessResult::Done
597
- }
598
- }
599
-
600
- fn any_not_whitespace(x: &StrTendril) -> bool {
601
- !x.bytes()
602
- .all(|b| matches!(b, b'\t' | b'\r' | b'\n' | b'\x0C' | b' '))
603
- }
604
-
605
- impl<Handle, Sink> XmlTreeBuilder<Handle, Sink>
606
- where
607
- Handle: Clone,
608
- Sink: TreeSink<Handle = Handle>,
609
- {
610
- fn step(&self, mode: XmlPhase, token: Token) -> XmlProcessResult<<Self as TokenSink>::Handle> {
611
- self.debug_step(mode, &token);
612
-
613
- match mode {
614
- XmlPhase::Start => match token {
615
- Token::Tag(Tag {
616
- kind: StartTag,
617
- name,
618
- attrs,
619
- }) => {
620
- let tag = {
621
- let mut tag = Tag {
622
- kind: StartTag,
623
- name,
624
- attrs,
625
- };
626
- self.process_namespaces(&mut tag);
627
- tag
628
- };
629
- self.phase.set(XmlPhase::Main);
630
- let handle = self.append_tag_to_doc(tag);
631
- self.add_to_open_elems(handle)
632
- },
633
- Token::Tag(Tag {
634
- kind: EmptyTag,
635
- name,
636
- attrs,
637
- }) => {
638
- let tag = {
639
- let mut tag = Tag {
640
- kind: EmptyTag,
641
- name,
642
- attrs,
643
- };
644
- self.process_namespaces(&mut tag);
645
- tag
646
- };
647
- self.phase.set(XmlPhase::End);
648
- let handle = self.append_tag_to_doc(tag);
649
- self.sink.pop(&handle);
650
- XmlProcessResult::Done
651
- },
652
- Token::Comment(comment) => self.append_comment_to_doc(comment),
653
- Token::Pi(pi) => self.append_pi_to_doc(pi),
654
- Token::Characters(ref chars) if !any_not_whitespace(chars) => {
655
- XmlProcessResult::Done
656
- },
657
- Token::Eof => {
658
- self.sink
659
- .parse_error(Borrowed("Unexpected EOF in start phase"));
660
- XmlProcessResult::Reprocess(XmlPhase::End, Token::Eof)
661
- },
662
- Token::Doctype(d) => {
663
- self.append_doctype_to_doc(d);
664
- XmlProcessResult::Done
665
- },
666
- _ => {
667
- self.sink
668
- .parse_error(Borrowed("Unexpected element in start phase"));
669
- XmlProcessResult::Done
670
- },
671
- },
672
- XmlPhase::Main => match token {
673
- Token::Characters(chs) => self.append_text(chs),
674
- Token::Tag(Tag {
675
- kind: StartTag,
676
- name,
677
- attrs,
678
- }) => {
679
- let tag = {
680
- let mut tag = Tag {
681
- kind: StartTag,
682
- name,
683
- attrs,
684
- };
685
- self.process_namespaces(&mut tag);
686
- tag
687
- };
688
- self.insert_tag(tag)
689
- },
690
- Token::Tag(Tag {
691
- kind: EmptyTag,
692
- name,
693
- attrs,
694
- }) => {
695
- let tag = {
696
- let mut tag = Tag {
697
- kind: EmptyTag,
698
- name,
699
- attrs,
700
- };
701
- self.process_namespaces(&mut tag);
702
- tag
703
- };
704
- if tag.name.local == local_name!("script") {
705
- self.insert_tag(tag.clone());
706
- let script = current_node(&self.open_elems.borrow()).clone();
707
- self.close_tag(tag);
708
- XmlProcessResult::Script(script)
709
- } else {
710
- self.append_tag(tag)
711
- }
712
- },
713
- Token::Tag(Tag {
714
- kind: EndTag,
715
- name,
716
- attrs,
717
- }) => {
718
- let tag = {
719
- let mut tag = Tag {
720
- kind: EndTag,
721
- name,
722
- attrs,
723
- };
724
- self.process_namespaces(&mut tag);
725
- tag
726
- };
727
- if tag.name.local == local_name!("script") {
728
- let script = current_node(&self.open_elems.borrow()).clone();
729
- self.close_tag(tag);
730
- if self.no_open_elems() {
731
- self.phase.set(XmlPhase::End);
732
- }
733
- return XmlProcessResult::Script(script);
734
- }
735
- let retval = self.close_tag(tag);
736
- if self.no_open_elems() {
737
- self.phase.set(XmlPhase::End);
738
- }
739
- retval
740
- },
741
- Token::Tag(Tag { kind: ShortTag, .. }) => {
742
- self.pop();
743
- if self.no_open_elems() {
744
- self.phase.set(XmlPhase::End);
745
- }
746
- XmlProcessResult::Done
747
- },
748
- Token::Comment(comment) => self.append_comment_to_tag(comment),
749
- Token::Pi(pi) => self.append_pi_to_tag(pi),
750
- Token::Eof | Token::NullCharacter => {
751
- XmlProcessResult::Reprocess(XmlPhase::End, Token::Eof)
752
- },
753
- Token::Doctype(_) => {
754
- self.sink
755
- .parse_error(Borrowed("Unexpected element in main phase"));
756
- XmlProcessResult::Done
757
- },
758
- },
759
- XmlPhase::End => match token {
760
- Token::Comment(comment) => self.append_comment_to_doc(comment),
761
- Token::Pi(pi) => self.append_pi_to_doc(pi),
762
- Token::Characters(ref chars) if !any_not_whitespace(chars) => {
763
- XmlProcessResult::Done
764
- },
765
- Token::Eof => self.stop_parsing(),
766
- _ => {
767
- self.sink
768
- .parse_error(Borrowed("Unexpected element in end phase"));
769
- XmlProcessResult::Done
770
- },
771
- },
772
- }
773
- }
774
- }