diff options
Diffstat (limited to 'vendor/markup5ever')
-rw-r--r-- | vendor/markup5ever/.cargo-checksum.json | 1 | ||||
-rw-r--r-- | vendor/markup5ever/Cargo.toml | 41 | ||||
-rw-r--r-- | vendor/markup5ever/LICENSE-APACHE | 201 | ||||
-rw-r--r-- | vendor/markup5ever/LICENSE-MIT | 25 | ||||
-rw-r--r-- | vendor/markup5ever/build.rs | 131 | ||||
-rw-r--r-- | vendor/markup5ever/data/mod.rs | 50 | ||||
-rw-r--r-- | vendor/markup5ever/entities.rs | 2233 | ||||
-rw-r--r-- | vendor/markup5ever/interface/mod.rs | 377 | ||||
-rw-r--r-- | vendor/markup5ever/interface/tree_builder.rs | 253 | ||||
-rw-r--r-- | vendor/markup5ever/lib.rs | 46 | ||||
-rw-r--r-- | vendor/markup5ever/local_names.txt | 1009 | ||||
-rw-r--r-- | vendor/markup5ever/serialize.rs | 75 | ||||
-rw-r--r-- | vendor/markup5ever/util/buffer_queue.rs | 303 | ||||
-rw-r--r-- | vendor/markup5ever/util/smallcharset.rs | 90 |
14 files changed, 4835 insertions, 0 deletions
diff --git a/vendor/markup5ever/.cargo-checksum.json b/vendor/markup5ever/.cargo-checksum.json new file mode 100644 index 000000000..b8e2c97ab --- /dev/null +++ b/vendor/markup5ever/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"ccecd758bd42f326a487297725a71d21debb90e9e19564f8418dd64ea5d76c4f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"86dd7f026f916daf7511e39951ad8ea8cf55a8db67ae64060dacf829761c18f3","build.rs":"b42d2263985ac4050af47e782a16ef46fa47f3e8f277da32d067c20bce948dae","data/mod.rs":"0fa4ca8cf1f10b0fb0a56277d688f124355ceeb184986b260f6e2e034967c6b7","entities.rs":"505c8b6cf175a1f553d2cfc401fee1851d69a763370b85ece5da4fa806f635ad","interface/mod.rs":"7235edee12e00967c0a1ec6df0dbd6fa4231cb22c396529fc1b9b2932078e398","interface/tree_builder.rs":"e10c87ff976cff4021e90d20191300dc0c7e05c8b2852b02ab9c34a7bd75f681","lib.rs":"be2620e63b956fbf28bf7960c412b96de80a37dbf9fb3469766984aea6cde854","local_names.txt":"9a6e4df2e9f5eb17ba1cb9bc12615d0a10a4ab655379b83fab51a7932f565249","serialize.rs":"2ba20413ed7b439698945f56c43ee680dc333f0c694e4af14f2f5070e175aaa4","util/buffer_queue.rs":"f65ee5039313d9ae2102ca46c5261a669f8af349c1936de2688c9c88f2d595a0","util/smallcharset.rs":"13a91adc6a1ce35172577c7a87d8b3005edc5621cbcbd6f1d6c7c123c396d6ba"},"package":"7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016"}
\ No newline at end of file diff --git a/vendor/markup5ever/Cargo.toml b/vendor/markup5ever/Cargo.toml new file mode 100644 index 000000000..215173efd --- /dev/null +++ b/vendor/markup5ever/Cargo.toml @@ -0,0 +1,41 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies. +# +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. + +[package] +edition = "2018" +name = "markup5ever" +version = "0.11.0" +authors = ["The html5ever Project Developers"] +build = "build.rs" +description = "Common code for xml5ever and html5ever" +documentation = "https://docs.rs/markup5ever" +categories = ["parser-implementations", "web-programming"] +license = "MIT OR Apache-2.0" +repository = "https://github.com/servo/html5ever" + +[lib] +path = "lib.rs" +[dependencies.log] +version = "0.4" + +[dependencies.phf] +version = "0.10" + +[dependencies.string_cache] +version = "0.8" + +[dependencies.tendril] +version = "0.4" +[build-dependencies.phf_codegen] +version = "0.10" + +[build-dependencies.string_cache_codegen] +version = "0.5.1" diff --git a/vendor/markup5ever/LICENSE-APACHE b/vendor/markup5ever/LICENSE-APACHE new file mode 100644 index 000000000..16fe87b06 --- /dev/null +++ b/vendor/markup5ever/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/markup5ever/LICENSE-MIT b/vendor/markup5ever/LICENSE-MIT new file mode 100644 index 000000000..6e4510217 --- /dev/null +++ b/vendor/markup5ever/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright (c) 2014 The html5ever Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/vendor/markup5ever/build.rs b/vendor/markup5ever/build.rs new file mode 100644 index 000000000..38b4fdddc --- /dev/null +++ b/vendor/markup5ever/build.rs @@ -0,0 +1,131 @@ +// Copyright 2014-2017 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +extern crate phf_codegen; +extern crate string_cache_codegen; + +use std::collections::HashMap; +use std::env; +use std::fs::File; +use std::io::{BufRead, BufReader, BufWriter, Write}; +use std::path::Path; + +mod entities; + +static NAMESPACES: &[(&str, &str)] = &[ + ("", ""), + ("*", "*"), + ("html", "http://www.w3.org/1999/xhtml"), + ("xml", "http://www.w3.org/XML/1998/namespace"), + ("xmlns", "http://www.w3.org/2000/xmlns/"), + ("xlink", "http://www.w3.org/1999/xlink"), + ("svg", "http://www.w3.org/2000/svg"), + ("mathml", "http://www.w3.org/1998/Math/MathML"), +]; + +fn main() { + let generated = Path::new(&env::var("OUT_DIR").unwrap()).join("generated.rs"); + let mut generated = BufWriter::new(File::create(&generated).unwrap()); + + named_entities_to_phf(&Path::new(&env::var("OUT_DIR").unwrap()).join("named_entities.rs")); + + // Create a string cache for local names + let local_names = Path::new(&env::var("CARGO_MANIFEST_DIR").unwrap()).join("local_names.txt"); + let mut local_names_atom = string_cache_codegen::AtomType::new("LocalName", "local_name!"); + for line in BufReader::new(File::open(&local_names).unwrap()).lines() { + let local_name = line.unwrap(); + local_names_atom.atom(&local_name); + local_names_atom.atom(&local_name.to_ascii_lowercase()); + } + local_names_atom + .with_macro_doc("Takes a local name as a string and returns its key in the string cache.") + .write_to(&mut generated) + .unwrap(); + + // Create a string cache for namespace prefixes + string_cache_codegen::AtomType::new("Prefix", "namespace_prefix!") + .with_macro_doc("Takes a namespace prefix string and returns its key in a string cache.") + .atoms(NAMESPACES.iter().map(|&(prefix, _url)| prefix)) + .write_to(&mut generated) + .unwrap(); + + // Create a string cache for namespace urls + string_cache_codegen::AtomType::new("Namespace", "namespace_url!") + .with_macro_doc("Takes a namespace url string and returns its key in a string cache.") + .atoms(NAMESPACES.iter().map(|&(_prefix, url)| url)) + .write_to(&mut generated) + .unwrap(); + + writeln!( + generated, + r#" + /// Maps the input of [`namespace_prefix!`](macro.namespace_prefix.html) to + /// the output of [`namespace_url!`](macro.namespace_url.html). + /// + #[macro_export] macro_rules! ns {{ + "# + ) + .unwrap(); + for &(prefix, url) in NAMESPACES { + writeln!( + generated, + "({}) => {{ namespace_url!({:?}) }};", + prefix, url + ) + .unwrap(); + } + writeln!(generated, "}}").unwrap(); +} + +fn named_entities_to_phf(to: &Path) { + let mut entities: HashMap<&str, (u32, u32)> = entities::NAMED_ENTITIES + .iter() + .map(|(name, cp1, cp2)| { + assert!(name.starts_with('&')); + (&name[1..], (*cp1, *cp2)) + }) + .collect(); + + // Add every missing prefix of those keys, mapping to NULL characters. + for key in entities.keys().cloned().collect::<Vec<_>>() { + for n in 1..key.len() { + entities.entry(&key[..n]).or_insert((0, 0)); + } + } + entities.insert("", (0, 0)); + + let mut phf_map = phf_codegen::Map::new(); + for (key, value) in entities { + phf_map.entry(key, &format!("{:?}", value)); + } + + let mut file = File::create(to).unwrap(); + writeln!( + &mut file, + r#" +/// A map of entity names to their codepoints. The second codepoint will +/// be 0 if the entity contains a single codepoint. Entities have their preceeding '&' removed. +/// +/// # Examples +/// +/// ``` +/// use markup5ever::data::NAMED_ENTITIES; +/// +/// assert_eq!(NAMED_ENTITIES.get("gt;").unwrap(), &(62, 0)); +/// ``` +"# + ) + .unwrap(); + writeln!( + &mut file, + "pub static NAMED_ENTITIES: Map<&'static str, (u32, u32)> = {};", + phf_map.build(), + ) + .unwrap(); +} diff --git a/vendor/markup5ever/data/mod.rs b/vendor/markup5ever/data/mod.rs new file mode 100644 index 000000000..fa839ba8a --- /dev/null +++ b/vendor/markup5ever/data/mod.rs @@ -0,0 +1,50 @@ +// Copyright 2014-2017 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +//! Data that is known at compile-time and hard-coded into the binary. +use phf::Map; + +/// The spec replaces most characters in the ISO-2022 C1 control code range +/// (U+0080 through U+009F) with these characters, based on Windows 8-bit +/// codepages. +pub static C1_REPLACEMENTS: [Option<char>; 32] = [ + Some('\u{20ac}'), + None, + Some('\u{201a}'), + Some('\u{0192}'), + Some('\u{201e}'), + Some('\u{2026}'), + Some('\u{2020}'), + Some('\u{2021}'), + Some('\u{02c6}'), + Some('\u{2030}'), + Some('\u{0160}'), + Some('\u{2039}'), + Some('\u{0152}'), + None, + Some('\u{017d}'), + None, + None, + Some('\u{2018}'), + Some('\u{2019}'), + Some('\u{201c}'), + Some('\u{201d}'), + Some('\u{2022}'), + Some('\u{2013}'), + Some('\u{2014}'), + Some('\u{02dc}'), + Some('\u{2122}'), + Some('\u{0161}'), + Some('\u{203a}'), + Some('\u{0153}'), + None, + Some('\u{017e}'), + Some('\u{0178}'), +]; + +include!(concat!(env!("OUT_DIR"), "/named_entities.rs")); diff --git a/vendor/markup5ever/entities.rs b/vendor/markup5ever/entities.rs new file mode 100644 index 000000000..324d90c67 --- /dev/null +++ b/vendor/markup5ever/entities.rs @@ -0,0 +1,2233 @@ +pub const NAMED_ENTITIES: [(&str, u32, u32); 2231] = [ + ("Á", 193, 0), + ("Á", 193, 0), + ("á", 225, 0), + ("á", 225, 0), + ("Ă", 258, 0), + ("ă", 259, 0), + ("∾", 8766, 0), + ("∿", 8767, 0), + ("∾̳", 8766, 819), + ("Â", 194, 0), + ("Â", 194, 0), + ("â", 226, 0), + ("â", 226, 0), + ("´", 180, 0), + ("´", 180, 0), + ("А", 1040, 0), + ("а", 1072, 0), + ("Æ", 198, 0), + ("Æ", 198, 0), + ("æ", 230, 0), + ("æ", 230, 0), + ("⁡", 8289, 0), + ("𝔄", 120068, 0), + ("𝔞", 120094, 0), + ("À", 192, 0), + ("À", 192, 0), + ("à", 224, 0), + ("à", 224, 0), + ("ℵ", 8501, 0), + ("ℵ", 8501, 0), + ("Α", 913, 0), + ("α", 945, 0), + ("Ā", 256, 0), + ("ā", 257, 0), + ("⨿", 10815, 0), + ("&", 38, 0), + ("&", 38, 0), + ("&", 38, 0), + ("&", 38, 0), + ("⩕", 10837, 0), + ("⩓", 10835, 0), + ("∧", 8743, 0), + ("⩜", 10844, 0), + ("⩘", 10840, 0), + ("⩚", 10842, 0), + ("∠", 8736, 0), + ("⦤", 10660, 0), + ("∠", 8736, 0), + ("⦨", 10664, 0), + ("⦩", 10665, 0), + ("⦪", 10666, 0), + ("⦫", 10667, 0), + ("⦬", 10668, 0), + ("⦭", 10669, 0), + ("⦮", 10670, 0), + ("⦯", 10671, 0), + ("∡", 8737, 0), + ("∟", 8735, 0), + ("⊾", 8894, 0), + ("⦝", 10653, 0), + ("∢", 8738, 0), + ("Å", 197, 0), + ("⍼", 9084, 0), + ("Ą", 260, 0), + ("ą", 261, 0), + ("𝔸", 120120, 0), + ("𝕒", 120146, 0), + ("⩯", 10863, 0), + ("≈", 8776, 0), + ("⩰", 10864, 0), + ("≊", 8778, 0), + ("≋", 8779, 0), + ("'", 39, 0), + ("⁡", 8289, 0), + ("≈", 8776, 0), + ("≊", 8778, 0), + ("Å", 197, 0), + ("Å", 197, 0), + ("å", 229, 0), + ("å", 229, 0), + ("𝒜", 119964, 0), + ("𝒶", 119990, 0), + ("≔", 8788, 0), + ("*", 42, 0), + ("≈", 8776, 0), + ("≍", 8781, 0), + ("Ã", 195, 0), + ("Ã", 195, 0), + ("ã", 227, 0), + ("ã", 227, 0), + ("Ä", 196, 0), + ("Ä", 196, 0), + ("ä", 228, 0), + ("ä", 228, 0), + ("∳", 8755, 0), + ("⨑", 10769, 0), + ("≌", 8780, 0), + ("϶", 1014, 0), + ("‵", 8245, 0), + ("∽", 8765, 0), + ("⋍", 8909, 0), + ("∖", 8726, 0), + ("⫧", 10983, 0), + ("⊽", 8893, 0), + ("⌅", 8965, 0), + ("⌆", 8966, 0), + ("⌅", 8965, 0), + ("⎵", 9141, 0), + ("⎶", 9142, 0), + ("≌", 8780, 0), + ("Б", 1041, 0), + ("б", 1073, 0), + ("„", 8222, 0), + ("∵", 8757, 0), + ("∵", 8757, 0), + ("∵", 8757, 0), + ("⦰", 10672, 0), + ("϶", 1014, 0), + ("ℬ", 8492, 0), + ("ℬ", 8492, 0), + ("Β", 914, 0), + ("β", 946, 0), + ("ℶ", 8502, 0), + ("≬", 8812, 0), + ("𝔅", 120069, 0), + ("𝔟", 120095, 0), + ("⋂", 8898, 0), + ("◯", 9711, 0), + ("⋃", 8899, 0), + ("⨀", 10752, 0), + ("⨁", 10753, 0), + ("⨂", 10754, 0), + ("⨆", 10758, 0), + ("★", 9733, 0), + ("▽", 9661, 0), + ("△", 9651, 0), + ("⨄", 10756, 0), + ("⋁", 8897, 0), + ("⋀", 8896, 0), + ("⤍", 10509, 0), + ("⧫", 10731, 0), + ("▪", 9642, 0), + ("▴", 9652, 0), + ("▾", 9662, 0), + ("◂", 9666, 0), + ("▸", 9656, 0), + ("␣", 9251, 0), + ("▒", 9618, 0), + ("░", 9617, 0), + ("▓", 9619, 0), + ("█", 9608, 0), + ("=⃥", 61, 8421), + ("≡⃥", 8801, 8421), + ("⫭", 10989, 0), + ("⌐", 8976, 0), + ("𝔹", 120121, 0), + ("𝕓", 120147, 0), + ("⊥", 8869, 0), + ("⊥", 8869, 0), + ("⋈", 8904, 0), + ("⧉", 10697, 0), + ("┐", 9488, 0), + ("╕", 9557, 0), + ("╖", 9558, 0), + ("╗", 9559, 0), + ("┌", 9484, 0), + ("╒", 9554, 0), + ("╓", 9555, 0), + ("╔", 9556, 0), + ("─", 9472, 0), + ("═", 9552, 0), + ("┬", 9516, 0), + ("╤", 9572, 0), + ("╥", 9573, 0), + ("╦", 9574, 0), + ("┴", 9524, 0), + ("╧", 9575, 0), + ("╨", 9576, 0), + ("╩", 9577, 0), + ("⊟", 8863, 0), + ("⊞", 8862, 0), + ("⊠", 8864, 0), + ("┘", 9496, 0), + ("╛", 9563, 0), + ("╜", 9564, 0), + ("╝", 9565, 0), + ("└", 9492, 0), + ("╘", 9560, 0), + ("╙", 9561, 0), + ("╚", 9562, 0), + ("│", 9474, 0), + ("║", 9553, 0), + ("┼", 9532, 0), + ("╪", 9578, 0), + ("╫", 9579, 0), + ("╬", 9580, 0), + ("┤", 9508, 0), + ("╡", 9569, 0), + ("╢", 9570, 0), + ("╣", 9571, 0), + ("├", 9500, 0), + ("╞", 9566, 0), + ("╟", 9567, 0), + ("╠", 9568, 0), + ("‵", 8245, 0), + ("˘", 728, 0), + ("˘", 728, 0), + ("¦", 166, 0), + ("¦", 166, 0), + ("𝒷", 119991, 0), + ("ℬ", 8492, 0), + ("⁏", 8271, 0), + ("∽", 8765, 0), + ("⋍", 8909, 0), + ("⧅", 10693, 0), + ("\", 92, 0), + ("⟈", 10184, 0), + ("•", 8226, 0), + ("•", 8226, 0), + ("≎", 8782, 0), + ("⪮", 10926, 0), + ("≏", 8783, 0), + ("≎", 8782, 0), + ("≏", 8783, 0), + ("Ć", 262, 0), + ("ć", 263, 0), + ("⩄", 10820, 0), + ("⩉", 10825, 0), + ("⩋", 10827, 0), + ("∩", 8745, 0), + ("⋒", 8914, 0), + ("⩇", 10823, 0), + ("⩀", 10816, 0), + ("ⅅ", 8517, 0), + ("∩︀", 8745, 65024), + ("⁁", 8257, 0), + ("ˇ", 711, 0), + ("ℭ", 8493, 0), + ("⩍", 10829, 0), + ("Č", 268, 0), + ("č", 269, 0), + ("Ç", 199, 0), + ("Ç", 199, 0), + ("ç", 231, 0), + ("ç", 231, 0), + ("Ĉ", 264, 0), + ("ĉ", 265, 0), + ("∰", 8752, 0), + ("⩌", 10828, 0), + ("⩐", 10832, 0), + ("Ċ", 266, 0), + ("ċ", 267, 0), + ("¸", 184, 0), + ("¸", 184, 0), + ("¸", 184, 0), + ("⦲", 10674, 0), + ("¢", 162, 0), + ("¢", 162, 0), + ("·", 183, 0), + ("·", 183, 0), + ("𝔠", 120096, 0), + ("ℭ", 8493, 0), + ("Ч", 1063, 0), + ("ч", 1095, 0), + ("✓", 10003, 0), + ("✓", 10003, 0), + ("Χ", 935, 0), + ("χ", 967, 0), + ("ˆ", 710, 0), + ("≗", 8791, 0), + ("↺", 8634, 0), + ("↻", 8635, 0), + ("⊛", 8859, 0), + ("⊚", 8858, 0), + ("⊝", 8861, 0), + ("⊙", 8857, 0), + ("®", 174, 0), + ("Ⓢ", 9416, 0), + ("⊖", 8854, 0), + ("⊕", 8853, 0), + ("⊗", 8855, 0), + ("○", 9675, 0), + ("⧃", 10691, 0), + ("≗", 8791, 0), + ("⨐", 10768, 0), + ("⫯", 10991, 0), + ("⧂", 10690, 0), + ("∲", 8754, 0), + ("”", 8221, 0), + ("’", 8217, 0), + ("♣", 9827, 0), + ("♣", 9827, 0), + (":", 58, 0), + ("∷", 8759, 0), + ("⩴", 10868, 0), + ("≔", 8788, 0), + ("≔", 8788, 0), + (",", 44, 0), + ("@", 64, 0), + ("∁", 8705, 0), + ("∘", 8728, 0), + ("∁", 8705, 0), + ("ℂ", 8450, 0), + ("≅", 8773, 0), + ("⩭", 10861, 0), + ("≡", 8801, 0), + ("∮", 8750, 0), + ("∯", 8751, 0), + ("∮", 8750, 0), + ("𝕔", 120148, 0), + ("ℂ", 8450, 0), + ("∐", 8720, 0), + ("∐", 8720, 0), + ("©", 169, 0), + ("©", 169, 0), + ("©", 169, 0), + ("©", 169, 0), + ("℗", 8471, 0), + ("∳", 8755, 0), + ("↵", 8629, 0), + ("✗", 10007, 0), + ("⨯", 10799, 0), + ("𝒞", 119966, 0), + ("𝒸", 119992, 0), + ("⫏", 10959, 0), + ("⫑", 10961, 0), + ("⫐", 10960, 0), + ("⫒", 10962, 0), + ("⋯", 8943, 0), + ("⤸", 10552, 0), + ("⤵", 10549, 0), + ("⋞", 8926, 0), + ("⋟", 8927, 0), + ("↶", 8630, 0), + ("⤽", 10557, 0), + ("⩈", 10824, 0), + ("⩆", 10822, 0), + ("≍", 8781, 0), + ("∪", 8746, 0), + ("⋓", 8915, 0), + ("⩊", 10826, 0), + ("⊍", 8845, 0), + ("⩅", 10821, 0), + ("∪︀", 8746, 65024), + ("↷", 8631, 0), + ("⤼", 10556, 0), + ("⋞", 8926, 0), + ("⋟", 8927, 0), + ("⋎", 8910, 0), + ("⋏", 8911, 0), + ("¤", 164, 0), + ("¤", 164, 0), + ("↶", 8630, 0), + ("↷", 8631, 0), + ("⋎", 8910, 0), + ("⋏", 8911, 0), + ("∲", 8754, 0), + ("∱", 8753, 0), + ("⌭", 9005, 0), + ("†", 8224, 0), + ("‡", 8225, 0), + ("ℸ", 8504, 0), + ("↓", 8595, 0), + ("↡", 8609, 0), + ("⇓", 8659, 0), + ("‐", 8208, 0), + ("⫤", 10980, 0), + ("⊣", 8867, 0), + ("⤏", 10511, 0), + ("˝", 733, 0), + ("Ď", 270, 0), + ("ď", 271, 0), + ("Д", 1044, 0), + ("д", 1076, 0), + ("‡", 8225, 0), + ("⇊", 8650, 0), + ("ⅅ", 8517, 0), + ("ⅆ", 8518, 0), + ("⤑", 10513, 0), + ("⩷", 10871, 0), + ("°", 176, 0), + ("°", 176, 0), + ("∇", 8711, 0), + ("Δ", 916, 0), + ("δ", 948, 0), + ("⦱", 10673, 0), + ("⥿", 10623, 0), + ("𝔇", 120071, 0), + ("𝔡", 120097, 0), + ("⥥", 10597, 0), + ("⇃", 8643, 0), + ("⇂", 8642, 0), + ("´", 180, 0), + ("˙", 729, 0), + ("˝", 733, 0), + ("`", 96, 0), + ("˜", 732, 0), + ("⋄", 8900, 0), + ("⋄", 8900, 0), + ("⋄", 8900, 0), + ("♦", 9830, 0), + ("♦", 9830, 0), + ("¨", 168, 0), + ("ⅆ", 8518, 0), + ("ϝ", 989, 0), + ("⋲", 8946, 0), + ("÷", 247, 0), + ("÷", 247, 0), + ("÷", 247, 0), + ("⋇", 8903, 0), + ("⋇", 8903, 0), + ("Ђ", 1026, 0), + ("ђ", 1106, 0), + ("⌞", 8990, 0), + ("⌍", 8973, 0), + ("$", 36, 0), + ("𝔻", 120123, 0), + ("𝕕", 120149, 0), + ("¨", 168, 0), + ("˙", 729, 0), + ("⃜", 8412, 0), + ("≐", 8784, 0), + ("≑", 8785, 0), + ("≐", 8784, 0), + ("∸", 8760, 0), + ("∔", 8724, 0), + ("⊡", 8865, 0), + ("⌆", 8966, 0), + ("∯", 8751, 0), + ("¨", 168, 0), + ("⇓", 8659, 0), + ("⇐", 8656, 0), + ("⇔", 8660, 0), + ("⫤", 10980, 0), + ("⟸", 10232, 0), + ("⟺", 10234, 0), + ("⟹", 10233, 0), + ("⇒", 8658, 0), + ("⊨", 8872, 0), + ("⇑", 8657, 0), + ("⇕", 8661, 0), + ("∥", 8741, 0), + ("⤓", 10515, 0), + ("↓", 8595, 0), + ("↓", 8595, 0), + ("⇓", 8659, 0), + ("⇵", 8693, 0), + ("̑", 785, 0), + ("⇊", 8650, 0), + ("⇃", 8643, 0), + ("⇂", 8642, 0), + ("⥐", 10576, 0), + ("⥞", 10590, 0), + ("⥖", 10582, 0), + ("↽", 8637, 0), + ("⥟", 10591, 0), + ("⥗", 10583, 0), + ("⇁", 8641, 0), + ("↧", 8615, 0), + ("⊤", 8868, 0), + ("⤐", 10512, 0), + ("⌟", 8991, 0), + ("⌌", 8972, 0), + ("𝒟", 119967, 0), + ("𝒹", 119993, 0), + ("Ѕ", 1029, 0), + ("ѕ", 1109, 0), + ("⧶", 10742, 0), + ("Đ", 272, 0), + ("đ", 273, 0), + ("⋱", 8945, 0), + ("▿", 9663, 0), + ("▾", 9662, 0), + ("⇵", 8693, 0), + ("⥯", 10607, 0), + ("⦦", 10662, 0), + ("Џ", 1039, 0), + ("џ", 1119, 0), + ("⟿", 10239, 0), + ("É", 201, 0), + ("É", 201, 0), + ("é", 233, 0), + ("é", 233, 0), + ("⩮", 10862, 0), + ("Ě", 282, 0), + ("ě", 283, 0), + ("Ê", 202, 0), + ("Ê", 202, 0), + ("ê", 234, 0), + ("ê", 234, 0), + ("≖", 8790, 0), + ("≕", 8789, 0), + ("Э", 1069, 0), + ("э", 1101, 0), + ("⩷", 10871, 0), + ("Ė", 278, 0), + ("ė", 279, 0), + ("≑", 8785, 0), + ("ⅇ", 8519, 0), + ("≒", 8786, 0), + ("𝔈", 120072, 0), + ("𝔢", 120098, 0), + ("⪚", 10906, 0), + ("È", 200, 0), + ("È", 200, 0), + ("è", 232, 0), + ("è", 232, 0), + ("⪖", 10902, 0), + ("⪘", 10904, 0), + ("⪙", 10905, 0), + ("∈", 8712, 0), + ("⏧", 9191, 0), + ("ℓ", 8467, 0), + ("⪕", 10901, 0), + ("⪗", 10903, 0), + ("Ē", 274, 0), + ("ē", 275, 0), + ("∅", 8709, 0), + ("∅", 8709, 0), + ("◻", 9723, 0), + ("∅", 8709, 0), + ("▫", 9643, 0), + (" ", 8196, 0), + (" ", 8197, 0), + (" ", 8195, 0), + ("Ŋ", 330, 0), + ("ŋ", 331, 0), + (" ", 8194, 0), + ("Ę", 280, 0), + ("ę", 281, 0), + ("𝔼", 120124, 0), + ("𝕖", 120150, 0), + ("⋕", 8917, 0), + ("⧣", 10723, 0), + ("⩱", 10865, 0), + ("ε", 949, 0), + ("Ε", 917, 0), + ("ε", 949, 0), + ("ϵ", 1013, 0), + ("≖", 8790, 0), + ("≕", 8789, 0), + ("≂", 8770, 0), + ("⪖", 10902, 0), + ("⪕", 10901, 0), + ("⩵", 10869, 0), + ("=", 61, 0), + ("≂", 8770, 0), + ("≟", 8799, 0), + ("⇌", 8652, 0), + ("≡", 8801, 0), + ("⩸", 10872, 0), + ("⧥", 10725, 0), + ("⥱", 10609, 0), + ("≓", 8787, 0), + ("ℯ", 8495, 0), + ("ℰ", 8496, 0), + ("≐", 8784, 0), + ("⩳", 10867, 0), + ("≂", 8770, 0), + ("Η", 919, 0), + ("η", 951, 0), + ("Ð", 208, 0), + ("Ð", 208, 0), + ("ð", 240, 0), + ("ð", 240, 0), + ("Ë", 203, 0), + ("Ë", 203, 0), + ("ë", 235, 0), + ("ë", 235, 0), + ("€", 8364, 0), + ("!", 33, 0), + ("∃", 8707, 0), + ("∃", 8707, 0), + ("ℰ", 8496, 0), + ("ⅇ", 8519, 0), + ("ⅇ", 8519, 0), + ("≒", 8786, 0), + ("Ф", 1060, 0), + ("ф", 1092, 0), + ("♀", 9792, 0), + ("ffi", 64259, 0), + ("ff", 64256, 0), + ("ffl", 64260, 0), + ("𝔉", 120073, 0), + ("𝔣", 120099, 0), + ("fi", 64257, 0), + ("◼", 9724, 0), + ("▪", 9642, 0), + ("fj", 102, 106), + ("♭", 9837, 0), + ("fl", 64258, 0), + ("▱", 9649, 0), + ("ƒ", 402, 0), + ("𝔽", 120125, 0), + ("𝕗", 120151, 0), + ("∀", 8704, 0), + ("∀", 8704, 0), + ("⋔", 8916, 0), + ("⫙", 10969, 0), + ("ℱ", 8497, 0), + ("⨍", 10765, 0), + ("½", 189, 0), + ("½", 189, 0), + ("⅓", 8531, 0), + ("¼", 188, 0), + ("¼", 188, 0), + ("⅕", 8533, 0), + ("⅙", 8537, 0), + ("⅛", 8539, 0), + ("⅔", 8532, 0), + ("⅖", 8534, 0), + ("¾", 190, 0), + ("¾", 190, 0), + ("⅗", 8535, 0), + ("⅜", 8540, 0), + ("⅘", 8536, 0), + ("⅚", 8538, 0), + ("⅝", 8541, 0), + ("⅞", 8542, 0), + ("⁄", 8260, 0), + ("⌢", 8994, 0), + ("𝒻", 119995, 0), + ("ℱ", 8497, 0), + ("ǵ", 501, 0), + ("Γ", 915, 0), + ("γ", 947, 0), + ("Ϝ", 988, 0), + ("ϝ", 989, 0), + ("⪆", 10886, 0), + ("Ğ", 286, 0), + ("ğ", 287, 0), + ("Ģ", 290, 0), + ("Ĝ", 284, 0), + ("ĝ", 285, 0), + ("Г", 1043, 0), + ("г", 1075, 0), + ("Ġ", 288, 0), + ("ġ", 289, 0), + ("≥", 8805, 0), + ("≧", 8807, 0), + ("⪌", 10892, 0), + ("⋛", 8923, 0), + ("≥", 8805, 0), + ("≧", 8807, 0), + ("⩾", 10878, 0), + ("⪩", 10921, 0), + ("⩾", 10878, 0), + ("⪀", 10880, 0), + ("⪂", 10882, 0), + ("⪄", 10884, 0), + ("⋛︀", 8923, 65024), + ("⪔", 10900, 0), + ("𝔊", 120074, 0), + ("𝔤", 120100, 0), + ("≫", 8811, 0), + ("⋙", 8921, 0), + ("⋙", 8921, 0), + ("ℷ", 8503, 0), + ("Ѓ", 1027, 0), + ("ѓ", 1107, 0), + ("⪥", 10917, 0), + ("≷", 8823, 0), + ("⪒", 10898, 0), + ("⪤", 10916, 0), + ("⪊", 10890, 0), + ("⪊", 10890, 0), + ("⪈", 10888, 0), + ("≩", 8809, 0), + ("⪈", 10888, 0), + ("≩", 8809, 0), + ("⋧", 8935, 0), + ("𝔾", 120126, 0), + ("𝕘", 120152, 0), + ("`", 96, 0), + ("≥", 8805, 0), + ("⋛", 8923, 0), + ("≧", 8807, 0), + ("⪢", 10914, 0), + ("≷", 8823, 0), + ("⩾", 10878, 0), + ("≳", 8819, 0), + ("𝒢", 119970, 0), + ("ℊ", 8458, 0), + ("≳", 8819, 0), + ("⪎", 10894, 0), + ("⪐", 10896, 0), + ("⪧", 10919, 0), + ("⩺", 10874, 0), + (">", 62, 0), + (">", 62, 0), + (">", 62, 0), + (">", 62, 0), + ("≫", 8811, 0), + ("⋗", 8919, 0), + ("⦕", 10645, 0), + ("⩼", 10876, 0), + ("⪆", 10886, 0), + ("⥸", 10616, 0), + ("⋗", 8919, 0), + ("⋛", 8923, 0), + ("⪌", 10892, 0), + ("≷", 8823, 0), + ("≳", 8819, 0), + ("≩︀", 8809, 65024), + ("≩︀", 8809, 65024), + ("ˇ", 711, 0), + (" ", 8202, 0), + ("½", 189, 0), + ("ℋ", 8459, 0), + ("Ъ", 1066, 0), + ("ъ", 1098, 0), + ("⥈", 10568, 0), + ("↔", 8596, 0), + ("⇔", 8660, 0), + ("↭", 8621, 0), + ("^", 94, 0), + ("ℏ", 8463, 0), + ("Ĥ", 292, 0), + ("ĥ", 293, 0), + ("♥", 9829, 0), + ("♥", 9829, 0), + ("…", 8230, 0), + ("⊹", 8889, 0), + ("𝔥", 120101, 0), + ("ℌ", 8460, 0), + ("ℋ", 8459, 0), + ("⤥", 10533, 0), + ("⤦", 10534, 0), + ("⇿", 8703, 0), + ("∻", 8763, 0), + ("↩", 8617, 0), + ("↪", 8618, 0), + ("𝕙", 120153, 0), + ("ℍ", 8461, 0), + ("―", 8213, 0), + ("─", 9472, 0), + ("𝒽", 119997, 0), + ("ℋ", 8459, 0), + ("ℏ", 8463, 0), + ("Ħ", 294, 0), + ("ħ", 295, 0), + ("≎", 8782, 0), + ("≏", 8783, 0), + ("⁃", 8259, 0), + ("‐", 8208, 0), + ("Í", 205, 0), + ("Í", 205, 0), + ("í", 237, 0), + ("í", 237, 0), + ("⁣", 8291, 0), + ("Î", 206, 0), + ("Î", 206, 0), + ("î", 238, 0), + ("î", 238, 0), + ("И", 1048, 0), + ("и", 1080, 0), + ("İ", 304, 0), + ("Е", 1045, 0), + ("е", 1077, 0), + ("¡", 161, 0), + ("¡", 161, 0), + ("⇔", 8660, 0), + ("𝔦", 120102, 0), + ("ℑ", 8465, 0), + ("Ì", 204, 0), + ("Ì", 204, 0), + ("ì", 236, 0), + ("ì", 236, 0), + ("ⅈ", 8520, 0), + ("⨌", 10764, 0), + ("∭", 8749, 0), + ("⧜", 10716, 0), + ("℩", 8489, 0), + ("IJ", 306, 0), + ("ij", 307, 0), + ("Ī", 298, 0), + ("ī", 299, 0), + ("ℑ", 8465, 0), + ("ⅈ", 8520, 0), + ("ℐ", 8464, 0), + ("ℑ", 8465, 0), + ("ı", 305, 0), + ("ℑ", 8465, 0), + ("⊷", 8887, 0), + ("Ƶ", 437, 0), + ("⇒", 8658, 0), + ("℅", 8453, 0), + ("∈", 8712, 0), + ("∞", 8734, 0), + ("⧝", 10717, 0), + ("ı", 305, 0), + ("⊺", 8890, 0), + ("∫", 8747, 0), + ("∬", 8748, 0), + ("ℤ", 8484, 0), + ("∫", 8747, 0), + ("⊺", 8890, 0), + ("⋂", 8898, 0), + ("⨗", 10775, 0), + ("⨼", 10812, 0), + ("⁣", 8291, 0), + ("⁢", 8290, 0), + ("Ё", 1025, 0), + ("ё", 1105, 0), + ("Į", 302, 0), + ("į", 303, 0), + ("𝕀", 120128, 0), + ("𝕚", 120154, 0), + ("Ι", 921, 0), + ("ι", 953, 0), + ("⨼", 10812, 0), + ("¿", 191, 0), + ("¿", 191, 0), + ("𝒾", 119998, 0), + ("ℐ", 8464, 0), + ("∈", 8712, 0), + ("⋵", 8949, 0), + ("⋹", 8953, 0), + ("⋴", 8948, 0), + ("⋳", 8947, 0), + ("∈", 8712, 0), + ("⁢", 8290, 0), + ("Ĩ", 296, 0), + ("ĩ", 297, 0), + ("І", 1030, 0), + ("і", 1110, 0), + ("Ï", 207, 0), + ("Ï", 207, 0), + ("ï", 239, 0), + ("ï", 239, 0), + ("Ĵ", 308, 0), + ("ĵ", 309, 0), + ("Й", 1049, 0), + ("й", 1081, 0), + ("𝔍", 120077, 0), + ("𝔧", 120103, 0), + ("ȷ", 567, 0), + ("𝕁", 120129, 0), + ("𝕛", 120155, 0), + ("𝒥", 119973, 0), + ("𝒿", 119999, 0), + ("Ј", 1032, 0), + ("ј", 1112, 0), + ("Є", 1028, 0), + ("є", 1108, 0), + ("Κ", 922, 0), + ("κ", 954, 0), + ("ϰ", 1008, 0), + ("Ķ", 310, 0), + ("ķ", 311, 0), + ("К", 1050, 0), + ("к", 1082, 0), + ("𝔎", 120078, 0), + ("𝔨", 120104, 0), + ("ĸ", 312, 0), + ("Х", 1061, 0), + ("х", 1093, 0), + ("Ќ", 1036, 0), + ("ќ", 1116, 0), + ("𝕂", 120130, 0), + ("𝕜", 120156, 0), + ("𝒦", 119974, 0), + ("𝓀", 120000, 0), + ("⇚", 8666, 0), + ("Ĺ", 313, 0), + ("ĺ", 314, 0), + ("⦴", 10676, 0), + ("ℒ", 8466, 0), + ("Λ", 923, 0), + ("λ", 955, 0), + ("⟨", 10216, 0), + ("⟪", 10218, 0), + ("⦑", 10641, 0), + ("⟨", 10216, 0), + ("⪅", 10885, 0), + ("ℒ", 8466, 0), + ("«", 171, 0), + ("«", 171, 0), + ("⇤", 8676, 0), + ("⤟", 10527, 0), + ("←", 8592, 0), + ("↞", 8606, 0), + ("⇐", 8656, 0), + ("⤝", 10525, 0), + ("↩", 8617, 0), + ("↫", 8619, 0), + ("⤹", 10553, 0), + ("⥳", 10611, 0), + ("↢", 8610, 0), + ("⤙", 10521, 0), + ("⤛", 10523, 0), + ("⪫", 10923, 0), + ("⪭", 10925, 0), + ("⪭︀", 10925, 65024), + ("⤌", 10508, 0), + ("⤎", 10510, 0), + ("❲", 10098, 0), + ("{", 123, 0), + ("[", 91, 0), + ("⦋", 10635, 0), + ("⦏", 10639, 0), + ("⦍", 10637, 0), + ("Ľ", 317, 0), + ("ľ", 318, 0), + ("Ļ", 315, 0), + ("ļ", 316, 0), + ("⌈", 8968, 0), + ("{", 123, 0), + ("Л", 1051, 0), + ("л", 1083, 0), + ("⤶", 10550, 0), + ("“", 8220, 0), + ("„", 8222, 0), + ("⥧", 10599, 0), + ("⥋", 10571, 0), + ("↲", 8626, 0), + ("≤", 8804, 0), + ("≦", 8806, 0), + ("⟨", 10216, 0), + ("⇤", 8676, 0), + ("←", 8592, 0), + ("←", 8592, 0), + ("⇐", 8656, 0), + ("⇆", 8646, 0), + ("↢", 8610, 0), + ("⌈", 8968, 0), + ("⟦", 10214, 0), + ("⥡", 10593, 0), + ("⥙", 10585, 0), + ("⇃", 8643, 0), + ("⌊", 8970, 0), + ("↽", 8637, 0), + ("↼", 8636, 0), + ("⇇", 8647, 0), + ("↔", 8596, 0), + ("↔", 8596, 0), + ("⇔", 8660, 0), + ("⇆", 8646, 0), + ("⇋", 8651, 0), + ("↭", 8621, 0), + ("⥎", 10574, 0), + ("↤", 8612, 0), + ("⊣", 8867, 0), + ("⥚", 10586, 0), + ("⋋", 8907, 0), + ("⧏", 10703, 0), + ("⊲", 8882, 0), + ("⊴", 8884, 0), + ("⥑", 10577, 0), + ("⥠", 10592, 0), + ("⥘", 10584, 0), + ("↿", 8639, 0), + ("⥒", 10578, 0), + ("↼", 8636, 0), + ("⪋", 10891, 0), + ("⋚", 8922, 0), + ("≤", 8804, 0), + ("≦", 8806, 0), + ("⩽", 10877, 0), + ("⪨", 10920, 0), + ("⩽", 10877, 0), + ("⩿", 10879, 0), + ("⪁", 10881, 0), + ("⪃", 10883, 0), + ("⋚︀", 8922, 65024), + ("⪓", 10899, 0), + ("⪅", 10885, 0), + ("⋖", 8918, 0), + ("⋚", 8922, 0), + ("⪋", 10891, 0), + ("⋚", 8922, 0), + ("≦", 8806, 0), + ("≶", 8822, 0), + ("≶", 8822, 0), + ("⪡", 10913, 0), + ("≲", 8818, 0), + ("⩽", 10877, 0), + ("≲", 8818, 0), + ("⥼", 10620, 0), + ("⌊", 8970, 0), + ("𝔏", 120079, 0), + ("𝔩", 120105, 0), + ("≶", 8822, 0), + ("⪑", 10897, 0), + ("⥢", 10594, 0), + ("↽", 8637, 0), + ("↼", 8636, 0), + ("⥪", 10602, 0), + ("▄", 9604, 0), + ("Љ", 1033, 0), + ("љ", 1113, 0), + ("⇇", 8647, 0), + ("≪", 8810, 0), + ("⋘", 8920, 0), + ("⌞", 8990, 0), + ("⇚", 8666, 0), + ("⥫", 10603, 0), + ("◺", 9722, 0), + ("Ŀ", 319, 0), + ("ŀ", 320, 0), + ("⎰", 9136, 0), + ("⎰", 9136, 0), + ("⪉", 10889, 0), + ("⪉", 10889, 0), + ("⪇", 10887, 0), + ("≨", 8808, 0), + ("⪇", 10887, 0), + ("≨", 8808, 0), + ("⋦", 8934, 0), + ("⟬", 10220, 0), + ("⇽", 8701, 0), + ("⟦", 10214, 0), + ("⟵", 10229, 0), + ("⟵", 10229, 0), + ("⟸", 10232, 0), + ("⟷", 10231, 0), + ("⟷", 10231, 0), + ("⟺", 10234, 0), + ("⟼", 10236, 0), + ("⟶", 10230, 0), + ("⟶", 10230, 0), + ("⟹", 10233, 0), + ("↫", 8619, 0), + ("↬", 8620, 0), + ("⦅", 10629, 0), + ("𝕃", 120131, 0), + ("𝕝", 120157, 0), + ("⨭", 10797, 0), + ("⨴", 10804, 0), + ("∗", 8727, 0), + ("_", 95, 0), + ("↙", 8601, 0), + ("↘", 8600, 0), + ("◊", 9674, 0), + ("◊", 9674, 0), + ("⧫", 10731, 0), + ("(", 40, 0), + ("⦓", 10643, 0), + ("⇆", 8646, 0), + ("⌟", 8991, 0), + ("⇋", 8651, 0), + ("⥭", 10605, 0), + ("‎", 8206, 0), + ("⊿", 8895, 0), + ("‹", 8249, 0), + ("𝓁", 120001, 0), + ("ℒ", 8466, 0), + ("↰", 8624, 0), + ("↰", 8624, 0), + ("≲", 8818, 0), + ("⪍", 10893, 0), + ("⪏", 10895, 0), + ("[", 91, 0), + ("‘", 8216, 0), + ("‚", 8218, 0), + ("Ł", 321, 0), + ("ł", 322, 0), + ("⪦", 10918, 0), + ("⩹", 10873, 0), + ("<", 60, 0), + ("<", 60, 0), + ("<", 60, 0), + ("<", 60, 0), + ("≪", 8810, 0), + ("⋖", 8918, 0), + ("⋋", 8907, 0), + ("⋉", 8905, 0), + ("⥶", 10614, 0), + ("⩻", 10875, 0), + ("◃", 9667, 0), + ("⊴", 8884, 0), + ("◂", 9666, 0), + ("⦖", 10646, 0), + ("⥊", 10570, 0), + ("⥦", 10598, 0), + ("≨︀", 8808, 65024), + ("≨︀", 8808, 65024), + ("¯", 175, 0), + ("¯", 175, 0), + ("♂", 9794, 0), + ("✠", 10016, 0), + ("✠", 10016, 0), + ("⤅", 10501, 0), + ("↦", 8614, 0), + ("↦", 8614, 0), + ("↧", 8615, 0), + ("↤", 8612, 0), + ("↥", 8613, 0), + ("▮", 9646, 0), + ("⨩", 10793, 0), + ("М", 1052, 0), + ("м", 1084, 0), + ("—", 8212, 0), + ("∺", 8762, 0), + ("∡", 8737, 0), + (" ", 8287, 0), + ("ℳ", 8499, 0), + ("𝔐", 120080, 0), + ("𝔪", 120106, 0), + ("℧", 8487, 0), + ("µ", 181, 0), + ("µ", 181, 0), + ("*", 42, 0), + ("⫰", 10992, 0), + ("∣", 8739, 0), + ("·", 183, 0), + ("·", 183, 0), + ("⊟", 8863, 0), + ("−", 8722, 0), + ("∸", 8760, 0), + ("⨪", 10794, 0), + ("∓", 8723, 0), + ("⫛", 10971, 0), + ("…", 8230, 0), + ("∓", 8723, 0), + ("⊧", 8871, 0), + ("𝕄", 120132, 0), + ("𝕞", 120158, 0), + ("∓", 8723, 0), + ("𝓂", 120002, 0), + ("ℳ", 8499, 0), + ("∾", 8766, 0), + ("Μ", 924, 0), + ("μ", 956, 0), + ("⊸", 8888, 0), + ("⊸", 8888, 0), + ("∇", 8711, 0), + ("Ń", 323, 0), + ("ń", 324, 0), + ("∠⃒", 8736, 8402), + ("≉", 8777, 0), + ("⩰̸", 10864, 824), + ("≋̸", 8779, 824), + ("ʼn", 329, 0), + ("≉", 8777, 0), + ("♮", 9838, 0), + ("ℕ", 8469, 0), + ("♮", 9838, 0), + (" ", 160, 0), + (" ", 160, 0), + ("≎̸", 8782, 824), + ("≏̸", 8783, 824), + ("⩃", 10819, 0), + ("Ň", 327, 0), + ("ň", 328, 0), + ("Ņ", 325, 0), + ("ņ", 326, 0), + ("≇", 8775, 0), + ("⩭̸", 10861, 824), + ("⩂", 10818, 0), + ("Н", 1053, 0), + ("н", 1085, 0), + ("–", 8211, 0), + ("⤤", 10532, 0), + ("↗", 8599, 0), + ("⇗", 8663, 0), + ("↗", 8599, 0), + ("≠", 8800, 0), + ("≐̸", 8784, 824), + ("​", 8203, 0), + ("​", 8203, 0), + ("​", 8203, 0), + ("​", 8203, 0), + ("≢", 8802, 0), + ("⤨", 10536, 0), + ("≂̸", 8770, 824), + ("≫", 8811, 0), + ("≪", 8810, 0), + ("
", 10, 0), + ("∄", 8708, 0), + ("∄", 8708, 0), + ("𝔑", 120081, 0), + ("𝔫", 120107, 0), + ("≧̸", 8807, 824), + ("≱", 8817, 0), + ("≱", 8817, 0), + ("≧̸", 8807, 824), + ("⩾̸", 10878, 824), + ("⩾̸", 10878, 824), + ("⋙̸", 8921, 824), + ("≵", 8821, 0), + ("≫⃒", 8811, 8402), + ("≯", 8815, 0), + ("≯", 8815, 0), + ("≫̸", 8811, 824), + ("↮", 8622, 0), + ("⇎", 8654, 0), + ("⫲", 10994, 0), + ("∋", 8715, 0), + ("⋼", 8956, 0), + ("⋺", 8954, 0), + ("∋", 8715, 0), + ("Њ", 1034, 0), + ("њ", 1114, 0), + ("↚", 8602, 0), + ("⇍", 8653, 0), + ("‥", 8229, 0), + ("≦̸", 8806, 824), + ("≰", 8816, 0), + ("↚", 8602, 0), + ("⇍", 8653, 0), + ("↮", 8622, 0), + ("⇎", 8654, 0), + ("≰", 8816, 0), + ("≦̸", 8806, 824), + ("⩽̸", 10877, 824), + ("⩽̸", 10877, 824), + ("≮", 8814, 0), + ("⋘̸", 8920, 824), + ("≴", 8820, 0), + ("≪⃒", 8810, 8402), + ("≮", 8814, 0), + ("⋪", 8938, 0), + ("⋬", 8940, 0), + ("≪̸", 8810, 824), + ("∤", 8740, 0), + ("⁠", 8288, 0), + (" ", 160, 0), + ("𝕟", 120159, 0), + ("ℕ", 8469, 0), + ("⫬", 10988, 0), + ("¬", 172, 0), + ("¬", 172, 0), + ("≢", 8802, 0), + ("≭", 8813, 0), + ("∦", 8742, 0), + ("∉", 8713, 0), + ("≠", 8800, 0), + ("≂̸", 8770, 824), + ("∄", 8708, 0), + ("≯", 8815, 0), + ("≱", 8817, 0), + ("≧̸", 8807, 824), + ("≫̸", 8811, 824), + ("≹", 8825, 0), + ("⩾̸", 10878, 824), + ("≵", 8821, 0), + ("≎̸", 8782, 824), + ("≏̸", 8783, 824), + ("∉", 8713, 0), + ("⋵̸", 8949, 824), + ("⋹̸", 8953, 824), + ("∉", 8713, 0), + ("⋷", 8951, 0), + ("⋶", 8950, 0), + ("⧏̸", 10703, 824), + ("⋪", 8938, 0), + ("⋬", 8940, 0), + ("≮", 8814, 0), + ("≰", 8816, 0), + ("≸", 8824, 0), + ("≪̸", 8810, 824), + ("⩽̸", 10877, 824), + ("≴", 8820, 0), + ("⪢̸", 10914, 824), + ("⪡̸", 10913, 824), + ("∌", 8716, 0), + ("∌", 8716, 0), + ("⋾", 8958, 0), + ("⋽", 8957, 0), + ("⊀", 8832, 0), + ("⪯̸", 10927, 824), + ("⋠", 8928, 0), + ("∌", 8716, 0), + ("⧐̸", 10704, 824), + ("⋫", 8939, 0), + ("⋭", 8941, 0), + ("⊏̸", 8847, 824), + ("⋢", 8930, 0), + ("⊐̸", 8848, 824), + ("⋣", 8931, 0), + ("⊂⃒", 8834, 8402), + ("⊈", 8840, 0), + ("⊁", 8833, 0), + ("⪰̸", 10928, 824), + ("⋡", 8929, 0), + ("≿̸", 8831, 824), + ("⊃⃒", 8835, 8402), + ("⊉", 8841, 0), + ("≁", 8769, 0), + ("≄", 8772, 0), + ("≇", 8775, 0), + ("≉", 8777, 0), + ("∤", 8740, 0), + ("∦", 8742, 0), + ("∦", 8742, 0), + ("⫽⃥", 11005, 8421), + ("∂̸", 8706, 824), + ("⨔", 10772, 0), + ("⊀", 8832, 0), + ("⋠", 8928, 0), + ("⊀", 8832, 0), + ("⪯̸", 10927, 824), + ("⪯̸", 10927, 824), + ("⤳̸", 10547, 824), + ("↛", 8603, 0), + ("⇏", 8655, 0), + ("↝̸", 8605, 824), + ("↛", 8603, 0), + ("⇏", 8655, 0), + ("⋫", 8939, 0), + ("⋭", 8941, 0), + ("⊁", 8833, 0), + ("⋡", 8929, 0), + ("⪰̸", 10928, 824), + ("𝒩", 119977, 0), + ("𝓃", 120003, 0), + ("∤", 8740, 0), + ("∦", 8742, 0), + ("≁", 8769, 0), + ("≄", 8772, 0), + ("≄", 8772, 0), + ("∤", 8740, 0), + ("∦", 8742, 0), + ("⋢", 8930, 0), + ("⋣", 8931, 0), + ("⊄", 8836, 0), + ("⫅̸", 10949, 824), + ("⊈", 8840, 0), + ("⊂⃒", 8834, 8402), + ("⊈", 8840, 0), + ("⫅̸", 10949, 824), + ("⊁", 8833, 0), + ("⪰̸", 10928, 824), + ("⊅", 8837, 0), + ("⫆̸", 10950, 824), + ("⊉", 8841, 0), + ("⊃⃒", 8835, 8402), + ("⊉", 8841, 0), + ("⫆̸", 10950, 824), + ("≹", 8825, 0), + ("Ñ", 209, 0), + ("Ñ", 209, 0), + ("ñ", 241, 0), + ("ñ", 241, 0), + ("≸", 8824, 0), + ("⋪", 8938, 0), + ("⋬", 8940, 0), + ("⋫", 8939, 0), + ("⋭", 8941, 0), + ("Ν", 925, 0), + ("ν", 957, 0), + ("#", 35, 0), + ("№", 8470, 0), + (" ", 8199, 0), + ("≍⃒", 8781, 8402), + ("⊬", 8876, 0), + ("⊭", 8877, 0), + ("⊮", 8878, 0), + ("⊯", 8879, 0), + ("≥⃒", 8805, 8402), + (">⃒", 62, 8402), + ("⤄", 10500, 0), + ("⧞", 10718, 0), + ("⤂", 10498, 0), + ("≤⃒", 8804, 8402), + ("<⃒", 60, 8402), + ("⊴⃒", 8884, 8402), + ("⤃", 10499, 0), + ("⊵⃒", 8885, 8402), + ("∼⃒", 8764, 8402), + ("⤣", 10531, 0), + ("↖", 8598, 0), + ("⇖", 8662, 0), + ("↖", 8598, 0), + ("⤧", 10535, 0), + ("Ó", 211, 0), + ("Ó", 211, 0), + ("ó", 243, 0), + ("ó", 243, 0), + ("⊛", 8859, 0), + ("Ô", 212, 0), + ("Ô", 212, 0), + ("ô", 244, 0), + ("ô", 244, 0), + ("⊚", 8858, 0), + ("О", 1054, 0), + ("о", 1086, 0), + ("⊝", 8861, 0), + ("Ő", 336, 0), + ("ő", 337, 0), + ("⨸", 10808, 0), + ("⊙", 8857, 0), + ("⦼", 10684, 0), + ("Œ", 338, 0), + ("œ", 339, 0), + ("⦿", 10687, 0), + ("𝔒", 120082, 0), + ("𝔬", 120108, 0), + ("˛", 731, 0), + ("Ò", 210, 0), + ("Ò", 210, 0), + ("ò", 242, 0), + ("ò", 242, 0), + ("⧁", 10689, 0), + ("⦵", 10677, 0), + ("Ω", 937, 0), + ("∮", 8750, 0), + ("↺", 8634, 0), + ("⦾", 10686, 0), + ("⦻", 10683, 0), + ("‾", 8254, 0), + ("⧀", 10688, 0), + ("Ō", 332, 0), + ("ō", 333, 0), + ("Ω", 937, 0), + ("ω", 969, 0), + ("Ο", 927, 0), + ("ο", 959, 0), + ("⦶", 10678, 0), + ("⊖", 8854, 0), + ("𝕆", 120134, 0), + ("𝕠", 120160, 0), + ("⦷", 10679, 0), + ("“", 8220, 0), + ("‘", 8216, 0), + ("⦹", 10681, 0), + ("⊕", 8853, 0), + ("↻", 8635, 0), + ("⩔", 10836, 0), + ("∨", 8744, 0), + ("⩝", 10845, 0), + ("ℴ", 8500, 0), + ("ℴ", 8500, 0), + ("ª", 170, 0), + ("ª", 170, 0), + ("º", 186, 0), + ("º", 186, 0), + ("⊶", 8886, 0), + ("⩖", 10838, 0), + ("⩗", 10839, 0), + ("⩛", 10843, 0), + ("Ⓢ", 9416, 0), + ("𝒪", 119978, 0), + ("ℴ", 8500, 0), + ("Ø", 216, 0), + ("Ø", 216, 0), + ("ø", 248, 0), + ("ø", 248, 0), + ("⊘", 8856, 0), + ("Õ", 213, 0), + ("Õ", 213, 0), + ("õ", 245, 0), + ("õ", 245, 0), + ("⨶", 10806, 0), + ("⨷", 10807, 0), + ("⊗", 8855, 0), + ("Ö", 214, 0), + ("Ö", 214, 0), + ("ö", 246, 0), + ("ö", 246, 0), + ("⌽", 9021, 0), + ("‾", 8254, 0), + ("⏞", 9182, 0), + ("⎴", 9140, 0), + ("⏜", 9180, 0), + ("¶", 182, 0), + ("¶", 182, 0), + ("∥", 8741, 0), + ("∥", 8741, 0), + ("⫳", 10995, 0), + ("⫽", 11005, 0), + ("∂", 8706, 0), + ("∂", 8706, 0), + ("П", 1055, 0), + ("п", 1087, 0), + ("%", 37, 0), + (".", 46, 0), + ("‰", 8240, 0), + ("⊥", 8869, 0), + ("‱", 8241, 0), + ("𝔓", 120083, 0), + ("𝔭", 120109, 0), + ("Φ", 934, 0), + ("φ", 966, 0), + ("ϕ", 981, 0), + ("ℳ", 8499, 0), + ("☎", 9742, 0), + ("Π", 928, 0), + ("π", 960, 0), + ("⋔", 8916, 0), + ("ϖ", 982, 0), + ("ℏ", 8463, 0), + ("ℎ", 8462, 0), + ("ℏ", 8463, 0), + ("⨣", 10787, 0), + ("⊞", 8862, 0), + ("⨢", 10786, 0), + ("+", 43, 0), + ("∔", 8724, 0), + ("⨥", 10789, 0), + ("⩲", 10866, 0), + ("±", 177, 0), + ("±", 177, 0), + ("±", 177, 0), + ("⨦", 10790, 0), + ("⨧", 10791, 0), + ("±", 177, 0), + ("ℌ", 8460, 0), + ("⨕", 10773, 0), + ("𝕡", 120161, 0), + ("ℙ", 8473, 0), + ("£", 163, 0), + ("£", 163, 0), + ("⪷", 10935, 0), + ("⪻", 10939, 0), + ("≺", 8826, 0), + ("≼", 8828, 0), + ("⪷", 10935, 0), + ("≺", 8826, 0), + ("≼", 8828, 0), + ("≺", 8826, 0), + ("⪯", 10927, 0), + ("≼", 8828, 0), + ("≾", 8830, 0), + ("⪯", 10927, 0), + ("⪹", 10937, 0), + ("⪵", 10933, 0), + ("⋨", 8936, 0), + ("⪯", 10927, 0), + ("⪳", 10931, 0), + ("≾", 8830, 0), + ("′", 8242, 0), + ("″", 8243, 0), + ("ℙ", 8473, 0), + ("⪹", 10937, 0), + ("⪵", 10933, 0), + ("⋨", 8936, 0), + ("∏", 8719, 0), + ("∏", 8719, 0), + ("⌮", 9006, 0), + ("⌒", 8978, 0), + ("⌓", 8979, 0), + ("∝", 8733, 0), + ("∝", 8733, 0), + ("∷", 8759, 0), + ("∝", 8733, 0), + ("≾", 8830, 0), + ("⊰", 8880, 0), + ("𝒫", 119979, 0), + ("𝓅", 120005, 0), + ("Ψ", 936, 0), + ("ψ", 968, 0), + (" ", 8200, 0), + ("𝔔", 120084, 0), + ("𝔮", 120110, 0), + ("⨌", 10764, 0), + ("𝕢", 120162, 0), + ("ℚ", 8474, 0), + ("⁗", 8279, 0), + ("𝒬", 119980, 0), + ("𝓆", 120006, 0), + ("ℍ", 8461, 0), + ("⨖", 10774, 0), + ("?", 63, 0), + ("≟", 8799, 0), + (""", 34, 0), + (""", 34, 0), + (""", 34, 0), + (""", 34, 0), + ("⇛", 8667, 0), + ("∽̱", 8765, 817), + ("Ŕ", 340, 0), + ("ŕ", 341, 0), + ("√", 8730, 0), + ("⦳", 10675, 0), + ("⟩", 10217, 0), + ("⟫", 10219, 0), + ("⦒", 10642, 0), + ("⦥", 10661, 0), + ("⟩", 10217, 0), + ("»", 187, 0), + ("»", 187, 0), + ("⥵", 10613, 0), + ("⇥", 8677, 0), + ("⤠", 10528, 0), + ("⤳", 10547, 0), + ("→", 8594, 0), + ("↠", 8608, 0), + ("⇒", 8658, 0), + ("⤞", 10526, 0), + ("↪", 8618, 0), + ("↬", 8620, 0), + ("⥅", 10565, 0), + ("⥴", 10612, 0), + ("⤖", 10518, 0), + ("↣", 8611, 0), + ("↝", 8605, 0), + ("⤚", 10522, 0), + ("⤜", 10524, 0), + ("∶", 8758, 0), + ("ℚ", 8474, 0), + ("⤍", 10509, 0), + ("⤏", 10511, 0), + ("⤐", 10512, 0), + ("❳", 10099, 0), + ("}", 125, 0), + ("]", 93, 0), + ("⦌", 10636, 0), + ("⦎", 10638, 0), + ("⦐", 10640, 0), + ("Ř", 344, 0), + ("ř", 345, 0), + ("Ŗ", 342, 0), + ("ŗ", 343, 0), + ("⌉", 8969, 0), + ("}", 125, 0), + ("Р", 1056, 0), + ("р", 1088, 0), + ("⤷", 10551, 0), + ("⥩", 10601, 0), + ("”", 8221, 0), + ("”", 8221, 0), + ("↳", 8627, 0), + ("ℜ", 8476, 0), + ("ℛ", 8475, 0), + ("ℜ", 8476, 0), + ("ℝ", 8477, 0), + ("ℜ", 8476, 0), + ("▭", 9645, 0), + ("®", 174, 0), + ("®", 174, 0), + ("®", 174, 0), + ("®", 174, 0), + ("∋", 8715, 0), + ("⇋", 8651, 0), + ("⥯", 10607, 0), + ("⥽", 10621, 0), + ("⌋", 8971, 0), + ("𝔯", 120111, 0), + ("ℜ", 8476, 0), + ("⥤", 10596, 0), + ("⇁", 8641, 0), + ("⇀", 8640, 0), + ("⥬", 10604, 0), + ("Ρ", 929, 0), + ("ρ", 961, 0), + ("ϱ", 1009, 0), + ("⟩", 10217, 0), + ("⇥", 8677, 0), + ("→", 8594, 0), + ("→", 8594, 0), + ("⇒", 8658, 0), + ("⇄", 8644, 0), + ("↣", 8611, 0), + ("⌉", 8969, 0), + ("⟧", 10215, 0), + ("⥝", 10589, 0), + ("⥕", 10581, 0), + ("⇂", 8642, 0), + ("⌋", 8971, 0), + ("⇁", 8641, 0), + ("⇀", 8640, 0), + ("⇄", 8644, 0), + ("⇌", 8652, 0), + ("⇉", 8649, 0), + ("↝", 8605, 0), + ("↦", 8614, 0), + ("⊢", 8866, 0), + ("⥛", 10587, 0), + ("⋌", 8908, 0), + ("⧐", 10704, 0), + ("⊳", 8883, 0), + ("⊵", 8885, 0), + ("⥏", 10575, 0), + ("⥜", 10588, 0), + ("⥔", 10580, 0), + ("↾", 8638, 0), + ("⥓", 10579, 0), + ("⇀", 8640, 0), + ("˚", 730, 0), + ("≓", 8787, 0), + ("⇄", 8644, 0), + ("⇌", 8652, 0), + ("‏", 8207, 0), + ("⎱", 9137, 0), + ("⎱", 9137, 0), + ("⫮", 10990, 0), + ("⟭", 10221, 0), + ("⇾", 8702, 0), + ("⟧", 10215, 0), + ("⦆", 10630, 0), + ("𝕣", 120163, 0), + ("ℝ", 8477, 0), + ("⨮", 10798, 0), + ("⨵", 10805, 0), + ("⥰", 10608, 0), + (")", 41, 0), + ("⦔", 10644, 0), + ("⨒", 10770, 0), + ("⇉", 8649, 0), + ("⇛", 8667, 0), + ("›", 8250, 0), + ("𝓇", 120007, 0), + ("ℛ", 8475, 0), + ("↱", 8625, 0), + ("↱", 8625, 0), + ("]", 93, 0), + ("’", 8217, 0), + ("’", 8217, 0), + ("⋌", 8908, 0), + ("⋊", 8906, 0), + ("▹", 9657, 0), + ("⊵", 8885, 0), + ("▸", 9656, 0), + ("⧎", 10702, 0), + ("⧴", 10740, 0), + ("⥨", 10600, 0), + ("℞", 8478, 0), + ("Ś", 346, 0), + ("ś", 347, 0), + ("‚", 8218, 0), + ("⪸", 10936, 0), + ("Š", 352, 0), + ("š", 353, 0), + ("⪼", 10940, 0), + ("≻", 8827, 0), + ("≽", 8829, 0), + ("⪰", 10928, 0), + ("⪴", 10932, 0), + ("Ş", 350, 0), + ("ş", 351, 0), + ("Ŝ", 348, 0), + ("ŝ", 349, 0), + ("⪺", 10938, 0), + ("⪶", 10934, 0), + ("⋩", 8937, 0), + ("⨓", 10771, 0), + ("≿", 8831, 0), + ("С", 1057, 0), + ("с", 1089, 0), + ("⊡", 8865, 0), + ("⋅", 8901, 0), + ("⩦", 10854, 0), + ("⤥", 10533, 0), + ("↘", 8600, 0), + ("⇘", 8664, 0), + ("↘", 8600, 0), + ("§", 167, 0), + ("§", 167, 0), + (";", 59, 0), + ("⤩", 10537, 0), + ("∖", 8726, 0), + ("∖", 8726, 0), + ("✶", 10038, 0), + ("𝔖", 120086, 0), + ("𝔰", 120112, 0), + ("⌢", 8994, 0), + ("♯", 9839, 0), + ("Щ", 1065, 0), + ("щ", 1097, 0), + ("Ш", 1064, 0), + ("ш", 1096, 0), + ("↓", 8595, 0), + ("←", 8592, 0), + ("∣", 8739, 0), + ("∥", 8741, 0), + ("→", 8594, 0), + ("↑", 8593, 0), + ("­", 173, 0), + ("­", 173, 0), + ("Σ", 931, 0), + ("σ", 963, 0), + ("ς", 962, 0), + ("ς", 962, 0), + ("∼", 8764, 0), + ("⩪", 10858, 0), + ("≃", 8771, 0), + ("≃", 8771, 0), + ("⪞", 10910, 0), + ("⪠", 10912, 0), + ("⪝", 10909, 0), + ("⪟", 10911, 0), + ("≆", 8774, 0), + ("⨤", 10788, 0), + ("⥲", 10610, 0), + ("←", 8592, 0), + ("∘", 8728, 0), + ("∖", 8726, 0), + ("⨳", 10803, 0), + ("⧤", 10724, 0), + ("∣", 8739, 0), + ("⌣", 8995, 0), + ("⪪", 10922, 0), + ("⪬", 10924, 0), + ("⪬︀", 10924, 65024), + ("Ь", 1068, 0), + ("ь", 1100, 0), + ("⌿", 9023, 0), + ("⧄", 10692, 0), + ("/", 47, 0), + ("𝕊", 120138, 0), + ("𝕤", 120164, 0), + ("♠", 9824, 0), + ("♠", 9824, 0), + ("∥", 8741, 0), + ("⊓", 8851, 0), + ("⊓︀", 8851, 65024), + ("⊔", 8852, 0), + ("⊔︀", 8852, 65024), + ("√", 8730, 0), + ("⊏", 8847, 0), + ("⊑", 8849, 0), + ("⊏", 8847, 0), + ("⊑", 8849, 0), + ("⊐", 8848, 0), + ("⊒", 8850, 0), + ("⊐", 8848, 0), + ("⊒", 8850, 0), + ("□", 9633, 0), + ("□", 9633, 0), + ("⊓", 8851, 0), + ("⊏", 8847, 0), + ("⊑", 8849, 0), + ("⊐", 8848, 0), + ("⊒", 8850, 0), + ("⊔", 8852, 0), + ("▪", 9642, 0), + ("□", 9633, 0), + ("▪", 9642, 0), + ("→", 8594, 0), + ("𝒮", 119982, 0), + ("𝓈", 120008, 0), + ("∖", 8726, 0), + ("⌣", 8995, 0), + ("⋆", 8902, 0), + ("⋆", 8902, 0), + ("☆", 9734, 0), + ("★", 9733, 0), + ("ϵ", 1013, 0), + ("ϕ", 981, 0), + ("¯", 175, 0), + ("⊂", 8834, 0), + ("⋐", 8912, 0), + ("⪽", 10941, 0), + ("⫅", 10949, 0), + ("⊆", 8838, 0), + ("⫃", 10947, 0), + ("⫁", 10945, 0), + ("⫋", 10955, 0), + ("⊊", 8842, 0), + ("⪿", 10943, 0), + ("⥹", 10617, 0), + ("⊂", 8834, 0), + ("⋐", 8912, 0), + ("⊆", 8838, 0), + ("⫅", 10949, 0), + ("⊆", 8838, 0), + ("⊊", 8842, 0), + ("⫋", 10955, 0), + ("⫇", 10951, 0), + ("⫕", 10965, 0), + ("⫓", 10963, 0), + ("⪸", 10936, 0), + ("≻", 8827, 0), + ("≽", 8829, 0), + ("≻", 8827, 0), + ("⪰", 10928, 0), + ("≽", 8829, 0), + ("≿", 8831, 0), + ("⪰", 10928, 0), + ("⪺", 10938, 0), + ("⪶", 10934, 0), + ("⋩", 8937, 0), + ("≿", 8831, 0), + ("∋", 8715, 0), + ("∑", 8721, 0), + ("∑", 8721, 0), + ("♪", 9834, 0), + ("¹", 185, 0), + ("¹", 185, 0), + ("²", 178, 0), + ("²", 178, 0), + ("³", 179, 0), + ("³", 179, 0), + ("⊃", 8835, 0), + ("⋑", 8913, 0), + ("⪾", 10942, 0), + ("⫘", 10968, 0), + ("⫆", 10950, 0), + ("⊇", 8839, 0), + ("⫄", 10948, 0), + ("⊃", 8835, 0), + ("⊇", 8839, 0), + ("⟉", 10185, 0), + ("⫗", 10967, 0), + ("⥻", 10619, 0), + ("⫂", 10946, 0), + ("⫌", 10956, 0), + ("⊋", 8843, 0), + ("⫀", 10944, 0), + ("⊃", 8835, 0), + ("⋑", 8913, 0), + ("⊇", 8839, 0), + ("⫆", 10950, 0), + ("⊋", 8843, 0), + ("⫌", 10956, 0), + ("⫈", 10952, 0), + ("⫔", 10964, 0), + ("⫖", 10966, 0), + ("⤦", 10534, 0), + ("↙", 8601, 0), + ("⇙", 8665, 0), + ("↙", 8601, 0), + ("⤪", 10538, 0), + ("ß", 223, 0), + ("ß", 223, 0), + ("	", 9, 0), + ("⌖", 8982, 0), + ("Τ", 932, 0), + ("τ", 964, 0), + ("⎴", 9140, 0), + ("Ť", 356, 0), + ("ť", 357, 0), + ("Ţ", 354, 0), + ("ţ", 355, 0), + ("Т", 1058, 0), + ("т", 1090, 0), + ("⃛", 8411, 0), + ("⌕", 8981, 0), + ("𝔗", 120087, 0), + ("𝔱", 120113, 0), + ("∴", 8756, 0), + ("∴", 8756, 0), + ("∴", 8756, 0), + ("Θ", 920, 0), + ("θ", 952, 0), + ("ϑ", 977, 0), + ("ϑ", 977, 0), + ("≈", 8776, 0), + ("∼", 8764, 0), + ("  ", 8287, 8202), + (" ", 8201, 0), + (" ", 8201, 0), + ("≈", 8776, 0), + ("∼", 8764, 0), + ("Þ", 222, 0), + ("Þ", 222, 0), + ("þ", 254, 0), + ("þ", 254, 0), + ("˜", 732, 0), + ("∼", 8764, 0), + ("≃", 8771, 0), + ("≅", 8773, 0), + ("≈", 8776, 0), + ("⨱", 10801, 0), + ("⊠", 8864, 0), + ("×", 215, 0), + ("×", 215, 0), + ("⨰", 10800, 0), + ("∭", 8749, 0), + ("⤨", 10536, 0), + ("⌶", 9014, 0), + ("⫱", 10993, 0), + ("⊤", 8868, 0), + ("𝕋", 120139, 0), + ("𝕥", 120165, 0), + ("⫚", 10970, 0), + ("⤩", 10537, 0), + ("‴", 8244, 0), + ("™", 8482, 0), + ("™", 8482, 0), + ("▵", 9653, 0), + ("▿", 9663, 0), + ("◃", 9667, 0), + ("⊴", 8884, 0), + ("≜", 8796, 0), + ("▹", 9657, 0), + ("⊵", 8885, 0), + ("◬", 9708, 0), + ("≜", 8796, 0), + ("⨺", 10810, 0), + ("⃛", 8411, 0), + ("⨹", 10809, 0), + ("⧍", 10701, 0), + ("⨻", 10811, 0), + ("⏢", 9186, 0), + ("𝒯", 119983, 0), + ("𝓉", 120009, 0), + ("Ц", 1062, 0), + ("ц", 1094, 0), + ("Ћ", 1035, 0), + ("ћ", 1115, 0), + ("Ŧ", 358, 0), + ("ŧ", 359, 0), + ("≬", 8812, 0), + ("↞", 8606, 0), + ("↠", 8608, 0), + ("Ú", 218, 0), + ("Ú", 218, 0), + ("ú", 250, 0), + ("ú", 250, 0), + ("↑", 8593, 0), + ("↟", 8607, 0), + ("⇑", 8657, 0), + ("⥉", 10569, 0), + ("Ў", 1038, 0), + ("ў", 1118, 0), + ("Ŭ", 364, 0), + ("ŭ", 365, 0), + ("Û", 219, 0), + ("Û", 219, 0), + ("û", 251, 0), + ("û", 251, 0), + ("У", 1059, 0), + ("у", 1091, 0), + ("⇅", 8645, 0), + ("Ű", 368, 0), + ("ű", 369, 0), + ("⥮", 10606, 0), + ("⥾", 10622, 0), + ("𝔘", 120088, 0), + ("𝔲", 120114, 0), + ("Ù", 217, 0), + ("Ù", 217, 0), + ("ù", 249, 0), + ("ù", 249, 0), + ("⥣", 10595, 0), + ("↿", 8639, 0), + ("↾", 8638, 0), + ("▀", 9600, 0), + ("⌜", 8988, 0), + ("⌜", 8988, 0), + ("⌏", 8975, 0), + ("◸", 9720, 0), + ("Ū", 362, 0), + ("ū", 363, 0), + ("¨", 168, 0), + ("¨", 168, 0), + ("_", 95, 0), + ("⏟", 9183, 0), + ("⎵", 9141, 0), + ("⏝", 9181, 0), + ("⋃", 8899, 0), + ("⊎", 8846, 0), + ("Ų", 370, 0), + ("ų", 371, 0), + ("𝕌", 120140, 0), + ("𝕦", 120166, 0), + ("⤒", 10514, 0), + ("↑", 8593, 0), + ("↑", 8593, 0), + ("⇑", 8657, 0), + ("⇅", 8645, 0), + ("↕", 8597, 0), + ("↕", 8597, 0), + ("⇕", 8661, 0), + ("⥮", 10606, 0), + ("↿", 8639, 0), + ("↾", 8638, 0), + ("⊎", 8846, 0), + ("↖", 8598, 0), + ("↗", 8599, 0), + ("υ", 965, 0), + ("ϒ", 978, 0), + ("ϒ", 978, 0), + ("Υ", 933, 0), + ("υ", 965, 0), + ("↥", 8613, 0), + ("⊥", 8869, 0), + ("⇈", 8648, 0), + ("⌝", 8989, 0), + ("⌝", 8989, 0), + ("⌎", 8974, 0), + ("Ů", 366, 0), + ("ů", 367, 0), + ("◹", 9721, 0), + ("𝒰", 119984, 0), + ("𝓊", 120010, 0), + ("⋰", 8944, 0), + ("Ũ", 360, 0), + ("ũ", 361, 0), + ("▵", 9653, 0), + ("▴", 9652, 0), + ("⇈", 8648, 0), + ("Ü", 220, 0), + ("Ü", 220, 0), + ("ü", 252, 0), + ("ü", 252, 0), + ("⦧", 10663, 0), + ("⦜", 10652, 0), + ("ϵ", 1013, 0), + ("ϰ", 1008, 0), + ("∅", 8709, 0), + ("ϕ", 981, 0), + ("ϖ", 982, 0), + ("∝", 8733, 0), + ("↕", 8597, 0), + ("⇕", 8661, 0), + ("ϱ", 1009, 0), + ("ς", 962, 0), + ("⊊︀", 8842, 65024), + ("⫋︀", 10955, 65024), + ("⊋︀", 8843, 65024), + ("⫌︀", 10956, 65024), + ("ϑ", 977, 0), + ("⊲", 8882, 0), + ("⊳", 8883, 0), + ("⫨", 10984, 0), + ("⫫", 10987, 0), + ("⫩", 10985, 0), + ("В", 1042, 0), + ("в", 1074, 0), + ("⊢", 8866, 0), + ("⊨", 8872, 0), + ("⊩", 8873, 0), + ("⊫", 8875, 0), + ("⫦", 10982, 0), + ("⊻", 8891, 0), + ("∨", 8744, 0), + ("⋁", 8897, 0), + ("≚", 8794, 0), + ("⋮", 8942, 0), + ("|", 124, 0), + ("‖", 8214, 0), + ("|", 124, 0), + ("‖", 8214, 0), + ("∣", 8739, 0), + ("|", 124, 0), + ("❘", 10072, 0), + ("≀", 8768, 0), + (" ", 8202, 0), + ("𝔙", 120089, 0), + ("𝔳", 120115, 0), + ("⊲", 8882, 0), + ("⊂⃒", 8834, 8402), + ("⊃⃒", 8835, 8402), + ("𝕍", 120141, 0), + ("𝕧", 120167, 0), + ("∝", 8733, 0), + ("⊳", 8883, 0), + ("𝒱", 119985, 0), + ("𝓋", 120011, 0), + ("⫋︀", 10955, 65024), + ("⊊︀", 8842, 65024), + ("⫌︀", 10956, 65024), + ("⊋︀", 8843, 65024), + ("⊪", 8874, 0), + ("⦚", 10650, 0), + ("Ŵ", 372, 0), + ("ŵ", 373, 0), + ("⩟", 10847, 0), + ("∧", 8743, 0), + ("⋀", 8896, 0), + ("≙", 8793, 0), + ("℘", 8472, 0), + ("𝔚", 120090, 0), + ("𝔴", 120116, 0), + ("𝕎", 120142, 0), + ("𝕨", 120168, 0), + ("℘", 8472, 0), + ("≀", 8768, 0), + ("≀", 8768, 0), + ("𝒲", 119986, 0), + ("𝓌", 120012, 0), + ("⋂", 8898, 0), + ("◯", 9711, 0), + ("⋃", 8899, 0), + ("▽", 9661, 0), + ("𝔛", 120091, 0), + ("𝔵", 120117, 0), + ("⟷", 10231, 0), + ("⟺", 10234, 0), + ("Ξ", 926, 0), + ("ξ", 958, 0), + ("⟵", 10229, 0), + ("⟸", 10232, 0), + ("⟼", 10236, 0), + ("⋻", 8955, 0), + ("⨀", 10752, 0), + ("𝕏", 120143, 0), + ("𝕩", 120169, 0), + ("⨁", 10753, 0), + ("⨂", 10754, 0), + ("⟶", 10230, 0), + ("⟹", 10233, 0), + ("𝒳", 119987, 0), + ("𝓍", 120013, 0), + ("⨆", 10758, 0), + ("⨄", 10756, 0), + ("△", 9651, 0), + ("⋁", 8897, 0), + ("⋀", 8896, 0), + ("Ý", 221, 0), + ("Ý", 221, 0), + ("ý", 253, 0), + ("ý", 253, 0), + ("Я", 1071, 0), + ("я", 1103, 0), + ("Ŷ", 374, 0), + ("ŷ", 375, 0), + ("Ы", 1067, 0), + ("ы", 1099, 0), + ("¥", 165, 0), + ("¥", 165, 0), + ("𝔜", 120092, 0), + ("𝔶", 120118, 0), + ("Ї", 1031, 0), + ("ї", 1111, 0), + ("𝕐", 120144, 0), + ("𝕪", 120170, 0), + ("𝒴", 119988, 0), + ("𝓎", 120014, 0), + ("Ю", 1070, 0), + ("ю", 1102, 0), + ("ÿ", 255, 0), + ("ÿ", 255, 0), + ("Ÿ", 376, 0), + ("Ź", 377, 0), + ("ź", 378, 0), + ("Ž", 381, 0), + ("ž", 382, 0), + ("З", 1047, 0), + ("з", 1079, 0), + ("Ż", 379, 0), + ("ż", 380, 0), + ("ℨ", 8488, 0), + ("​", 8203, 0), + ("Ζ", 918, 0), + ("ζ", 950, 0), + ("𝔷", 120119, 0), + ("ℨ", 8488, 0), + ("Ж", 1046, 0), + ("ж", 1078, 0), + ("⇝", 8669, 0), + ("𝕫", 120171, 0), + ("ℤ", 8484, 0), + ("𝒵", 119989, 0), + ("𝓏", 120015, 0), + ("‍", 8205, 0), + ("‌", 8204, 0), +]; diff --git a/vendor/markup5ever/interface/mod.rs b/vendor/markup5ever/interface/mod.rs new file mode 100644 index 000000000..f498fdfbf --- /dev/null +++ b/vendor/markup5ever/interface/mod.rs @@ -0,0 +1,377 @@ +// Copyright 2014-2017 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +//! Types for tag and attribute names, and tree-builder functionality. + +use std::fmt; +use tendril::StrTendril; + +pub use self::tree_builder::{create_element, AppendNode, AppendText, ElementFlags, NodeOrText}; +pub use self::tree_builder::{LimitedQuirks, NoQuirks, Quirks, QuirksMode}; +pub use self::tree_builder::{NextParserState, Tracer, TreeSink}; +use super::{LocalName, Namespace, Prefix}; + +/// An [expanded name], containing the tag and the namespace. +/// +/// [expanded name]: https://www.w3.org/TR/REC-xml-names/#dt-expname +#[derive(Copy, Clone, Eq, Hash)] +pub struct ExpandedName<'a> { + pub ns: &'a Namespace, + pub local: &'a LocalName, +} + +impl<'a, 'b> PartialEq<ExpandedName<'a>> for ExpandedName<'b> { + fn eq(&self, other: &ExpandedName<'a>) -> bool { + self.ns == other.ns && self.local == other.local + } +} + +impl<'a> fmt::Debug for ExpandedName<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + if self.ns.is_empty() { + write!(f, "{}", self.local) + } else { + write!(f, "{{{}}}:{}", self.ns, self.local) + } + } +} + +/// Helper to quickly create an expanded name. +/// +/// Can be used with no namespace as `expanded_name!("", "some_name")` +/// or with a namespace as `expanded_name!(ns "some_name")`. In the +/// latter case, `ns` is one of the symbols which the [`ns!`][ns] +/// macro accepts; note the lack of a comma between the `ns` and +/// `"some_name"`. +/// +/// [ns]: macro.ns.html +/// +/// # Examples +/// +/// ``` +/// # #[macro_use] extern crate markup5ever; +/// +/// # fn main() { +/// use markup5ever::ExpandedName; +/// +/// assert_eq!( +/// expanded_name!("", "div"), +/// ExpandedName { +/// ns: &ns!(), +/// local: &local_name!("div") +/// } +/// ); +/// +/// assert_eq!( +/// expanded_name!(html "div"), +/// ExpandedName { +/// ns: &ns!(html), +/// local: &local_name!("div") +/// } +/// ); +/// # } +#[macro_export] +macro_rules! expanded_name { + ("", $local: tt) => { + $crate::interface::ExpandedName { + ns: &ns!(), + local: &local_name!($local), + } + }; + ($ns: ident $local: tt) => { + $crate::interface::ExpandedName { + ns: &ns!($ns), + local: &local_name!($local), + } + }; +} + +pub mod tree_builder; + +/// A fully qualified name (with a namespace), used to depict names of tags and attributes. +/// +/// Namespaces can be used to differentiate between similar XML fragments. For example: +/// +/// ```text +/// // HTML +/// <table> +/// <tr> +/// <td>Apples</td> +/// <td>Bananas</td> +/// </tr> +/// </table> +/// +/// // Furniture XML +/// <table> +/// <name>African Coffee Table</name> +/// <width>80</width> +/// <length>120</length> +/// </table> +/// ``` +/// +/// Without XML namespaces, we can't use those two fragments in the same document +/// at the same time. However if we declare a namespace we could instead say: +/// +/// ```text +/// +/// // Furniture XML +/// <furn:table xmlns:furn="https://furniture.rs"> +/// <furn:name>African Coffee Table</furn:name> +/// <furn:width>80</furn:width> +/// <furn:length>120</furn:length> +/// </furn:table> +/// ``` +/// +/// and bind the prefix `furn` to a different namespace. +/// +/// For this reason we parse names that contain a colon in the following way: +/// +/// ```text +/// <furn:table> +/// | | +/// | +- local name +/// | +/// prefix (when resolved gives namespace_url `https://furniture.rs`) +/// ``` +/// +/// NOTE: `Prefix`, `LocalName` and `Prefix` are all derivative of +/// `string_cache::atom::Atom` and `Atom` implements `Deref<str>`. +/// +#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Clone)] +#[cfg_attr(feature = "heap_size", derive(HeapSizeOf))] +pub struct QualName { + /// The prefix of qualified (e.g. `furn` in `<furn:table>` above). + /// Optional (since some namespaces can be empty or inferred), and + /// only useful for namespace resolution (since different prefix + /// can still resolve to same namespace) + /// + /// ``` + /// + /// # fn main() { + /// use markup5ever::{QualName, Namespace, LocalName, Prefix}; + /// + /// let qual = QualName::new( + /// Some(Prefix::from("furn")), + /// Namespace::from("https://furniture.rs"), + /// LocalName::from("table"), + /// ); + /// + /// assert_eq!("furn", &qual.prefix.unwrap()); + /// + /// # } + /// ``` + pub prefix: Option<Prefix>, + /// The namespace after resolution (e.g. `https://furniture.rs` in example above). + /// + /// ``` + /// # use markup5ever::{QualName, Namespace, LocalName, Prefix}; + /// + /// # fn main() { + /// # let qual = QualName::new( + /// # Some(Prefix::from("furn")), + /// # Namespace::from("https://furniture.rs"), + /// # LocalName::from("table"), + /// # ); + /// + /// assert_eq!("https://furniture.rs", &qual.ns); + /// # } + /// ``` + /// + /// When matching namespaces used by HTML we can use `ns!` macro. + /// Although keep in mind that ns! macro only works with namespaces + /// that are present in HTML spec (like `html`, `xmlns`, `svg`, etc.). + /// + /// ``` + /// #[macro_use] extern crate markup5ever; + /// + /// # use markup5ever::{QualName, Namespace, LocalName, Prefix}; + /// + /// let html_table = QualName::new( + /// None, + /// ns!(html), + /// LocalName::from("table"), + /// ); + /// + /// assert!( + /// match html_table.ns { + /// ns!(html) => true, + /// _ => false, + /// } + /// ); + /// + /// ``` + pub ns: Namespace, + /// The local name (e.g. `table` in `<furn:table>` above). + /// + /// ``` + /// # use markup5ever::{QualName, Namespace, LocalName, Prefix}; + /// + /// # fn main() { + /// # let qual = QualName::new( + /// # Some(Prefix::from("furn")), + /// # Namespace::from("https://furniture.rs"), + /// # LocalName::from("table"), + /// # ); + /// + /// assert_eq!("table", &qual.local); + /// # } + /// ``` + /// When matching local name we can also use the `local_name!` macro: + /// + /// ``` + /// #[macro_use] extern crate markup5ever; + /// + /// # use markup5ever::{QualName, Namespace, LocalName, Prefix}; + /// + /// # let qual = QualName::new( + /// # Some(Prefix::from("furn")), + /// # Namespace::from("https://furniture.rs"), + /// # LocalName::from("table"), + /// # ); + /// + /// // Initialize qual to furniture example + /// + /// assert!( + /// match qual.local { + /// local_name!("table") => true, + /// _ => false, + /// } + /// ); + /// + /// ``` + pub local: LocalName, +} + +impl QualName { + /// Basic constructor function. + /// + /// First let's try it for the following example where `QualName` + /// is defined as: + /// ```text + /// <furn:table> <!-- namespace url is https://furniture.rs --> + /// ``` + /// + /// Given this definition, we can define `QualName` using strings. + /// + /// ``` + /// use markup5ever::{QualName, Namespace, LocalName, Prefix}; + /// + /// # fn main() { + /// let qual_name = QualName::new( + /// Some(Prefix::from("furn")), + /// Namespace::from("https://furniture.rs"), + /// LocalName::from("table"), + /// ); + /// # } + /// ``` + /// + /// If we were instead to construct this element instead: + /// + /// ```text + /// + /// <table> + /// ^^^^^---- no prefix and thus default html namespace + /// + /// ``` + /// + /// Or could define it using macros, like so: + /// + /// ``` + /// #[macro_use] extern crate markup5ever; + /// use markup5ever::{QualName, Namespace, LocalName, Prefix}; + /// + /// # fn main() { + /// let qual_name = QualName::new( + /// None, + /// ns!(html), + /// local_name!("table") + /// ); + /// # } + /// ``` + /// + /// Let's analyse the above example. + /// Since we have no prefix its value is None. Second we have html namespace. + /// In html5ever html namespaces are supported out of the box, + /// we can write `ns!(html)` instead of typing `Namespace::from("http://www.w3.org/1999/xhtml")`. + /// Local name is also one of the HTML elements local names, so can + /// use `local_name!("table")` macro. + /// + #[inline] + pub fn new(prefix: Option<Prefix>, ns: Namespace, local: LocalName) -> QualName { + QualName { + prefix, + ns, + local, + } + } + + /// Take a reference of `self` as an `ExpandedName`, dropping the unresolved prefix. + /// + /// In XML and HTML prefixes are only used to extract the relevant namespace URI. + /// Expanded name only contains resolved namespace and tag name, which are only + /// relevant parts of an XML or HTML tag and attribute name respectively. + /// + /// In lieu of our XML Namespace example + /// + /// ```text + /// <furn:table> <!-- namespace url is https://furniture.rs --> + /// ``` + /// For it the expanded name would become roughly equivalent to: + /// + /// ```text + /// ExpandedName { + /// ns: "https://furniture.rs", + /// local: "table", + /// } + /// ``` + /// + #[inline] + pub fn expanded(&self) -> ExpandedName { + ExpandedName { + ns: &self.ns, + local: &self.local, + } + } +} + +/// A tag attribute, e.g. `class="test"` in `<div class="test" ...>`. +/// +/// The namespace on the attribute name is almost always ns!(""). +/// The tokenizer creates all attributes this way, but the tree +/// builder will adjust certain attribute names inside foreign +/// content (MathML, SVG). +#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug)] +pub struct Attribute { + /// The name of the attribute (e.g. the `class` in `<div class="test">`) + pub name: QualName, + /// The value of the attribute (e.g. the `"test"` in `<div class="test">`) + pub value: StrTendril, +} + +#[cfg(test)] +mod tests { + use super::Namespace; + + #[test] + fn ns_macro() { + assert_eq!(ns!(), Namespace::from("")); + + assert_eq!(ns!(html), Namespace::from("http://www.w3.org/1999/xhtml")); + assert_eq!( + ns!(xml), + Namespace::from("http://www.w3.org/XML/1998/namespace") + ); + assert_eq!(ns!(xmlns), Namespace::from("http://www.w3.org/2000/xmlns/")); + assert_eq!(ns!(xlink), Namespace::from("http://www.w3.org/1999/xlink")); + assert_eq!(ns!(svg), Namespace::from("http://www.w3.org/2000/svg")); + assert_eq!( + ns!(mathml), + Namespace::from("http://www.w3.org/1998/Math/MathML") + ); + } +} diff --git a/vendor/markup5ever/interface/tree_builder.rs b/vendor/markup5ever/interface/tree_builder.rs new file mode 100644 index 000000000..43361f360 --- /dev/null +++ b/vendor/markup5ever/interface/tree_builder.rs @@ -0,0 +1,253 @@ +// Copyright 2014-2017 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! This module contains functionality for managing the DOM, including adding/removing nodes. +//! +//! It can be used by a parser to create the DOM graph structure in memory. + +use crate::interface::{Attribute, ExpandedName, QualName}; +use std::borrow::Cow; +use tendril::StrTendril; + +pub use self::NodeOrText::{AppendNode, AppendText}; +pub use self::QuirksMode::{LimitedQuirks, NoQuirks, Quirks}; + +/// Something which can be inserted into the DOM. +/// +/// Adjacent sibling text nodes are merged into a single node, so +/// the sink may not want to allocate a `Handle` for each. +pub enum NodeOrText<Handle> { + AppendNode(Handle), + AppendText(StrTendril), +} + +/// A document's quirks mode, for compatibility with old browsers. See [quirks mode on wikipedia] +/// for more information. +/// +/// [quirks mode on wikipedia]: https://en.wikipedia.org/wiki/Quirks_mode +#[derive(PartialEq, Eq, Copy, Clone, Hash, Debug)] +pub enum QuirksMode { + /// Full quirks mode + Quirks, + /// Almost standards mode + LimitedQuirks, + /// Standards mode + NoQuirks, +} + +/// Whether to interrupt further parsing of the current input until +/// the next explicit resumption of the tokenizer, or continue without +/// any interruption. +#[derive(PartialEq, Eq, Copy, Clone, Hash, Debug)] +pub enum NextParserState { + /// Stop further parsing. + Suspend, + /// Continue without interruptions. + Continue, +} + +/// Special properties of an element, useful for tagging elements with this information. +#[derive(Default)] +pub struct ElementFlags { + /// A document fragment should be created, associated with the element, + /// and returned in TreeSink::get_template_contents. + /// + /// See [template-contents in the whatwg spec][whatwg template-contents]. + /// + /// [whatwg template-contents]: https://html.spec.whatwg.org/multipage/#template-contents + pub template: bool, + + /// This boolean should be recorded with the element and returned + /// in TreeSink::is_mathml_annotation_xml_integration_point + /// + /// See [html-integration-point in the whatwg spec][whatwg integration-point]. + /// + /// [whatwg integration-point]: https://html.spec.whatwg.org/multipage/#html-integration-point + pub mathml_annotation_xml_integration_point: bool, + + // Prevent construction from outside module + _private: (), +} + +/// A constructor for an element. +/// +/// # Examples +/// +/// Create an element like `<div class="test-class-name"></div>`: +pub fn create_element<Sink>(sink: &mut Sink, name: QualName, attrs: Vec<Attribute>) -> Sink::Handle +where + Sink: TreeSink, +{ + let mut flags = ElementFlags::default(); + match name.expanded() { + expanded_name!(html "template") => flags.template = true, + expanded_name!(mathml "annotation-xml") => { + flags.mathml_annotation_xml_integration_point = attrs.iter().any(|attr| { + attr.name.expanded() == expanded_name!("", "encoding") && + (attr.value.eq_ignore_ascii_case("text/html") || + attr.value.eq_ignore_ascii_case("application/xhtml+xml")) + }) + }, + _ => {}, + } + sink.create_element(name, attrs, flags) +} + +/// Methods a parser can use to create the DOM. The DOM provider implements this trait. +/// +/// Having this as a trait potentially allows multiple implementations of the DOM to be used with +/// the same parser. +pub trait TreeSink { + /// `Handle` is a reference to a DOM node. The tree builder requires + /// that a `Handle` implements `Clone` to get another reference to + /// the same node. + type Handle: Clone; + + /// The overall result of parsing. + /// + /// This should default to Self, but default associated types are not stable yet. + /// [rust-lang/rust#29661](https://github.com/rust-lang/rust/issues/29661) + type Output; + + /// Consume this sink and return the overall result of parsing. + /// + /// TODO:This should default to `fn finish(self) -> Self::Output { self }`, + /// but default associated types are not stable yet. + /// [rust-lang/rust#29661](https://github.com/rust-lang/rust/issues/29661) + fn finish(self) -> Self::Output; + + /// Signal a parse error. + fn parse_error(&mut self, msg: Cow<'static, str>); + + /// Get a handle to the `Document` node. + fn get_document(&mut self) -> Self::Handle; + + /// What is the name of this element? + /// + /// Should never be called on a non-element node; + /// feel free to `panic!`. + fn elem_name<'a>(&'a self, target: &'a Self::Handle) -> ExpandedName<'a>; + + /// Create an element. + /// + /// When creating a template element (`name.ns.expanded() == expanded_name!(html "template")`), + /// an associated document fragment called the "template contents" should + /// also be created. Later calls to self.get_template_contents() with that + /// given element return it. + /// See [the template element in the whatwg spec][whatwg template]. + /// + /// [whatwg template]: https://html.spec.whatwg.org/multipage/#the-template-element + fn create_element( + &mut self, + name: QualName, + attrs: Vec<Attribute>, + flags: ElementFlags, + ) -> Self::Handle; + + /// Create a comment node. + fn create_comment(&mut self, text: StrTendril) -> Self::Handle; + + /// Create a Processing Instruction node. + fn create_pi(&mut self, target: StrTendril, data: StrTendril) -> Self::Handle; + + /// Append a node as the last child of the given node. If this would + /// produce adjacent sibling text nodes, it should concatenate the text + /// instead. + /// + /// The child node will not already have a parent. + fn append(&mut self, parent: &Self::Handle, child: NodeOrText<Self::Handle>); + + /// When the insertion point is decided by the existence of a parent node of the + /// element, we consider both possibilities and send the element which will be used + /// if a parent node exists, along with the element to be used if there isn't one. + fn append_based_on_parent_node( + &mut self, + element: &Self::Handle, + prev_element: &Self::Handle, + child: NodeOrText<Self::Handle>, + ); + + /// Append a `DOCTYPE` element to the `Document` node. + fn append_doctype_to_document( + &mut self, + name: StrTendril, + public_id: StrTendril, + system_id: StrTendril, + ); + + /// Mark a HTML `<script>` as "already started". + fn mark_script_already_started(&mut self, _node: &Self::Handle) {} + + /// Indicate that a node was popped off the stack of open elements. + fn pop(&mut self, _node: &Self::Handle) {} + + /// Get a handle to a template's template contents. The tree builder + /// promises this will never be called with something else than + /// a template element. + fn get_template_contents(&mut self, target: &Self::Handle) -> Self::Handle; + + /// Do two handles refer to the same node? + fn same_node(&self, x: &Self::Handle, y: &Self::Handle) -> bool; + + /// Set the document's quirks mode. + fn set_quirks_mode(&mut self, mode: QuirksMode); + + /// Append a node as the sibling immediately before the given node. + /// + /// The tree builder promises that `sibling` is not a text node. However its + /// old previous sibling, which would become the new node's previous sibling, + /// could be a text node. If the new node is also a text node, the two should + /// be merged, as in the behavior of `append`. + /// + /// NB: `new_node` may have an old parent, from which it should be removed. + fn append_before_sibling(&mut self, sibling: &Self::Handle, new_node: NodeOrText<Self::Handle>); + + /// Add each attribute to the given element, if no attribute with that name + /// already exists. The tree builder promises this will never be called + /// with something else than an element. + fn add_attrs_if_missing(&mut self, target: &Self::Handle, attrs: Vec<Attribute>); + + /// Associate the given form-associatable element with the form element + fn associate_with_form( + &mut self, + _target: &Self::Handle, + _form: &Self::Handle, + _nodes: (&Self::Handle, Option<&Self::Handle>), + ) { + } + + /// Detach the given node from its parent. + fn remove_from_parent(&mut self, target: &Self::Handle); + + /// Remove all the children from node and append them to new_parent. + fn reparent_children(&mut self, node: &Self::Handle, new_parent: &Self::Handle); + + /// Returns true if the adjusted current node is an HTML integration point + /// and the token is a start tag. + fn is_mathml_annotation_xml_integration_point(&self, _handle: &Self::Handle) -> bool { + false + } + + /// Called whenever the line number changes. + fn set_current_line(&mut self, _line_number: u64) {} + + /// Indicate that a `script` element is complete. + fn complete_script(&mut self, _node: &Self::Handle) -> NextParserState { + NextParserState::Continue + } +} + +/// Trace hooks for a garbage-collected DOM. +pub trait Tracer { + type Handle; + + /// Upon a call to `trace_handles`, the tree builder will call this method + /// for each handle in its internal state. + fn trace_handle(&self, node: &Self::Handle); +} diff --git a/vendor/markup5ever/lib.rs b/vendor/markup5ever/lib.rs new file mode 100644 index 000000000..a2c49753a --- /dev/null +++ b/vendor/markup5ever/lib.rs @@ -0,0 +1,46 @@ +// Copyright 2014-2017 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub use tendril; + +/// Create a [`SmallCharSet`], with each space-separated number stored in the set. +/// +/// # Examples +/// +/// ``` +/// # #[macro_use] extern crate markup5ever; +/// # fn main() { +/// let set = small_char_set!(12 54 42); +/// assert_eq!(set.bits, +/// 0b00000000_01000000_00000100_00000000_00000000_00000000_00010000_00000000); +/// # } +/// ``` +/// +/// [`SmallCharSet`]: struct.SmallCharSet.html +#[macro_export] +macro_rules! small_char_set ( ($($e:expr)+) => ( + $ crate ::SmallCharSet { + bits: $( (1 << ($e as usize)) )|+ + } +)); + +include!(concat!(env!("OUT_DIR"), "/generated.rs")); + +pub mod data; +#[macro_use] +pub mod interface; +pub mod serialize; +mod util { + pub mod buffer_queue; + pub mod smallcharset; +} + +pub use interface::{Attribute, ExpandedName, QualName}; +pub use util::smallcharset::SmallCharSet; +pub use util::*; diff --git a/vendor/markup5ever/local_names.txt b/vendor/markup5ever/local_names.txt new file mode 100644 index 000000000..fdd57f827 --- /dev/null +++ b/vendor/markup5ever/local_names.txt @@ -0,0 +1,1009 @@ +* +a +abbr +abs +accent +accent-height +accentunder +accept +accept-charset +accesskey +accumulate +acronym +action +actiontype +active +actuate +additive +address +align +alignment-baseline +alignmentscope +alink +allowfullscreen +alphabetic +alt +altGlyph +altGlyphDef +altGlyphItem +altimg +alttext +amplitude +and +animate +animateColor +animateMotion +animateTransform +animation +annotation +annotation-xml +applet +apply +approx +arabic-form +arccos +arccosh +arccot +arccoth +arccsc +arccsch +archive +arcrole +arcsec +arcsech +arcsin +arcsinh +arctan +arctanh +area +arg +aria-activedescendant +aria-atomic +aria-autocomplete +aria-busy +aria-channel +aria-checked +aria-controls +aria-datatype +aria-describedby +aria-disabled +aria-dropeffect +aria-expanded +aria-flowto +aria-grab +aria-haspopup +aria-hidden +aria-invalid +aria-labelledby +aria-level +aria-live +aria-multiline +aria-multiselectable +aria-owns +aria-posinset +aria-pressed +aria-readonly +aria-relevant +aria-required +aria-secret +aria-selected +aria-setsize +aria-sort +aria-templateid +aria-valuemax +aria-valuemin +aria-valuenow +article +ascent +aside +async +attributeName +attributeType +audio +autocomplete +autofocus +autoplay +autosubmit +axis +azimuth +b +background +base +baseFrequency +baseProfile +basefont +baseline +baseline-shift +bbox +bdi +bdo +begin +bevelled +bgcolor +bgsound +bias +big +blink +blockquote +body +border +br +button +bvar +by +calcMode +canvas +cap-height +caption +card +cartesianproduct +ceiling +cellpadding +cellspacing +center +char +charoff +charset +checked +ci +circle +cite +class +classid +clear +clip +clip-path +clip-rule +clipPath +clipPathUnits +close +closure +cn +code +codebase +codetype +codomain +col +colgroup +color +color-interpolation +color-interpolation-filters +color-profile +color-rendering +cols +colspan +columnalign +columnlines +columnspacing +columnspan +columnwidth +compact +complexes +compose +condition +conjugate +content +contentScriptType +contentStyleType +contenteditable +contextmenu +controllerchange +controls +coords +cos +cosh +cot +coth +crossorigin +csc +csch +csymbol +curl +cursor +cx +cy +d +data +datafld +dataformatas +datalist +datasrc +datatemplate +datetime +dd +declare +decoding +default +defer +definition-src +definitionURL +defs +degree +del +depth +desc +descent +details +determinant +dfn +dialog +diff +diffuseConstant +dir +direction +dirname +disabled +discard +display +displaystyle +div +divergence +divide +divisor +dl +domain +domainofapplication +dominant-baseline +download +draggable +dt +dur +dx +dy +edge +edgeMode +elevation +ellipse +em +embed +emptyset +enable-background +encoding +enctype +end +eq +equalcolumns +equalrows +equivalent +eulergamma +event +exists +exp +exponent +exponentiale +externalResourcesRequired +face +factorial +factorof +false +feBlend +feColorMatrix +feComponentTransfer +feComposite +feConvolveMatrix +feDiffuseLighting +feDisplacementMap +feDistantLight +feDropShadow +feFlood +feFuncA +feFuncB +feFuncG +feFuncR +feGaussianBlur +feImage +feMerge +feMergeNode +feMorphology +feOffset +fePointLight +feSpecularLighting +feSpotLight +feTile +feTurbulence +fence +fetch +fieldset +figcaption +figure +fill +fill-opacity +fill-rule +filter +filterRes +filterUnits +flood-color +flood-opacity +floor +fn +font +font-face +font-face-format +font-face-name +font-face-src +font-face-uri +font-family +font-size +font-size-adjust +font-stretch +font-style +font-variant +font-weight +fontfamily +fontsize +fontstyle +fontweight +footer +for +forall +foreignObject +form +formaction +format +formenctype +formmethod +formnovalidate +formtarget +frame +frameborder +frameset +framespacing +from +fx +fy +g +g1 +g2 +gcd +geq +glyph +glyph-name +glyph-orientation-horizontal +glyph-orientation-vertical +glyphRef +grad +gradientTransform +gradientUnits +groupalign +gt +h1 +h2 +h3 +h4 +h5 +h6 +handler +hanging +head +header +headers +height +hgroup +hidden +hidefocus +high +hkern +horiz-adv-x +horiz-origin-x +horiz-origin-y +hr +href +hreflang +hspace +html +http-equiv +i +icon +id +ident +ideographic +iframe +image +image-rendering +imaginary +imaginaryi +img +implies +in +in2 +index +infinity +input +inputmode +ins +int +integers +integrity +intercept +intersect +interval +inverse +irrelevant +isindex +ismap +itemid +itemprop +itemref +itemscope +itemtype +k +k1 +k2 +k3 +k4 +kbd +kernelMatrix +kernelUnitLength +kerning +keyPoints +keySplines +keyTimes +keygen +kind +label +lambda +lang +language +laplacian +largeop +lcm +legend +lengthAdjust +leq +letter-spacing +li +lighting-color +limit +limitingConeAngle +line +line-height +linearGradient +linebreak +linethickness +link +list +listener +listing +ln +local +log +logbase +longdesc +loop +low +lowlimit +lowsrc +lquote +lspace +lt +macros +maction +main +maligngroup +malignmark +manifest +map +marginheight +marginwidth +mark +marker +marker-end +marker-mid +marker-start +markerHeight +markerUnits +markerWidth +marquee +mask +maskContentUnits +maskUnits +math +mathbackground +mathcolor +mathematical +mathsize +mathvariant +matrix +matrixrow +max +maxlength +maxsize +mean +media +median +mediummathspace +menclose +menu +menuitem +merror +meta +metadata +meter +method +mfenced +mfrac +mglyph +mi +min +minlength +minsize +minus +missing-glyph +mlabeledtr +mmultiscripts +mn +mo +mode +moment +momentabout +movablelimits +mover +mozbrowser +mpadded +mpath +mphantom +mprescripts +mroot +mrow +ms +mspace +msqrt +mstyle +msub +msubsup +msup +mtable +mtd +mtext +mtr +multicol +multiple +munder +munderover +muted +name +nargs +naturalnumbers +nav +neq +nest +nextid +nobr +noembed +noframes +nohref +nomodule +nonce +none +noresize +noscript +noshade +not +notanumber +notation +notin +notprsubset +notsubset +novalidate +nowrap +numOctaves +object +occurrence +offset +ol +onabort +onactivate +onafterprint +onafterupdate +onbefordeactivate +onbeforeactivate +onbeforecopy +onbeforecut +onbeforeeditfocus +onbeforepaste +onbeforeprint +onbeforeunload +onbeforeupdate +onbegin +onblur +onbounce +oncellchange +onchange +onclick +oncontextmenu +oncontrolselect +oncopy +oncut +ondataavailable +ondatasetchanged +ondatasetcomplete +ondblclick +ondeactivate +ondrag +ondragdrop +ondragend +ondragenter +ondragleave +ondragover +ondragstart +ondrop +onend +onerror +onerrorupdate +onfilterchange +onfinish +onfocus +onfocusin +onfocusout +onformchange +onforminput +onhashchange +onhelp +oninput +oninvalid +onkeydown +onkeypress +onkeyup +onlanguagechange +onload +onlosecapture +onmessage +onmousedown +onmouseenter +onmouseleave +onmousemove +onmouseout +onmouseover +onmouseup +onmousewheel +onmove +onmoveend +onmovestart +onoffline +ononline +onpagehide +onpageshow +onpaste +onpopstate +onpropertychange +onreadystatechange +onrepeat +onreset +onresize +onrowenter +onrowexit +onrowsdelete +onrowsinserted +onscroll +onselect +onselectstart +onstart +onstop +onstorage +onsubmit +onunload +onzoom +opacity +open +operator +optgroup +optimum +option +or +order +orient +orientation +origin +other +otherwise +outerproduct +output +overflow +overline-position +overline-thickness +p +panose-1 +param +parse +partialdiff +path +pathLength +pattern +patternContentUnits +patternTransform +patternUnits +pi +picture +piece +piecewise +ping +placeholder +plaintext +plus +pointer-events +points +pointsAtX +pointsAtY +pointsAtZ +polygon +polyline +poster +power +pre +prefetch +preload +preserveAlpha +preserveAspectRatio +primes +primitiveUnits +product +profile +progress +prompt +property +prsubset +q +quotient +r +radialGradient +radiogroup +radius +rationals +rb +readonly +real +reals +rect +referrerpolicy +refX +refY +rel +reln +rem +rendering-intent +repeat +repeat-max +repeat-min +repeat-start +repeat-template +repeatCount +repeatDur +replace +required +requiredExtensions +requiredFeatures +restart +result +rev +reversed +role +root +rotate +rowalign +rowlines +rows +rowspacing +rowspan +rp +rquote +rspace +rt +rtc +ruby +rule +rules +rx +ry +s +samp +sandbox +scalarproduct +scale +scheme +scope +scoped +script +scriptlevel +scriptminsize +scriptsizemultiplier +scrolldelay +scrolling +sdev +seamless +sec +sech +section +seed +select +selected +selection +selector +semantics +sep +separator +separators +set +setdiff +shape +shape-rendering +show +sin +sinh +size +sizes +slope +slot +small +solidcolor +source +space +spacer +spacing +span +specification +specularConstant +specularExponent +speed +spellcheck +spreadMethod +src +srcdoc +srclang +srcset +standby +start +startOffset +statechange +stdDeviation +stemh +stemv +step +stitchTiles +stop +stop-color +stop-opacity +stretchy +strike +strikethrough-position +strikethrough-thickness +string +stroke +stroke-dasharray +stroke-dashoffset +stroke-linecap +stroke-linejoin +stroke-miterlimit +stroke-opacity +stroke-width +strong +style +sub +subscriptshift +subset +sum +summary +sup +superscriptshift +surfaceScale +svg +switch +symbol +symmetric +systemLanguage +tabindex +table +tableValues +tan +tanh +target +targetX +targetY +tbody +tbreak +td +template +tendsto +text +text-anchor +text-decoration +text-rendering +textLength +textPath +textarea +tfoot +th +thead +thickmathspace +thinmathspace +time +times +title +to +toggle +tr +track +transform +translate +transpose +tref +true +tspan +tt +type +u +u1 +u2 +ul +underline-position +underline-thickness +unicode +unicode-bidi +unicode-range +union +units-per-em +unselectable +uplimit +use +usemap +v-alphabetic +v-hanging +v-ideographic +v-mathematical +valign +value +values +valuetype +var +variance +vector +vectorproduct +version +vert-adv-y +vert-origin-x +vert-origin-y +verythickmathspace +verythinmathspace +veryverythickmathspace +veryverythinmathspace +video +view +viewBox +viewTarget +visibility +vkern +vlink +vspace +wbr +when +width +widths +word-spacing +wrap +writing-mode +x +x-height +x1 +x2 +xChannelSelector +xlink +xlink:actuate +xlink:arcrole +xlink:href +xlink:role +xlink:show +xlink:title +xlink:type +xml:base +xml:lang +xml:space +xmlns +xmlns:xlink +xmp +xor +xref +y +y1 +y2 +yChannelSelector +z +zoomAndPan diff --git a/vendor/markup5ever/serialize.rs b/vendor/markup5ever/serialize.rs new file mode 100644 index 000000000..e65e998f6 --- /dev/null +++ b/vendor/markup5ever/serialize.rs @@ -0,0 +1,75 @@ +// Copyright 2014-2017 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +//! Traits for serializing elements. The serializer expects the data to be xml-like (with a name, +//! and optional children, attrs, text, comments, doctypes, and [processing instructions]). It uses +//! the visitor pattern, where the serializer and the serializable objects are decoupled and +//! implement their own traits. +//! +//! [processing instructions]: https://en.wikipedia.org/wiki/Processing_Instruction + +use crate::QualName; +use std::io; + +//§ serializing-html-fragments +/// Used as a parameter to `serialize`, telling it if we want to skip the parent. +#[derive(Clone, PartialEq)] +pub enum TraversalScope { + /// Include the parent node when serializing. + IncludeNode, + /// Only serialize the children of the node, treating any provided qualified name as the + /// parent while serializing. + /// + /// This is used in the implementation of [`html5ever::serialize::serialize`] + /// + /// [`html5ever::serialize::serialize`]: ../../html5ever/serialize/fn.serialize.html + ChildrenOnly(Option<QualName>), +} + +/// Types that can be serialized (according to the xml-like scheme in `Serializer`) implement this +/// trait. +pub trait Serialize { + /// Take the serializer and call its methods to serialize this type. The type will dictate + /// which methods are called and with what parameters. + fn serialize<S>(&self, serializer: &mut S, traversal_scope: TraversalScope) -> io::Result<()> + where + S: Serializer; +} + +/// Types that are capable of serializing implement this trait +pub trait Serializer { + /// Serialize the start of an element, for example `<div class="test">`. + fn start_elem<'a, AttrIter>(&mut self, name: QualName, attrs: AttrIter) -> io::Result<()> + where + AttrIter: Iterator<Item = AttrRef<'a>>; + + /// Serialize the end of an element, for example `</div>`. + fn end_elem(&mut self, name: QualName) -> io::Result<()>; + + /// Serialize a plain text node. + fn write_text(&mut self, text: &str) -> io::Result<()>; + + /// Serialize a comment node, for example `<!-- comment -->`. + fn write_comment(&mut self, text: &str) -> io::Result<()>; + + /// Serialize a doctype node, for example `<!doctype html>`. + fn write_doctype(&mut self, name: &str) -> io::Result<()>; + + /// Serialize a processing instruction node, for example + /// `<?xml-stylesheet type="text/xsl" href="style.xsl"?>`. + fn write_processing_instruction(&mut self, target: &str, data: &str) -> io::Result<()>; +} + +/// A type alias for an attribute name and value (e.g. the `class="test"` in `<div class="test">` +/// is represented as `(<QualName of type class>, "test")`. +/// +/// This is used in [`Serializer::start_elem`] where the value being serialized must supply an +/// iterator over the attributes for the current element +/// +/// [`Serializer::start_elem`]: trait.Serializer.html#tymethod.start_elem +pub type AttrRef<'a> = (&'a QualName, &'a str); diff --git a/vendor/markup5ever/util/buffer_queue.rs b/vendor/markup5ever/util/buffer_queue.rs new file mode 100644 index 000000000..d5724890c --- /dev/null +++ b/vendor/markup5ever/util/buffer_queue.rs @@ -0,0 +1,303 @@ +// Copyright 2014-2017 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! The `BufferQueue` struct and helper types. +//! +//! This type is designed for the efficient parsing of string data, especially where many +//! significant characters are from the ascii range 0-63. This includes, for example, important +//! characters in xml/html parsing. +//! +//! Good and predictable performance is achieved by avoiding allocation where possible (a.k.a. zero +//! copy). +//! +//! [`BufferQueue`]: struct.BufferQueue.html + +use std::collections::VecDeque; + +use tendril::StrTendril; + +pub use self::SetResult::{FromSet, NotFromSet}; +use crate::util::smallcharset::SmallCharSet; + +/// Result from [`pop_except_from`] containing either a character from a [`SmallCharSet`], or a +/// string buffer of characters not from the set. +/// +/// [`pop_except_from`]: struct.BufferQueue.html#method.pop_except_from +/// [`SmallCharSet`]: ../struct.SmallCharSet.html +#[derive(PartialEq, Eq, Debug)] +pub enum SetResult { + /// A character from the `SmallCharSet`. + FromSet(char), + /// A string buffer containing no characters from the `SmallCharSet`. + NotFromSet(StrTendril), +} + +/// A queue of owned string buffers, which supports incrementally consuming characters. +/// +/// Internally it uses [`VecDeque`] and has the same complexity properties. +/// +/// [`VecDeque`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html +#[derive(Debug)] +pub struct BufferQueue { + /// Buffers to process. + buffers: VecDeque<StrTendril>, +} + +impl BufferQueue { + /// Create an empty BufferQueue. + #[inline] + pub fn new() -> BufferQueue { + BufferQueue { + buffers: VecDeque::with_capacity(16), + } + } + + /// Returns whether the queue is empty. + #[inline] + pub fn is_empty(&self) -> bool { + self.buffers.is_empty() + } + + /// Get the buffer at the beginning of the queue. + #[inline] + pub fn pop_front(&mut self) -> Option<StrTendril> { + self.buffers.pop_front() + } + + /// Add a buffer to the beginning of the queue. + /// + /// If the buffer is empty, it will be skipped. + pub fn push_front(&mut self, buf: StrTendril) { + if buf.len32() == 0 { + return; + } + self.buffers.push_front(buf); + } + + /// Add a buffer to the end of the queue. + /// + /// If the buffer is empty, it will be skipped. + pub fn push_back(&mut self, buf: StrTendril) { + if buf.len32() == 0 { + return; + } + self.buffers.push_back(buf); + } + + /// Look at the next available character without removing it, if the queue is not empty. + pub fn peek(&self) -> Option<char> { + debug_assert!( + self.buffers + .iter() + .find(|el| el.len32() == 0) + .is_none(), + "invariant \"all buffers in the queue are non-empty\" failed" + ); + self.buffers.front().map(|b| b.chars().next().unwrap()) + } + + /// Get the next character if one is available, removing it from the queue. + /// + /// This function manages the buffers, removing them as they become empty. + pub fn next(&mut self) -> Option<char> { + let (result, now_empty) = match self.buffers.front_mut() { + None => (None, false), + Some(buf) => { + let c = buf.pop_front_char().expect("empty buffer in queue"); + (Some(c), buf.is_empty()) + }, + }; + + if now_empty { + self.buffers.pop_front(); + } + + result + } + + /// Pops and returns either a single character from the given set, or + /// a buffer of characters none of which are in the set. + /// + /// # Examples + /// + /// ``` + /// # #[macro_use] extern crate markup5ever; + /// # #[macro_use] extern crate tendril; + /// # fn main() { + /// use markup5ever::buffer_queue::{BufferQueue, SetResult}; + /// + /// let mut queue = BufferQueue::new(); + /// queue.push_back(format_tendril!(r#"<some_tag attr="text">SomeText</some_tag>"#)); + /// let set = small_char_set!(b'<' b'>' b' ' b'=' b'"' b'/'); + /// let tag = format_tendril!("some_tag"); + /// let attr = format_tendril!("attr"); + /// let attr_val = format_tendril!("text"); + /// assert_eq!(queue.pop_except_from(set), Some(SetResult::FromSet('<'))); + /// assert_eq!(queue.pop_except_from(set), Some(SetResult::NotFromSet(tag))); + /// assert_eq!(queue.pop_except_from(set), Some(SetResult::FromSet(' '))); + /// assert_eq!(queue.pop_except_from(set), Some(SetResult::NotFromSet(attr))); + /// assert_eq!(queue.pop_except_from(set), Some(SetResult::FromSet('='))); + /// assert_eq!(queue.pop_except_from(set), Some(SetResult::FromSet('"'))); + /// assert_eq!(queue.pop_except_from(set), Some(SetResult::NotFromSet(attr_val))); + /// // ... + /// # } + /// ``` + pub fn pop_except_from(&mut self, set: SmallCharSet) -> Option<SetResult> { + let (result, now_empty) = match self.buffers.front_mut() { + None => (None, false), + Some(buf) => { + let n = set.nonmember_prefix_len(&buf); + if n > 0 { + let out; + unsafe { + out = buf.unsafe_subtendril(0, n); + buf.unsafe_pop_front(n); + } + (Some(NotFromSet(out)), buf.is_empty()) + } else { + let c = buf.pop_front_char().expect("empty buffer in queue"); + (Some(FromSet(c)), buf.is_empty()) + } + }, + }; + + // Unborrow self for this part. + if now_empty { + self.buffers.pop_front(); + } + + result + } + + /// Consume bytes matching the pattern, using a custom comparison function `eq`. + /// + /// Returns `Some(true)` if there is a match, `Some(false)` if there is no match, or `None` if + /// it wasn't possible to know (more data is needed). + /// + /// The custom comparison function is used elsewhere to compare ascii-case-insensitively. + /// + /// # Examples + /// + /// ``` + /// # extern crate markup5ever; + /// # #[macro_use] extern crate tendril; + /// # fn main() { + /// use markup5ever::buffer_queue::{BufferQueue}; + /// + /// let mut queue = BufferQueue::new(); + /// queue.push_back(format_tendril!("testtext")); + /// let test_str = "test"; + /// assert_eq!(queue.eat("test", |&a, &b| a == b), Some(true)); + /// assert_eq!(queue.eat("text", |&a, &b| a == b), Some(true)); + /// assert!(queue.is_empty()); + /// # } + /// ``` + pub fn eat<F: Fn(&u8, &u8) -> bool>(&mut self, pat: &str, eq: F) -> Option<bool> { + let mut buffers_exhausted = 0; + let mut consumed_from_last = 0; + + self.buffers.front()?; + + for pattern_byte in pat.bytes() { + if buffers_exhausted >= self.buffers.len() { + return None; + } + let buf = &self.buffers[buffers_exhausted]; + + if !eq(&buf.as_bytes()[consumed_from_last], &pattern_byte) { + return Some(false); + } + + consumed_from_last += 1; + if consumed_from_last >= buf.len() { + buffers_exhausted += 1; + consumed_from_last = 0; + } + } + + // We have a match. Commit changes to the BufferQueue. + for _ in 0..buffers_exhausted { + self.buffers.pop_front(); + } + + match self.buffers.front_mut() { + None => assert_eq!(consumed_from_last, 0), + Some(ref mut buf) => buf.pop_front(consumed_from_last as u32), + } + + Some(true) + } +} + +#[cfg(test)] +#[allow(non_snake_case)] +mod test { + use tendril::SliceExt; + + use super::BufferQueue; + use super::SetResult::{FromSet, NotFromSet}; + + #[test] + fn smoke_test() { + let mut bq = BufferQueue::new(); + assert_eq!(bq.peek(), None); + assert_eq!(bq.next(), None); + + bq.push_back("abc".to_tendril()); + assert_eq!(bq.peek(), Some('a')); + assert_eq!(bq.next(), Some('a')); + assert_eq!(bq.peek(), Some('b')); + assert_eq!(bq.peek(), Some('b')); + assert_eq!(bq.next(), Some('b')); + assert_eq!(bq.peek(), Some('c')); + assert_eq!(bq.next(), Some('c')); + assert_eq!(bq.peek(), None); + assert_eq!(bq.next(), None); + } + + #[test] + fn can_unconsume() { + let mut bq = BufferQueue::new(); + bq.push_back("abc".to_tendril()); + assert_eq!(bq.next(), Some('a')); + + bq.push_front("xy".to_tendril()); + assert_eq!(bq.next(), Some('x')); + assert_eq!(bq.next(), Some('y')); + assert_eq!(bq.next(), Some('b')); + assert_eq!(bq.next(), Some('c')); + assert_eq!(bq.next(), None); + } + + #[test] + fn can_pop_except_set() { + let mut bq = BufferQueue::new(); + bq.push_back("abc&def".to_tendril()); + let mut pop = || bq.pop_except_from(small_char_set!('&')); + assert_eq!(pop(), Some(NotFromSet("abc".to_tendril()))); + assert_eq!(pop(), Some(FromSet('&'))); + assert_eq!(pop(), Some(NotFromSet("def".to_tendril()))); + assert_eq!(pop(), None); + } + + #[test] + fn can_eat() { + // This is not very comprehensive. We rely on the tokenizer + // integration tests for more thorough testing with many + // different input buffer splits. + let mut bq = BufferQueue::new(); + bq.push_back("a".to_tendril()); + bq.push_back("bc".to_tendril()); + assert_eq!(bq.eat("abcd", u8::eq_ignore_ascii_case), None); + assert_eq!(bq.eat("ax", u8::eq_ignore_ascii_case), Some(false)); + assert_eq!(bq.eat("ab", u8::eq_ignore_ascii_case), Some(true)); + assert_eq!(bq.next(), Some('c')); + assert_eq!(bq.next(), None); + } +} diff --git a/vendor/markup5ever/util/smallcharset.rs b/vendor/markup5ever/util/smallcharset.rs new file mode 100644 index 000000000..957dad730 --- /dev/null +++ b/vendor/markup5ever/util/smallcharset.rs @@ -0,0 +1,90 @@ +// Copyright 2014-2017 The html5ever Project Developers. See the +// COPYRIGHT file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! This module contains a single struct [`SmallCharSet`]. See its documentation for details. +//! +//! [`SmallCharSet`]: struct.SmallCharSet.html + +/// Represents a set of "small characters", those with Unicode scalar +/// values less than 64. +/// +/// This is stored as a bitmap, with 1 bit for each value. +#[derive(Debug, Eq, PartialEq, Clone, Copy, Hash)] +pub struct SmallCharSet { + pub bits: u64, +} + +impl SmallCharSet { + /// Checks whether a character (u8 value below 64) is stored in the SmallCharSet. + /// + /// # Examples + /// + /// ```ignore + /// # use markup5ever::SmallCharSet; + /// let set = SmallCharSet { + /// bits: 0b00000000_01000000_00000100_00000000_00000000_00000000_00010000_00000000 + /// }; + /// assert!(set.contains(64)); + /// assert!(set.contains(b'6')); // `b'6'` is the same as 64u8 + /// ``` + #[inline] + fn contains(&self, n: u8) -> bool { + 0 != (self.bits & (1 << (n as usize))) + } + + /// Count the number of bytes of characters at the beginning of `buf` which are not in the set. + /// + /// This functionality is used in [`BufferQueue::pop_except_from`]. + /// + /// # Examples + /// + /// ``` + /// # #[macro_use] extern crate markup5ever; + /// # fn main() { + /// let set = small_char_set!(48 49 50); // '0' '1' '2' + /// // `test` is 4 chars, 😁 is 4 chars, then we meet a character in the set + /// let test_str = "test😁01232afd"; + /// assert_eq!(set.nonmember_prefix_len(test_str), 8); + /// # } + /// ``` + /// + /// [`BufferQueue::pop_except_from`]: buffer_queue/struct.BufferQueue.html#method.pop_except_from + pub fn nonmember_prefix_len(&self, buf: &str) -> u32 { + let mut n = 0; + for b in buf.bytes() { + if b >= 64 || !self.contains(b) { + n += 1; + } else { + break; + } + } + n + } +} + +#[cfg(test)] +mod test { + use std::iter::repeat; + + #[test] + fn nonmember_prefix() { + for &c in ['&', '\0'].iter() { + for x in 0..48u32 { + for y in 0..48u32 { + let mut s = repeat("x").take(x as usize).collect::<String>(); + s.push(c); + s.push_str(&repeat("x").take(y as usize).collect::<String>()); + let set = small_char_set!('&' '\0'); + + assert_eq!(x, set.nonmember_prefix_len(&s)); + } + } + } + } +} |