1
1
mirror of https://github.com/wez/wezterm.git synced 2025-01-03 11:11:43 +03:00

termwiz: use perfect hashing for emoji variation sequences

This commit is contained in:
Wez Furlong 2022-04-26 19:10:00 -07:00
parent 4d09fe1f7d
commit 97005b8c1c
9 changed files with 952 additions and 53 deletions

2
.gitignore vendored
View File

@ -7,6 +7,8 @@
/wezterm*.tar.xz
/pkg
/target/
/termwiz/codegen/target
/termwiz/codegen/Cargo.lock
/gh_pages/
/docs/SUMMARY.md
/docs/install/*.md

31
Cargo.lock generated
View File

@ -868,7 +868,7 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2fb3bd93ef32553e3d5b9f8020028f41ac64ff8a230033d5d548b8222d21fbe"
dependencies = [
"phf",
"phf 0.8.0",
]
[[package]]
@ -2817,10 +2817,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
dependencies = [
"phf_macros",
"phf_shared",
"phf_shared 0.8.0",
"proc-macro-hack",
]
[[package]]
name = "phf"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
dependencies = [
"phf_shared 0.10.0",
]
[[package]]
name = "phf_codegen"
version = "0.8.0"
@ -2828,7 +2837,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
dependencies = [
"phf_generator",
"phf_shared",
"phf_shared 0.8.0",
]
[[package]]
@ -2837,7 +2846,7 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
dependencies = [
"phf_shared",
"phf_shared 0.8.0",
"rand 0.7.3",
]
@ -2848,7 +2857,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
dependencies = [
"phf_generator",
"phf_shared",
"phf_shared 0.8.0",
"proc-macro-hack",
"proc-macro2",
"quote",
@ -2864,6 +2873,15 @@ dependencies = [
"siphasher",
]
[[package]]
name = "phf_shared"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
dependencies = [
"siphasher",
]
[[package]]
name = "pin-project"
version = "1.0.10"
@ -3980,7 +3998,7 @@ dependencies = [
"dirs",
"fnv",
"nom 5.1.2",
"phf",
"phf 0.8.0",
"phf_codegen",
]
@ -4032,6 +4050,7 @@ dependencies = [
"ordered-float",
"pest",
"pest_derive",
"phf 0.10.1",
"pretty_assertions",
"regex",
"semver 0.11.0",

View File

@ -9,6 +9,9 @@ members = [
"wezterm-ssh"
]
resolver = "2"
exclude = [
"termwiz/codegen"
]
[profile.release]
opt-level = 3

View File

@ -28,6 +28,7 @@ num-traits = "0.2"
ordered-float = "2.10"
pest = "2.1"
pest_derive = "2.1"
phf = "0.10"
regex = "1"
semver = "0.11"
serde = {version="1.0", features = ["rc", "derive"], optional=true}

View File

@ -0,0 +1,7 @@
[package]
name = "codegen"
version = "0.1.0"
edition = "2021"
[dependencies]
phf_codegen = "0.10"

View File

@ -0,0 +1,50 @@
const VARIATION_SEQUENCES: &str = include_str!("../../data/emoji-variation-sequences.txt");
/// Parses emoji-variation-sequences.txt, which is part of the UCD download
/// for a given version of the Unicode spec.
/// It defines which sequences can have explicit presentation selectors.
fn main() {
let mut map = phf_codegen::Map::new();
'next_line: for line in VARIATION_SEQUENCES.lines() {
if let Some(lhs) = line.split('#').next() {
if let Some(seq) = lhs.split(';').next() {
let mut s = String::new();
let mut last = None;
for hex in seq.split_whitespace() {
match u32::from_str_radix(hex, 16) {
Ok(n) => {
let c = char::from_u32(n).unwrap();
s.push(c);
last.replace(c);
}
Err(_) => {
continue 'next_line;
}
}
}
if let Some(last) = last {
map.entry(
s,
match last {
'\u{FE0F}' => "Presentation::Emoji",
'\u{FE0E}' => "Presentation::Text",
_ => unreachable!(),
},
);
}
}
}
}
println!("//! This file was generated by running:");
println!("//! cd ../codegen ; cargo run > ../emoji_variation.rs");
println!();
println!("use crate::emoji::Presentation;");
println!();
println!(
"pub static VARIATION_MAP: phf::Map<&'static str, Presentation> = \n{};\n",
map.build(),
);
}

View File

@ -1,4 +1,4 @@
use std::collections::HashMap;
use crate::emoji_variation::VARIATION_MAP;
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum Presentation {
@ -34,49 +34,3 @@ impl Presentation {
}
}
}
const VARIATION_SEQUENCES: &str = include_str!("../data/emoji-variation-sequences.txt");
lazy_static::lazy_static! {
static ref VARIATION_MAP: HashMap<String, Presentation> = build_variation_sequences();
}
/// Parses emoji-variation-sequences.txt, which is part of the UCD download
/// for a given version of the Unicode spec.
/// It defines which sequences can have explicit presentation selectors.
fn build_variation_sequences() -> HashMap<String, Presentation> {
let mut res = HashMap::new();
'next_line: for line in VARIATION_SEQUENCES.lines() {
if let Some(lhs) = line.split('#').next() {
if let Some(seq) = lhs.split(';').next() {
let mut s = String::new();
let mut last = None;
for hex in seq.split_whitespace() {
match u32::from_str_radix(hex, 16) {
Ok(n) => {
let c = char::from_u32(n).unwrap();
s.push(c);
last.replace(c);
}
Err(_) => {
continue 'next_line;
}
}
}
if let Some(last) = last {
res.insert(
s,
match last {
'\u{FE0F}' => Presentation::Emoji,
'\u{FE0E}' => Presentation::Text,
_ => unreachable!(),
},
);
}
}
}
}
res
}

View File

@ -0,0 +1,862 @@
//! This file was generated by running:
//! cd ../codegen ; cargo run > ../emoji_variation.rs
use crate::emoji::Presentation;
pub static VARIATION_MAP: phf::Map<&'static str, Presentation> = ::phf::Map {
key: 12913932095322966823,
disps: &[
(0, 226),
(1, 0),
(0, 488),
(2, 141),
(0, 1),
(0, 79),
(0, 45),
(0, 0),
(0, 88),
(0, 7),
(0, 69),
(0, 20),
(0, 12),
(0, 19),
(0, 14),
(0, 662),
(0, 9),
(0, 339),
(0, 197),
(0, 0),
(0, 4),
(0, 82),
(0, 82),
(0, 669),
(0, 208),
(0, 78),
(0, 146),
(0, 44),
(0, 264),
(0, 82),
(2, 210),
(0, 1),
(2, 281),
(0, 4),
(0, 112),
(0, 0),
(0, 1),
(0, 122),
(0, 139),
(1, 4),
(0, 6),
(0, 0),
(0, 36),
(4, 351),
(0, 95),
(3, 610),
(1, 523),
(0, 124),
(0, 5),
(2, 515),
(1, 252),
(0, 14),
(0, 15),
(4, 416),
(0, 42),
(0, 10),
(1, 204),
(0, 3),
(0, 92),
(0, 35),
(0, 425),
(0, 29),
(0, 4),
(0, 13),
(0, 342),
(0, 1),
(0, 0),
(0, 492),
(0, 7),
(0, 4),
(0, 10),
(0, 0),
(0, 22),
(0, 235),
(0, 105),
(1, 566),
(1, 257),
(0, 397),
(0, 57),
(0, 191),
(0, 101),
(0, 31),
(1, 427),
(0, 187),
(0, 228),
(1, 3),
(0, 249),
(0, 68),
(0, 422),
(0, 0),
(2, 136),
(1, 49),
(1, 573),
(0, 463),
(0, 4),
(2, 184),
(0, 1),
(0, 1),
(0, 10),
(8, 73),
(0, 312),
(0, 41),
(0, 522),
(3, 205),
(0, 707),
(0, 518),
(0, 113),
(10, 569),
(3, 634),
(0, 16),
(0, 18),
(0, 71),
(0, 126),
(1, 181),
(25, 615),
(0, 249),
(0, 138),
(0, 5),
(7, 292),
(0, 152),
(6, 310),
(0, 262),
(1, 0),
(0, 13),
(0, 54),
(0, 5),
(0, 0),
(0, 21),
(0, 26),
(4, 314),
(0, 48),
(0, 123),
(0, 13),
(0, 0),
(0, 0),
(0, 2),
(0, 19),
(6, 243),
(12, 409),
(3, 82),
(0, 601),
(0, 2),
],
entries: &[
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("📤\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("👍\u{fe0e}", Presentation::Text),
("📟\u{fe0f}", Presentation::Emoji),
("🕧\u{fe0f}", Presentation::Emoji),
("🔒\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🛩\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🖐\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("1\u{fe0e}", Presentation::Text),
("📪\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🌫\u{fe0e}", Presentation::Text),
("🕵\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🈷\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🖨\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🚭\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🈚\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🅰\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🚇\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🌕\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🅾\u{fe0f}", Presentation::Emoji),
("🕕\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏎\u{fe0f}", Presentation::Emoji),
("🌍\u{fe0e}", Presentation::Text),
("🖋\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("📺\u{fe0e}", Presentation::Text),
("🎟\u{fe0f}", Presentation::Emoji),
("🈯\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("👪\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🗨\u{fe0f}", Presentation::Emoji),
("🏕\u{fe0e}", Presentation::Text),
("🐕\u{fe0f}", Presentation::Emoji),
("🖋\u{fe0f}", Presentation::Emoji),
("👓\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🕣\u{fe0f}", Presentation::Emoji),
("®\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🅾\u{fe0e}", Presentation::Text),
("👇\u{fe0e}", Presentation::Text),
("👎\u{fe0e}", Presentation::Text),
("🅱\u{fe0e}", Presentation::Text),
("🚹\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🐦\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🏠\u{fe0e}", Presentation::Text),
("🏭\u{fe0f}", Presentation::Emoji),
("🕹\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("8\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("®\u{fe0f}", Presentation::Emoji),
("🗃\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🈷\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🎭\u{fe0f}", Presentation::Emoji),
("🏙\u{fe0f}", Presentation::Emoji),
("🗂\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🗞\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("💣\u{fe0e}", Presentation::Text),
("🏳\u{fe0e}", Presentation::Text),
("🏋\u{fe0f}", Presentation::Emoji),
("💻\u{fe0e}", Presentation::Text),
("📦\u{fe0f}", Presentation::Emoji),
("📫\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("📷\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("👆\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🌍\u{fe0f}", Presentation::Emoji),
("🌤\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🕓\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🕉\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("👽\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🌏\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🗃\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🌡\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🕣\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🕵\u{fe0f}", Presentation::Emoji),
("🗳\u{fe0e}", Presentation::Text),
("🏞\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🏄\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("👁\u{fe0e}", Presentation::Text),
("🎛\u{fe0f}", Presentation::Emoji),
("🗑\u{fe0f}", Presentation::Emoji),
("🖱\u{fe0f}", Presentation::Emoji),
("🎬\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🎬\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🐕\u{fe0e}", Presentation::Text),
("🗯\u{fe0e}", Presentation::Text),
("2\u{fe0f}", Presentation::Emoji),
("👇\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🌦\u{fe0e}", Presentation::Text),
("🏟\u{fe0e}", Presentation::Text),
("🕙\u{fe0e}", Presentation::Text),
("6\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🛋\u{fe0f}", Presentation::Emoji),
("🎖\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🗞\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🖲\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🕯\u{fe0e}", Presentation::Text),
("🛳\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏆\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🏊\u{fe0e}", Presentation::Text),
("🌬\u{fe0f}", Presentation::Emoji),
("🗣\u{fe0f}", Presentation::Emoji),
("🖼\u{fe0f}", Presentation::Emoji),
("🎓\u{fe0e}", Presentation::Text),
("©\u{fe0f}", Presentation::Emoji),
("🕑\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🕟\u{fe0e}", Presentation::Text),
("🚲\u{fe0f}", Presentation::Emoji),
("🛍\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🕊\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🕢\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🎧\u{fe0e}", Presentation::Text),
("🎚\u{fe0f}", Presentation::Emoji),
("🏳\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🗯\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏔\u{fe0e}", Presentation::Text),
("🖌\u{fe0e}", Presentation::Text),
("🕘\u{fe0f}", Presentation::Emoji),
("🌦\u{fe0f}", Presentation::Emoji),
("📥\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🚺\u{fe0e}", Presentation::Text),
("🔈\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🎗\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🖱\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🐿\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🏚\u{fe0f}", Presentation::Emoji),
("🛤\u{fe0f}", Presentation::Emoji),
("🕗\u{fe0e}", Presentation::Text),
("🛏\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🕒\u{fe0f}", Presentation::Emoji),
("8\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("📚\u{fe0e}", Presentation::Text),
("🏋\u{fe0e}", Presentation::Text),
("🛤\u{fe0e}", Presentation::Text),
("🕡\u{fe0e}", Presentation::Text),
("🍽\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🖇\u{fe0e}", Presentation::Text),
("🗒\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🐟\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏍\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🕤\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🚍\u{fe0e}", Presentation::Text),
("😐\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🛣\u{fe0e}", Presentation::Text),
("🎙\u{fe0e}", Presentation::Text),
("🕒\u{fe0e}", Presentation::Text),
("🛡\u{fe0e}", Presentation::Text),
("🎭\u{fe0e}", Presentation::Text),
("🌜\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏎\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🍸\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🗡\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🕴\u{fe0e}", Presentation::Text),
("🚼\u{fe0e}", Presentation::Text),
("🏗\u{fe0e}", Presentation::Text),
("🔍\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🕐\u{fe0e}", Presentation::Text),
("🗜\u{fe0e}", Presentation::Text),
("🕑\u{fe0f}", Presentation::Emoji),
("🔓\u{fe0e}", Presentation::Text),
("🌪\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🌨\u{fe0f}", Presentation::Emoji),
("📷\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🐦\u{fe0f}", Presentation::Emoji),
("🏂\u{fe0f}", Presentation::Emoji),
("🕚\u{fe0e}", Presentation::Text),
("7\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏕\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🛢\u{fe0e}", Presentation::Text),
("🕶\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🕥\u{fe0e}", Presentation::Text),
("🔍\u{fe0f}", Presentation::Emoji),
("🅰\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("📺\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏂\u{fe0e}", Presentation::Text),
("🛩\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("📹\u{fe0f}", Presentation::Emoji),
("💿\u{fe0f}", Presentation::Emoji),
("🕓\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("5\u{fe0e}", Presentation::Text),
("🐿\u{fe0f}", Presentation::Emoji),
("🕛\u{fe0f}", Presentation::Emoji),
("🏄\u{fe0f}", Presentation::Emoji),
("🖌\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🕕\u{fe0e}", Presentation::Text),
("🍽\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🏛\u{fe0e}", Presentation::Text),
("🏷\u{fe0e}", Presentation::Text),
("🖥\u{fe0e}", Presentation::Text),
("📚\u{fe0f}", Presentation::Emoji),
("🗺\u{fe0e}", Presentation::Text),
("📬\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("7\u{fe0e}", Presentation::Text),
("📻\u{fe0f}", Presentation::Emoji),
("🕝\u{fe0f}", Presentation::Emoji),
("🌪\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("👂\u{fe0e}", Presentation::Text),
("🗳\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("1\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🗓\u{fe0e}", Presentation::Text),
("🕧\u{fe0e}", Presentation::Text),
("📹\u{fe0e}", Presentation::Text),
("🕯\u{fe0f}", Presentation::Emoji),
("🎚\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🚲\u{fe0e}", Presentation::Text),
("🚍\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🏛\u{fe0f}", Presentation::Emoji),
("0\u{fe0e}", Presentation::Text),
("🕠\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🛥\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🌥\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏘\u{fe0e}", Presentation::Text),
("🏜\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🖊\u{fe0e}", Presentation::Text),
("🎟\u{fe0e}", Presentation::Text),
("🕟\u{fe0f}", Presentation::Emoji),
("📤\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🖍\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("#\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("📋\u{fe0f}", Presentation::Emoji),
("📟\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🗝\u{fe0e}", Presentation::Text),
("🗡\u{fe0f}", Presentation::Emoji),
("🚑\u{fe0e}", Presentation::Text),
("🚔\u{fe0f}", Presentation::Emoji),
("🗜\u{fe0f}", Presentation::Emoji),
("🏵\u{fe0f}", Presentation::Emoji),
("🕊\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🔒\u{fe0e}", Presentation::Text),
("🈚\u{fe0e}", Presentation::Text),
("🏔\u{fe0f}", Presentation::Emoji),
("🛰\u{fe0e}", Presentation::Text),
("*\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🏵\u{fe0e}", Presentation::Text),
("🛳\u{fe0e}", Presentation::Text),
("🕙\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🅱\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("💳\u{fe0e}", Presentation::Text),
("📭\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("4\u{fe0e}", Presentation::Text),
("🖍\u{fe0f}", Presentation::Emoji),
("📋\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🕷\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🕔\u{fe0e}", Presentation::Text),
("🕗\u{fe0f}", Presentation::Emoji),
("👉\u{fe0e}", Presentation::Text),
("💿\u{fe0e}", Presentation::Text),
("🗺\u{fe0f}", Presentation::Emoji),
("🌨\u{fe0e}", Presentation::Text),
("🕚\u{fe0f}", Presentation::Emoji),
("🏖\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🕞\u{fe0e}", Presentation::Text),
("🖥\u{fe0f}", Presentation::Emoji),
("🐈\u{fe0f}", Presentation::Emoji),
("5\u{fe0f}", Presentation::Emoji),
("🖇\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🅿\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("👆\u{fe0e}", Presentation::Text),
("🛰\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏠\u{fe0f}", Presentation::Emoji),
("💰\u{fe0e}", Presentation::Text),
("🕳\u{fe0e}", Presentation::Text),
("🕸\u{fe0e}", Presentation::Text),
("🏝\u{fe0f}", Presentation::Emoji),
("🕶\u{fe0f}", Presentation::Emoji),
("🚔\u{fe0e}", Presentation::Text),
("🐈\u{fe0e}", Presentation::Text),
("👉\u{fe0f}", Presentation::Emoji),
("🌡\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🕸\u{fe0f}", Presentation::Emoji),
("🚼\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🖨\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🏆\u{fe0f}", Presentation::Emoji),
("💣\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🗣\u{fe0e}", Presentation::Text),
("🎮\u{fe0e}", Presentation::Text),
("💳\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🛢\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🕥\u{fe0f}", Presentation::Emoji),
("🛏\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🗄\u{fe0e}", Presentation::Text),
("🕖\u{fe0e}", Presentation::Text),
("🕖\u{fe0f}", Presentation::Emoji),
("🛣\u{fe0f}", Presentation::Emoji),
("👽\u{fe0e}", Presentation::Text),
("🚘\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🛠\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🎓\u{fe0f}", Presentation::Emoji),
("👎\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("📽\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🔈\u{fe0e}", Presentation::Text),
("🕐\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🏍\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("4\u{fe0f}", Presentation::Emoji),
("🕜\u{fe0e}", Presentation::Text),
("🕦\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🚘\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("👪\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("👈\u{fe0e}", Presentation::Text),
("6\u{fe0e}", Presentation::Text),
("🕉\u{fe0f}", Presentation::Emoji),
("🎗\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🕴\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("📦\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🖊\u{fe0f}", Presentation::Emoji),
("🌎\u{fe0e}", Presentation::Text),
("🕠\u{fe0e}", Presentation::Text),
("🏘\u{fe0f}", Presentation::Emoji),
("9\u{fe0e}", Presentation::Text),
("🏗\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🛎\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🛥\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🖲\u{fe0f}", Presentation::Emoji),
("🕘\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏝\u{fe0e}", Presentation::Text),
("📬\u{fe0f}", Presentation::Emoji),
("🗨\u{fe0e}", Presentation::Text),
("📪\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("👂\u{fe0f}", Presentation::Emoji),
("0\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("3\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🕞\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🕝\u{fe0e}", Presentation::Text),
("🕡\u{fe0f}", Presentation::Emoji),
("📥\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🏟\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🗝\u{fe0f}", Presentation::Emoji),
("🕛\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🗒\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🎛\u{fe0e}", Presentation::Text),
("🛋\u{fe0e}", Presentation::Text),
("🕰\u{fe0f}", Presentation::Emoji),
("🗑\u{fe0e}", Presentation::Text),
("🕳\u{fe0f}", Presentation::Emoji),
("👓\u{fe0e}", Presentation::Text),
("🕷\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🎞\u{fe0f}", Presentation::Emoji),
("🏌\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🖼\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🛡\u{fe0f}", Presentation::Emoji),
("🅿\u{fe0f}", Presentation::Emoji),
("🏊\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("*\u{fe0e}", Presentation::Text),
("🈂\u{fe0f}", Presentation::Emoji),
("#\u{fe0f}", Presentation::Emoji),
("🌤\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🌎\u{fe0f}", Presentation::Emoji),
("🕢\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🌶\u{fe0e}", Presentation::Text),
("🚺\u{fe0f}", Presentation::Emoji),
("🕹\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("😐\u{fe0e}", Presentation::Text),
("🏚\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🗄\u{fe0f}", Presentation::Emoji),
("🕜\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("©\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🎖\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🀄\u{fe0f}", Presentation::Emoji),
("🚭\u{fe0e}", Presentation::Text),
("👁\u{fe0f}", Presentation::Emoji),
("🌶\u{fe0f}", Presentation::Emoji),
("🛍\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🛠\u{fe0e}", Presentation::Text),
("💻\u{fe0f}", Presentation::Emoji),
("📽\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🚇\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🌩\u{fe0e}", Presentation::Text),
("🌕\u{fe0f}", Presentation::Emoji),
("🍸\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🕤\u{fe0f}", Presentation::Emoji),
("3\u{fe0e}", Presentation::Text),
("👍\u{fe0f}", Presentation::Emoji),
("🌬\u{fe0e}", Presentation::Text),
("🚑\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🏌\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🌏\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("🌜\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🏜\u{fe0f}", Presentation::Emoji),
("9\u{fe0f}", Presentation::Emoji),
("🕦\u{fe0f}", Presentation::Emoji),
("📭\u{fe0f}", Presentation::Emoji),
("🎮\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("💰\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🗓\u{fe0f}", Presentation::Emoji),
("🏭\u{fe0e}", Presentation::Text),
("🏷\u{fe0f}", Presentation::Emoji),
("🏙\u{fe0e}", Presentation::Text),
("🛎\u{fe0f}", Presentation::Emoji),
("🎧\u{fe0f}", Presentation::Emoji),
("🌥\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🔓\u{fe0f}", Presentation::Emoji),
("👈\u{fe0f}", Presentation::Emoji),
("🈂\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🕔\u{fe0f}", Presentation::Emoji),
("🎙\u{fe0f}", Presentation::Emoji),
("🕰\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🌩\u{fe0f}", Presentation::Emoji),
("🌧\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🖐\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🎞\u{fe0e}", Presentation::Text),
("🈯\u{fe0f}", Presentation::Emoji),
("🐟\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("🏖\u{fe0e}", Presentation::Text),
("🏞\u{fe0f}", Presentation::Emoji),
("📫\u{fe0e}", Presentation::Text),
("🗂\u{fe0e}", Presentation::Text),
("📻\u{fe0e}", Presentation::Text),
("🌧\u{fe0e}", Presentation::Text),
("\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("🀄\u{fe0e}", Presentation::Text),
("🚹\u{fe0f}", Presentation::Emoji),
("2\u{fe0e}", Presentation::Text),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0f}", Presentation::Emoji),
("\u{fe0e}", Presentation::Text),
("🌫\u{fe0f}", Presentation::Emoji),
],
};

View File

@ -42,6 +42,7 @@
mod emoji;
mod emoji_presentation;
mod emoji_variation;
mod widechar_width;
pub mod caps;