diff --git a/build.rs b/build.rs index 82f44e9..37d42d6 100644 --- a/build.rs +++ b/build.rs @@ -1,9 +1,10 @@ const LINE_BREAK_TABLE_URL: &str = "http://www.unicode.org/Public/UCD/latest/ucd/LineBreak.txt"; -use std::fs::File; -use std::io::prelude::*; -use std::io::BufReader; -use std::path::PathBuf; -use std::process::Command; +use std::{ + fs::File, + io::{prelude::*, BufReader}, + path::PathBuf, + process::Command, +}; include!("src/text_processing/types.rs"); @@ -23,7 +24,7 @@ fn main() -> Result<(), std::io::Error> { ); tmpdir_path.push("LineBreak.txt"); Command::new("curl") - .args(&["-o", tmpdir_path.to_str().unwrap(), LINE_BREAK_TABLE_URL]) + .args(["-o", tmpdir_path.to_str().unwrap(), LINE_BREAK_TABLE_URL]) .output()?; let file = File::open(&tmpdir_path)?; @@ -38,7 +39,8 @@ fn main() -> Result<(), std::io::Error> { let tokens: &str = line.split_whitespace().next().unwrap(); let semicolon_idx: usize = tokens.chars().position(|c| c == ';').unwrap(); - /* LineBreak.txt list is ascii encoded so we can assume each char takes one byte: */ + // LineBreak.txt list is ascii encoded so we can assume each char takes one + // byte: let chars_str: &str = &tokens[..semicolon_idx]; let mut codepoint_iter = chars_str.split(".."); diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..0038b1d --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,8 @@ +edition = "2018" +format_generated_files = false +format_code_in_doc_comments = true +format_strings = true +imports_granularity = "Crate" +group_imports = "StdExternalCrate" +wrap_comments = true +normalize_comments = true diff --git a/src/components.rs b/src/components.rs index efb500a..b9e88ec 100644 --- a/src/components.rs +++ b/src/components.rs @@ -1,43 +1,42 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . -/*! -Components are ways to handle application data. They can draw on the terminal and receive events, but also do other stuff as well. (For example, see the `notifications` module.) +//! Components are ways to handle application data. They can draw on the +//! terminal and receive events, but also do other stuff as well. (For example, +//! see the `notifications` module.) +//! +//! See the `Component` Trait for more details. -See the `Component` Trait for more details. -*/ - -use crate::state::*; -use crate::terminal::*; +use crate::{state::*, terminal::*}; mod utilities; pub use utilities::*; mod kernel; pub use kernel::*; pub mod processes; -pub use processes::*; +use std::{ + collections::{HashMap, VecDeque}, + fmt, + fmt::{Debug, Display}, +}; -use std::collections::{HashMap, VecDeque}; -use std::fmt; -use std::fmt::{Debug, Display}; +pub use processes::*; use super::{Key, UIEvent}; // The upper and lower boundary char. const HORZ_BOUNDARY: char = '─'; @@ -47,8 +46,6 @@ pub type ShortcutMap = HashMap<&'static str, Key>; pub type ShortcutMaps = HashMap; /// Types implementing this Trait can draw on the terminal and receive events. -/// If a type wants to skip drawing if it has not changed anything, it can hold some flag in its -/// fields (eg self.dirty = false) and act upon that in their `draw` implementation. pub trait Component: Display + Debug + Send { fn draw( &mut self, @@ -74,16 +71,15 @@ pub fn create_box(grid: &mut CellBuffer, area: Area) { let upper_left = upper_left!(area); let bottom_right = bottom_right!(area); - /*for x in get_x(upper_left)..=get_x(bottom_right) { - grid[(x, get_y(upper_left))].set_ch(HORZ_BOUNDARY); - grid[(x, get_y(bottom_right))].set_ch(HORZ_BOUNDARY); - grid[(x, get_y(bottom_right))].set_ch('▒'); - grid[(x, get_y(bottom_right))].set_fg(Color::Byte(240)); - } - */ + // for x in get_x(upper_left)..=get_x(bottom_right) { + // grid[(x, get_y(upper_left))].set_ch(HORZ_BOUNDARY); + // grid[(x, get_y(bottom_right))].set_ch(HORZ_BOUNDARY); + // grid[(x, get_y(bottom_right))].set_ch('▒'); + // grid[(x, get_y(bottom_right))].set_fg(Color::Byte(240)); + // } for y in get_y(upper_left)..=get_y(bottom_right) { - //grid[(get_x(upper_left), y)].set_ch(VERT_BOUNDARY); + // grid[(get_x(upper_left), y)].set_ch(VERT_BOUNDARY); grid[(get_x(bottom_right), y)] .set_ch('▒') .set_fg(Color::Byte(240)); diff --git a/src/components/kernel.rs b/src/components/kernel.rs index 33d3295..0e08d72 100644 --- a/src/components/kernel.rs +++ b/src/components/kernel.rs @@ -1,32 +1,29 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . + +use std::{fs::File, io::prelude::*, str::FromStr}; use super::*; -use std::fs::File; -use std::io::prelude::*; -use std::str::FromStr; -/* if cpu_no > MAX_CPU_ROWS, the cpu bars wrap in columns */ +/// if cpu_no > MAX_CPU_ROWS, the cpu bars wrap in columns static MAX_CPU_ROWS: usize = 5; -/* Kernel metrics components */ +/// Kernel metrics components #[derive(Debug)] pub struct KernelMetrics { hostname: String, @@ -44,6 +41,12 @@ impl fmt::Display for KernelMetrics { } } +impl Default for KernelMetrics { + fn default() -> Self { + Self::new() + } +} + impl KernelMetrics { pub fn new() -> Self { let mut file = File::open("/proc/sys/kernel/hostname").expect(crate::PROC_FS_ERROR_STR); @@ -68,35 +71,36 @@ impl KernelMetrics { } } - /* Returns width of entire widget */ + /// Returns width of entire widget fn draw_cpu_bars(&mut self, grid: &mut CellBuffer, area: Area) -> usize { let upper_left = upper_left!(area); let total_cols = width!(area); - /* no of bars is no of CPUs along with the total CPU usage */ + // no of bars is no of CPUs along with the total CPU usage let cpu_no = self.cpu_stat.len(); - /* Calculate how much horizontal space the labels (ie CPU0, CPU1, CPU2) take in order to - * distribute the remainder for each column, specifically the bars */ + // Calculate how much horizontal space the labels (ie CPU0, CPU1, CPU2) take + // in order to distribute the remainder for each column, specifically + // the bars let mut cpu_label_space = 0; let mut cpu_bar_columns = 0; let mut i = 0; while i < cpu_no { - /* Reserve space for CPU labels */ + // Reserve space for CPU labels if i < 10 { - /* label will be " CPU0 " */ + // label will be " CPU0 " cpu_label_space += 7; } else if i < 100 { - /* label will be " CPU32 " */ + // label will be " CPU32 " cpu_label_space += 8; } else { - /* label will be " CPU128 " */ + // label will be " CPU128 " cpu_label_space += 9; } - /* each column holds MAX_CPU_ROWS */ + // each column holds MAX_CPU_ROWS i += MAX_CPU_ROWS; cpu_bar_columns += 1; } - /* max width of each cpu bar */ + // max width of each cpu bar let bar_width = if cpu_no < MAX_CPU_ROWS { total_cols } else { @@ -132,7 +136,7 @@ impl KernelMetrics { None, ) } else { - /* add padding */ + // add padding let (x, y) = write_string_to_grid( "Σ", grid, @@ -157,7 +161,7 @@ impl KernelMetrics { }; x += 2; - /* Calculate percentages for the cpu usage bar */ + // Calculate percentages for the cpu usage bar let bar_length: usize = ((cpu_stat .busy_time() .saturating_sub(self.cpu_stat[i].busy_time()) @@ -170,7 +174,7 @@ impl KernelMetrics { return x_offset; } - /* Sometimes you draw the bar */ + // Sometimes you draw the bar let mut _x_offset = 0; while _x_offset < bar_length { write_string_to_grid( @@ -184,7 +188,7 @@ impl KernelMetrics { ); _x_offset += 1; } - /* and sometimes the bar draws you */ + // and sometimes the bar draws you while _x_offset <= bar_width { write_string_to_grid( "▁", @@ -224,26 +228,24 @@ impl KernelMetrics { let upper_left = upper_left!(area); let bottom_right = bottom_right!(area); if bars_max == 0 { - /* In first draw, we have no cpu data since there is no previous measurement to use - * in the calculation so bars_max will be 0 */ + // In first draw, we have no cpu data since there is no previous measurement + // to use in the calculation so bars_max will be 0 return; } let (available, total) = get_mem_info(); - /* available_length == the length the spaces takes up in this case: - * |******** | 50% - */ + // available_length == the length the spaces takes up in this case: + // |******** | 50% let available_length = ((available as f64 / total as f64) * (bars_max * 8) as f64) as usize; - /* mem_bar length == the length the asterisks takes up in this case: - * |******** | 50% - */ + // mem_bar length == the length the asterisks takes up in this case: + // |******** | 50% let mem_bar_length = bars_max * 8 - available_length; let mem_display = format!( "RAM {}/{}", Bytes((total - available) * 1024).as_convenient_string(), Bytes(total * 1024).as_convenient_string() ); - /* Put the "RAM XGB/YGB" in the middle of the RAM bar */ + // Put the "RAM XGB/YGB" in the middle of the RAM bar let mem_display_padding = bars_max.saturating_sub(mem_display.len()) / 2; let y_offset = 2 + MAX_CPU_ROWS; @@ -369,7 +371,7 @@ impl Component for KernelMetrics { self.dirty = false; } - /* Draw uptime */ + // Draw uptime let mut file = File::open("/proc/uptime").expect(crate::PROC_FS_ERROR_STR); self.uptime.clear(); file.read_to_string(&mut self.uptime).unwrap(); @@ -406,9 +408,9 @@ impl Component for KernelMetrics { } let old_cpu_stat = self.cpu_stat[0]; - /* Draw CPU usage bars */ + // Draw CPU usage bars - /* max width of cpu bar area */ + // max width of cpu bar area let bars_max = (0.6 * total_cols as f32) as usize; let cpu_widget_width = self.draw_cpu_bars( grid, @@ -417,14 +419,14 @@ impl Component for KernelMetrics { pos_inc(upper_left, (bars_max + 1, MAX_CPU_ROWS + 1)), ), ); - /* Draw RAM usage bar */ + // Draw RAM usage bar self.draw_ram_bar(grid, area, cpu_widget_width.saturating_sub(2)); - /* Various values table */ - /* max width of cpu bar area */ + // Various values table + // max width of cpu bar area let bars_max = (0.6 * total_cols as f32) as usize; - /* CPU Times */ + // CPU Times let mut cpu_column_width = "CPU".len(); let upper_left = pos_inc(upper_left, (bars_max + 5, 2)); clear_area(grid, (upper_left, bottom_right)); @@ -471,7 +473,7 @@ impl Component for KernelMetrics { cpu_column_width = std::cmp::max(tag.len() + s.len() + 4, cpu_column_width); } - /* Load average */ + // Load average let upper_left = pos_inc(upper_left, (cpu_column_width + 3, 0)); if get_x(upper_left) >= get_x(bottom_right) { return; @@ -512,11 +514,8 @@ impl Component for KernelMetrics { } fn process_event(&mut self, event: &mut UIEvent, _ui_mode: &mut UIMode) { - match event { - UIEvent::Resize => { - self.dirty = true; - } - _ => {} + if let UIEvent::Resize = event { + self.dirty = true; } } @@ -538,11 +537,10 @@ fn get_mem_info() -> (usize, usize) { let mut counter = 0; for line in res.lines() { if line.starts_with("MemTotal") { - mem_total = usize::from_str(line.split_whitespace().skip(1).next().unwrap()).unwrap(); + mem_total = usize::from_str(line.split_whitespace().nth(1).unwrap()).unwrap(); counter += 1; } else if line.starts_with("MemAvailable") { - mem_available = - usize::from_str(line.split_whitespace().skip(1).next().unwrap()).unwrap(); + mem_available = usize::from_str(line.split_whitespace().nth(1).unwrap()).unwrap(); counter += 1; } @@ -605,17 +603,17 @@ fn get_cpu_times( }, )); }; - }; + } - /* user % */ + // user % val!("user ", user_time); - /* system % */ + // system % val!("system ", system_time); - /* nice % */ + // nice % val!("nice ", nice_time); - /* idle % */ + // idle % val!("idle ", idle_time); - /* iowait % */ + // iowait % val!("iowait ", iowait_time); ret diff --git a/src/components/processes.rs b/src/components/processes.rs index 42b49b3..9c6129c 100644 --- a/src/components/processes.rs +++ b/src/components/processes.rs @@ -1,30 +1,32 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . + +use std::{ + collections::{HashMap, HashSet}, + fs::File, + io::prelude::*, + path::PathBuf, + str::FromStr, +}; use super::*; -use std::collections::{HashMap, HashSet}; -use std::fs::File; -use std::io::prelude::*; -use std::path::PathBuf; -use std::str::FromStr; + #[derive(Debug)] pub struct ProcessData { cpu_stat: Stat, @@ -36,7 +38,7 @@ pub struct ProcessData { tree: Vec<(usize, Pid)>, } -const SIGNAL_LIST: &[(i32, &'static str)] = &[ +const SIGNAL_LIST: &[(i32, &str)] = &[ (1, "1 HUP"), (2, "2 INT"), (3, "3 QUIT"), @@ -70,14 +72,14 @@ const SIGNAL_LIST: &[(i32, &'static str)] = &[ (31, "31 SYS"), ]; -//const ARROW_UP: &str = "↑"; -//const ARROW_DOWN: &str = "↓"; -//const ARROW_UP: &str = "▲"; -//const ARROW_DOWN: &str = "▼"; +// const ARROW_UP: &str = "↑"; +// const ARROW_DOWN: &str = "↓"; +// const ARROW_UP: &str = "▲"; +// const ARROW_DOWN: &str = "▼"; const ARROW_UP: &str = "🠉"; const ARROW_DOWN: &str = "🠋"; -/* Hold maximum width for each column */ +/// Hold maximum width for each column #[derive(Debug)] pub struct ColumnWidthMaxima { pid: usize, @@ -112,6 +114,11 @@ macro_rules! define_column_string { pub fn len(&self) -> usize { self.0.len() } + + #[allow(dead_code)] + pub fn is_empty(&self) -> bool { + self.0.len() == 0 + } } impl std::fmt::Display for $typename { @@ -148,7 +155,7 @@ enum Sort { CmdLineDesc, } -/* Wrapper type for display strings */ +/// Wrapper type for display strings #[derive(Debug)] pub struct ProcessDisplay { pub i: Pid, @@ -165,31 +172,29 @@ pub struct ProcessDisplay { pub is_thread: bool, } -/* process list components */ +/// Process list component #[derive(Debug)] pub struct ProcessList { page_movement: Option, - cpu_stat: Stat, data: ProcessData, cursor: usize, height: usize, dirty: bool, force_redraw: bool, maxima: ColumnWidthMaxima, - /* stop updating data */ + /// stop updating data freeze: bool, draw_tree: bool, draw_help: bool, - processes_times: HashMap, - threads_times: HashMap, processes: Vec, sort: Sort, mode: FunctionModes, } -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Default)] enum Input { Active, + #[default] Inactive, } @@ -205,11 +210,6 @@ impl Input { } } -impl Default for Input { - fn default() -> Self { - Inactive - } -} use Input::*; const FOLLOW_ACTIVE: u8 = 0x01; @@ -223,7 +223,9 @@ const FILTER_ACTIVE: u8 = 0x40; struct FunctionModes { follow: Pid, locate: Pid, - search: (String, usize, usize, bool), /* (search term, current result y_offset, previous result offset, is cursor focused on results?) */ + /// (search term, current result y_offset, previous result offset, is cursor + /// focused on results?) + search: (String, usize, usize, bool), kill: u16, filter: String, active: u8, @@ -239,19 +241,19 @@ impl FunctionModes { #[derive(Debug, PartialEq)] pub enum State { - /* Z Zombie */ + /// `Z` Zombie Zombie, - /* R Running */ + /// `R` Running Running, - /* S Sleeping in an interruptible wait */ + /// `S` Sleeping in an interruptible wait Sleeping, - /* D Waiting in uninterruptible disk sleep */ + /// `D` Waiting in uninterruptible disk sleep Waiting, - /* T Stopped (on a signal) or (before Linux 2.6.33) trace stopped */ + /// `T` Stopped (on a signal) or (before Linux 2.6.33) trace stopped Stopped, - /* t Tracing stop (Linux 2.6.33 onward) */ + /// `t` Tracing stop (Linux 2.6.33 onward) Tracing, - /* X Dead (from Linux 2.6.0 onward) */ + /// `X` Dead (from Linux 2.6.0 onward) Dead, } @@ -306,6 +308,12 @@ impl fmt::Display for ProcessList { } } +impl Default for ProcessList { + fn default() -> Self { + Self::new() + } +} + impl ProcessList { pub fn new() -> Self { let data = ProcessData { @@ -320,11 +328,8 @@ impl ProcessList { ProcessList { cursor: 0, page_movement: None, - cpu_stat: get_stat(&mut 0).remove(0), data, processes: Vec::with_capacity(1024), - processes_times: Default::default(), - threads_times: Default::default(), height: 0, maxima: ColumnWidthMaxima::new(), freeze: false, @@ -384,8 +389,7 @@ impl ProcessList { .map(|(k, v)| (*k, v)) .collect::>(); shortcuts.sort_by_key(|s| s.0); - let mut y = 0; - for (k, v) in shortcuts.iter() { + for (y, (k, v)) in shortcuts.iter().enumerate() { write_string_to_grid( &format!("{k:>max_key$} {v}", k = k, v = v, max_key = max_key), grid, @@ -393,12 +397,11 @@ impl ProcessList { Color::Default, Attr::Default, ( - pos_inc(upper_left!(box_area), (2, 4 + y)), + pos_inc(upper_left!(box_area), (2, y + 4)), bottom_right!(box_area), ), None, ); - y += 1; } let box_area = ( (margin_left, margin_top + 13), @@ -448,20 +451,23 @@ impl ProcessList { let p = &self.processes[self.data.processes_index[pid]]; if self.mode.is_active(SEARCH_ACTIVE) { let (ref search, ref mut n, ref mut n_prev, is_cursor_focused) = self.mode.search; - if (*n != *n_prev || tick) && is_cursor_focused { - if !stop_search && search.len() > 1 && p.cmd_line.0.contains(search) { - if search_results == *n { - let i = y_offset; - pages = i / height; - self.cursor = i; - stop_search = true; - *n_prev = *n; - } else { - search_results += 1; - } - if search_results < *n { - *n = search_results; - } + if (*n != *n_prev || tick) + && is_cursor_focused + && !stop_search + && search.len() > 1 + && p.cmd_line.0.contains(search) + { + if search_results == *n { + let i = y_offset; + pages = i / height; + self.cursor = i; + stop_search = true; + *n_prev = *n; + } else { + search_results += 1; + } + if search_results < *n { + *n = search_results; } } } @@ -472,7 +478,7 @@ impl ProcessList { .data .parents .get(&p.p) - .and_then(|v| Some(v.len() - 1)) + .map(|v| v.len() - 1) .unwrap_or(0) }) .unwrap_or(false); @@ -492,16 +498,12 @@ impl ProcessList { } else { s.push(' '); } - if i > 0 {} s.push(' '); } if *ind > 0 || (has_sibling || is_first) { if p.is_thread { - if has_sibling && is_first { - s.push(' '); - s.push('┠'); - } else if has_sibling { + if has_sibling { s.push(' '); s.push('┠'); } else { @@ -510,10 +512,7 @@ impl ProcessList { } s.push('┄'); } else { - if has_sibling && is_first { - s.push(' '); - s.push('┣'); - } else if has_sibling { + if has_sibling { s.push(' '); s.push('┣'); } else { @@ -568,8 +567,10 @@ impl ProcessList { match executable_path_color(&p.cmd_line) { Ok((path, bin, rest)) => { let (x, _) = write_string_to_grid( - &format!( - "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% {state:>max_state$} {branches}", + &format!( + "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} \ + {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% \ + {state:>max_state$} {branches}", pid = p.pid, ppid = p.ppid, username = p.username, @@ -583,13 +584,14 @@ impl ProcessList { max_cpu_percent = self.maxima.cpu_percent, max_state = self.maxima.state, branches = s, - ), - grid, - fg_color, - bg_color, - Attr::Default, - (pos_inc(upper_left, (0, y_offset + 2)), bottom_right), - None,); + ), + grid, + fg_color, + bg_color, + Attr::Default, + (pos_inc(upper_left, (0, y_offset + 2)), bottom_right), + None, + ); if p.state == State::Running { grid[pos_inc( upper_left, @@ -652,8 +654,10 @@ impl ProcessList { } Err((bin, rest)) => { let (x, _) = write_string_to_grid( - &format!( - "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% {state:>max_state$} {branches}", + &format!( + "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} \ + {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% \ + {state:>max_state$} {branches}", pid = p.pid, ppid = p.ppid, username = p.username, @@ -667,13 +671,14 @@ impl ProcessList { max_cpu_percent = self.maxima.cpu_percent, max_state = self.maxima.state, branches = s, - ), - grid, - fg_color, - bg_color, - Attr::Default, - (pos_inc(upper_left, (0, y_offset + 2)), bottom_right), - None,); + ), + grid, + fg_color, + bg_color, + Attr::Default, + (pos_inc(upper_left, (0, y_offset + 2)), bottom_right), + None, + ); if p.state == State::Running { grid[pos_inc( upper_left, @@ -732,8 +737,8 @@ impl ProcessList { } } -/* Prints the process list */ impl Component for ProcessList { + /// Prints the process list fn draw( &mut self, grid: &mut CellBuffer, @@ -753,7 +758,7 @@ impl Component for ProcessList { let mut upper_left = pos_inc(upper_left!(area), (1, 0)); let bottom_right = pos_dec(bottom_right!(area), (1, 1)); - /* Reserve first row for column headers */ + // Reserve first row for column headers let height = height!(area) - 2 - if self.mode.is_active(LOCATE_ACTIVE) { @@ -809,7 +814,7 @@ impl Component for ProcessList { dirty_areas.push_back(area); if !self.freeze && update_maxima { - /* Keep tabs on biggest element in each column */ + // Keep tabs on biggest element in each column self.maxima = ColumnWidthMaxima::new(); for p in &self.processes { @@ -871,34 +876,65 @@ impl Component for ProcessList { None }; - /* Write column headers */ + // Write column headers let (x, y) = write_string_to_grid( &format!( - "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$}{usernamesort} {vm_rss:>max_vm_rss$}{vmrsssort} {cpu_percent:>max_cpu_percent$}{cpusort} {state:>max_state$} {cmd_line}{cmd_linesort}", + "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$}{usernamesort} \ + {vm_rss:>max_vm_rss$}{vmrsssort} {cpu_percent:>max_cpu_percent$}{cpusort} \ + {state:>max_state$} {cmd_line}{cmd_linesort}", pid = "PID", - ppid ="PPID", + ppid = "PPID", username = "USER", vm_rss = "VM_RSS", cpu_percent = " CPU%", state = " ", - cmd_line = if let Some(ref cmd_header) = cmd_header { &cmd_header } else { "CMD_LINE"} , + cmd_line = if let Some(ref cmd_header) = cmd_header { + &cmd_header + } else { + "CMD_LINE" + }, max_pid = self.maxima.pid, max_ppid = self.maxima.ppid, max_username = self.maxima.username, max_vm_rss = self.maxima.vm_rss, max_cpu_percent = self.maxima.cpu_percent, max_state = self.maxima.state, - usernamesort = if let Sort::UserAsc = self.sort { ARROW_UP } else if let Sort::UserDesc = self.sort { ARROW_DOWN } else { " " }, - vmrsssort = if let Sort::VmRssAsc = self.sort { ARROW_UP } else if let Sort::VmRssDesc = self.sort { ARROW_DOWN } else { " " }, - cpusort = if let Sort::CpuAsc = self.sort { ARROW_UP } else if let Sort::CpuDesc = self.sort { ARROW_DOWN } else { " " }, - cmd_linesort = if let Sort::CmdLineAsc = self.sort { ARROW_UP } else if let Sort::CmdLineDesc = self.sort { ARROW_DOWN } else { "" }, + usernamesort = if let Sort::UserAsc = self.sort { + ARROW_UP + } else if let Sort::UserDesc = self.sort { + ARROW_DOWN + } else { + " " + }, + vmrsssort = if let Sort::VmRssAsc = self.sort { + ARROW_UP + } else if let Sort::VmRssDesc = self.sort { + ARROW_DOWN + } else { + " " + }, + cpusort = if let Sort::CpuAsc = self.sort { + ARROW_UP + } else if let Sort::CpuDesc = self.sort { + ARROW_DOWN + } else { + " " + }, + cmd_linesort = if let Sort::CmdLineAsc = self.sort { + ARROW_UP + } else if let Sort::CmdLineDesc = self.sort { + ARROW_DOWN + } else { + "" + }, ), grid, Color::Black, Color::White, Attr::Default, (pos_inc(upper_left, (0, 1)), bottom_right), - None,); + None, + ); if self.mode.is_active(SEARCH_ACTIVE | FILTER_ACTIVE) && self.mode.input == Active { grid[(x - 1, y)].set_fg(Color::White); grid[(x - 1, y)].set_bg(Color::Black); @@ -910,7 +946,7 @@ impl Component for ProcessList { Some(Color::White), ); - /* Write current selected status if any. eg. if list is frozen, show 'FROZEN'. */ + // Write current selected status if any. eg. if list is frozen, show 'FROZEN'. { let (mut x, y) = set_y(upper_left!(area), get_y(bottom_right) + 1); if self.freeze { @@ -1057,27 +1093,30 @@ impl Component for ProcessList { match executable_path_color(&p.cmd_line) { Ok((path, bin, rest)) => { let (x, _) = write_string_to_grid( - &format!( - "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% {state:>max_state$} ", - pid = p.pid, - ppid = p.ppid, - username = p.username, - vm_rss = p.vm_rss, - cpu_percent = (p.cpu_percent as f64 / 100.0), - state = p.state, - max_pid = self.maxima.pid, - max_ppid = self.maxima.ppid, - max_username = self.maxima.username, - max_vm_rss = self.maxima.vm_rss, - max_cpu_percent = self.maxima.cpu_percent, - max_state = self.maxima.state, + &format!( + "{pid:>max_pid$} {ppid:>max_ppid$} \ + {username:>max_username$} {vm_rss:>max_vm_rss$} \ + {cpu_percent:>max_cpu_percent$}% {state:>max_state$} ", + pid = p.pid, + ppid = p.ppid, + username = p.username, + vm_rss = p.vm_rss, + cpu_percent = (p.cpu_percent as f64 / 100.0), + state = p.state, + max_pid = self.maxima.pid, + max_ppid = self.maxima.ppid, + max_username = self.maxima.username, + max_vm_rss = self.maxima.vm_rss, + max_cpu_percent = self.maxima.cpu_percent, + max_state = self.maxima.state, ), - grid, - fg_color, - bg_color, - Attr::Default, - (pos_inc(upper_left, (0, y_offset + 2)), bottom_right), - None,); + grid, + fg_color, + bg_color, + Attr::Default, + (pos_inc(upper_left, (0, y_offset + 2)), bottom_right), + None, + ); if p.state == State::Running { grid[pos_inc( upper_left, @@ -1140,27 +1179,30 @@ impl Component for ProcessList { } Err((bin, rest)) => { let (x, _) = write_string_to_grid( - &format!( - "{pid:>max_pid$} {ppid:>max_ppid$} {username:>max_username$} {vm_rss:>max_vm_rss$} {cpu_percent:>max_cpu_percent$}% {state:>max_state$} ", - pid = p.pid, - ppid = p.ppid, - username = p.username, - vm_rss = p.vm_rss, - cpu_percent = (p.cpu_percent as f64 / 100.0), - state = p.state, - max_pid = self.maxima.pid, - max_ppid = self.maxima.ppid, - max_username = self.maxima.username, - max_vm_rss = self.maxima.vm_rss, - max_cpu_percent = self.maxima.cpu_percent, - max_state = self.maxima.state, - ), - grid, - fg_color, - bg_color, - Attr::Default, - (pos_inc(upper_left, (0, y_offset + 2)), bottom_right), - None,); + &format!( + "{pid:>max_pid$} {ppid:>max_ppid$} \ + {username:>max_username$} {vm_rss:>max_vm_rss$} \ + {cpu_percent:>max_cpu_percent$}% {state:>max_state$} ", + pid = p.pid, + ppid = p.ppid, + username = p.username, + vm_rss = p.vm_rss, + cpu_percent = (p.cpu_percent as f64 / 100.0), + state = p.state, + max_pid = self.maxima.pid, + max_ppid = self.maxima.ppid, + max_username = self.maxima.username, + max_vm_rss = self.maxima.vm_rss, + max_cpu_percent = self.maxima.cpu_percent, + max_state = self.maxima.state, + ), + grid, + fg_color, + bg_color, + Attr::Default, + (pos_inc(upper_left, (0, y_offset + 2)), bottom_right), + None, + ); if p.state == State::Running { grid[pos_inc( upper_left, @@ -1302,46 +1344,44 @@ impl Component for ProcessList { change_colors(grid, old_area, None, Some(bg_color)); dirty_areas.push_back(old_area); dirty_areas.push_back(new_area); - } else { - if self.mode.is_active(FOLLOW_ACTIVE) { - let pid = self.mode.follow; - let info = format!("Following PID == {pid} || PPID == {pid}", pid = pid); - let (_, y) = write_string_to_grid( - &info, - grid, - Color::Default, - Color::Default, - Attr::Bold, - ( - pos_inc( - upper_left!(area), - ((width / 2).saturating_sub(info.len() / 2), 1), - ), - bottom_right!(area), + } else if self.mode.is_active(FOLLOW_ACTIVE) { + let pid = self.mode.follow; + let info = format!("Following PID == {pid} || PPID == {pid}", pid = pid); + let (_, y) = write_string_to_grid( + &info, + grid, + Color::Default, + Color::Default, + Attr::Bold, + ( + pos_inc( + upper_left!(area), + ((width / 2).saturating_sub(info.len() / 2), 1), ), - None, - ); - dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right, y))); - } else if self.mode.is_active(LOCATE_ACTIVE) { - let pid = self.mode.locate; - let info = format!("Highlighting PID == {pid}", pid = pid); - let (_, y) = write_string_to_grid( - &info, - grid, - Color::Default, - Color::Default, - Attr::Bold, - ( - pos_inc( - upper_left!(area), - ((width / 2).saturating_sub(info.len() / 2), 1), - ), - bottom_right!(area), + bottom_right!(area), + ), + None, + ); + dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right, y))); + } else if self.mode.is_active(LOCATE_ACTIVE) { + let pid = self.mode.locate; + let info = format!("Highlighting PID == {pid}", pid = pid); + let (_, y) = write_string_to_grid( + &info, + grid, + Color::Default, + Color::Default, + Attr::Bold, + ( + pos_inc( + upper_left!(area), + ((width / 2).saturating_sub(info.len() / 2), 1), ), - None, - ); - dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right, y))); - } + bottom_right!(area), + ), + None, + ); + dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right, y))); } if self.mode.is_active(KILL_ACTIVE) { @@ -1357,18 +1397,16 @@ impl Component for ProcessList { create_box(grid, box_area); let mut x = 1; for s in SIGNAL_LIST.chunks(11) { - let mut y = 0; - for sig in s { + for (y, sig) in s.iter().enumerate() { write_string_to_grid( sig.1, grid, Color::Default, Color::Default, Attr::Default, - (pos_inc(upper_left!(box_area), (x, 1 + y)), bottom_right), + (pos_inc(upper_left!(box_area), (x, y + 1)), bottom_right), None, ); - y += 1; } x += 11; } @@ -1379,7 +1417,7 @@ impl Component for ProcessList { clear_area(grid, box_area); create_box(grid, box_area); let signal_fmt = if n == 0 { - format!("__") + "__".to_string() } else if n < 32 { format!("{} [{}]", SIGNAL_LIST[n as usize - 1].1, n) } else { @@ -1600,7 +1638,7 @@ impl Component for ProcessList { self.force_redraw = true; } UIEvent::Input(k) if *k == map["cancel"] => { - /* layered cancelling */ + // layered cancelling if self.mode.is_active(HELP_ACTIVE) { self.mode.active &= !HELP_ACTIVE; } else if self.mode.is_active(KILL_ACTIVE) { @@ -1641,14 +1679,14 @@ impl Component for ProcessList { && f.is_numeric() => { if self.mode.is_active(KILL_ACTIVE) { - let ref mut n = self.mode.kill; + let n = &mut self.mode.kill; if let Some(add) = (*n).checked_mul(10) { *n = add .checked_add(f.to_digit(10).unwrap() as u16) .unwrap_or(*n); } } else { - let ref mut p = self.mode.locate; + let p = &mut self.mode.locate; if let Some(add) = (*p).checked_mul(10) { *p = add .checked_add(f.to_digit(10).unwrap() as i32) @@ -1660,7 +1698,7 @@ impl Component for ProcessList { UIEvent::Input(Key::Backspace) if self.mode.input == Active => { if self.mode.is_active(KILL_ACTIVE) { let n = &mut self.mode.kill; - *n = *n / 10; + *n /= 10; } else if self.mode.is_active(SEARCH_ACTIVE) { let (ref mut p, ref mut n, ref mut n_prev, _) = self.mode.search; if p.is_empty() { @@ -1673,7 +1711,7 @@ impl Component for ProcessList { } } else if self.mode.is_active(LOCATE_ACTIVE) { let p = &mut self.mode.locate; - *p = *p / 10; + *p /= 10; } else if self.mode.is_active(FILTER_ACTIVE) { let filter = &mut self.mode.filter; if filter.is_empty() { @@ -1690,10 +1728,11 @@ impl Component for ProcessList { UIEvent::Input(Key::Char('\n')) if self.mode.input == Active && self.mode.is_active(KILL_ACTIVE) => { - let ref n = self.mode.kill; - use nix::sys::signal::kill; + let n = &self.mode.kill; use std::convert::TryFrom; + use nix::sys::signal::kill; + kill( nix::unistd::Pid::from_raw(self.get_pid_under_cursor(self.cursor)), nix::sys::signal::Signal::try_from(*n as i32).unwrap(), @@ -1721,7 +1760,7 @@ impl Component for ProcessList { *n_prev = *n; *n += 1; } else { - /* regain focus */ + // regain focus *n_prev = *n + 1; *is_cursor_focused = true; } @@ -1732,7 +1771,7 @@ impl Component for ProcessList { *n_prev = *n; *n = (*n).saturating_sub(1); } else { - /* regain focus */ + // regain focus *n_prev = *n + 1; *is_cursor_focused = true; } @@ -1798,15 +1837,13 @@ fn executable_path_color(p: &CmdLineString) -> Result<(&str, &str, &str), (&str, Ok((path, rest, "")) } } else { - return Err(p.split_at(first_whitespace)); + Err(p.split_at(first_whitespace)) } + } else if let Some(path_end) = p.as_bytes().iter().rposition(|c| *c == b'/') { + let (path, bin) = p.split_at(path_end + 1); + Ok((path, bin, "")) } else { - if let Some(path_end) = p.as_bytes().iter().rposition(|c| *c == b'/') { - let (path, bin) = p.split_at(path_end + 1); - Ok((path, bin, "")) - } else { - return Err((p, "")); - } + Err((p, "")) } } @@ -1849,7 +1886,7 @@ fn get(data: &mut ProcessData, follow_pid: Option, sort: Sort) -> Vec, sort: Sort) -> Vec, sort: Sort) -> Vec, sort: Sort) -> Vec Result { - /* proc file structure can be found in man 5 proc.*/ + // proc file structure can be found in man 5 proc. path.push("status"); let mut file: File = File::open(&path)?; let mut res = String::with_capacity(2048); @@ -2076,19 +2112,21 @@ fn get_pid_info(mut path: PathBuf, thread: bool) -> Result>().join(" ")); + // values are separated by null bytes + ret.cmd_line = res.split('\0').collect::>().join(" ").to_string(); } path.pop(); path.push("stat"); let mut file: File = File::open(&path)?; res.clear(); file.read_to_string(&mut res)?; - /* values are separated by whitespace and are in a specific order */ + // values are separated by whitespace and are in a specific order if !res.is_empty() { let mut vals = res.split_whitespace().skip(13); - ret.rtime = err!(usize::from_str(none_err!(vals.next()))); /* utime */ - ret.rtime += err!(usize::from_str(none_err!(vals.next()))); /* stime */ + // utime + ret.rtime = err!(usize::from_str(none_err!(vals.next()))); + // stime + ret.rtime += err!(usize::from_str(none_err!(vals.next()))); } Ok(ret) } diff --git a/src/components/utilities.rs b/src/components/utilities.rs index 95a04b2..f6db640 100644 --- a/src/components/utilities.rs +++ b/src/components/utilities.rs @@ -1,35 +1,34 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . + +//! Various useful utilities -/*! Various useful components that can be used in a generic fashion. - */ extern crate cassowary; -use super::*; -use std::fs::File; -use std::io::prelude::*; -use std::str::FromStr; +use std::{fs::File, io::prelude::*, str::FromStr}; -use cassowary::strength::{REQUIRED, STRONG, WEAK}; -use cassowary::WeightedRelation::*; -use cassowary::{Solver, Variable}; +use cassowary::{ + strength::{REQUIRED, STRONG, WEAK}, + Solver, Variable, + WeightedRelation::*, +}; + +use super::*; #[derive(Debug)] pub enum PageMovement { @@ -125,16 +124,16 @@ pub fn get_stat(boot_time: &mut usize) -> Vec { let mut mut_value_iter = line.split_whitespace().skip(1); - let user_time = usize::from_str(&mut_value_iter.next().unwrap()).unwrap(); - let nice_time = usize::from_str(&mut_value_iter.next().unwrap()).unwrap(); - let system_time = usize::from_str(&mut_value_iter.next().unwrap()).unwrap(); - let idle_time = usize::from_str(&mut_value_iter.next().unwrap()).unwrap(); - let iowait_time = usize::from_str(&mut_value_iter.next().unwrap()).unwrap(); - let irq = usize::from_str(&mut_value_iter.next().unwrap()).unwrap(); - let soft_irq = usize::from_str(&mut_value_iter.next().unwrap()).unwrap(); - let steal = usize::from_str(&mut_value_iter.next().unwrap()).unwrap(); - let guest = usize::from_str(&mut_value_iter.next().unwrap()).unwrap(); - let guest_nice = usize::from_str(&mut_value_iter.next().unwrap()).unwrap(); + let user_time = usize::from_str(mut_value_iter.next().unwrap()).unwrap(); + let nice_time = usize::from_str(mut_value_iter.next().unwrap()).unwrap(); + let system_time = usize::from_str(mut_value_iter.next().unwrap()).unwrap(); + let idle_time = usize::from_str(mut_value_iter.next().unwrap()).unwrap(); + let iowait_time = usize::from_str(mut_value_iter.next().unwrap()).unwrap(); + let irq = usize::from_str(mut_value_iter.next().unwrap()).unwrap(); + let soft_irq = usize::from_str(mut_value_iter.next().unwrap()).unwrap(); + let steal = usize::from_str(mut_value_iter.next().unwrap()).unwrap(); + let guest = usize::from_str(mut_value_iter.next().unwrap()).unwrap(); + let guest_nice = usize::from_str(mut_value_iter.next().unwrap()).unwrap(); ret.push(Stat { user_time, system_time, @@ -151,7 +150,7 @@ pub fn get_stat(boot_time: &mut usize) -> Vec { while !line.starts_with("btime") { line = lines_iter.next().unwrap(); } - *boot_time = usize::from_str(&line.split_whitespace().skip(1).next().unwrap()).unwrap(); + *boot_time = usize::from_str(line.split_whitespace().nth(1).unwrap()).unwrap(); ret } @@ -216,10 +215,10 @@ impl Component for Window { top_bars.top | LE(REQUIRED) | top_bars.bottom, list.top | LE(REQUIRED) | list.bottom, // preferred heights: - top_bars.bottom - top_bars.top | GE(REQUIRED) | 6.0, - top_bars.bottom - top_bars.top | EQ(WEAK) | 8.0, - top_bars.bottom - top_bars.top | LE(REQUIRED) | 8.0, - list.bottom - list.top | GE(REQUIRED) | 11.0, + (top_bars.bottom - top_bars.top) | GE(REQUIRED) | 6.0, + (top_bars.bottom - top_bars.top) | EQ(WEAK) | 8.0, + (top_bars.bottom - top_bars.top) | LE(REQUIRED) | 8.0, + (list.bottom - list.top) | GE(REQUIRED) | 11.0, ]) .unwrap(); @@ -268,7 +267,7 @@ impl Component for Window { fn get_shortcuts(&self) -> ShortcutMaps { let mut top_bars_map = self.top_bars.get_shortcuts(); - top_bars_map.extend(self.list.get_shortcuts().into_iter()); + top_bars_map.extend(self.list.get_shortcuts()); top_bars_map } } diff --git a/src/lib.rs b/src/lib.rs index 434f703..076b495 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,20 +1,18 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . diff --git a/src/main.rs b/src/main.rs index 08683f3..7d0e545 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,36 +1,39 @@ -/* - * bb - bin.rs - * - * Copyright 2019 Manos Pitsidianakis - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb - bin.rs +// +// Copyright 2019 Manos Pitsidianakis +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . extern crate crossbeam; extern crate nix; extern crate signal_hook; extern crate termion; -use crossbeam::channel::{bounded, tick}; -use crossbeam::select; -use libc::c_int; -use std::io::Error; -use std::sync::{ - atomic::{AtomicBool, AtomicPtr}, - Arc, +use std::{ + io::Error, + sync::{ + atomic::{AtomicBool, AtomicPtr}, + Arc, + }, + time::Duration, +}; + +use crossbeam::{ + channel::{bounded, tick}, + select, }; -use std::time::Duration; +use libc::c_int; pub const PROC_FS_ERROR_STR: &str = "/proc/ filesystem not found, are you running this on linux?"; @@ -49,12 +52,12 @@ pub mod state; pub use crate::state::*; pub mod components; -pub use crate::components::*; -pub use crate::username::*; +pub use crate::{components::*, username::*}; pub mod username { - use libc; use std::ptr::null_mut; - /* taken from whoami-0.1.1 */ + + use libc; + // taken from whoami-0.1.1 fn getpwuid( pw_uid: u32, #[cfg(not(any( @@ -142,7 +145,7 @@ pub mod username { None => uid.to_string(), Some(p) => ::std::ffi::CStr::from_ptr(p.pw_name) .to_str() - .unwrap_or_else(|_| "") + .unwrap_or("") .to_string(), } } @@ -195,7 +198,7 @@ fn notify( } fn main() -> Result<(), Error> { - /* Create the application State */ + // Create the application State let mut state = UIState::new(); let signals = &[ @@ -228,9 +231,10 @@ fn main() -> Result<(), Error> { state.render(); state.redraw(true); - /* Keep track of the input mode. See UIMode for details */ + // Keep track of the input mode. See UIMode for details 'main: loop { - /* Poll on all channels. Currently we have the input channel for stdin, watching events and the signal watcher. */ + // Poll on all channels. Currently we have the input channel for stdin, + // watching events and the signal watcher. select! { recv(ticker) -> _ => { state.redraw(true); diff --git a/src/state.rs b/src/state.rs index 5216de0..9ca5a82 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,41 +1,42 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ - -/*! The application's state. - -The UI crate has an Box-Component-System design. The System part, is also the application's state, so they're both merged in the `State` struct. - -`State` owns all the Components of the UI. In the application's main event loop, input is handed to the state in the form of `UIEvent` objects which traverse the component graph. Components decide to handle each input or not. - -Input is received in the main loop from threads which listen on the stdin for user input, observe folders for file changes etc. The relevant struct is `ThreadEvent`. -*/ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . + +//! The application's state. +//! +//! The UI crate has an Box-Component-System design. The System +//! part, is also the application's state, so they're both merged in the `State` +//! struct. +//! +//! `State` owns all the Components of the UI. In the application's main event +//! loop, input is handed to the state in the form of `UIEvent` objects which +//! traverse the component graph. Components decide to handle each input or not. +//! +//! Input is received in the main loop from threads which listen on the stdin +//! for user input, observe folders for file changes etc. The relevant struct is +//! `ThreadEvent`. + +use std::{collections::VecDeque, io::Write}; -use super::*; use crossbeam::channel::{Receiver, Sender}; -use std::collections::VecDeque; -use std::io::Write; +use termion::{clear, cursor, raw::IntoRawMode, screen::AlternateScreen}; -use termion::raw::IntoRawMode; -use termion::screen::AlternateScreen; -use termion::{clear, cursor}; +use super::*; #[derive(PartialEq)] pub enum UIMode { @@ -76,8 +77,8 @@ impl InputHandler { } } -/// A State object to manage and own components and components of the UI. `State` is responsible for -/// managing the terminal +/// A State object to manage and own components and components of the UI. +/// `State` is responsible for managing the terminal pub struct UIState { cols: usize, rows: usize, @@ -107,15 +108,13 @@ impl Default for UIState { impl UIState { pub fn new() -> Self { - /* Create a channel to communicate with other threads. The main process is the sole receiver. - * */ + // Create a channel to communicate with other threads. The main process is + // the sole receiver. let (sender, receiver) = crossbeam::channel::bounded(32 * ::std::mem::size_of::()); - /* - * Create async channel to block the input-thread if we need to fork and stop it from reading - * stdin, see get_events() for details - * */ + // Create async channel to block the input-thread if we need to fork and stop + // it from reading stdin, see get_events() for details let (input_sender, input_receiver) = crossbeam::channel::unbounded(); let termsize = termion::terminal_size().ok(); @@ -143,8 +142,8 @@ impl UIState { s } - /// Switch back to the terminal's main screen (The command line the user sees before opening - /// the application) + /// Switch back to the terminal's main screen (The command line the user + /// sees before opening the application) pub fn switch_to_main_screen(&mut self) { write!( self.stdout(), @@ -179,7 +178,7 @@ impl UIState { cursor::Goto(1, 1), BracketModeStart, save_title_to_stack = SaveWindowTitleIconToStack, - window_title = "\x1b]2;bb\x07", + window_title = concat!("\x1b]2;", env!("CARGO_PKG_NAME"), "bb\x07"), ) .unwrap(); @@ -193,7 +192,8 @@ impl UIState { self.receiver.clone() } - /// On `SIGWNICH` the `State` redraws itself according to the new terminal size. + /// On `SIGWNICH` the `State` redraws itself according to the new terminal + /// size. pub fn update_size(&mut self) { let termsize = termion::terminal_size().ok(); let termcols = termsize.map(|(w, _)| w); @@ -225,9 +225,9 @@ impl UIState { self.draw_component(i, tick); } let mut areas: Vec = self.dirty_areas.drain(0..).collect(); - /* Sort by x_start, ie upper_left corner's x coordinate */ + // Sort by x_start, ie upper_left corner's x coordinate areas.sort_by(|a, b| (a.0).0.partial_cmp(&(b.0).0).unwrap()); - /* draw each dirty area */ + // draw each dirty area let rows = self.rows; for y in 0..rows { let mut segment = None; @@ -340,7 +340,7 @@ impl UIState { } /// The application's main loop sends `UIEvents` to state via this method. pub fn rcv_event(&mut self, mut event: UIEvent) { - /* inform each component */ + // inform each component for i in 0..self.components.len() { self.components[i].process_event(&mut event, &mut self.mode); } diff --git a/src/terminal.rs b/src/terminal.rs index df95db1..cfc9ee4 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -1,29 +1,25 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . #[macro_use] mod position; #[macro_use] mod cells; #[macro_use] mod keys; -pub use self::cells::*; -pub use self::keys::*; -pub use self::position::*; +pub use self::{cells::*, keys::*, position::*}; diff --git a/src/terminal/cells.rs b/src/terminal/cells.rs index 4d40aab..f6e7c50 100644 --- a/src/terminal/cells.rs +++ b/src/terminal/cells.rs @@ -1,39 +1,38 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ - -/*! - Define a (x, y) point in the terminal display as a holder of a character, foreground/background - colors and attributes. -*/ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . + +//! Define a (x, y) point in the terminal display as a holder of a character, +//! foreground/background colors and attributes. + +use std::{ + convert::From, + fmt, + ops::{Deref, DerefMut, Index, IndexMut}, +}; + +use termion::color::{AnsiValue, Rgb as TermionRgb}; use super::position::*; use crate::text_processing::wcwidth; -use std::convert::From; -use std::fmt; -use std::ops::{Deref, DerefMut, Index, IndexMut}; -use termion::color::{AnsiValue, Rgb as TermionRgb}; - -/// In a scroll region up and down cursor movements shift the region vertically. The new lines are -/// empty. +/// In a scroll region up and down cursor movements shift the region vertically. +/// The new lines are empty. #[derive(Debug, Clone, PartialEq, Eq, Default)] pub struct ScrollRegion { pub top: usize, @@ -44,11 +43,12 @@ pub struct ScrollRegion { /// An array of `Cell`s that represents a terminal display. /// -/// A `CellBuffer` is a two-dimensional array of `Cell`s, each pair of indices correspond to a -/// single point on the underlying terminal. +/// A `CellBuffer` is a two-dimensional array of `Cell`s, each pair of indices +/// correspond to a single point on the underlying terminal. /// -/// The first index, `Cellbuffer[y]`, corresponds to a row, and thus the y-axis. The second -/// index, `Cellbuffer[y][x]`, corresponds to a column within a row and thus the x-axis. +/// The first index, `Cellbuffer[y]`, corresponds to a row, and thus the y-axis. +/// The second index, `Cellbuffer[y][x]`, corresponds to a column within a row +/// and thus the x-axis. #[derive(Clone, PartialEq, Eq)] pub struct CellBuffer { cols: usize, @@ -79,8 +79,8 @@ impl CellBuffer { self.cols = new_cols; } - /// Constructs a new `CellBuffer` with the given number of columns and rows, using the given - /// `cell` as a blank. + /// Constructs a new `CellBuffer` with the given number of columns and rows, + /// using the given `cell` as a blank. pub fn new(cols: usize, rows: usize, cell: Cell) -> CellBuffer { CellBuffer { cols, @@ -89,8 +89,8 @@ impl CellBuffer { } } - /// Resizes `CellBuffer` to the given number of rows and columns, using the given `Cell` as - /// a blank. + /// Resizes `CellBuffer` to the given number of rows and columns, using the + /// given `Cell` as a blank. pub fn resize(&mut self, newcols: usize, newrows: usize, blank: Cell) { let newlen = newcols * newrows; if self.buf.len() == newlen { @@ -141,13 +141,12 @@ impl CellBuffer { } } - /// Returns a reference to the `Cell` at the given coordinates, or `None` if the index is out of - /// bounds. + /// Returns a reference to the `Cell` at the given coordinates, or `None` if + /// the index is out of bounds. /// /// # Examples /// /// ```norun - /// /// let mut term = Terminal::new().unwrap(); /// /// let a_cell = term.get(5, 5); @@ -159,13 +158,12 @@ impl CellBuffer { } } - /// Returns a mutable reference to the `Cell` at the given coordinates, or `None` if the index - /// is out of bounds. + /// Returns a mutable reference to the `Cell` at the given coordinates, or + /// `None` if the index is out of bounds. /// /// # Examples /// /// ```norun - /// /// let mut term = Terminal::new().unwrap(); /// /// let a_mut_cell = term.get_mut(5, 5); @@ -234,7 +232,6 @@ impl CellBuffer { /// | 555555555555 | | 666666666666 | /// | 666666666666 | | | /// ``` - /// pub fn scroll_up(&mut self, scroll_region: &ScrollRegion, top: usize, offset: usize) { let l = scroll_region.left; let r = if scroll_region.right == 0 { @@ -293,7 +290,6 @@ impl CellBuffer { /// | 555555555555 | | 444444444444 | /// | 666666666666 | | 555555555555 | /// ``` - /// pub fn scroll_down(&mut self, scroll_region: &ScrollRegion, top: usize, offset: usize) { for y in (scroll_region.bottom - offset + 1)..=scroll_region.bottom { for x in 0..self.size().0 { @@ -367,7 +363,8 @@ impl IndexMut for CellBuffer { } impl Default for CellBuffer { - /// Constructs a new `CellBuffer` with a size of `(0, 0)`, using the default `Cell` as a blank. + /// Constructs a new `CellBuffer` with a size of `(0, 0)`, using the default + /// `Cell` as a blank. fn default() -> CellBuffer { CellBuffer::new(0, 0, Cell::default()) } @@ -409,7 +406,6 @@ impl Cell { /// # Examples /// /// ```norun - /// /// let cell = Cell::new('x', Color::Default, Color::Green, Attr::Default); /// assert_eq!(cell.ch(), 'x'); /// assert_eq!(cell.fg(), Color::Default); @@ -433,7 +429,6 @@ impl Cell { /// # Examples /// /// ```norun - /// /// let mut cell = Cell::with_char('x'); /// assert_eq!(cell.ch(), 'x'); /// assert_eq!(cell.fg(), Color::Default); @@ -449,7 +444,6 @@ impl Cell { /// # Examples /// /// ```norun - /// /// let mut cell = Cell::with_style(Color::Default, Color::Red, Attr::Bold); /// assert_eq!(cell.fg(), Color::Default); /// assert_eq!(cell.bg(), Color::Red); @@ -465,7 +459,6 @@ impl Cell { /// # Examples /// /// ```norun - /// /// let mut cell = Cell::with_char('x'); /// assert_eq!(cell.ch(), 'x'); /// ``` @@ -478,7 +471,6 @@ impl Cell { /// # Examples /// /// ```norun - /// /// let mut cell = Cell::with_char('x'); /// assert_eq!(cell.ch(), 'x'); /// @@ -497,7 +489,6 @@ impl Cell { /// # Examples /// /// ```norun - /// /// let mut cell = Cell::with_style(Color::Blue, Color::Default, Attr::Default); /// assert_eq!(cell.fg(), Color::Blue); /// ``` @@ -510,7 +501,6 @@ impl Cell { /// # Examples /// /// ```norun - /// /// let mut cell = Cell::default(); /// assert_eq!(cell.fg(), Color::Default); /// @@ -563,8 +553,8 @@ impl Cell { self } - /// Set a `Cell` as empty when a previous cell spans multiple columns and it would - /// "overflow" to this cell. + /// Set a `Cell` as empty when a previous cell spans multiple columns and it + /// would "overflow" to this cell. pub fn empty(&self) -> bool { self.empty } @@ -574,15 +564,15 @@ impl Cell { self } - /// Sets `keep_fg` field. If true, the foreground color will not be altered if attempted so - /// until the character content of the cell is changed. + /// Sets `keep_fg` field. If true, the foreground color will not be altered + /// if attempted so until the character content of the cell is changed. pub fn set_keep_fg(&mut self, new_val: bool) -> &mut Cell { self.keep_fg = new_val; self } - /// Sets `keep_bg` field. If true, the background color will not be altered if attempted so - /// until the character content of the cell is changed. + /// Sets `keep_bg` field. If true, the background color will not be altered + /// if attempted so until the character content of the cell is changed. pub fn set_keep_bg(&mut self, new_val: bool) -> &mut Cell { self.keep_bg = new_val; self @@ -595,7 +585,6 @@ impl Default for Cell { /// # Examples /// /// ```norun - /// /// let mut cell = Cell::default(); /// assert_eq!(cell.ch(), ' '); /// assert_eq!(cell.fg(), Color::Default); @@ -610,16 +599,15 @@ impl Default for Cell { /// /// `Color::Default` represents the default color of the underlying terminal. /// -/// The eight basic colors may be used directly and correspond to 0x00..0x07 in the 8-bit (256) -/// color range; in addition, the eight basic colors coupled with `Attr::Bold` correspond to -/// 0x08..0x0f in the 8-bit color range. +/// The eight basic colors may be used directly and correspond to 0x00..0x07 in +/// the 8-bit (256) color range; in addition, the eight basic colors coupled +/// with `Attr::Bold` correspond to 0x08..0x0f in the 8-bit color range. /// /// `Color::Byte(..)` may be used to specify a color in the 8-bit range. /// /// # Examples /// /// ```norun -/// /// // The default color. /// let default = Color::Default; /// @@ -632,7 +620,7 @@ impl Default for Cell { /// // Basic colors are also 8-bit colors (but not vice-versa). /// assert_eq!(red.as_byte(), fancy.as_byte()) /// ``` -#[derive(Debug, Copy, Clone, PartialEq, Eq)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)] pub enum Color { Black, Red, @@ -644,6 +632,7 @@ pub enum Color { White, Byte(u8), Rgb(u8, u8, u8), + #[default] Default, } @@ -714,12 +703,6 @@ impl Color { } } -impl Default for Color { - fn default() -> Self { - Color::Default - } -} - /// The attributes of a `Cell`. /// /// `Attr` enumerates all combinations of attributes a given style may have. @@ -729,7 +712,6 @@ impl Default for Color { /// # Examples /// /// ```norun -/// /// // Default attribute. /// let def = Attr::Default; /// @@ -739,8 +721,9 @@ impl Default for Color { /// // Combination. /// let comb = Attr::UnderlineReverse; /// ``` -#[derive(Debug, Copy, Clone, PartialEq, Eq)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)] pub enum Attr { + #[default] Default = 0b000, Bold = 0b001, Underline = 0b100, @@ -794,12 +777,6 @@ impl core::ops::BitOrAssign for Attr { } } -impl Default for Attr { - fn default() -> Self { - Attr::Default - } -} - impl Attr { pub fn write(self, prev: Attr, stdout: &mut crate::state::StateStdout) -> std::io::Result<()> { use std::io::Write; @@ -861,7 +838,7 @@ pub fn copy_area_with_break( src_y += 1; src_x = 0; if src_y >= get_y(bottom_right!(src)) { - //clear_area(grid_dest, ((get_x(upper_left!(dest)), y), bottom_right!(dest))); + // clear_area(grid_dest, ((get_x(upper_left!(dest)), y), bottom_right!(dest))); ret.1 = y; break 'y_; } @@ -910,7 +887,8 @@ macro_rules! inspect_bounds { }; } -/// Write an `&str` to a `CellBuffer` in a specified `Area` with the passed colors. +/// Write an `&str` to a `CellBuffer` in a specified `Area` with the passed +/// colors. pub fn write_string_to_grid( s: &str, grid: &mut CellBuffer, @@ -955,12 +933,12 @@ pub fn write_string_to_grid( match wcwidth(u32::from(c)) { Some(0) | None => { - /* Skip drawing zero width characters */ + // Skip drawing zero width characters grid[(x, y)].empty = true; } Some(2) => { - /* Grapheme takes more than one column, so the next cell will be - * drawn over. Set it as empty to skip drawing it. */ + // Grapheme takes more than one column, so the next cell will be + // drawn over. Set it as empty to skip drawing it. x += 1; inspect_bounds!(grid, area, x, y, line_break); grid[(x, y)] = Cell::default(); @@ -979,7 +957,8 @@ pub fn write_string_to_grid( (x, y) } -/// Completely clear an `Area` with an empty char and the terminal's default colors. +/// Completely clear an `Area` with an empty char and the terminal's default +/// colors. pub fn clear_area(grid: &mut CellBuffer, area: Area) { if !is_valid_area!(area) { return; @@ -991,10 +970,10 @@ pub fn clear_area(grid: &mut CellBuffer, area: Area) { } } -/// Use `RowIterator` to iterate the cells of a row without the need to do any bounds checking; -/// the iterator will simply return `None` when it reaches the end of the row. -/// `RowIterator` can be created via the `CellBuffer::row_iter` method and can be returned by -/// `BoundsIterator` which iterates each row. +/// Use `RowIterator` to iterate the cells of a row without the need to do any +/// bounds checking; the iterator will simply return `None` when it reaches the +/// end of the row. `RowIterator` can be created via the `CellBuffer::row_iter` +/// method and can be returned by `BoundsIterator` which iterates each row. /// ```norun /// for c in grid.row_iter( /// x..(x + 11), diff --git a/src/terminal/keys.rs b/src/terminal/keys.rs index 9212451..57fa779 100644 --- a/src/terminal/keys.rs +++ b/src/terminal/keys.rs @@ -1,32 +1,31 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . + +use std::{fmt, io}; + +use termion::{ + event::{Event as TermionEvent, Key as TermionKey}, + input::TermRead, +}; use crate::crossbeam::*; -use std::fmt; -use std::io; -use termion::event::Event as TermionEvent; -use termion::event::Key as TermionKey; -use termion::input::TermRead; - #[derive(Debug, PartialEq, Eq, Clone)] pub enum Key { /// Backspace. @@ -61,7 +60,8 @@ pub enum Key { Alt(char), /// Ctrl modified character. /// - /// Note that certain keys may not be modifiable with `ctrl`, due to limitations of terminals. + /// Note that certain keys may not be modifiable with `ctrl`, due to + /// limitations of terminals. Ctrl(char), /// Null byte. Null, @@ -185,9 +185,7 @@ pub fn get_events( } } -/* - * CSI events we use - */ +// CSI events we use // Some macros taken from termion: /// Create a CSI-introduced sequence. @@ -237,11 +235,13 @@ pub const BRACKET_PASTE_START: &[u8] = b"\x1B[200~"; pub const BRACKET_PASTE_END: &[u8] = b"\x1B[201~"; derive_csi_sequence!( - #[doc = "`CSI Ps ; Ps ; Ps t`, where `Ps = 2 2 ; 0` -> Save xterm icon and window title on stack."] + #[doc = "`CSI Ps ; Ps ; Ps t`, where `Ps = 2 2 ; 0` -> Save xterm icon and window title on \ + stack."] (SaveWindowTitleIconToStack, "22;0t") ); derive_csi_sequence!( - #[doc = "Restore window title and icon from terminal's title stack. `CSI Ps ; Ps ; Ps t`, where `Ps = 2 3 ; 0` -> Restore xterm icon and window title from stack."] + #[doc = "Restore window title and icon from terminal's title stack. `CSI Ps ; Ps ; Ps t`, \ + where `Ps = 2 3 ; 0` -> Restore xterm icon and window title from stack."] (RestoreWindowTitleIconFromStack, "23;0t") ); diff --git a/src/terminal/position.rs b/src/terminal/position.rs index 2c8c398..7207886 100644 --- a/src/terminal/position.rs +++ b/src/terminal/position.rs @@ -1,29 +1,26 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . -/*! -Simple type definitions and macro helper for a (x,y) position on the terminal and the areas they define. - -An `Area` consists of two points: the upper left and bottom right corners. -*/ +//! Simple type definitions and macro helper for a (x,y) position on the +//! terminal and the areas they define. +//! +//! An `Area` consists of two points: the upper left and bottom right corners. /// A `(x, y)` position on screen. pub type Pos = (usize, usize); diff --git a/src/text_processing.rs b/src/text_processing.rs index 995aef9..48047a6 100644 --- a/src/text_processing.rs +++ b/src/text_processing.rs @@ -1,23 +1,21 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . pub mod grapheme_clusters; pub mod line_break; diff --git a/src/text_processing/grapheme_clusters.rs b/src/text_processing/grapheme_clusters.rs index ddc61ed..81a67d1 100644 --- a/src/text_processing/grapheme_clusters.rs +++ b/src/text_processing/grapheme_clusters.rs @@ -1,44 +1,40 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ - -/* - Breaks a string into individual user-perceived "characters" - Unicode UAX-29 standard, version 10.0.0 - - Usage: - //returns an array of strings, one string for each grapheme cluster - let mut graphemes = split_graphemes(string); +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . -*/ +// Breaks a string into individual user-perceived "characters" +// Unicode UAX-29 standard, version 10.0.0 +// +// Usage: +// returns an array of strings, one string for each grapheme cluster +// let mut graphemes = split_graphemes(string); +// use crate::wcwidth::{wcwidth, CodePointsIter}; extern crate unicode_segmentation; use self::unicode_segmentation::UnicodeSegmentation; pub trait Graphemes: UnicodeSegmentation + CodePointsIter { - fn split_graphemes<'a>(&'a self) -> Vec<&'a str> { + fn split_graphemes(&self) -> Vec<&str> { UnicodeSegmentation::graphemes(self, true).collect::>() } - fn graphemes_indices<'a>(&'a self) -> Vec<(usize, &'a str)> { + fn graphemes_indices(&self) -> Vec<(usize, &str)> { UnicodeSegmentation::grapheme_indices(self, true).collect::>() } @@ -53,7 +49,7 @@ pub trait Graphemes: UnicodeSegmentation + CodePointsIter { fn grapheme_width(&self) -> usize { let mut count = 0; for c in self.code_points() { - count += if let Some(w) = wcwidth(c) { w } else { 0 }; + count += wcwidth(c).unwrap_or_default(); } count @@ -77,7 +73,7 @@ impl<'s> Iterator for WordBreakIter<'s> { if self.input.is_empty() { return None; } - self.input = self.input.trim_start_matches(|c| c == ' '); + self.input = self.input.trim_start_matches(' '); if self.input.starts_with('\n') { let ret = &self.input[0..0]; self.input = &self.input[1..]; @@ -108,7 +104,7 @@ impl<'s> Iterator for WordBreakIter<'s> { Some(ret) } } else { - /* graphemes.len() < width */ + // graphemes.len() < width let ret = self.input; self.input = &self.input[0..0]; Some(ret) @@ -122,7 +118,7 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { } //#[derive(PartialEq)] -//enum Property { +// enum Property { // CR, // LF, // Control, @@ -142,19 +138,17 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { // Glue_After_Zwj, // E_Base_GAZ, //} -// -//enum Breaks { +// enum Breaks { // NotBreak, // BreakStart, // Break, // BreakLastRegional, // BreakPenultimateRegional, //} +// use Property::*; +// use Breaks::*; // -//use Property::*; -//use Breaks::*; -// -//impl From for Breaks { +// impl From for Breaks { // fn from(u: u8) -> Breaks { // match u { // 0 => NotBreak, @@ -166,15 +160,15 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { // } // } //} -// -//fn is_surrogate(s: &str, pos: usize) -> bool { -// return 0xd800 <= char_code_at(s, pos) && char_code_at(s, pos) <= 0xdbff && -// 0xdc00 <= char_code_at(s, pos + 1) && char_code_at(s, pos + 1) <= 0xdfff; +// fn is_surrogate(s: &str, pos: usize) -> bool { +// return 0xd800 <= char_code_at(s, pos) && char_code_at(s, pos) <= 0xdbff +// && 0xdc00 <= char_code_at(s, pos + 1) && char_code_at(s, pos + 1) <= +// 0xdfff; //} // -//// Private function, gets a Unicode code point from a java_script UTF-16 string -//// handling surrogate pairs appropriately -//fn code_point_at(s: &str, idx: usize) -> u8 { +//// Private function, gets a Unicode code point from a java_script UTF-16 +//// string handling surrogate pairs appropriately +// fn code_point_at(s: &str, idx: usize) -> u8 { // let mut code: u8 = char_code_at(s, idx); // // // if a high surrogate @@ -206,7 +200,7 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { // //// Private function, returns whether a break is allowed between the //// two given grapheme breaking classes -//fn should_break(start, mid, end) -> Breaks { +// fn should_break(start, mid, end) -> Breaks { // let mut all = [start, mid, end].into(); // let mut previous = start; // let mut next = end @@ -215,8 +209,8 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { // // GB10. (E_Base | EBG) Extend* ? E_Modifier // let mut e_modifier_index = all.last_index_of(E_Modifier) // if(e_modifier_index > 1 && -// all.slice(1, e_modifier_index).every(function(c){return c == Extend}) && -// [Extend, E_Base, E_Base_GAZ].index_of(start) == -1){ +// all.slice(1, e_modifier_index).every(function(c){return c == +// Extend}) && [Extend, E_Base, E_Base_GAZ].index_of(start) == -1){ // return Break // } // @@ -225,9 +219,10 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { // // GB13. [^RI] (RI RI)* RI ? RI // let mut r_iIndex = all.last_index_of(Regional_Indicator) // if(r_iIndex > 0 && -// all.slice(1, r_iIndex).every(function(c){return c == Regional_Indicator}) && -// [Prepend, Regional_Indicator].index_of(previous) == -1) { -// if(all.filter(function(c){return c == Regional_Indicator}).length % 2 == 1) { +// all.slice(1, r_iIndex).every(function(c){return c == +// Regional_Indicator}) && [Prepend, +// Regional_Indicator].index_of(previous) == -1) { +// if(all.filter(function(c){return c == Regional_Indicator}).length % 2 == 1) { // return BreakLastRegional // } // else { @@ -281,10 +276,11 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { // } // // // GB10. (E_Base | EBG) Extend* ? E_Modifier -// let mut previous_non_extend_index = all.index_of(Extend) != -1 ? all.last_index_of(Extend) - 1 : all.length - 2; -// if([E_Base, E_Base_GAZ].index_of(all[previous_non_extend_index]) != -1 && -// all.slice(previous_non_extend_index + 1, -1).every(function(c){return c == Extend}) && -// next == E_Modifier){ +// let mut previous_non_extend_index = all.index_of(Extend) != -1 ? +// all.last_index_of(Extend) - 1 : all.length - 2; if([E_Base, +// E_Base_GAZ].index_of(all[previous_non_extend_index]) != -1 && +// all.slice(previous_non_extend_index + 1, -1).every(function(c){return c +// == Extend}) && next == E_Modifier){ // return NotBreak; // } // @@ -307,7 +303,7 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { //} // //// Returns the next grapheme break in the string after the given index -//fn next_break(s: &str, index: usize) -> Breaks { +// fn next_break(s: &str, index: usize) -> Breaks { // // if(index < 0){ // // return 0; // // } @@ -333,7 +329,7 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { //}; // //// Breaks the given string into an array of grapheme cluster strings -//fn split_graphemes(s: &str) -> Vec<&str> { +// fn split_graphemes(s: &str) -> Vec<&str> { // let mut res = Vec::new() // let mut index = 0; // @@ -350,34 +346,34 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { //}; // //// Returns the iterator of grapheme clusters there are in the given string -////fn iterate_graphemes(s: &str) { -//// let mut index = 0; -//// let mut res = { -//// next: (function() { -//// let mut value; -//// let mut brk; -//// if ((brk = this.next_break(str, index)) < str.length) { -//// value = str.slice(index, brk); -//// index = brk; -//// return { value: value, done: false }; -//// } -//// if (index < str.length) { -//// value = str.slice(index); -//// index = str.length; -//// return { value: value, done: false }; -//// } -//// return { value: undefined, done: true }; -//// }).bind(this) -//// }; -//// // ES2015 @@iterator method (iterable) for spread syntax and for...of statement -//// if (typeof Symbol !== 'undefined' && Symbol.iterator) { -//// res[Symbol.iterator] = function() {return res}; -//// } -//// return res; -////}; +//// fn iterate_graphemes(s: &str) { +//// let mut index = 0; +//// let mut res = { +//// next: (function() { +//// let mut value; +//// let mut brk; +//// if ((brk = this.next_break(str, index)) < str.length) { +//// value = str.slice(index, brk); +//// index = brk; +//// return { value: value, done: false }; +//// } +//// if (index < str.length) { +//// value = str.slice(index); +//// index = str.length; +//// return { value: value, done: false }; +//// } +//// return { value: undefined, done: true }; +//// }).bind(this) +//// }; +//// // ES2015 @@iterator method (iterable) for spread syntax and for...of +//// statement if (typeof Symbol !== 'undefined' && Symbol.iterator) { +//// res[Symbol.iterator] = function() {return res}; +//// } +//// return res; +//// }; // //// Returns the number of grapheme clusters there are in the given string -//fn count_graphemes(s:&str) -> usize { +// fn count_graphemes(s:&str) -> usize { // let mut count = 0; // let mut index = 0; // while let Some(brk) = next_break(s, index) { @@ -393,24 +389,25 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { //}; // ////given a Unicode code point, determines this symbol's grapheme break property -//fn get_grapheme_break_property(code: u8) -> Property { +// fn get_grapheme_break_property(code: u8) -> Property { // // //grapheme break property for Unicode 10.0.0, // //taken from http://www.unicode.org/Public/10.0.0/ucd/auxiliary/grapheme_break_property.txt // //and adapted to java_script rules // // if( -// (0x0600 <= code && code <= 0x0605) || // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE -// 0x06DD == code || // Cf ARABIC END OF AYAH -// 0x070F == code || // Cf SYRIAC ABBREVIATION MARK +// (0x0600 <= code && code <= 0x0605) || // Cf [6] ARABIC NUMBER +// SIGN..ARABIC NUMBER MARK ABOVE 0x06DD == code || // Cf ARABIC +// END OF AYAH 0x070F == code || // Cf SYRIAC ABBREVIATION MARK // 0x08E2 == code || // Cf ARABIC DISPUTED END OF AYAH // 0x0D4E == code || // Lo MALAYALAM LETTER DOT REPH // 0x110BD == code || // Cf KAITHI NUMBER SIGN -// (0x111C2 <= code && code <= 0x111C3) || // Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA -// 0x11A3A == code || // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA -// (0x11A86 <= code && code <= 0x11A89) || // Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA -// 0x11D46 == code // Lo MASARAM GONDI REPHA -// ){ +// (0x111C2 <= code && code <= 0x111C3) || // Lo [2] SHARADA SIGN +// JIHVAMULIYA..SHARADA SIGN UPADHMANIYA 0x11A3A == code || // Lo +// ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA (0x11A86 <= code && code <= +// 0x11A89) || // Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO +// CLUSTER-INITIAL LETTER SA 0x11D46 == code // Lo MASARAM GONDI +// REPHA ){ // return Prepend; // } // if( @@ -427,549 +424,679 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { // // // if( -// (0x0000 <= code && code <= 0x0009) || // Cc [10] .. -// (0x000B <= code && code <= 0x000C) || // Cc [2] .. -// (0x000E <= code && code <= 0x001F) || // Cc [18] .. -// (0x007F <= code && code <= 0x009F) || // Cc [33] .. +// (0x0000 <= code && code <= 0x0009) || // Cc [10] +// .. (0x000B <= code && code <= 0x000C) || +// // Cc [2] .. (0x000E <= code && code <= +// 0x001F) || // Cc [18] .. (0x007F <= code +// && code <= 0x009F) || // Cc [33] .. // 0x00AD == code || // Cf SOFT HYPHEN // 0x061C == code || // Cf ARABIC LETTER MARK // // 0x180E == code || // Cf MONGOLIAN VOWEL SEPARATOR // 0x200B == code || // Cf ZERO WIDTH SPACE -// (0x200E <= code && code <= 0x200F) || // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK -// 0x2028 == code || // Zl LINE SEPARATOR +// (0x200E <= code && code <= 0x200F) || // Cf [2] LEFT-TO-RIGHT +// MARK..RIGHT-TO-LEFT MARK 0x2028 == code || // Zl LINE SEPARATOR // 0x2029 == code || // Zp PARAGRAPH SEPARATOR -// (0x202A <= code && code <= 0x202E) || // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE -// (0x2060 <= code && code <= 0x2064) || // Cf [5] WORD JOINER..INVISIBLE PLUS -// 0x2065 == code || // Cn -// (0x2066 <= code && code <= 0x206F) || // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES -// (0x_d800 <= code && code <= 0x_dFFF) || // Cs [2048] .. -// 0x_fEFF == code || // Cf ZERO WIDTH NO-BREAK SPACE -// (0x_fFF0 <= code && code <= 0x_fFF8) || // Cn [9] .. -// (0x_fFF9 <= code && code <= 0x_fFFB) || // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -// (0x1BCA0 <= code && code <= 0x1BCA3) || // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP -// (0x1D173 <= code && code <= 0x1D17A) || // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE -// 0x_e0000 == code || // Cn -// 0x_e0001 == code || // Cf LANGUAGE TAG -// (0x_e0002 <= code && code <= 0x_e001F) || // Cn [30] .. -// (0x_e0080 <= code && code <= 0x_e00FF) || // Cn [128] .. -// (0x_e01F0 <= code && code <= 0x_e0FFF) // Cn [3600] .. +// (0x202A <= code && code <= 0x202E) || // Cf [5] LEFT-TO-RIGHT +// EMBEDDING..RIGHT-TO-LEFT OVERRIDE (0x2060 <= code && code <= 0x2064) +// || // Cf [5] WORD JOINER..INVISIBLE PLUS 0x2065 == code || // Cn +// (0x2066 <= code && code <= 0x206F) || // Cf [10] +// LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES (0x_d800 <= code && code +// <= 0x_dFFF) || // Cs [2048] .. 0x_fEFF +// == code || // Cf ZERO WIDTH NO-BREAK SPACE (0x_fFF0 <= code && +// code <= 0x_fFF8) || // Cn [9] .. +// (0x_fFF9 <= code && code <= 0x_fFFB) || // Cf [3] INTERLINEAR +// ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR (0x1BCA0 <= code +// && code <= 0x1BCA3) || // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND +// FORMAT UP STEP (0x1D173 <= code && code <= 0x1D17A) || // Cf [8] +// MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE 0x_e0000 == code +// || // Cn 0x_e0001 == code || // Cf +// LANGUAGE TAG (0x_e0002 <= code && code <= 0x_e001F) || // Cn [30] +// .. (0x_e0080 <= code && code <= +// 0x_e00FF) || // Cn [128] .. (0x_e01F0 +// <= code && code <= 0x_e0FFF) // Cn [3600] .. // ){ // return Control; // } // // // if( -// (0x0300 <= code && code <= 0x036F) || // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X -// (0x0483 <= code && code <= 0x0487) || // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE -// (0x0488 <= code && code <= 0x0489) || // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -// (0x0591 <= code && code <= 0x05BD) || // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG -// 0x05BF == code || // Mn HEBREW POINT RAFE -// (0x05C1 <= code && code <= 0x05C2) || // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -// (0x05C4 <= code && code <= 0x05C5) || // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -// 0x05C7 == code || // Mn HEBREW POINT QAMATS QATAN -// (0x0610 <= code && code <= 0x061A) || // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA -// (0x064B <= code && code <= 0x065F) || // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW -// 0x0670 == code || // Mn ARABIC LETTER SUPERSCRIPT ALEF -// (0x06D6 <= code && code <= 0x06DC) || // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -// (0x06DF <= code && code <= 0x06E4) || // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -// (0x06E7 <= code && code <= 0x06E8) || // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -// (0x06EA <= code && code <= 0x06ED) || // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -// 0x0711 == code || // Mn SYRIAC LETTER SUPERSCRIPT ALAPH -// (0x0730 <= code && code <= 0x074A) || // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -// (0x07A6 <= code && code <= 0x07B0) || // Mn [11] THAANA ABAFILI..THAANA SUKUN -// (0x07EB <= code && code <= 0x07F3) || // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE -// (0x0816 <= code && code <= 0x0819) || // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH -// (0x081B <= code && code <= 0x0823) || // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A -// (0x0825 <= code && code <= 0x0827) || // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U -// (0x0829 <= code && code <= 0x082D) || // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA -// (0x0859 <= code && code <= 0x085B) || // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK -// (0x08D4 <= code && code <= 0x08E1) || // Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA -// (0x08E3 <= code && code <= 0x0902) || // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA -// 0x093A == code || // Mn DEVANAGARI VOWEL SIGN OE -// 0x093C == code || // Mn DEVANAGARI SIGN NUKTA -// (0x0941 <= code && code <= 0x0948) || // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -// 0x094D == code || // Mn DEVANAGARI SIGN VIRAMA -// (0x0951 <= code && code <= 0x0957) || // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE -// (0x0962 <= code && code <= 0x0963) || // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -// 0x0981 == code || // Mn BENGALI SIGN CANDRABINDU -// 0x09BC == code || // Mn BENGALI SIGN NUKTA -// 0x09BE == code || // Mc BENGALI VOWEL SIGN AA -// (0x09C1 <= code && code <= 0x09C4) || // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -// 0x09CD == code || // Mn BENGALI SIGN VIRAMA -// 0x09D7 == code || // Mc BENGALI AU LENGTH MARK -// (0x09E2 <= code && code <= 0x09E3) || // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -// (0x0A01 <= code && code <= 0x0A02) || // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +// (0x0300 <= code && code <= 0x036F) || // Mn [112] COMBINING GRAVE +// ACCENT..COMBINING LATIN SMALL LETTER X (0x0483 <= code && code <= +// 0x0487) || // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +// (0x0488 <= code && code <= 0x0489) || // Me [2] COMBINING CYRILLIC +// HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN (0x0591 <= +// code && code <= 0x05BD) || // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT +// METEG 0x05BF == code || // Mn HEBREW POINT RAFE +// (0x05C1 <= code && code <= 0x05C2) || // Mn [2] HEBREW POINT SHIN +// DOT..HEBREW POINT SIN DOT (0x05C4 <= code && code <= 0x05C5) || // Mn +// [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT 0x05C7 == code || // +// Mn HEBREW POINT QAMATS QATAN (0x0610 <= code && code <= 0x061A) +// || // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +// (0x064B <= code && code <= 0x065F) || // Mn [21] ARABIC +// FATHATAN..ARABIC WAVY HAMZA BELOW 0x0670 == code || // Mn ARABIC +// LETTER SUPERSCRIPT ALEF (0x06D6 <= code && code <= 0x06DC) || // Mn +// [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL +// HIGH SEEN (0x06DF <= code && code <= 0x06E4) || // Mn [6] ARABIC +// SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA (0x06E7 <= code && +// code <= 0x06E8) || // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +// (0x06EA <= code && code <= 0x06ED) || // Mn [4] ARABIC EMPTY CENTRE +// LOW STOP..ARABIC SMALL LOW MEEM 0x0711 == code || // Mn SYRIAC +// LETTER SUPERSCRIPT ALAPH (0x0730 <= code && code <= 0x074A) || // Mn +// [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH (0x07A6 <= code && code <= +// 0x07B0) || // Mn [11] THAANA ABAFILI..THAANA SUKUN (0x07EB <= code && +// code <= 0x07F3) || // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING +// DOUBLE DOT ABOVE (0x0816 <= code && code <= 0x0819) || // Mn [4] +// SAMARITAN MARK IN..SAMARITAN MARK DAGESH (0x081B <= code && code <= +// 0x0823) || // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +// (0x0825 <= code && code <= 0x0827) || // Mn [3] SAMARITAN VOWEL SIGN +// SHORT A..SAMARITAN VOWEL SIGN U (0x0829 <= code && code <= 0x082D) || +// // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +// (0x0859 <= code && code <= 0x085B) || // Mn [3] MANDAIC AFFRICATION +// MARK..MANDAIC GEMINATION MARK (0x08D4 <= code && code <= 0x08E1) || // +// Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA +// (0x08E3 <= code && code <= 0x0902) || // Mn [32] ARABIC TURNED DAMMA +// BELOW..DEVANAGARI SIGN ANUSVARA 0x093A == code || // Mn +// DEVANAGARI VOWEL SIGN OE 0x093C == code || // Mn DEVANAGARI SIGN +// NUKTA (0x0941 <= code && code <= 0x0948) || // Mn [8] DEVANAGARI +// VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI 0x094D == code || // Mn +// DEVANAGARI SIGN VIRAMA (0x0951 <= code && code <= 0x0957) || // Mn +// [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE (0x0962 +// <= code && code <= 0x0963) || // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC +// L..DEVANAGARI VOWEL SIGN VOCALIC LL 0x0981 == code || // Mn +// BENGALI SIGN CANDRABINDU 0x09BC == code || // Mn BENGALI SIGN +// NUKTA 0x09BE == code || // Mc BENGALI VOWEL SIGN AA +// (0x09C1 <= code && code <= 0x09C4) || // Mn [4] BENGALI VOWEL SIGN +// U..BENGALI VOWEL SIGN VOCALIC RR 0x09CD == code || // Mn BENGALI +// SIGN VIRAMA 0x09D7 == code || // Mc BENGALI AU LENGTH MARK +// (0x09E2 <= code && code <= 0x09E3) || // Mn [2] BENGALI VOWEL SIGN +// VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL (0x0A01 <= code && code <= +// 0x0A02) || // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI // 0x0A3C == code || // Mn GURMUKHI SIGN NUKTA -// (0x0A41 <= code && code <= 0x0A42) || // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -// (0x0A47 <= code && code <= 0x0A48) || // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -// (0x0A4B <= code && code <= 0x0A4D) || // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +// (0x0A41 <= code && code <= 0x0A42) || // Mn [2] GURMUKHI VOWEL SIGN +// U..GURMUKHI VOWEL SIGN UU (0x0A47 <= code && code <= 0x0A48) || // Mn +// [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI (0x0A4B <= code && +// code <= 0x0A4D) || // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA // 0x0A51 == code || // Mn GURMUKHI SIGN UDAAT -// (0x0A70 <= code && code <= 0x0A71) || // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -// 0x0A75 == code || // Mn GURMUKHI SIGN YAKASH -// (0x0A81 <= code && code <= 0x0A82) || // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -// 0x0ABC == code || // Mn GUJARATI SIGN NUKTA -// (0x0AC1 <= code && code <= 0x0AC5) || // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -// (0x0AC7 <= code && code <= 0x0AC8) || // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +// (0x0A70 <= code && code <= 0x0A71) || // Mn [2] GURMUKHI +// TIPPI..GURMUKHI ADDAK 0x0A75 == code || // Mn GURMUKHI SIGN +// YAKASH (0x0A81 <= code && code <= 0x0A82) || // Mn [2] GUJARATI SIGN +// CANDRABINDU..GUJARATI SIGN ANUSVARA 0x0ABC == code || // Mn +// GUJARATI SIGN NUKTA (0x0AC1 <= code && code <= 0x0AC5) || // Mn [5] +// GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E (0x0AC7 <= code && +// code <= 0x0AC8) || // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI // 0x0ACD == code || // Mn GUJARATI SIGN VIRAMA -// (0x0AE2 <= code && code <= 0x0AE3) || // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -// (0x0AFA <= code && code <= 0x0AFF) || // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE -// 0x0B01 == code || // Mn ORIYA SIGN CANDRABINDU +// (0x0AE2 <= code && code <= 0x0AE3) || // Mn [2] GUJARATI VOWEL SIGN +// VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL (0x0AFA <= code && code <= +// 0x0AFF) || // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA +// ABOVE 0x0B01 == code || // Mn ORIYA SIGN CANDRABINDU // 0x0B3C == code || // Mn ORIYA SIGN NUKTA // 0x0B3E == code || // Mc ORIYA VOWEL SIGN AA // 0x0B3F == code || // Mn ORIYA VOWEL SIGN I -// (0x0B41 <= code && code <= 0x0B44) || // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR -// 0x0B4D == code || // Mn ORIYA SIGN VIRAMA -// 0x0B56 == code || // Mn ORIYA AI LENGTH MARK +// (0x0B41 <= code && code <= 0x0B44) || // Mn [4] ORIYA VOWEL SIGN +// U..ORIYA VOWEL SIGN VOCALIC RR 0x0B4D == code || // Mn ORIYA +// SIGN VIRAMA 0x0B56 == code || // Mn ORIYA AI LENGTH MARK // 0x0B57 == code || // Mc ORIYA AU LENGTH MARK -// (0x0B62 <= code && code <= 0x0B63) || // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL -// 0x0B82 == code || // Mn TAMIL SIGN ANUSVARA -// 0x0BBE == code || // Mc TAMIL VOWEL SIGN AA +// (0x0B62 <= code && code <= 0x0B63) || // Mn [2] ORIYA VOWEL SIGN +// VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL 0x0B82 == code || // Mn +// TAMIL SIGN ANUSVARA 0x0BBE == code || // Mc TAMIL VOWEL SIGN AA // 0x0BC0 == code || // Mn TAMIL VOWEL SIGN II // 0x0BCD == code || // Mn TAMIL SIGN VIRAMA // 0x0BD7 == code || // Mc TAMIL AU LENGTH MARK // 0x0C00 == code || // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE -// (0x0C3E <= code && code <= 0x0C40) || // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -// (0x0C46 <= code && code <= 0x0C48) || // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -// (0x0C4A <= code && code <= 0x0C4D) || // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -// (0x0C55 <= code && code <= 0x0C56) || // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -// (0x0C62 <= code && code <= 0x0C63) || // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +// (0x0C3E <= code && code <= 0x0C40) || // Mn [3] TELUGU VOWEL SIGN +// AA..TELUGU VOWEL SIGN II (0x0C46 <= code && code <= 0x0C48) || // Mn +// [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI (0x0C4A <= code && code +// <= 0x0C4D) || // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +// (0x0C55 <= code && code <= 0x0C56) || // Mn [2] TELUGU LENGTH +// MARK..TELUGU AI LENGTH MARK (0x0C62 <= code && code <= 0x0C63) || // +// Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL // 0x0C81 == code || // Mn KANNADA SIGN CANDRABINDU // 0x0CBC == code || // Mn KANNADA SIGN NUKTA // 0x0CBF == code || // Mn KANNADA VOWEL SIGN I // 0x0CC2 == code || // Mc KANNADA VOWEL SIGN UU // 0x0CC6 == code || // Mn KANNADA VOWEL SIGN E -// (0x0CCC <= code && code <= 0x0CCD) || // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -// (0x0CD5 <= code && code <= 0x0CD6) || // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -// (0x0CE2 <= code && code <= 0x0CE3) || // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -// (0x0D00 <= code && code <= 0x0D01) || // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU -// (0x0D3B <= code && code <= 0x0D3C) || // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA -// 0x0D3E == code || // Mc MALAYALAM VOWEL SIGN AA -// (0x0D41 <= code && code <= 0x0D44) || // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +// (0x0CCC <= code && code <= 0x0CCD) || // Mn [2] KANNADA VOWEL SIGN +// AU..KANNADA SIGN VIRAMA (0x0CD5 <= code && code <= 0x0CD6) || // Mc +// [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK (0x0CE2 <= code && +// code <= 0x0CE3) || // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL +// SIGN VOCALIC LL (0x0D00 <= code && code <= 0x0D01) || // Mn [2] +// MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +// (0x0D3B <= code && code <= 0x0D3C) || // Mn [2] MALAYALAM SIGN +// VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0x0D3E == code || +// // Mc MALAYALAM VOWEL SIGN AA (0x0D41 <= code && code <= 0x0D44) +// || // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR // 0x0D4D == code || // Mn MALAYALAM SIGN VIRAMA // 0x0D57 == code || // Mc MALAYALAM AU LENGTH MARK -// (0x0D62 <= code && code <= 0x0D63) || // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL -// 0x0DCA == code || // Mn SINHALA SIGN AL-LAKUNA -// 0x0DCF == code || // Mc SINHALA VOWEL SIGN AELA-PILLA -// (0x0DD2 <= code && code <= 0x0DD4) || // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +// (0x0D62 <= code && code <= 0x0D63) || // Mn [2] MALAYALAM VOWEL SIGN +// VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL 0x0DCA == code || // Mn +// SINHALA SIGN AL-LAKUNA 0x0DCF == code || // Mc SINHALA VOWEL +// SIGN AELA-PILLA (0x0DD2 <= code && code <= 0x0DD4) || // Mn [3] +// SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA // 0x0DD6 == code || // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA // 0x0DDF == code || // Mc SINHALA VOWEL SIGN GAYANUKITTA // 0x0E31 == code || // Mn THAI CHARACTER MAI HAN-AKAT -// (0x0E34 <= code && code <= 0x0E3A) || // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -// (0x0E47 <= code && code <= 0x0E4E) || // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -// 0x0EB1 == code || // Mn LAO VOWEL SIGN MAI KAN -// (0x0EB4 <= code && code <= 0x0EB9) || // Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -// (0x0EBB <= code && code <= 0x0EBC) || // Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -// (0x0EC8 <= code && code <= 0x0ECD) || // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA -// (0x0F18 <= code && code <= 0x0F19) || // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +// (0x0E34 <= code && code <= 0x0E3A) || // Mn [7] THAI CHARACTER SARA +// I..THAI CHARACTER PHINTHU (0x0E47 <= code && code <= 0x0E4E) || // Mn +// [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN 0x0EB1 == code +// || // Mn LAO VOWEL SIGN MAI KAN (0x0EB4 <= code && code <= +// 0x0EB9) || // Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU (0x0EBB <= +// code && code <= 0x0EBC) || // Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL +// SIGN LO (0x0EC8 <= code && code <= 0x0ECD) || // Mn [6] LAO TONE MAI +// EK..LAO NIGGAHITA (0x0F18 <= code && code <= 0x0F19) || // Mn [2] +// TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS // 0x0F35 == code || // Mn TIBETAN MARK NGAS BZUNG NYI ZLA // 0x0F37 == code || // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS // 0x0F39 == code || // Mn TIBETAN MARK TSA -PHRU -// (0x0F71 <= code && code <= 0x0F7E) || // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -// (0x0F80 <= code && code <= 0x0F84) || // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -// (0x0F86 <= code && code <= 0x0F87) || // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -// (0x0F8D <= code && code <= 0x0F97) || // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA -// (0x0F99 <= code && code <= 0x0FBC) || // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -// 0x0FC6 == code || // Mn TIBETAN SYMBOL PADMA GDAN -// (0x102D <= code && code <= 0x1030) || // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -// (0x1032 <= code && code <= 0x1037) || // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW -// (0x1039 <= code && code <= 0x103A) || // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT -// (0x103D <= code && code <= 0x103E) || // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA -// (0x1058 <= code && code <= 0x1059) || // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -// (0x105E <= code && code <= 0x1060) || // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA -// (0x1071 <= code && code <= 0x1074) || // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE -// 0x1082 == code || // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA -// (0x1085 <= code && code <= 0x1086) || // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y -// 0x108D == code || // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE -// 0x109D == code || // Mn MYANMAR VOWEL SIGN AITON AI -// (0x135D <= code && code <= 0x135F) || // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK -// (0x1712 <= code && code <= 0x1714) || // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA -// (0x1732 <= code && code <= 0x1734) || // Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD -// (0x1752 <= code && code <= 0x1753) || // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U -// (0x1772 <= code && code <= 0x1773) || // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -// (0x17B4 <= code && code <= 0x17B5) || // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -// (0x17B7 <= code && code <= 0x17BD) || // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -// 0x17C6 == code || // Mn KHMER SIGN NIKAHIT -// (0x17C9 <= code && code <= 0x17D3) || // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -// 0x17DD == code || // Mn KHMER SIGN ATTHACAN -// (0x180B <= code && code <= 0x180D) || // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -// (0x1885 <= code && code <= 0x1886) || // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +// (0x0F71 <= code && code <= 0x0F7E) || // Mn [14] TIBETAN VOWEL SIGN +// AA..TIBETAN SIGN RJES SU NGA RO (0x0F80 <= code && code <= 0x0F84) || +// // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +// (0x0F86 <= code && code <= 0x0F87) || // Mn [2] TIBETAN SIGN LCI +// RTAGS..TIBETAN SIGN YANG RTAGS (0x0F8D <= code && code <= 0x0F97) || +// // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +// (0x0F99 <= code && code <= 0x0FBC) || // Mn [36] TIBETAN SUBJOINED +// LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA 0x0FC6 == code || +// // Mn TIBETAN SYMBOL PADMA GDAN (0x102D <= code && code <= +// 0x1030) || // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +// (0x1032 <= code && code <= 0x1037) || // Mn [6] MYANMAR VOWEL SIGN +// AI..MYANMAR SIGN DOT BELOW (0x1039 <= code && code <= 0x103A) || // Mn +// [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT (0x103D <= code && code <= +// 0x103E) || // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT +// SIGN MEDIAL HA (0x1058 <= code && code <= 0x1059) || // Mn [2] +// MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL (0x105E <= +// code && code <= 0x1060) || // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL +// NA..MYANMAR CONSONANT SIGN MON MEDIAL LA (0x1071 <= code && code <= +// 0x1074) || // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN +// KAYAH EE 0x1082 == code || // Mn MYANMAR CONSONANT SIGN SHAN +// MEDIAL WA (0x1085 <= code && code <= 0x1086) || // Mn [2] MYANMAR +// VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y 0x108D == +// code || // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE 0x109D == +// code || // Mn MYANMAR VOWEL SIGN AITON AI (0x135D <= code && +// code <= 0x135F) || // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH +// MARK..ETHIOPIC COMBINING GEMINATION MARK (0x1712 <= code && code <= +// 0x1714) || // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +// (0x1732 <= code && code <= 0x1734) || // Mn [3] HANUNOO VOWEL SIGN +// I..HANUNOO SIGN PAMUDPOD (0x1752 <= code && code <= 0x1753) || // Mn +// [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U (0x1772 <= code && code <= +// 0x1773) || // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +// (0x17B4 <= code && code <= 0x17B5) || // Mn [2] KHMER VOWEL INHERENT +// AQ..KHMER VOWEL INHERENT AA (0x17B7 <= code && code <= 0x17BD) || // +// Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA 0x17C6 == code || // +// Mn KHMER SIGN NIKAHIT (0x17C9 <= code && code <= 0x17D3) || // +// Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT 0x17DD == code +// || // Mn KHMER SIGN ATTHACAN (0x180B <= code && code <= 0x180D) +// || // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE +// VARIATION SELECTOR THREE (0x1885 <= code && code <= 0x1886) || // Mn +// [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA // 0x18A9 == code || // Mn MONGOLIAN LETTER ALI GALI DAGALGA -// (0x1920 <= code && code <= 0x1922) || // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -// (0x1927 <= code && code <= 0x1928) || // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -// 0x1932 == code || // Mn LIMBU SMALL LETTER ANUSVARA -// (0x1939 <= code && code <= 0x193B) || // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -// (0x1A17 <= code && code <= 0x1A18) || // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +// (0x1920 <= code && code <= 0x1922) || // Mn [3] LIMBU VOWEL SIGN +// A..LIMBU VOWEL SIGN U (0x1927 <= code && code <= 0x1928) || // Mn +// [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O 0x1932 == code || // Mn +// LIMBU SMALL LETTER ANUSVARA (0x1939 <= code && code <= 0x193B) || // +// Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I (0x1A17 <= code && code +// <= 0x1A18) || // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U // 0x1A1B == code || // Mn BUGINESE VOWEL SIGN AE // 0x1A56 == code || // Mn TAI THAM CONSONANT SIGN MEDIAL LA -// (0x1A58 <= code && code <= 0x1A5E) || // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA -// 0x1A60 == code || // Mn TAI THAM SIGN SAKOT -// 0x1A62 == code || // Mn TAI THAM VOWEL SIGN MAI SAT -// (0x1A65 <= code && code <= 0x1A6C) || // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW -// (0x1A73 <= code && code <= 0x1A7C) || // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN -// 0x1A7F == code || // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT -// (0x1AB0 <= code && code <= 0x1ABD) || // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW -// 0x1ABE == code || // Me COMBINING PARENTHESES OVERLAY -// (0x1B00 <= code && code <= 0x1B03) || // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +// (0x1A58 <= code && code <= 0x1A5E) || // Mn [7] TAI THAM SIGN MAI +// KANG LAI..TAI THAM CONSONANT SIGN SA 0x1A60 == code || // Mn TAI +// THAM SIGN SAKOT 0x1A62 == code || // Mn TAI THAM VOWEL SIGN MAI +// SAT (0x1A65 <= code && code <= 0x1A6C) || // Mn [8] TAI THAM VOWEL +// SIGN I..TAI THAM VOWEL SIGN OA BELOW (0x1A73 <= code && code <= +// 0x1A7C) || // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE +// KARAN 0x1A7F == code || // Mn TAI THAM COMBINING CRYPTOGRAMMIC +// DOT (0x1AB0 <= code && code <= 0x1ABD) || // Mn [14] COMBINING +// DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW 0x1ABE == code +// || // Me COMBINING PARENTHESES OVERLAY (0x1B00 <= code && code +// <= 0x1B03) || // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG // 0x1B34 == code || // Mn BALINESE SIGN REREKAN -// (0x1B36 <= code && code <= 0x1B3A) || // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA -// 0x1B3C == code || // Mn BALINESE VOWEL SIGN LA LENGA -// 0x1B42 == code || // Mn BALINESE VOWEL SIGN PEPET -// (0x1B6B <= code && code <= 0x1B73) || // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG -// (0x1B80 <= code && code <= 0x1B81) || // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR -// (0x1BA2 <= code && code <= 0x1BA5) || // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU -// (0x1BA8 <= code && code <= 0x1BA9) || // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG -// (0x1BAB <= code && code <= 0x1BAD) || // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA -// 0x1BE6 == code || // Mn BATAK SIGN TOMPI -// (0x1BE8 <= code && code <= 0x1BE9) || // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE -// 0x1BED == code || // Mn BATAK VOWEL SIGN KARO O -// (0x1BEF <= code && code <= 0x1BF1) || // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H -// (0x1C2C <= code && code <= 0x1C33) || // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T -// (0x1C36 <= code && code <= 0x1C37) || // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA -// (0x1CD0 <= code && code <= 0x1CD2) || // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA -// (0x1CD4 <= code && code <= 0x1CE0) || // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA -// (0x1CE2 <= code && code <= 0x1CE8) || // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL -// 0x1CED == code || // Mn VEDIC SIGN TIRYAK -// 0x1CF4 == code || // Mn VEDIC TONE CANDRA ABOVE -// (0x1CF8 <= code && code <= 0x1CF9) || // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -// (0x1DC0 <= code && code <= 0x1DF9) || // Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW -// (0x1DFB <= code && code <= 0x1DFF) || // Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +// (0x1B36 <= code && code <= 0x1B3A) || // Mn [5] BALINESE VOWEL SIGN +// ULU..BALINESE VOWEL SIGN RA REPA 0x1B3C == code || // Mn +// BALINESE VOWEL SIGN LA LENGA 0x1B42 == code || // Mn BALINESE +// VOWEL SIGN PEPET (0x1B6B <= code && code <= 0x1B73) || // Mn [9] +// BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING +// GONG (0x1B80 <= code && code <= 0x1B81) || // Mn [2] SUNDANESE SIGN +// PANYECEK..SUNDANESE SIGN PANGLAYAR (0x1BA2 <= code && code <= 0x1BA5) +// || // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN +// PANYUKU (0x1BA8 <= code && code <= 0x1BA9) || // Mn [2] SUNDANESE +// VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG (0x1BAB <= code && +// code <= 0x1BAD) || // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT +// SIGN PASANGAN WA 0x1BE6 == code || // Mn BATAK SIGN TOMPI +// (0x1BE8 <= code && code <= 0x1BE9) || // Mn [2] BATAK VOWEL SIGN +// PAKPAK E..BATAK VOWEL SIGN EE 0x1BED == code || // Mn BATAK +// VOWEL SIGN KARO O (0x1BEF <= code && code <= 0x1BF1) || // Mn [3] +// BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H (0x1C2C +// <= code && code <= 0x1C33) || // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA +// CONSONANT SIGN T (0x1C36 <= code && code <= 0x1C37) || // Mn [2] +// LEPCHA SIGN RAN..LEPCHA SIGN NUKTA (0x1CD0 <= code && code <= 0x1CD2) +// || // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA (0x1CD4 <= code +// && code <= 0x1CE0) || // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE +// SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA (0x1CE2 <= +// code && code <= 0x1CE8) || // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN +// VISARGA ANUDATTA WITH TAIL 0x1CED == code || // Mn VEDIC SIGN +// TIRYAK 0x1CF4 == code || // Mn VEDIC TONE CANDRA ABOVE +// (0x1CF8 <= code && code <= 0x1CF9) || // Mn [2] VEDIC TONE RING +// ABOVE..VEDIC TONE DOUBLE RING ABOVE (0x1DC0 <= code && code <= 0x1DF9) +// || // Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE +// BELOW (0x1DFB <= code && code <= 0x1DFF) || // Mn [5] COMBINING +// DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW // 0x200C == code || // Cf ZERO WIDTH NON-JOINER -// (0x20D0 <= code && code <= 0x20DC) || // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -// (0x20DD <= code && code <= 0x20E0) || // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH -// 0x20E1 == code || // Mn COMBINING LEFT RIGHT ARROW ABOVE -// (0x20E2 <= code && code <= 0x20E4) || // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE -// (0x20E5 <= code && code <= 0x20F0) || // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE -// (0x2CEF <= code && code <= 0x2CF1) || // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +// (0x20D0 <= code && code <= 0x20DC) || // Mn [13] COMBINING LEFT +// HARPOON ABOVE..COMBINING FOUR DOTS ABOVE (0x20DD <= code && code <= +// 0x20E0) || // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE +// BACKSLASH 0x20E1 == code || // Mn COMBINING LEFT RIGHT ARROW +// ABOVE (0x20E2 <= code && code <= 0x20E4) || // Me [3] COMBINING +// ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE (0x20E5 +// <= code && code <= 0x20F0) || // Mn [12] COMBINING REVERSE SOLIDUS +// OVERLAY..COMBINING ASTERISK ABOVE (0x2CEF <= code && code <= 0x2CF1) +// || // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS // 0x2D7F == code || // Mn TIFINAGH CONSONANT JOINER -// (0x2DE0 <= code && code <= 0x2DFF) || // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -// (0x302A <= code && code <= 0x302D) || // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK -// (0x302E <= code && code <= 0x302F) || // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK -// (0x3099 <= code && code <= 0x309A) || // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -// 0x_a66F == code || // Mn COMBINING CYRILLIC VZMET -// (0x_a670 <= code && code <= 0x_a672) || // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN -// (0x_a674 <= code && code <= 0x_a67D) || // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK -// (0x_a69E <= code && code <= 0x_a69F) || // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E -// (0x_a6F0 <= code && code <= 0x_a6F1) || // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS -// 0x_a802 == code || // Mn SYLOTI NAGRI SIGN DVISVARA -// 0x_a806 == code || // Mn SYLOTI NAGRI SIGN HASANTA -// 0x_a80B == code || // Mn SYLOTI NAGRI SIGN ANUSVARA -// (0x_a825 <= code && code <= 0x_a826) || // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E -// (0x_a8C4 <= code && code <= 0x_a8C5) || // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU -// (0x_a8E0 <= code && code <= 0x_a8F1) || // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA -// (0x_a926 <= code && code <= 0x_a92D) || // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU -// (0x_a947 <= code && code <= 0x_a951) || // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R -// (0x_a980 <= code && code <= 0x_a982) || // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +// (0x2DE0 <= code && code <= 0x2DFF) || // Mn [32] COMBINING CYRILLIC +// LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS (0x302A <= code +// && code <= 0x302D) || // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC +// ENTERING TONE MARK (0x302E <= code && code <= 0x302F) || // Mc [2] +// HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK (0x3099 <= +// code && code <= 0x309A) || // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED +// SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK 0x_a66F +// == code || // Mn COMBINING CYRILLIC VZMET (0x_a670 <= code && +// code <= 0x_a672) || // Me [3] COMBINING CYRILLIC TEN MILLIONS +// SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN (0x_a674 <= code && +// code <= 0x_a67D) || // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN +// IE..COMBINING CYRILLIC PAYEROK (0x_a69E <= code && code <= 0x_a69F) || +// // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED +// E (0x_a6F0 <= code && code <= 0x_a6F1) || // Mn [2] BAMUM COMBINING +// MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS 0x_a802 == code || // Mn +// SYLOTI NAGRI SIGN DVISVARA 0x_a806 == code || // Mn SYLOTI NAGRI +// SIGN HASANTA 0x_a80B == code || // Mn SYLOTI NAGRI SIGN ANUSVARA +// (0x_a825 <= code && code <= 0x_a826) || // Mn [2] SYLOTI NAGRI VOWEL +// SIGN U..SYLOTI NAGRI VOWEL SIGN E (0x_a8C4 <= code && code <= 0x_a8C5) +// || // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +// (0x_a8E0 <= code && code <= 0x_a8F1) || // Mn [18] COMBINING +// DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA (0x_a926 <= +// code && code <= 0x_a92D) || // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE +// CALYA PLOPHU (0x_a947 <= code && code <= 0x_a951) || // Mn [11] +// REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R (0x_a980 <= code && code +// <= 0x_a982) || // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR // 0x_a9B3 == code || // Mn JAVANESE SIGN CECAK TELU -// (0x_a9B6 <= code && code <= 0x_a9B9) || // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT -// 0x_a9BC == code || // Mn JAVANESE VOWEL SIGN PEPET -// 0x_a9E5 == code || // Mn MYANMAR SIGN SHAN SAW -// (0x_aA29 <= code && code <= 0x_aA2E) || // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE -// (0x_aA31 <= code && code <= 0x_aA32) || // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE -// (0x_aA35 <= code && code <= 0x_aA36) || // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA -// 0x_aA43 == code || // Mn CHAM CONSONANT SIGN FINAL NG +// (0x_a9B6 <= code && code <= 0x_a9B9) || // Mn [4] JAVANESE VOWEL +// SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT 0x_a9BC == code || // Mn +// JAVANESE VOWEL SIGN PEPET 0x_a9E5 == code || // Mn MYANMAR SIGN +// SHAN SAW (0x_aA29 <= code && code <= 0x_aA2E) || // Mn [6] CHAM +// VOWEL SIGN AA..CHAM VOWEL SIGN OE (0x_aA31 <= code && code <= 0x_aA32) +// || // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE (0x_aA35 <= code +// && code <= 0x_aA36) || // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT +// SIGN WA 0x_aA43 == code || // Mn CHAM CONSONANT SIGN FINAL NG // 0x_aA4C == code || // Mn CHAM CONSONANT SIGN FINAL M // 0x_aA7C == code || // Mn MYANMAR SIGN TAI LAING TONE-2 // 0x_aAB0 == code || // Mn TAI VIET MAI KANG -// (0x_aAB2 <= code && code <= 0x_aAB4) || // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U -// (0x_aAB7 <= code && code <= 0x_aAB8) || // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA -// (0x_aABE <= code && code <= 0x_aABF) || // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +// (0x_aAB2 <= code && code <= 0x_aAB4) || // Mn [3] TAI VIET VOWEL +// I..TAI VIET VOWEL U (0x_aAB7 <= code && code <= 0x_aAB8) || // Mn +// [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA (0x_aABE <= code && code <= +// 0x_aABF) || // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK // 0x_aAC1 == code || // Mn TAI VIET TONE MAI THO -// (0x_aAEC <= code && code <= 0x_aAED) || // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI -// 0x_aAF6 == code || // Mn MEETEI MAYEK VIRAMA -// 0x_aBE5 == code || // Mn MEETEI MAYEK VOWEL SIGN ANAP -// 0x_aBE8 == code || // Mn MEETEI MAYEK VOWEL SIGN UNAP +// (0x_aAEC <= code && code <= 0x_aAED) || // Mn [2] MEETEI MAYEK VOWEL +// SIGN UU..MEETEI MAYEK VOWEL SIGN AAI 0x_aAF6 == code || // Mn +// MEETEI MAYEK VIRAMA 0x_aBE5 == code || // Mn MEETEI MAYEK VOWEL +// SIGN ANAP 0x_aBE8 == code || // Mn MEETEI MAYEK VOWEL SIGN UNAP // 0x_aBED == code || // Mn MEETEI MAYEK APUN IYEK // 0x_fB1E == code || // Mn HEBREW POINT JUDEO-SPANISH VARIKA -// (0x_fE00 <= code && code <= 0x_fE0F) || // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -// (0x_fE20 <= code && code <= 0x_fE2F) || // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF -// (0x_fF9E <= code && code <= 0x_fF9F) || // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -// 0x101FD == code || // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -// 0x102E0 == code || // Mn COPTIC EPACT THOUSANDS MARK -// (0x10376 <= code && code <= 0x1037A) || // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII -// (0x10A01 <= code && code <= 0x10A03) || // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R -// (0x10A05 <= code && code <= 0x10A06) || // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O -// (0x10A0C <= code && code <= 0x10A0F) || // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA -// (0x10A38 <= code && code <= 0x10A3A) || // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW -// 0x10A3F == code || // Mn KHAROSHTHI VIRAMA -// (0x10AE5 <= code && code <= 0x10AE6) || // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +// (0x_fE00 <= code && code <= 0x_fE0F) || // Mn [16] VARIATION +// SELECTOR-1..VARIATION SELECTOR-16 (0x_fE20 <= code && code <= 0x_fE2F) +// || // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT +// HALF (0x_fF9E <= code && code <= 0x_fF9F) || // Lm [2] HALFWIDTH +// KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +// 0x101FD == code || // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE +// STROKE 0x102E0 == code || // Mn COPTIC EPACT THOUSANDS MARK +// (0x10376 <= code && code <= 0x1037A) || // Mn [5] COMBINING OLD +// PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII (0x10A01 <= code && +// code <= 0x10A03) || // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL +// SIGN VOCALIC R (0x10A05 <= code && code <= 0x10A06) || // Mn [2] +// KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O (0x10A0C <= code && +// code <= 0x10A0F) || // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN +// VISARGA (0x10A38 <= code && code <= 0x10A3A) || // Mn [3] KHAROSHTHI +// SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW 0x10A3F == code || // Mn +// KHAROSHTHI VIRAMA (0x10AE5 <= code && code <= 0x10AE6) || // Mn [2] +// MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW // 0x11001 == code || // Mn BRAHMI SIGN ANUSVARA -// (0x11038 <= code && code <= 0x11046) || // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA -// (0x1107F <= code && code <= 0x11081) || // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA -// (0x110B3 <= code && code <= 0x110B6) || // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI -// (0x110B9 <= code && code <= 0x110BA) || // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA -// (0x11100 <= code && code <= 0x11102) || // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA -// (0x11127 <= code && code <= 0x1112B) || // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU -// (0x1112D <= code && code <= 0x11134) || // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA -// 0x11173 == code || // Mn MAHAJANI SIGN NUKTA -// (0x11180 <= code && code <= 0x11181) || // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA -// (0x111B6 <= code && code <= 0x111BE) || // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O -// (0x111CA <= code && code <= 0x111CC) || // Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK -// (0x1122F <= code && code <= 0x11231) || // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +// (0x11038 <= code && code <= 0x11046) || // Mn [15] BRAHMI VOWEL SIGN +// AA..BRAHMI VIRAMA (0x1107F <= code && code <= 0x11081) || // Mn [3] +// BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA (0x110B3 <= code && code <= +// 0x110B6) || // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +// (0x110B9 <= code && code <= 0x110BA) || // Mn [2] KAITHI SIGN +// VIRAMA..KAITHI SIGN NUKTA (0x11100 <= code && code <= 0x11102) || // +// Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA (0x11127 <= code +// && code <= 0x1112B) || // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +// (0x1112D <= code && code <= 0x11134) || // Mn [8] CHAKMA VOWEL SIGN +// AI..CHAKMA MAAYYAA 0x11173 == code || // Mn MAHAJANI SIGN NUKTA +// (0x11180 <= code && code <= 0x11181) || // Mn [2] SHARADA SIGN +// CANDRABINDU..SHARADA SIGN ANUSVARA (0x111B6 <= code && code <= +// 0x111BE) || // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +// (0x111CA <= code && code <= 0x111CC) || // Mn [3] SHARADA SIGN +// NUKTA..SHARADA EXTRA SHORT VOWEL MARK (0x1122F <= code && code <= +// 0x11231) || // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI // 0x11234 == code || // Mn KHOJKI SIGN ANUSVARA -// (0x11236 <= code && code <= 0x11237) || // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA -// 0x1123E == code || // Mn KHOJKI SIGN SUKUN -// 0x112DF == code || // Mn KHUDAWADI SIGN ANUSVARA -// (0x112E3 <= code && code <= 0x112EA) || // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA -// (0x11300 <= code && code <= 0x11301) || // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +// (0x11236 <= code && code <= 0x11237) || // Mn [2] KHOJKI SIGN +// NUKTA..KHOJKI SIGN SHADDA 0x1123E == code || // Mn KHOJKI SIGN +// SUKUN 0x112DF == code || // Mn KHUDAWADI SIGN ANUSVARA +// (0x112E3 <= code && code <= 0x112EA) || // Mn [8] KHUDAWADI VOWEL +// SIGN U..KHUDAWADI SIGN VIRAMA (0x11300 <= code && code <= 0x11301) || +// // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU // 0x1133C == code || // Mn GRANTHA SIGN NUKTA // 0x1133E == code || // Mc GRANTHA VOWEL SIGN AA // 0x11340 == code || // Mn GRANTHA VOWEL SIGN II // 0x11357 == code || // Mc GRANTHA AU LENGTH MARK -// (0x11366 <= code && code <= 0x1136C) || // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX -// (0x11370 <= code && code <= 0x11374) || // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA -// (0x11438 <= code && code <= 0x1143F) || // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI -// (0x11442 <= code && code <= 0x11444) || // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA -// 0x11446 == code || // Mn NEWA SIGN NUKTA -// 0x114B0 == code || // Mc TIRHUTA VOWEL SIGN AA -// (0x114B3 <= code && code <= 0x114B8) || // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL -// 0x114BA == code || // Mn TIRHUTA VOWEL SIGN SHORT E -// 0x114BD == code || // Mc TIRHUTA VOWEL SIGN SHORT O -// (0x114BF <= code && code <= 0x114C0) || // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA -// (0x114C2 <= code && code <= 0x114C3) || // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +// (0x11366 <= code && code <= 0x1136C) || // Mn [7] COMBINING GRANTHA +// DIGIT ZERO..COMBINING GRANTHA DIGIT SIX (0x11370 <= code && code <= +// 0x11374) || // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER +// PA (0x11438 <= code && code <= 0x1143F) || // Mn [8] NEWA VOWEL SIGN +// U..NEWA VOWEL SIGN AI (0x11442 <= code && code <= 0x11444) || // Mn +// [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA 0x11446 == code || // Mn +// NEWA SIGN NUKTA 0x114B0 == code || // Mc TIRHUTA VOWEL SIGN AA +// (0x114B3 <= code && code <= 0x114B8) || // Mn [6] TIRHUTA VOWEL SIGN +// U..TIRHUTA VOWEL SIGN VOCALIC LL 0x114BA == code || // Mn +// TIRHUTA VOWEL SIGN SHORT E 0x114BD == code || // Mc TIRHUTA +// VOWEL SIGN SHORT O (0x114BF <= code && code <= 0x114C0) || // Mn [2] +// TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA (0x114C2 <= code && +// code <= 0x114C3) || // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA // 0x115AF == code || // Mc SIDDHAM VOWEL SIGN AA -// (0x115B2 <= code && code <= 0x115B5) || // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR -// (0x115BC <= code && code <= 0x115BD) || // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA -// (0x115BF <= code && code <= 0x115C0) || // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA -// (0x115DC <= code && code <= 0x115DD) || // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU -// (0x11633 <= code && code <= 0x1163A) || // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI -// 0x1163D == code || // Mn MODI SIGN ANUSVARA -// (0x1163F <= code && code <= 0x11640) || // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA -// 0x116AB == code || // Mn TAKRI SIGN ANUSVARA -// 0x116AD == code || // Mn TAKRI VOWEL SIGN AA -// (0x116B0 <= code && code <= 0x116B5) || // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU -// 0x116B7 == code || // Mn TAKRI SIGN NUKTA -// (0x1171D <= code && code <= 0x1171F) || // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA -// (0x11722 <= code && code <= 0x11725) || // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU -// (0x11727 <= code && code <= 0x1172B) || // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER -// (0x11A01 <= code && code <= 0x11A06) || // Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O -// (0x11A09 <= code && code <= 0x11A0A) || // Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK -// (0x11A33 <= code && code <= 0x11A38) || // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA -// (0x11A3B <= code && code <= 0x11A3E) || // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA -// 0x11A47 == code || // Mn ZANABAZAR SQUARE SUBJOINER -// (0x11A51 <= code && code <= 0x11A56) || // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE -// (0x11A59 <= code && code <= 0x11A5B) || // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK -// (0x11A8A <= code && code <= 0x11A96) || // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA -// (0x11A98 <= code && code <= 0x11A99) || // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER -// (0x11C30 <= code && code <= 0x11C36) || // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L -// (0x11C38 <= code && code <= 0x11C3D) || // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +// (0x115B2 <= code && code <= 0x115B5) || // Mn [4] SIDDHAM VOWEL SIGN +// U..SIDDHAM VOWEL SIGN VOCALIC RR (0x115BC <= code && code <= 0x115BD) +// || // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +// (0x115BF <= code && code <= 0x115C0) || // Mn [2] SIDDHAM SIGN +// VIRAMA..SIDDHAM SIGN NUKTA (0x115DC <= code && code <= 0x115DD) || // +// Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +// (0x11633 <= code && code <= 0x1163A) || // Mn [8] MODI VOWEL SIGN +// U..MODI VOWEL SIGN AI 0x1163D == code || // Mn MODI SIGN +// ANUSVARA (0x1163F <= code && code <= 0x11640) || // Mn [2] MODI SIGN +// VIRAMA..MODI SIGN ARDHACANDRA 0x116AB == code || // Mn TAKRI +// SIGN ANUSVARA 0x116AD == code || // Mn TAKRI VOWEL SIGN AA +// (0x116B0 <= code && code <= 0x116B5) || // Mn [6] TAKRI VOWEL SIGN +// U..TAKRI VOWEL SIGN AU 0x116B7 == code || // Mn TAKRI SIGN NUKTA +// (0x1171D <= code && code <= 0x1171F) || // Mn [3] AHOM CONSONANT +// SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA (0x11722 <= +// code && code <= 0x11725) || // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +// (0x11727 <= code && code <= 0x1172B) || // Mn [5] AHOM VOWEL SIGN +// AW..AHOM SIGN KILLER (0x11A01 <= code && code <= 0x11A06) || // Mn +// [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O +// (0x11A09 <= code && code <= 0x11A0A) || // Mn [2] ZANABAZAR SQUARE +// VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK (0x11A33 <= +// code && code <= 0x11A38) || // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT +// MARK..ZANABAZAR SQUARE SIGN ANUSVARA (0x11A3B <= code && code <= +// 0x11A3E) || // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR +// SQUARE CLUSTER-FINAL LETTER VA 0x11A47 == code || // Mn +// ZANABAZAR SQUARE SUBJOINER (0x11A51 <= code && code <= 0x11A56) || // +// Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE (0x11A59 <= code +// && code <= 0x11A5B) || // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO +// VOWEL LENGTH MARK (0x11A8A <= code && code <= 0x11A96) || // Mn [13] +// SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA (0x11A98 <= code +// && code <= 0x11A99) || // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +// (0x11C30 <= code && code <= 0x11C36) || // Mn [7] BHAIKSUKI VOWEL +// SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L (0x11C38 <= code && code <= +// 0x11C3D) || // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA // 0x11C3F == code || // Mn BHAIKSUKI SIGN VIRAMA -// (0x11C92 <= code && code <= 0x11CA7) || // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA -// (0x11CAA <= code && code <= 0x11CB0) || // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA -// (0x11CB2 <= code && code <= 0x11CB3) || // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E -// (0x11CB5 <= code && code <= 0x11CB6) || // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU -// (0x11D31 <= code && code <= 0x11D36) || // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R -// 0x11D3A == code || // Mn MASARAM GONDI VOWEL SIGN E -// (0x11D3C <= code && code <= 0x11D3D) || // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O -// (0x11D3F <= code && code <= 0x11D45) || // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA -// 0x11D47 == code || // Mn MASARAM GONDI RA-KARA -// (0x16AF0 <= code && code <= 0x16AF4) || // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE -// (0x16B30 <= code && code <= 0x16B36) || // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM -// (0x16F8F <= code && code <= 0x16F92) || // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW -// (0x1BC9D <= code && code <= 0x1BC9E) || // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +// (0x11C92 <= code && code <= 0x11CA7) || // Mn [22] MARCHEN SUBJOINED +// LETTER KA..MARCHEN SUBJOINED LETTER ZA (0x11CAA <= code && code <= +// 0x11CB0) || // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +// (0x11CB2 <= code && code <= 0x11CB3) || // Mn [2] MARCHEN VOWEL SIGN +// U..MARCHEN VOWEL SIGN E (0x11CB5 <= code && code <= 0x11CB6) || // Mn +// [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU (0x11D31 <= code +// && code <= 0x11D36) || // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI +// VOWEL SIGN VOCALIC R 0x11D3A == code || // Mn MASARAM GONDI +// VOWEL SIGN E (0x11D3C <= code && code <= 0x11D3D) || // Mn [2] +// MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O (0x11D3F <= +// code && code <= 0x11D45) || // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM +// GONDI VIRAMA 0x11D47 == code || // Mn MASARAM GONDI RA-KARA +// (0x16AF0 <= code && code <= 0x16AF4) || // Mn [5] BASSA VAH +// COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE (0x16B30 <= +// code && code <= 0x16B36) || // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH +// HMONG MARK CIM TAUM (0x16F8F <= code && code <= 0x16F92) || // Mn +// [4] MIAO TONE RIGHT..MIAO TONE BELOW (0x1BC9D <= code && code <= +// 0x1BC9E) || // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK // 0x1D165 == code || // Mc MUSICAL SYMBOL COMBINING STEM -// (0x1D167 <= code && code <= 0x1D169) || // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -// (0x1D16E <= code && code <= 0x1D172) || // Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 -// (0x1D17B <= code && code <= 0x1D182) || // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -// (0x1D185 <= code && code <= 0x1D18B) || // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -// (0x1D1AA <= code && code <= 0x1D1AD) || // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -// (0x1D242 <= code && code <= 0x1D244) || // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME -// (0x1DA00 <= code && code <= 0x1DA36) || // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN -// (0x1DA3B <= code && code <= 0x1DA6C) || // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT -// 0x1DA75 == code || // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS -// 0x1DA84 == code || // Mn SIGNWRITING LOCATION HEAD NECK -// (0x1DA9B <= code && code <= 0x1DA9F) || // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 -// (0x1DAA1 <= code && code <= 0x1DAAF) || // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 -// (0x1E000 <= code && code <= 0x1E006) || // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE -// (0x1E008 <= code && code <= 0x1E018) || // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU -// (0x1E01B <= code && code <= 0x1E021) || // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI -// (0x1E023 <= code && code <= 0x1E024) || // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS -// (0x1E026 <= code && code <= 0x1E02A) || // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA -// (0x1E8D0 <= code && code <= 0x1E8D6) || // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS -// (0x1E944 <= code && code <= 0x1E94A) || // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA -// (0x_e0020 <= code && code <= 0x_e007F) || // Cf [96] TAG SPACE..CANCEL TAG -// (0x_e0100 <= code && code <= 0x_e01EF) // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -// ){ +// (0x1D167 <= code && code <= 0x1D169) || // Mn [3] MUSICAL SYMBOL +// COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 (0x1D16E <= +// code && code <= 0x1D172) || // Mc [5] MUSICAL SYMBOL COMBINING +// FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 (0x1D17B <= code && code <= +// 0x1D182) || // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL +// COMBINING LOURE (0x1D185 <= code && code <= 0x1D18B) || // Mn [7] +// MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +// (0x1D1AA <= code && code <= 0x1D1AD) || // Mn [4] MUSICAL SYMBOL +// COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO (0x1D242 +// <= code && code <= 0x1D244) || // Mn [3] COMBINING GREEK MUSICAL +// TRISEME..COMBINING GREEK MUSICAL PENTASEME (0x1DA00 <= code && code <= +// 0x1DA36) || // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +// (0x1DA3B <= code && code <= 0x1DA6C) || // Mn [50] SIGNWRITING MOUTH +// CLOSED NEUTRAL..SIGNWRITING EXCITEMENT 0x1DA75 == code || // Mn +// SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS 0x1DA84 == code || // +// Mn SIGNWRITING LOCATION HEAD NECK (0x1DA9B <= code && code <= +// 0x1DA9F) || // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL +// MODIFIER-6 (0x1DAA1 <= code && code <= 0x1DAAF) || // Mn [15] +// SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +// (0x1E000 <= code && code <= 0x1E006) || // Mn [7] COMBINING +// GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE (0x1E008 <= +// code && code <= 0x1E018) || // Mn [17] COMBINING GLAGOLITIC LETTER +// ZEMLJA..COMBINING GLAGOLITIC LETTER HERU (0x1E01B <= code && code <= +// 0x1E021) || // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING +// GLAGOLITIC LETTER YATI (0x1E023 <= code && code <= 0x1E024) || // Mn +// [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +// (0x1E026 <= code && code <= 0x1E02A) || // Mn [5] COMBINING +// GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA (0x1E8D0 <= +// code && code <= 0x1E8D6) || // Mn [7] MENDE KIKAKUI COMBINING NUMBER +// TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS (0x1E944 <= code && +// code <= 0x1E94A) || // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +// (0x_e0020 <= code && code <= 0x_e007F) || // Cf [96] TAG +// SPACE..CANCEL TAG (0x_e0100 <= code && code <= 0x_e01EF) // Mn [240] +// VARIATION SELECTOR-17..VARIATION SELECTOR-256 ){ // return Extend; // } // // // if( -// (0x1F1E6 <= code && code <= 0x1F1FF) // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z -// ){ +// (0x1F1E6 <= code && code <= 0x1F1FF) // So [26] REGIONAL INDICATOR +// SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z ){ // return Regional_Indicator; // } // // if( // 0x0903 == code || // Mc DEVANAGARI SIGN VISARGA // 0x093B == code || // Mc DEVANAGARI VOWEL SIGN OOE -// (0x093E <= code && code <= 0x0940) || // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -// (0x0949 <= code && code <= 0x094C) || // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -// (0x094E <= code && code <= 0x094F) || // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW -// (0x0982 <= code && code <= 0x0983) || // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -// (0x09BF <= code && code <= 0x09C0) || // Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II -// (0x09C7 <= code && code <= 0x09C8) || // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -// (0x09CB <= code && code <= 0x09CC) || // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +// (0x093E <= code && code <= 0x0940) || // Mc [3] DEVANAGARI VOWEL +// SIGN AA..DEVANAGARI VOWEL SIGN II (0x0949 <= code && code <= 0x094C) +// || // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +// (0x094E <= code && code <= 0x094F) || // Mc [2] DEVANAGARI VOWEL +// SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW (0x0982 <= code && code +// <= 0x0983) || // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +// (0x09BF <= code && code <= 0x09C0) || // Mc [2] BENGALI VOWEL SIGN +// I..BENGALI VOWEL SIGN II (0x09C7 <= code && code <= 0x09C8) || // Mc +// [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI (0x09CB <= code && +// code <= 0x09CC) || // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU // 0x0A03 == code || // Mc GURMUKHI SIGN VISARGA -// (0x0A3E <= code && code <= 0x0A40) || // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -// 0x0A83 == code || // Mc GUJARATI SIGN VISARGA -// (0x0ABE <= code && code <= 0x0AC0) || // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -// 0x0AC9 == code || // Mc GUJARATI VOWEL SIGN CANDRA O -// (0x0ACB <= code && code <= 0x0ACC) || // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -// (0x0B02 <= code && code <= 0x0B03) || // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +// (0x0A3E <= code && code <= 0x0A40) || // Mc [3] GURMUKHI VOWEL SIGN +// AA..GURMUKHI VOWEL SIGN II 0x0A83 == code || // Mc GUJARATI SIGN +// VISARGA (0x0ABE <= code && code <= 0x0AC0) || // Mc [3] GUJARATI +// VOWEL SIGN AA..GUJARATI VOWEL SIGN II 0x0AC9 == code || // Mc +// GUJARATI VOWEL SIGN CANDRA O (0x0ACB <= code && code <= 0x0ACC) || // +// Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU (0x0B02 <= code +// && code <= 0x0B03) || // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA // 0x0B40 == code || // Mc ORIYA VOWEL SIGN II -// (0x0B47 <= code && code <= 0x0B48) || // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -// (0x0B4B <= code && code <= 0x0B4C) || // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -// 0x0BBF == code || // Mc TAMIL VOWEL SIGN I -// (0x0BC1 <= code && code <= 0x0BC2) || // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -// (0x0BC6 <= code && code <= 0x0BC8) || // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -// (0x0BCA <= code && code <= 0x0BCC) || // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -// (0x0C01 <= code && code <= 0x0C03) || // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -// (0x0C41 <= code && code <= 0x0C44) || // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -// (0x0C82 <= code && code <= 0x0C83) || // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -// 0x0CBE == code || // Mc KANNADA VOWEL SIGN AA -// (0x0CC0 <= code && code <= 0x0CC1) || // Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U -// (0x0CC3 <= code && code <= 0x0CC4) || // Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR -// (0x0CC7 <= code && code <= 0x0CC8) || // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -// (0x0CCA <= code && code <= 0x0CCB) || // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -// (0x0D02 <= code && code <= 0x0D03) || // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -// (0x0D3F <= code && code <= 0x0D40) || // Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II -// (0x0D46 <= code && code <= 0x0D48) || // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -// (0x0D4A <= code && code <= 0x0D4C) || // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -// (0x0D82 <= code && code <= 0x0D83) || // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -// (0x0DD0 <= code && code <= 0x0DD1) || // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -// (0x0DD8 <= code && code <= 0x0DDE) || // Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA -// (0x0DF2 <= code && code <= 0x0DF3) || // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +// (0x0B47 <= code && code <= 0x0B48) || // Mc [2] ORIYA VOWEL SIGN +// E..ORIYA VOWEL SIGN AI (0x0B4B <= code && code <= 0x0B4C) || // Mc +// [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU 0x0BBF == code || // Mc +// TAMIL VOWEL SIGN I (0x0BC1 <= code && code <= 0x0BC2) || // Mc [2] +// TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU (0x0BC6 <= code && code <= +// 0x0BC8) || // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI (0x0BCA +// <= code && code <= 0x0BCC) || // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL +// SIGN AU (0x0C01 <= code && code <= 0x0C03) || // Mc [3] TELUGU SIGN +// CANDRABINDU..TELUGU SIGN VISARGA (0x0C41 <= code && code <= 0x0C44) || +// // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR (0x0C82 +// <= code && code <= 0x0C83) || // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN +// VISARGA 0x0CBE == code || // Mc KANNADA VOWEL SIGN AA +// (0x0CC0 <= code && code <= 0x0CC1) || // Mc [2] KANNADA VOWEL SIGN +// II..KANNADA VOWEL SIGN U (0x0CC3 <= code && code <= 0x0CC4) || // Mc +// [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR +// (0x0CC7 <= code && code <= 0x0CC8) || // Mc [2] KANNADA VOWEL SIGN +// EE..KANNADA VOWEL SIGN AI (0x0CCA <= code && code <= 0x0CCB) || // Mc +// [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO (0x0D02 <= code && +// code <= 0x0D03) || // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN +// VISARGA (0x0D3F <= code && code <= 0x0D40) || // Mc [2] MALAYALAM +// VOWEL SIGN I..MALAYALAM VOWEL SIGN II (0x0D46 <= code && code <= +// 0x0D48) || // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +// (0x0D4A <= code && code <= 0x0D4C) || // Mc [3] MALAYALAM VOWEL SIGN +// O..MALAYALAM VOWEL SIGN AU (0x0D82 <= code && code <= 0x0D83) || // Mc +// [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA (0x0DD0 <= code && +// code <= 0x0DD1) || // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA +// VOWEL SIGN DIGA AEDA-PILLA (0x0DD8 <= code && code <= 0x0DDE) || // Mc +// [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA +// GAYANUKITTA (0x0DF2 <= code && code <= 0x0DF3) || // Mc [2] SINHALA +// VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA // 0x0E33 == code || // Lo THAI CHARACTER SARA AM // 0x0EB3 == code || // Lo LAO VOWEL SIGN AM -// (0x0F3E <= code && code <= 0x0F3F) || // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -// 0x0F7F == code || // Mc TIBETAN SIGN RNAM BCAD -// 0x1031 == code || // Mc MYANMAR VOWEL SIGN E -// (0x103B <= code && code <= 0x103C) || // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA -// (0x1056 <= code && code <= 0x1057) || // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -// 0x1084 == code || // Mc MYANMAR VOWEL SIGN SHAN E -// 0x17B6 == code || // Mc KHMER VOWEL SIGN AA -// (0x17BE <= code && code <= 0x17C5) || // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -// (0x17C7 <= code && code <= 0x17C8) || // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -// (0x1923 <= code && code <= 0x1926) || // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -// (0x1929 <= code && code <= 0x192B) || // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -// (0x1930 <= code && code <= 0x1931) || // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -// (0x1933 <= code && code <= 0x1938) || // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -// (0x1A19 <= code && code <= 0x1A1A) || // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O -// 0x1A55 == code || // Mc TAI THAM CONSONANT SIGN MEDIAL RA -// 0x1A57 == code || // Mc TAI THAM CONSONANT SIGN LA TANG LAI -// (0x1A6D <= code && code <= 0x1A72) || // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +// (0x0F3E <= code && code <= 0x0F3F) || // Mc [2] TIBETAN SIGN YAR +// TSHES..TIBETAN SIGN MAR TSHES 0x0F7F == code || // Mc TIBETAN +// SIGN RNAM BCAD 0x1031 == code || // Mc MYANMAR VOWEL SIGN E +// (0x103B <= code && code <= 0x103C) || // Mc [2] MYANMAR CONSONANT +// SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA (0x1056 <= code && +// code <= 0x1057) || // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL +// SIGN VOCALIC RR 0x1084 == code || // Mc MYANMAR VOWEL SIGN SHAN +// E 0x17B6 == code || // Mc KHMER VOWEL SIGN AA +// (0x17BE <= code && code <= 0x17C5) || // Mc [8] KHMER VOWEL SIGN +// OE..KHMER VOWEL SIGN AU (0x17C7 <= code && code <= 0x17C8) || // Mc +// [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU (0x1923 <= code && +// code <= 0x1926) || // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +// (0x1929 <= code && code <= 0x192B) || // Mc [3] LIMBU SUBJOINED +// LETTER YA..LIMBU SUBJOINED LETTER WA (0x1930 <= code && code <= +// 0x1931) || // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +// (0x1933 <= code && code <= 0x1938) || // Mc [6] LIMBU SMALL LETTER +// TA..LIMBU SMALL LETTER LA (0x1A19 <= code && code <= 0x1A1A) || // Mc +// [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O 0x1A55 == code || // +// Mc TAI THAM CONSONANT SIGN MEDIAL RA 0x1A57 == code || // Mc +// TAI THAM CONSONANT SIGN LA TANG LAI (0x1A6D <= code && code <= 0x1A72) +// || // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI // 0x1B04 == code || // Mc BALINESE SIGN BISAH // 0x1B35 == code || // Mc BALINESE VOWEL SIGN TEDUNG // 0x1B3B == code || // Mc BALINESE VOWEL SIGN RA REPA TEDUNG -// (0x1B3D <= code && code <= 0x1B41) || // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG -// (0x1B43 <= code && code <= 0x1B44) || // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG -// 0x1B82 == code || // Mc SUNDANESE SIGN PANGWISAD -// 0x1BA1 == code || // Mc SUNDANESE CONSONANT SIGN PAMINGKAL -// (0x1BA6 <= code && code <= 0x1BA7) || // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG -// 0x1BAA == code || // Mc SUNDANESE SIGN PAMAAEH -// 0x1BE7 == code || // Mc BATAK VOWEL SIGN E -// (0x1BEA <= code && code <= 0x1BEC) || // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O -// 0x1BEE == code || // Mc BATAK VOWEL SIGN U -// (0x1BF2 <= code && code <= 0x1BF3) || // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN -// (0x1C24 <= code && code <= 0x1C2B) || // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU -// (0x1C34 <= code && code <= 0x1C35) || // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG -// 0x1CE1 == code || // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA -// (0x1CF2 <= code && code <= 0x1CF3) || // Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA +// (0x1B3D <= code && code <= 0x1B41) || // Mc [5] BALINESE VOWEL SIGN +// LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG (0x1B43 <= +// code && code <= 0x1B44) || // Mc [2] BALINESE VOWEL SIGN PEPET +// TEDUNG..BALINESE ADEG ADEG 0x1B82 == code || // Mc SUNDANESE +// SIGN PANGWISAD 0x1BA1 == code || // Mc SUNDANESE CONSONANT SIGN +// PAMINGKAL (0x1BA6 <= code && code <= 0x1BA7) || // Mc [2] SUNDANESE +// VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG 0x1BAA == code || +// // Mc SUNDANESE SIGN PAMAAEH 0x1BE7 == code || // Mc BATAK +// VOWEL SIGN E (0x1BEA <= code && code <= 0x1BEC) || // Mc [3] BATAK +// VOWEL SIGN I..BATAK VOWEL SIGN O 0x1BEE == code || // Mc BATAK +// VOWEL SIGN U (0x1BF2 <= code && code <= 0x1BF3) || // Mc [2] BATAK +// PANGOLAT..BATAK PANONGONAN (0x1C24 <= code && code <= 0x1C2B) || // Mc +// [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU (0x1C34 <= code +// && code <= 0x1C35) || // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA +// CONSONANT SIGN KANG 0x1CE1 == code || // Mc VEDIC TONE +// ATHARVAVEDIC INDEPENDENT SVARITA (0x1CF2 <= code && code <= 0x1CF3) || +// // Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA // 0x1CF7 == code || // Mc VEDIC SIGN ATIKRAMA -// (0x_a823 <= code && code <= 0x_a824) || // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I -// 0x_a827 == code || // Mc SYLOTI NAGRI VOWEL SIGN OO -// (0x_a880 <= code && code <= 0x_a881) || // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA -// (0x_a8B4 <= code && code <= 0x_a8C3) || // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -// (0x_a952 <= code && code <= 0x_a953) || // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA -// 0x_a983 == code || // Mc JAVANESE SIGN WIGNYAN -// (0x_a9B4 <= code && code <= 0x_a9B5) || // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG -// (0x_a9BA <= code && code <= 0x_a9BB) || // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE -// (0x_a9BD <= code && code <= 0x_a9C0) || // Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON -// (0x_aA2F <= code && code <= 0x_aA30) || // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI -// (0x_aA33 <= code && code <= 0x_aA34) || // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA -// 0x_aA4D == code || // Mc CHAM CONSONANT SIGN FINAL H -// 0x_aAEB == code || // Mc MEETEI MAYEK VOWEL SIGN II -// (0x_aAEE <= code && code <= 0x_aAEF) || // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU -// 0x_aAF5 == code || // Mc MEETEI MAYEK VOWEL SIGN VISARGA -// (0x_aBE3 <= code && code <= 0x_aBE4) || // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP -// (0x_aBE6 <= code && code <= 0x_aBE7) || // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP -// (0x_aBE9 <= code && code <= 0x_aBEA) || // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG -// 0x_aBEC == code || // Mc MEETEI MAYEK LUM IYEK -// 0x11000 == code || // Mc BRAHMI SIGN CANDRABINDU -// 0x11002 == code || // Mc BRAHMI SIGN VISARGA -// 0x11082 == code || // Mc KAITHI SIGN VISARGA -// (0x110B0 <= code && code <= 0x110B2) || // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II -// (0x110B7 <= code && code <= 0x110B8) || // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU -// 0x1112C == code || // Mc CHAKMA VOWEL SIGN E -// 0x11182 == code || // Mc SHARADA SIGN VISARGA -// (0x111B3 <= code && code <= 0x111B5) || // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II -// (0x111BF <= code && code <= 0x111C0) || // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA -// (0x1122C <= code && code <= 0x1122E) || // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II -// (0x11232 <= code && code <= 0x11233) || // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU -// 0x11235 == code || // Mc KHOJKI SIGN VIRAMA -// (0x112E0 <= code && code <= 0x112E2) || // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II -// (0x11302 <= code && code <= 0x11303) || // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +// (0x_a823 <= code && code <= 0x_a824) || // Mc [2] SYLOTI NAGRI VOWEL +// SIGN A..SYLOTI NAGRI VOWEL SIGN I 0x_a827 == code || // Mc +// SYLOTI NAGRI VOWEL SIGN OO (0x_a880 <= code && code <= 0x_a881) || // +// Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA (0x_a8B4 <= +// code && code <= 0x_a8C3) || // Mc [16] SAURASHTRA CONSONANT SIGN +// HAARU..SAURASHTRA VOWEL SIGN AU (0x_a952 <= code && code <= 0x_a953) +// || // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA 0x_a983 == code +// || // Mc JAVANESE SIGN WIGNYAN (0x_a9B4 <= code && code <= +// 0x_a9B5) || // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN +// TOLONG (0x_a9BA <= code && code <= 0x_a9BB) || // Mc [2] JAVANESE +// VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE (0x_a9BD <= code && +// code <= 0x_a9C0) || // Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE +// PANGKON (0x_aA2F <= code && code <= 0x_aA30) || // Mc [2] CHAM VOWEL +// SIGN O..CHAM VOWEL SIGN AI (0x_aA33 <= code && code <= 0x_aA34) || // +// Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA 0x_aA4D == +// code || // Mc CHAM CONSONANT SIGN FINAL H 0x_aAEB == code || // +// Mc MEETEI MAYEK VOWEL SIGN II (0x_aAEE <= code && code <= +// 0x_aAEF) || // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN +// AAU 0x_aAF5 == code || // Mc MEETEI MAYEK VOWEL SIGN VISARGA +// (0x_aBE3 <= code && code <= 0x_aBE4) || // Mc [2] MEETEI MAYEK VOWEL +// SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP (0x_aBE6 <= code && code <= +// 0x_aBE7) || // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL +// SIGN SOUNAP (0x_aBE9 <= code && code <= 0x_aBEA) || // Mc [2] MEETEI +// MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG 0x_aBEC == code +// || // Mc MEETEI MAYEK LUM IYEK 0x11000 == code || // Mc +// BRAHMI SIGN CANDRABINDU 0x11002 == code || // Mc BRAHMI SIGN +// VISARGA 0x11082 == code || // Mc KAITHI SIGN VISARGA +// (0x110B0 <= code && code <= 0x110B2) || // Mc [3] KAITHI VOWEL SIGN +// AA..KAITHI VOWEL SIGN II (0x110B7 <= code && code <= 0x110B8) || // Mc +// [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU 0x1112C == code || // Mc +// CHAKMA VOWEL SIGN E 0x11182 == code || // Mc SHARADA SIGN +// VISARGA (0x111B3 <= code && code <= 0x111B5) || // Mc [3] SHARADA +// VOWEL SIGN AA..SHARADA VOWEL SIGN II (0x111BF <= code && code <= +// 0x111C0) || // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +// (0x1122C <= code && code <= 0x1122E) || // Mc [3] KHOJKI VOWEL SIGN +// AA..KHOJKI VOWEL SIGN II (0x11232 <= code && code <= 0x11233) || // Mc +// [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU 0x11235 == code || // Mc +// KHOJKI SIGN VIRAMA (0x112E0 <= code && code <= 0x112E2) || // Mc [3] +// KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II (0x11302 <= code && +// code <= 0x11303) || // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA // 0x1133F == code || // Mc GRANTHA VOWEL SIGN I -// (0x11341 <= code && code <= 0x11344) || // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR -// (0x11347 <= code && code <= 0x11348) || // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI -// (0x1134B <= code && code <= 0x1134D) || // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA -// (0x11362 <= code && code <= 0x11363) || // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL -// (0x11435 <= code && code <= 0x11437) || // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II -// (0x11440 <= code && code <= 0x11441) || // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU -// 0x11445 == code || // Mc NEWA SIGN VISARGA -// (0x114B1 <= code && code <= 0x114B2) || // Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II -// 0x114B9 == code || // Mc TIRHUTA VOWEL SIGN E -// (0x114BB <= code && code <= 0x114BC) || // Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O -// 0x114BE == code || // Mc TIRHUTA VOWEL SIGN AU -// 0x114C1 == code || // Mc TIRHUTA SIGN VISARGA -// (0x115B0 <= code && code <= 0x115B1) || // Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II -// (0x115B8 <= code && code <= 0x115BB) || // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +// (0x11341 <= code && code <= 0x11344) || // Mc [4] GRANTHA VOWEL SIGN +// U..GRANTHA VOWEL SIGN VOCALIC RR (0x11347 <= code && code <= 0x11348) +// || // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI (0x1134B +// <= code && code <= 0x1134D) || // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA +// SIGN VIRAMA (0x11362 <= code && code <= 0x11363) || // Mc [2] +// GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL (0x11435 +// <= code && code <= 0x11437) || // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL +// SIGN II (0x11440 <= code && code <= 0x11441) || // Mc [2] NEWA VOWEL +// SIGN O..NEWA VOWEL SIGN AU 0x11445 == code || // Mc NEWA SIGN +// VISARGA (0x114B1 <= code && code <= 0x114B2) || // Mc [2] TIRHUTA +// VOWEL SIGN I..TIRHUTA VOWEL SIGN II 0x114B9 == code || // Mc +// TIRHUTA VOWEL SIGN E (0x114BB <= code && code <= 0x114BC) || // Mc +// [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O 0x114BE == code || // +// Mc TIRHUTA VOWEL SIGN AU 0x114C1 == code || // Mc TIRHUTA +// SIGN VISARGA (0x115B0 <= code && code <= 0x115B1) || // Mc [2] +// SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II (0x115B8 <= code && code +// <= 0x115BB) || // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU // 0x115BE == code || // Mc SIDDHAM SIGN VISARGA -// (0x11630 <= code && code <= 0x11632) || // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II -// (0x1163B <= code && code <= 0x1163C) || // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU -// 0x1163E == code || // Mc MODI SIGN VISARGA -// 0x116AC == code || // Mc TAKRI SIGN VISARGA -// (0x116AE <= code && code <= 0x116AF) || // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II -// 0x116B6 == code || // Mc TAKRI SIGN VIRAMA -// (0x11720 <= code && code <= 0x11721) || // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA -// 0x11726 == code || // Mc AHOM VOWEL SIGN E -// (0x11A07 <= code && code <= 0x11A08) || // Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU -// 0x11A39 == code || // Mc ZANABAZAR SQUARE SIGN VISARGA -// (0x11A57 <= code && code <= 0x11A58) || // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +// (0x11630 <= code && code <= 0x11632) || // Mc [3] MODI VOWEL SIGN +// AA..MODI VOWEL SIGN II (0x1163B <= code && code <= 0x1163C) || // Mc +// [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU 0x1163E == code || // Mc +// MODI SIGN VISARGA 0x116AC == code || // Mc TAKRI SIGN VISARGA +// (0x116AE <= code && code <= 0x116AF) || // Mc [2] TAKRI VOWEL SIGN +// I..TAKRI VOWEL SIGN II 0x116B6 == code || // Mc TAKRI SIGN +// VIRAMA (0x11720 <= code && code <= 0x11721) || // Mc [2] AHOM VOWEL +// SIGN A..AHOM VOWEL SIGN AA 0x11726 == code || // Mc AHOM VOWEL +// SIGN E (0x11A07 <= code && code <= 0x11A08) || // Mc [2] ZANABAZAR +// SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU 0x11A39 == code +// || // Mc ZANABAZAR SQUARE SIGN VISARGA (0x11A57 <= code && code +// <= 0x11A58) || // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU // 0x11A97 == code || // Mc SOYOMBO SIGN VISARGA // 0x11C2F == code || // Mc BHAIKSUKI VOWEL SIGN AA // 0x11C3E == code || // Mc BHAIKSUKI SIGN VISARGA // 0x11CA9 == code || // Mc MARCHEN SUBJOINED LETTER YA // 0x11CB1 == code || // Mc MARCHEN VOWEL SIGN I // 0x11CB4 == code || // Mc MARCHEN VOWEL SIGN O -// (0x16F51 <= code && code <= 0x16F7E) || // Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG -// 0x1D166 == code || // Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -// 0x1D16D == code // Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT -// ){ +// (0x16F51 <= code && code <= 0x16F7E) || // Mc [46] MIAO SIGN +// ASPIRATION..MIAO VOWEL SIGN NG 0x1D166 == code || // Mc MUSICAL +// SYMBOL COMBINING SPRECHGESANG STEM 0x1D16D == code // Mc MUSICAL +// SYMBOL COMBINING AUGMENTATION DOT ){ // return SpacingMark; // } // // // if( -// (0x1100 <= code && code <= 0x115F) || // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER -// (0x_a960 <= code && code <= 0x_a97C) // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH -// ){ +// (0x1100 <= code && code <= 0x115F) || // Lo [96] HANGUL CHOSEONG +// KIYEOK..HANGUL CHOSEONG FILLER (0x_a960 <= code && code <= 0x_a97C) // +// Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH ){ // return L; // } // // if( -// (0x1160 <= code && code <= 0x11A7) || // Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE -// (0x_d7B0 <= code && code <= 0x_d7C6) // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E -// ){ +// (0x1160 <= code && code <= 0x11A7) || // Lo [72] HANGUL JUNGSEONG +// FILLER..HANGUL JUNGSEONG O-YAE (0x_d7B0 <= code && code <= 0x_d7C6) // +// Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E ){ // return V; // } // // // if( -// (0x11A8 <= code && code <= 0x11FF) || // Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN -// (0x_d7CB <= code && code <= 0x_d7FB) // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH -// ){ +// (0x11A8 <= code && code <= 0x11FF) || // Lo [88] HANGUL JONGSEONG +// KIYEOK..HANGUL JONGSEONG SSANGNIEUN (0x_d7CB <= code && code <= +// 0x_d7FB) // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG +// PHIEUPH-THIEUTH ){ // return T; // } // @@ -1378,448 +1505,601 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { // } // // if( -// (0x_aC01 <= code && code <= 0x_aC1B) || // Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH -// (0x_aC1D <= code && code <= 0x_aC37) || // Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH -// (0x_aC39 <= code && code <= 0x_aC53) || // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH -// (0x_aC55 <= code && code <= 0x_aC6F) || // Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH -// (0x_aC71 <= code && code <= 0x_aC8B) || // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH -// (0x_aC8D <= code && code <= 0x_aCA7) || // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH -// (0x_aCA9 <= code && code <= 0x_aCC3) || // Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH -// (0x_aCC5 <= code && code <= 0x_aCDF) || // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH -// (0x_aCE1 <= code && code <= 0x_aCFB) || // Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH -// (0x_aCFD <= code && code <= 0x_aD17) || // Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH -// (0x_aD19 <= code && code <= 0x_aD33) || // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH -// (0x_aD35 <= code && code <= 0x_aD4F) || // Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH -// (0x_aD51 <= code && code <= 0x_aD6B) || // Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH -// (0x_aD6D <= code && code <= 0x_aD87) || // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH -// (0x_aD89 <= code && code <= 0x_aDA3) || // Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH -// (0x_aDA5 <= code && code <= 0x_aDBF) || // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH -// (0x_aDC1 <= code && code <= 0x_aDDB) || // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH -// (0x_aDDD <= code && code <= 0x_aDF7) || // Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH -// (0x_aDF9 <= code && code <= 0x_aE13) || // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH -// (0x_aE15 <= code && code <= 0x_aE2F) || // Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH -// (0x_aE31 <= code && code <= 0x_aE4B) || // Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH -// (0x_aE4D <= code && code <= 0x_aE67) || // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH -// (0x_aE69 <= code && code <= 0x_aE83) || // Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH -// (0x_aE85 <= code && code <= 0x_aE9F) || // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH -// (0x_aEA1 <= code && code <= 0x_aEBB) || // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH -// (0x_aEBD <= code && code <= 0x_aED7) || // Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH -// (0x_aED9 <= code && code <= 0x_aEF3) || // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH -// (0x_aEF5 <= code && code <= 0x_aF0F) || // Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH -// (0x_aF11 <= code && code <= 0x_aF2B) || // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH -// (0x_aF2D <= code && code <= 0x_aF47) || // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH -// (0x_aF49 <= code && code <= 0x_aF63) || // Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH -// (0x_aF65 <= code && code <= 0x_aF7F) || // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH -// (0x_aF81 <= code && code <= 0x_aF9B) || // Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH -// (0x_aF9D <= code && code <= 0x_aFB7) || // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH -// (0x_aFB9 <= code && code <= 0x_aFD3) || // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH -// (0x_aFD5 <= code && code <= 0x_aFEF) || // Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH -// (0x_aFF1 <= code && code <= 0x_b00B) || // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH -// (0x_b00D <= code && code <= 0x_b027) || // Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH -// (0x_b029 <= code && code <= 0x_b043) || // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH -// (0x_b045 <= code && code <= 0x_b05F) || // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH -// (0x_b061 <= code && code <= 0x_b07B) || // Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH -// (0x_b07D <= code && code <= 0x_b097) || // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH -// (0x_b099 <= code && code <= 0x_b0B3) || // Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH -// (0x_b0B5 <= code && code <= 0x_b0CF) || // Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH -// (0x_b0D1 <= code && code <= 0x_b0EB) || // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH -// (0x_b0ED <= code && code <= 0x_b107) || // Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH -// (0x_b109 <= code && code <= 0x_b123) || // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH -// (0x_b125 <= code && code <= 0x_b13F) || // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH -// (0x_b141 <= code && code <= 0x_b15B) || // Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH -// (0x_b15D <= code && code <= 0x_b177) || // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH -// (0x_b179 <= code && code <= 0x_b193) || // Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH -// (0x_b195 <= code && code <= 0x_b1AF) || // Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH -// (0x_b1B1 <= code && code <= 0x_b1CB) || // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH -// (0x_b1CD <= code && code <= 0x_b1E7) || // Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH -// (0x_b1E9 <= code && code <= 0x_b203) || // Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH -// (0x_b205 <= code && code <= 0x_b21F) || // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH -// (0x_b221 <= code && code <= 0x_b23B) || // Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH -// (0x_b23D <= code && code <= 0x_b257) || // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH -// (0x_b259 <= code && code <= 0x_b273) || // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH -// (0x_b275 <= code && code <= 0x_b28F) || // Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH -// (0x_b291 <= code && code <= 0x_b2AB) || // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH -// (0x_b2AD <= code && code <= 0x_b2C7) || // Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH -// (0x_b2C9 <= code && code <= 0x_b2E3) || // Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH -// (0x_b2E5 <= code && code <= 0x_b2FF) || // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH -// (0x_b301 <= code && code <= 0x_b31B) || // Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH -// (0x_b31D <= code && code <= 0x_b337) || // Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH -// (0x_b339 <= code && code <= 0x_b353) || // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH -// (0x_b355 <= code && code <= 0x_b36F) || // Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH -// (0x_b371 <= code && code <= 0x_b38B) || // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH -// (0x_b38D <= code && code <= 0x_b3A7) || // Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH -// (0x_b3A9 <= code && code <= 0x_b3C3) || // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH -// (0x_b3C5 <= code && code <= 0x_b3DF) || // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH -// (0x_b3E1 <= code && code <= 0x_b3FB) || // Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH -// (0x_b3FD <= code && code <= 0x_b417) || // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH -// (0x_b419 <= code && code <= 0x_b433) || // Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH -// (0x_b435 <= code && code <= 0x_b44F) || // Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH -// (0x_b451 <= code && code <= 0x_b46B) || // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH -// (0x_b46D <= code && code <= 0x_b487) || // Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH -// (0x_b489 <= code && code <= 0x_b4A3) || // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH -// (0x_b4A5 <= code && code <= 0x_b4BF) || // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH -// (0x_b4C1 <= code && code <= 0x_b4DB) || // Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH -// (0x_b4DD <= code && code <= 0x_b4F7) || // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH -// (0x_b4F9 <= code && code <= 0x_b513) || // Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH -// (0x_b515 <= code && code <= 0x_b52F) || // Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH -// (0x_b531 <= code && code <= 0x_b54B) || // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH -// (0x_b54D <= code && code <= 0x_b567) || // Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH -// (0x_b569 <= code && code <= 0x_b583) || // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH -// (0x_b585 <= code && code <= 0x_b59F) || // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH -// (0x_b5A1 <= code && code <= 0x_b5BB) || // Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH -// (0x_b5BD <= code && code <= 0x_b5D7) || // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH -// (0x_b5D9 <= code && code <= 0x_b5F3) || // Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH -// (0x_b5F5 <= code && code <= 0x_b60F) || // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH -// (0x_b611 <= code && code <= 0x_b62B) || // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH -// (0x_b62D <= code && code <= 0x_b647) || // Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH -// (0x_b649 <= code && code <= 0x_b663) || // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH -// (0x_b665 <= code && code <= 0x_b67F) || // Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH -// (0x_b681 <= code && code <= 0x_b69B) || // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH -// (0x_b69D <= code && code <= 0x_b6B7) || // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH -// (0x_b6B9 <= code && code <= 0x_b6D3) || // Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH -// (0x_b6D5 <= code && code <= 0x_b6EF) || // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH -// (0x_b6F1 <= code && code <= 0x_b70B) || // Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH -// (0x_b70D <= code && code <= 0x_b727) || // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH -// (0x_b729 <= code && code <= 0x_b743) || // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH -// (0x_b745 <= code && code <= 0x_b75F) || // Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH -// (0x_b761 <= code && code <= 0x_b77B) || // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH -// (0x_b77D <= code && code <= 0x_b797) || // Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH -// (0x_b799 <= code && code <= 0x_b7B3) || // Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH -// (0x_b7B5 <= code && code <= 0x_b7CF) || // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH -// (0x_b7D1 <= code && code <= 0x_b7EB) || // Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH -// (0x_b7ED <= code && code <= 0x_b807) || // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH -// (0x_b809 <= code && code <= 0x_b823) || // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH -// (0x_b825 <= code && code <= 0x_b83F) || // Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH -// (0x_b841 <= code && code <= 0x_b85B) || // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH -// (0x_b85D <= code && code <= 0x_b877) || // Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH -// (0x_b879 <= code && code <= 0x_b893) || // Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH -// (0x_b895 <= code && code <= 0x_b8AF) || // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH -// (0x_b8B1 <= code && code <= 0x_b8CB) || // Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH -// (0x_b8CD <= code && code <= 0x_b8E7) || // Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH -// (0x_b8E9 <= code && code <= 0x_b903) || // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH -// (0x_b905 <= code && code <= 0x_b91F) || // Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH -// (0x_b921 <= code && code <= 0x_b93B) || // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH -// (0x_b93D <= code && code <= 0x_b957) || // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH -// (0x_b959 <= code && code <= 0x_b973) || // Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH -// (0x_b975 <= code && code <= 0x_b98F) || // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH -// (0x_b991 <= code && code <= 0x_b9AB) || // Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH -// (0x_b9AD <= code && code <= 0x_b9C7) || // Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH -// (0x_b9C9 <= code && code <= 0x_b9E3) || // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH -// (0x_b9E5 <= code && code <= 0x_b9FF) || // Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH -// (0x_bA01 <= code && code <= 0x_bA1B) || // Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH -// (0x_bA1D <= code && code <= 0x_bA37) || // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH -// (0x_bA39 <= code && code <= 0x_bA53) || // Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH -// (0x_bA55 <= code && code <= 0x_bA6F) || // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH -// (0x_bA71 <= code && code <= 0x_bA8B) || // Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH -// (0x_bA8D <= code && code <= 0x_bAA7) || // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH -// (0x_bAA9 <= code && code <= 0x_bAC3) || // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH -// (0x_bAC5 <= code && code <= 0x_bADF) || // Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH -// (0x_bAE1 <= code && code <= 0x_bAFB) || // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH -// (0x_bAFD <= code && code <= 0x_bB17) || // Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH -// (0x_bB19 <= code && code <= 0x_bB33) || // Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH -// (0x_bB35 <= code && code <= 0x_bB4F) || // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH -// (0x_bB51 <= code && code <= 0x_bB6B) || // Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH -// (0x_bB6D <= code && code <= 0x_bB87) || // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH -// (0x_bB89 <= code && code <= 0x_bBA3) || // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH -// (0x_bBA5 <= code && code <= 0x_bBBF) || // Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH -// (0x_bBC1 <= code && code <= 0x_bBDB) || // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH -// (0x_bBDD <= code && code <= 0x_bBF7) || // Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH -// (0x_bBF9 <= code && code <= 0x_bC13) || // Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH -// (0x_bC15 <= code && code <= 0x_bC2F) || // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH -// (0x_bC31 <= code && code <= 0x_bC4B) || // Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH -// (0x_bC4D <= code && code <= 0x_bC67) || // Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH -// (0x_bC69 <= code && code <= 0x_bC83) || // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH -// (0x_bC85 <= code && code <= 0x_bC9F) || // Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH -// (0x_bCA1 <= code && code <= 0x_bCBB) || // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH -// (0x_bCBD <= code && code <= 0x_bCD7) || // Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH -// (0x_bCD9 <= code && code <= 0x_bCF3) || // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH -// (0x_bCF5 <= code && code <= 0x_bD0F) || // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH -// (0x_bD11 <= code && code <= 0x_bD2B) || // Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH -// (0x_bD2D <= code && code <= 0x_bD47) || // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH -// (0x_bD49 <= code && code <= 0x_bD63) || // Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH -// (0x_bD65 <= code && code <= 0x_bD7F) || // Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH -// (0x_bD81 <= code && code <= 0x_bD9B) || // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH -// (0x_bD9D <= code && code <= 0x_bDB7) || // Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH -// (0x_bDB9 <= code && code <= 0x_bDD3) || // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH -// (0x_bDD5 <= code && code <= 0x_bDEF) || // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH -// (0x_bDF1 <= code && code <= 0x_bE0B) || // Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH -// (0x_bE0D <= code && code <= 0x_bE27) || // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH -// (0x_bE29 <= code && code <= 0x_bE43) || // Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH -// (0x_bE45 <= code && code <= 0x_bE5F) || // Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH -// (0x_bE61 <= code && code <= 0x_bE7B) || // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH -// (0x_bE7D <= code && code <= 0x_bE97) || // Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH -// (0x_bE99 <= code && code <= 0x_bEB3) || // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH -// (0x_bEB5 <= code && code <= 0x_bECF) || // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH -// (0x_bED1 <= code && code <= 0x_bEEB) || // Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH -// (0x_bEED <= code && code <= 0x_bF07) || // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH -// (0x_bF09 <= code && code <= 0x_bF23) || // Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH -// (0x_bF25 <= code && code <= 0x_bF3F) || // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH -// (0x_bF41 <= code && code <= 0x_bF5B) || // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH -// (0x_bF5D <= code && code <= 0x_bF77) || // Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH -// (0x_bF79 <= code && code <= 0x_bF93) || // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH -// (0x_bF95 <= code && code <= 0x_bFAF) || // Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH -// (0x_bFB1 <= code && code <= 0x_bFCB) || // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH -// (0x_bFCD <= code && code <= 0x_bFE7) || // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH -// (0x_bFE9 <= code && code <= 0x_c003) || // Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH -// (0x_c005 <= code && code <= 0x_c01F) || // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH -// (0x_c021 <= code && code <= 0x_c03B) || // Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH -// (0x_c03D <= code && code <= 0x_c057) || // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH -// (0x_c059 <= code && code <= 0x_c073) || // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH -// (0x_c075 <= code && code <= 0x_c08F) || // Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH -// (0x_c091 <= code && code <= 0x_c0AB) || // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH -// (0x_c0AD <= code && code <= 0x_c0C7) || // Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH -// (0x_c0C9 <= code && code <= 0x_c0E3) || // Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH -// (0x_c0E5 <= code && code <= 0x_c0FF) || // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH -// (0x_c101 <= code && code <= 0x_c11B) || // Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH -// (0x_c11D <= code && code <= 0x_c137) || // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH -// (0x_c139 <= code && code <= 0x_c153) || // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH -// (0x_c155 <= code && code <= 0x_c16F) || // Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH -// (0x_c171 <= code && code <= 0x_c18B) || // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH -// (0x_c18D <= code && code <= 0x_c1A7) || // Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH -// (0x_c1A9 <= code && code <= 0x_c1C3) || // Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH -// (0x_c1C5 <= code && code <= 0x_c1DF) || // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH -// (0x_c1E1 <= code && code <= 0x_c1FB) || // Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH -// (0x_c1FD <= code && code <= 0x_c217) || // Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH -// (0x_c219 <= code && code <= 0x_c233) || // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH -// (0x_c235 <= code && code <= 0x_c24F) || // Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH -// (0x_c251 <= code && code <= 0x_c26B) || // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH -// (0x_c26D <= code && code <= 0x_c287) || // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH -// (0x_c289 <= code && code <= 0x_c2A3) || // Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH -// (0x_c2A5 <= code && code <= 0x_c2BF) || // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH -// (0x_c2C1 <= code && code <= 0x_c2DB) || // Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH -// (0x_c2DD <= code && code <= 0x_c2F7) || // Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH -// (0x_c2F9 <= code && code <= 0x_c313) || // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH -// (0x_c315 <= code && code <= 0x_c32F) || // Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH -// (0x_c331 <= code && code <= 0x_c34B) || // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH -// (0x_c34D <= code && code <= 0x_c367) || // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH -// (0x_c369 <= code && code <= 0x_c383) || // Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH -// (0x_c385 <= code && code <= 0x_c39F) || // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH -// (0x_c3A1 <= code && code <= 0x_c3BB) || // Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH -// (0x_c3BD <= code && code <= 0x_c3D7) || // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH -// (0x_c3D9 <= code && code <= 0x_c3F3) || // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH -// (0x_c3F5 <= code && code <= 0x_c40F) || // Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH -// (0x_c411 <= code && code <= 0x_c42B) || // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH -// (0x_c42D <= code && code <= 0x_c447) || // Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH -// (0x_c449 <= code && code <= 0x_c463) || // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH -// (0x_c465 <= code && code <= 0x_c47F) || // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH -// (0x_c481 <= code && code <= 0x_c49B) || // Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH -// (0x_c49D <= code && code <= 0x_c4B7) || // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH -// (0x_c4B9 <= code && code <= 0x_c4D3) || // Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH -// (0x_c4D5 <= code && code <= 0x_c4EF) || // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH -// (0x_c4F1 <= code && code <= 0x_c50B) || // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH -// (0x_c50D <= code && code <= 0x_c527) || // Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH -// (0x_c529 <= code && code <= 0x_c543) || // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH -// (0x_c545 <= code && code <= 0x_c55F) || // Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH -// (0x_c561 <= code && code <= 0x_c57B) || // Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH -// (0x_c57D <= code && code <= 0x_c597) || // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH -// (0x_c599 <= code && code <= 0x_c5B3) || // Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH -// (0x_c5B5 <= code && code <= 0x_c5CF) || // Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH -// (0x_c5D1 <= code && code <= 0x_c5EB) || // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH -// (0x_c5ED <= code && code <= 0x_c607) || // Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH -// (0x_c609 <= code && code <= 0x_c623) || // Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH -// (0x_c625 <= code && code <= 0x_c63F) || // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH -// (0x_c641 <= code && code <= 0x_c65B) || // Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH -// (0x_c65D <= code && code <= 0x_c677) || // Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH -// (0x_c679 <= code && code <= 0x_c693) || // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH -// (0x_c695 <= code && code <= 0x_c6AF) || // Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH -// (0x_c6B1 <= code && code <= 0x_c6CB) || // Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH -// (0x_c6CD <= code && code <= 0x_c6E7) || // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH -// (0x_c6E9 <= code && code <= 0x_c703) || // Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH -// (0x_c705 <= code && code <= 0x_c71F) || // Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH -// (0x_c721 <= code && code <= 0x_c73B) || // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH -// (0x_c73D <= code && code <= 0x_c757) || // Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH -// (0x_c759 <= code && code <= 0x_c773) || // Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH -// (0x_c775 <= code && code <= 0x_c78F) || // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH -// (0x_c791 <= code && code <= 0x_c7AB) || // Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH -// (0x_c7AD <= code && code <= 0x_c7C7) || // Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH -// (0x_c7C9 <= code && code <= 0x_c7E3) || // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH -// (0x_c7E5 <= code && code <= 0x_c7FF) || // Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH -// (0x_c801 <= code && code <= 0x_c81B) || // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH -// (0x_c81D <= code && code <= 0x_c837) || // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH -// (0x_c839 <= code && code <= 0x_c853) || // Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH -// (0x_c855 <= code && code <= 0x_c86F) || // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH -// (0x_c871 <= code && code <= 0x_c88B) || // Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH -// (0x_c88D <= code && code <= 0x_c8A7) || // Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH -// (0x_c8A9 <= code && code <= 0x_c8C3) || // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH -// (0x_c8C5 <= code && code <= 0x_c8DF) || // Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH -// (0x_c8E1 <= code && code <= 0x_c8FB) || // Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH -// (0x_c8FD <= code && code <= 0x_c917) || // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH -// (0x_c919 <= code && code <= 0x_c933) || // Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH -// (0x_c935 <= code && code <= 0x_c94F) || // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH -// (0x_c951 <= code && code <= 0x_c96B) || // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH -// (0x_c96D <= code && code <= 0x_c987) || // Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH -// (0x_c989 <= code && code <= 0x_c9A3) || // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH -// (0x_c9A5 <= code && code <= 0x_c9BF) || // Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH -// (0x_c9C1 <= code && code <= 0x_c9DB) || // Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH -// (0x_c9DD <= code && code <= 0x_c9F7) || // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH -// (0x_c9F9 <= code && code <= 0x_cA13) || // Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH -// (0x_cA15 <= code && code <= 0x_cA2F) || // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH -// (0x_cA31 <= code && code <= 0x_cA4B) || // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH -// (0x_cA4D <= code && code <= 0x_cA67) || // Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH -// (0x_cA69 <= code && code <= 0x_cA83) || // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH -// (0x_cA85 <= code && code <= 0x_cA9F) || // Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH -// (0x_cAA1 <= code && code <= 0x_cABB) || // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH -// (0x_cABD <= code && code <= 0x_cAD7) || // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH -// (0x_cAD9 <= code && code <= 0x_cAF3) || // Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH -// (0x_cAF5 <= code && code <= 0x_cB0F) || // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH -// (0x_cB11 <= code && code <= 0x_cB2B) || // Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH -// (0x_cB2D <= code && code <= 0x_cB47) || // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH -// (0x_cB49 <= code && code <= 0x_cB63) || // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH -// (0x_cB65 <= code && code <= 0x_cB7F) || // Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH -// (0x_cB81 <= code && code <= 0x_cB9B) || // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH -// (0x_cB9D <= code && code <= 0x_cBB7) || // Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH -// (0x_cBB9 <= code && code <= 0x_cBD3) || // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH -// (0x_cBD5 <= code && code <= 0x_cBEF) || // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH -// (0x_cBF1 <= code && code <= 0x_cC0B) || // Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH -// (0x_cC0D <= code && code <= 0x_cC27) || // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH -// (0x_cC29 <= code && code <= 0x_cC43) || // Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH -// (0x_cC45 <= code && code <= 0x_cC5F) || // Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH -// (0x_cC61 <= code && code <= 0x_cC7B) || // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH -// (0x_cC7D <= code && code <= 0x_cC97) || // Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH -// (0x_cC99 <= code && code <= 0x_cCB3) || // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH -// (0x_cCB5 <= code && code <= 0x_cCCF) || // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH -// (0x_cCD1 <= code && code <= 0x_cCEB) || // Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH -// (0x_cCED <= code && code <= 0x_cD07) || // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH -// (0x_cD09 <= code && code <= 0x_cD23) || // Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH -// (0x_cD25 <= code && code <= 0x_cD3F) || // Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH -// (0x_cD41 <= code && code <= 0x_cD5B) || // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH -// (0x_cD5D <= code && code <= 0x_cD77) || // Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH -// (0x_cD79 <= code && code <= 0x_cD93) || // Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH -// (0x_cD95 <= code && code <= 0x_cDAF) || // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH -// (0x_cDB1 <= code && code <= 0x_cDCB) || // Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH -// (0x_cDCD <= code && code <= 0x_cDE7) || // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH -// (0x_cDE9 <= code && code <= 0x_cE03) || // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH -// (0x_cE05 <= code && code <= 0x_cE1F) || // Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH -// (0x_cE21 <= code && code <= 0x_cE3B) || // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH -// (0x_cE3D <= code && code <= 0x_cE57) || // Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH -// (0x_cE59 <= code && code <= 0x_cE73) || // Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH -// (0x_cE75 <= code && code <= 0x_cE8F) || // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH -// (0x_cE91 <= code && code <= 0x_cEAB) || // Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH -// (0x_cEAD <= code && code <= 0x_cEC7) || // Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH -// (0x_cEC9 <= code && code <= 0x_cEE3) || // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH -// (0x_cEE5 <= code && code <= 0x_cEFF) || // Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH -// (0x_cF01 <= code && code <= 0x_cF1B) || // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH -// (0x_cF1D <= code && code <= 0x_cF37) || // Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH -// (0x_cF39 <= code && code <= 0x_cF53) || // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH -// (0x_cF55 <= code && code <= 0x_cF6F) || // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH -// (0x_cF71 <= code && code <= 0x_cF8B) || // Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH -// (0x_cF8D <= code && code <= 0x_cFA7) || // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH -// (0x_cFA9 <= code && code <= 0x_cFC3) || // Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH -// (0x_cFC5 <= code && code <= 0x_cFDF) || // Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH -// (0x_cFE1 <= code && code <= 0x_cFFB) || // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH -// (0x_cFFD <= code && code <= 0x_d017) || // Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH -// (0x_d019 <= code && code <= 0x_d033) || // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH -// (0x_d035 <= code && code <= 0x_d04F) || // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH -// (0x_d051 <= code && code <= 0x_d06B) || // Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH -// (0x_d06D <= code && code <= 0x_d087) || // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH -// (0x_d089 <= code && code <= 0x_d0A3) || // Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH -// (0x_d0A5 <= code && code <= 0x_d0BF) || // Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH -// (0x_d0C1 <= code && code <= 0x_d0DB) || // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH -// (0x_d0DD <= code && code <= 0x_d0F7) || // Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH -// (0x_d0F9 <= code && code <= 0x_d113) || // Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH -// (0x_d115 <= code && code <= 0x_d12F) || // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH -// (0x_d131 <= code && code <= 0x_d14B) || // Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH -// (0x_d14D <= code && code <= 0x_d167) || // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH -// (0x_d169 <= code && code <= 0x_d183) || // Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH -// (0x_d185 <= code && code <= 0x_d19F) || // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH -// (0x_d1A1 <= code && code <= 0x_d1BB) || // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH -// (0x_d1BD <= code && code <= 0x_d1D7) || // Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH -// (0x_d1D9 <= code && code <= 0x_d1F3) || // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH -// (0x_d1F5 <= code && code <= 0x_d20F) || // Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH -// (0x_d211 <= code && code <= 0x_d22B) || // Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH -// (0x_d22D <= code && code <= 0x_d247) || // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH -// (0x_d249 <= code && code <= 0x_d263) || // Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH -// (0x_d265 <= code && code <= 0x_d27F) || // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH -// (0x_d281 <= code && code <= 0x_d29B) || // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH -// (0x_d29D <= code && code <= 0x_d2B7) || // Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH -// (0x_d2B9 <= code && code <= 0x_d2D3) || // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH -// (0x_d2D5 <= code && code <= 0x_d2EF) || // Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH -// (0x_d2F1 <= code && code <= 0x_d30B) || // Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH -// (0x_d30D <= code && code <= 0x_d327) || // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH -// (0x_d329 <= code && code <= 0x_d343) || // Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH -// (0x_d345 <= code && code <= 0x_d35F) || // Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH -// (0x_d361 <= code && code <= 0x_d37B) || // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH -// (0x_d37D <= code && code <= 0x_d397) || // Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH -// (0x_d399 <= code && code <= 0x_d3B3) || // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH -// (0x_d3B5 <= code && code <= 0x_d3CF) || // Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH -// (0x_d3D1 <= code && code <= 0x_d3EB) || // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH -// (0x_d3ED <= code && code <= 0x_d407) || // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH -// (0x_d409 <= code && code <= 0x_d423) || // Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH -// (0x_d425 <= code && code <= 0x_d43F) || // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH -// (0x_d441 <= code && code <= 0x_d45B) || // Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH -// (0x_d45D <= code && code <= 0x_d477) || // Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH -// (0x_d479 <= code && code <= 0x_d493) || // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH -// (0x_d495 <= code && code <= 0x_d4AF) || // Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH -// (0x_d4B1 <= code && code <= 0x_d4CB) || // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH -// (0x_d4CD <= code && code <= 0x_d4E7) || // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH -// (0x_d4E9 <= code && code <= 0x_d503) || // Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH -// (0x_d505 <= code && code <= 0x_d51F) || // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH -// (0x_d521 <= code && code <= 0x_d53B) || // Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH -// (0x_d53D <= code && code <= 0x_d557) || // Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH -// (0x_d559 <= code && code <= 0x_d573) || // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH -// (0x_d575 <= code && code <= 0x_d58F) || // Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH -// (0x_d591 <= code && code <= 0x_d5AB) || // Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH -// (0x_d5AD <= code && code <= 0x_d5C7) || // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH -// (0x_d5C9 <= code && code <= 0x_d5E3) || // Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH -// (0x_d5E5 <= code && code <= 0x_d5FF) || // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH -// (0x_d601 <= code && code <= 0x_d61B) || // Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH -// (0x_d61D <= code && code <= 0x_d637) || // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH -// (0x_d639 <= code && code <= 0x_d653) || // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH -// (0x_d655 <= code && code <= 0x_d66F) || // Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH -// (0x_d671 <= code && code <= 0x_d68B) || // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH -// (0x_d68D <= code && code <= 0x_d6A7) || // Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH -// (0x_d6A9 <= code && code <= 0x_d6C3) || // Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH -// (0x_d6C5 <= code && code <= 0x_d6DF) || // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH -// (0x_d6E1 <= code && code <= 0x_d6FB) || // Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH -// (0x_d6FD <= code && code <= 0x_d717) || // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH -// (0x_d719 <= code && code <= 0x_d733) || // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH -// (0x_d735 <= code && code <= 0x_d74F) || // Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH -// (0x_d751 <= code && code <= 0x_d76B) || // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH -// (0x_d76D <= code && code <= 0x_d787) || // Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH -// (0x_d789 <= code && code <= 0x_d7A3) // Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH -// ){ +// (0x_aC01 <= code && code <= 0x_aC1B) || // Lo [27] HANGUL SYLLABLE +// GAG..HANGUL SYLLABLE GAH (0x_aC1D <= code && code <= 0x_aC37) || // Lo +// [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH (0x_aC39 <= code && +// code <= 0x_aC53) || // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH +// (0x_aC55 <= code && code <= 0x_aC6F) || // Lo [27] HANGUL SYLLABLE +// GYAEG..HANGUL SYLLABLE GYAEH (0x_aC71 <= code && code <= 0x_aC8B) || +// // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH (0x_aC8D <= +// code && code <= 0x_aCA7) || // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE +// GEH (0x_aCA9 <= code && code <= 0x_aCC3) || // Lo [27] HANGUL +// SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH (0x_aCC5 <= code && code <= +// 0x_aCDF) || // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH +// (0x_aCE1 <= code && code <= 0x_aCFB) || // Lo [27] HANGUL SYLLABLE +// GOG..HANGUL SYLLABLE GOH (0x_aCFD <= code && code <= 0x_aD17) || // Lo +// [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH (0x_aD19 <= code && +// code <= 0x_aD33) || // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH +// (0x_aD35 <= code && code <= 0x_aD4F) || // Lo [27] HANGUL SYLLABLE +// GOEG..HANGUL SYLLABLE GOEH (0x_aD51 <= code && code <= 0x_aD6B) || // +// Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH (0x_aD6D <= code +// && code <= 0x_aD87) || // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH +// (0x_aD89 <= code && code <= 0x_aDA3) || // Lo [27] HANGUL SYLLABLE +// GWEOG..HANGUL SYLLABLE GWEOH (0x_aDA5 <= code && code <= 0x_aDBF) || +// // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH (0x_aDC1 <= +// code && code <= 0x_aDDB) || // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE +// GWIH (0x_aDDD <= code && code <= 0x_aDF7) || // Lo [27] HANGUL +// SYLLABLE GYUG..HANGUL SYLLABLE GYUH (0x_aDF9 <= code && code <= +// 0x_aE13) || // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH +// (0x_aE15 <= code && code <= 0x_aE2F) || // Lo [27] HANGUL SYLLABLE +// GYIG..HANGUL SYLLABLE GYIH (0x_aE31 <= code && code <= 0x_aE4B) || // +// Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH (0x_aE4D <= code && +// code <= 0x_aE67) || // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH +// (0x_aE69 <= code && code <= 0x_aE83) || // Lo [27] HANGUL SYLLABLE +// GGAEG..HANGUL SYLLABLE GGAEH (0x_aE85 <= code && code <= 0x_aE9F) || +// // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH (0x_aEA1 <= +// code && code <= 0x_aEBB) || // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL +// SYLLABLE GGYAEH (0x_aEBD <= code && code <= 0x_aED7) || // Lo [27] +// HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH (0x_aED9 <= code && code +// <= 0x_aEF3) || // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH +// (0x_aEF5 <= code && code <= 0x_aF0F) || // Lo [27] HANGUL SYLLABLE +// GGYEOG..HANGUL SYLLABLE GGYEOH (0x_aF11 <= code && code <= 0x_aF2B) || +// // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH (0x_aF2D <= +// code && code <= 0x_aF47) || // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE +// GGOH (0x_aF49 <= code && code <= 0x_aF63) || // Lo [27] HANGUL +// SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH (0x_aF65 <= code && code <= +// 0x_aF7F) || // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH +// (0x_aF81 <= code && code <= 0x_aF9B) || // Lo [27] HANGUL SYLLABLE +// GGOEG..HANGUL SYLLABLE GGOEH (0x_aF9D <= code && code <= 0x_aFB7) || +// // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH (0x_aFB9 <= +// code && code <= 0x_aFD3) || // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE +// GGUH (0x_aFD5 <= code && code <= 0x_aFEF) || // Lo [27] HANGUL +// SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH (0x_aFF1 <= code && code <= +// 0x_b00B) || // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH +// (0x_b00D <= code && code <= 0x_b027) || // Lo [27] HANGUL SYLLABLE +// GGWIG..HANGUL SYLLABLE GGWIH (0x_b029 <= code && code <= 0x_b043) || +// // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH (0x_b045 <= +// code && code <= 0x_b05F) || // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL +// SYLLABLE GGEUH (0x_b061 <= code && code <= 0x_b07B) || // Lo [27] +// HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH (0x_b07D <= code && code +// <= 0x_b097) || // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH +// (0x_b099 <= code && code <= 0x_b0B3) || // Lo [27] HANGUL SYLLABLE +// NAG..HANGUL SYLLABLE NAH (0x_b0B5 <= code && code <= 0x_b0CF) || // Lo +// [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH (0x_b0D1 <= code && +// code <= 0x_b0EB) || // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH +// (0x_b0ED <= code && code <= 0x_b107) || // Lo [27] HANGUL SYLLABLE +// NYAEG..HANGUL SYLLABLE NYAEH (0x_b109 <= code && code <= 0x_b123) || +// // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH (0x_b125 <= +// code && code <= 0x_b13F) || // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE +// NEH (0x_b141 <= code && code <= 0x_b15B) || // Lo [27] HANGUL +// SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH (0x_b15D <= code && code <= +// 0x_b177) || // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH +// (0x_b179 <= code && code <= 0x_b193) || // Lo [27] HANGUL SYLLABLE +// NOG..HANGUL SYLLABLE NOH (0x_b195 <= code && code <= 0x_b1AF) || // Lo +// [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH (0x_b1B1 <= code && +// code <= 0x_b1CB) || // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH +// (0x_b1CD <= code && code <= 0x_b1E7) || // Lo [27] HANGUL SYLLABLE +// NOEG..HANGUL SYLLABLE NOEH (0x_b1E9 <= code && code <= 0x_b203) || // +// Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH (0x_b205 <= code +// && code <= 0x_b21F) || // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH +// (0x_b221 <= code && code <= 0x_b23B) || // Lo [27] HANGUL SYLLABLE +// NWEOG..HANGUL SYLLABLE NWEOH (0x_b23D <= code && code <= 0x_b257) || +// // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH (0x_b259 <= +// code && code <= 0x_b273) || // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE +// NWIH (0x_b275 <= code && code <= 0x_b28F) || // Lo [27] HANGUL +// SYLLABLE NYUG..HANGUL SYLLABLE NYUH (0x_b291 <= code && code <= +// 0x_b2AB) || // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH +// (0x_b2AD <= code && code <= 0x_b2C7) || // Lo [27] HANGUL SYLLABLE +// NYIG..HANGUL SYLLABLE NYIH (0x_b2C9 <= code && code <= 0x_b2E3) || // +// Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH (0x_b2E5 <= code && +// code <= 0x_b2FF) || // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH +// (0x_b301 <= code && code <= 0x_b31B) || // Lo [27] HANGUL SYLLABLE +// DAEG..HANGUL SYLLABLE DAEH (0x_b31D <= code && code <= 0x_b337) || // +// Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH (0x_b339 <= code +// && code <= 0x_b353) || // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE +// DYAEH (0x_b355 <= code && code <= 0x_b36F) || // Lo [27] HANGUL +// SYLLABLE DEOG..HANGUL SYLLABLE DEOH (0x_b371 <= code && code <= +// 0x_b38B) || // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH +// (0x_b38D <= code && code <= 0x_b3A7) || // Lo [27] HANGUL SYLLABLE +// DYEOG..HANGUL SYLLABLE DYEOH (0x_b3A9 <= code && code <= 0x_b3C3) || +// // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH (0x_b3C5 <= +// code && code <= 0x_b3DF) || // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE +// DOH (0x_b3E1 <= code && code <= 0x_b3FB) || // Lo [27] HANGUL +// SYLLABLE DWAG..HANGUL SYLLABLE DWAH (0x_b3FD <= code && code <= +// 0x_b417) || // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH +// (0x_b419 <= code && code <= 0x_b433) || // Lo [27] HANGUL SYLLABLE +// DOEG..HANGUL SYLLABLE DOEH (0x_b435 <= code && code <= 0x_b44F) || // +// Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH (0x_b451 <= code +// && code <= 0x_b46B) || // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH +// (0x_b46D <= code && code <= 0x_b487) || // Lo [27] HANGUL SYLLABLE +// DWEOG..HANGUL SYLLABLE DWEOH (0x_b489 <= code && code <= 0x_b4A3) || +// // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH (0x_b4A5 <= +// code && code <= 0x_b4BF) || // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE +// DWIH (0x_b4C1 <= code && code <= 0x_b4DB) || // Lo [27] HANGUL +// SYLLABLE DYUG..HANGUL SYLLABLE DYUH (0x_b4DD <= code && code <= +// 0x_b4F7) || // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH +// (0x_b4F9 <= code && code <= 0x_b513) || // Lo [27] HANGUL SYLLABLE +// DYIG..HANGUL SYLLABLE DYIH (0x_b515 <= code && code <= 0x_b52F) || // +// Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH (0x_b531 <= code && +// code <= 0x_b54B) || // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH +// (0x_b54D <= code && code <= 0x_b567) || // Lo [27] HANGUL SYLLABLE +// DDAEG..HANGUL SYLLABLE DDAEH (0x_b569 <= code && code <= 0x_b583) || +// // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH (0x_b585 <= +// code && code <= 0x_b59F) || // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL +// SYLLABLE DDYAEH (0x_b5A1 <= code && code <= 0x_b5BB) || // Lo [27] +// HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH (0x_b5BD <= code && code +// <= 0x_b5D7) || // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH +// (0x_b5D9 <= code && code <= 0x_b5F3) || // Lo [27] HANGUL SYLLABLE +// DDYEOG..HANGUL SYLLABLE DDYEOH (0x_b5F5 <= code && code <= 0x_b60F) || +// // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH (0x_b611 <= +// code && code <= 0x_b62B) || // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE +// DDOH (0x_b62D <= code && code <= 0x_b647) || // Lo [27] HANGUL +// SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH (0x_b649 <= code && code <= +// 0x_b663) || // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH +// (0x_b665 <= code && code <= 0x_b67F) || // Lo [27] HANGUL SYLLABLE +// DDOEG..HANGUL SYLLABLE DDOEH (0x_b681 <= code && code <= 0x_b69B) || +// // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH (0x_b69D <= +// code && code <= 0x_b6B7) || // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE +// DDUH (0x_b6B9 <= code && code <= 0x_b6D3) || // Lo [27] HANGUL +// SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH (0x_b6D5 <= code && code <= +// 0x_b6EF) || // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH +// (0x_b6F1 <= code && code <= 0x_b70B) || // Lo [27] HANGUL SYLLABLE +// DDWIG..HANGUL SYLLABLE DDWIH (0x_b70D <= code && code <= 0x_b727) || +// // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH (0x_b729 <= +// code && code <= 0x_b743) || // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL +// SYLLABLE DDEUH (0x_b745 <= code && code <= 0x_b75F) || // Lo [27] +// HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH (0x_b761 <= code && code +// <= 0x_b77B) || // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH +// (0x_b77D <= code && code <= 0x_b797) || // Lo [27] HANGUL SYLLABLE +// RAG..HANGUL SYLLABLE RAH (0x_b799 <= code && code <= 0x_b7B3) || // Lo +// [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH (0x_b7B5 <= code && +// code <= 0x_b7CF) || // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH +// (0x_b7D1 <= code && code <= 0x_b7EB) || // Lo [27] HANGUL SYLLABLE +// RYAEG..HANGUL SYLLABLE RYAEH (0x_b7ED <= code && code <= 0x_b807) || +// // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH (0x_b809 <= +// code && code <= 0x_b823) || // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE +// REH (0x_b825 <= code && code <= 0x_b83F) || // Lo [27] HANGUL +// SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH (0x_b841 <= code && code <= +// 0x_b85B) || // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH +// (0x_b85D <= code && code <= 0x_b877) || // Lo [27] HANGUL SYLLABLE +// ROG..HANGUL SYLLABLE ROH (0x_b879 <= code && code <= 0x_b893) || // Lo +// [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH (0x_b895 <= code && +// code <= 0x_b8AF) || // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH +// (0x_b8B1 <= code && code <= 0x_b8CB) || // Lo [27] HANGUL SYLLABLE +// ROEG..HANGUL SYLLABLE ROEH (0x_b8CD <= code && code <= 0x_b8E7) || // +// Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH (0x_b8E9 <= code +// && code <= 0x_b903) || // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH +// (0x_b905 <= code && code <= 0x_b91F) || // Lo [27] HANGUL SYLLABLE +// RWEOG..HANGUL SYLLABLE RWEOH (0x_b921 <= code && code <= 0x_b93B) || +// // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH (0x_b93D <= +// code && code <= 0x_b957) || // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE +// RWIH (0x_b959 <= code && code <= 0x_b973) || // Lo [27] HANGUL +// SYLLABLE RYUG..HANGUL SYLLABLE RYUH (0x_b975 <= code && code <= +// 0x_b98F) || // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH +// (0x_b991 <= code && code <= 0x_b9AB) || // Lo [27] HANGUL SYLLABLE +// RYIG..HANGUL SYLLABLE RYIH (0x_b9AD <= code && code <= 0x_b9C7) || // +// Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH (0x_b9C9 <= code && +// code <= 0x_b9E3) || // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH +// (0x_b9E5 <= code && code <= 0x_b9FF) || // Lo [27] HANGUL SYLLABLE +// MAEG..HANGUL SYLLABLE MAEH (0x_bA01 <= code && code <= 0x_bA1B) || // +// Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH (0x_bA1D <= code +// && code <= 0x_bA37) || // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE +// MYAEH (0x_bA39 <= code && code <= 0x_bA53) || // Lo [27] HANGUL +// SYLLABLE MEOG..HANGUL SYLLABLE MEOH (0x_bA55 <= code && code <= +// 0x_bA6F) || // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH +// (0x_bA71 <= code && code <= 0x_bA8B) || // Lo [27] HANGUL SYLLABLE +// MYEOG..HANGUL SYLLABLE MYEOH (0x_bA8D <= code && code <= 0x_bAA7) || +// // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH (0x_bAA9 <= +// code && code <= 0x_bAC3) || // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE +// MOH (0x_bAC5 <= code && code <= 0x_bADF) || // Lo [27] HANGUL +// SYLLABLE MWAG..HANGUL SYLLABLE MWAH (0x_bAE1 <= code && code <= +// 0x_bAFB) || // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH +// (0x_bAFD <= code && code <= 0x_bB17) || // Lo [27] HANGUL SYLLABLE +// MOEG..HANGUL SYLLABLE MOEH (0x_bB19 <= code && code <= 0x_bB33) || // +// Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH (0x_bB35 <= code +// && code <= 0x_bB4F) || // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH +// (0x_bB51 <= code && code <= 0x_bB6B) || // Lo [27] HANGUL SYLLABLE +// MWEOG..HANGUL SYLLABLE MWEOH (0x_bB6D <= code && code <= 0x_bB87) || +// // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH (0x_bB89 <= +// code && code <= 0x_bBA3) || // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE +// MWIH (0x_bBA5 <= code && code <= 0x_bBBF) || // Lo [27] HANGUL +// SYLLABLE MYUG..HANGUL SYLLABLE MYUH (0x_bBC1 <= code && code <= +// 0x_bBDB) || // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH +// (0x_bBDD <= code && code <= 0x_bBF7) || // Lo [27] HANGUL SYLLABLE +// MYIG..HANGUL SYLLABLE MYIH (0x_bBF9 <= code && code <= 0x_bC13) || // +// Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH (0x_bC15 <= code && +// code <= 0x_bC2F) || // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH +// (0x_bC31 <= code && code <= 0x_bC4B) || // Lo [27] HANGUL SYLLABLE +// BAEG..HANGUL SYLLABLE BAEH (0x_bC4D <= code && code <= 0x_bC67) || // +// Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH (0x_bC69 <= code +// && code <= 0x_bC83) || // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE +// BYAEH (0x_bC85 <= code && code <= 0x_bC9F) || // Lo [27] HANGUL +// SYLLABLE BEOG..HANGUL SYLLABLE BEOH (0x_bCA1 <= code && code <= +// 0x_bCBB) || // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH +// (0x_bCBD <= code && code <= 0x_bCD7) || // Lo [27] HANGUL SYLLABLE +// BYEOG..HANGUL SYLLABLE BYEOH (0x_bCD9 <= code && code <= 0x_bCF3) || +// // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH (0x_bCF5 <= +// code && code <= 0x_bD0F) || // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE +// BOH (0x_bD11 <= code && code <= 0x_bD2B) || // Lo [27] HANGUL +// SYLLABLE BWAG..HANGUL SYLLABLE BWAH (0x_bD2D <= code && code <= +// 0x_bD47) || // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH +// (0x_bD49 <= code && code <= 0x_bD63) || // Lo [27] HANGUL SYLLABLE +// BOEG..HANGUL SYLLABLE BOEH (0x_bD65 <= code && code <= 0x_bD7F) || // +// Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH (0x_bD81 <= code +// && code <= 0x_bD9B) || // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH +// (0x_bD9D <= code && code <= 0x_bDB7) || // Lo [27] HANGUL SYLLABLE +// BWEOG..HANGUL SYLLABLE BWEOH (0x_bDB9 <= code && code <= 0x_bDD3) || +// // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH (0x_bDD5 <= +// code && code <= 0x_bDEF) || // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE +// BWIH (0x_bDF1 <= code && code <= 0x_bE0B) || // Lo [27] HANGUL +// SYLLABLE BYUG..HANGUL SYLLABLE BYUH (0x_bE0D <= code && code <= +// 0x_bE27) || // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH +// (0x_bE29 <= code && code <= 0x_bE43) || // Lo [27] HANGUL SYLLABLE +// BYIG..HANGUL SYLLABLE BYIH (0x_bE45 <= code && code <= 0x_bE5F) || // +// Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH (0x_bE61 <= code && +// code <= 0x_bE7B) || // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH +// (0x_bE7D <= code && code <= 0x_bE97) || // Lo [27] HANGUL SYLLABLE +// BBAEG..HANGUL SYLLABLE BBAEH (0x_bE99 <= code && code <= 0x_bEB3) || +// // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH (0x_bEB5 <= +// code && code <= 0x_bECF) || // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL +// SYLLABLE BBYAEH (0x_bED1 <= code && code <= 0x_bEEB) || // Lo [27] +// HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH (0x_bEED <= code && code +// <= 0x_bF07) || // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH +// (0x_bF09 <= code && code <= 0x_bF23) || // Lo [27] HANGUL SYLLABLE +// BBYEOG..HANGUL SYLLABLE BBYEOH (0x_bF25 <= code && code <= 0x_bF3F) || +// // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH (0x_bF41 <= +// code && code <= 0x_bF5B) || // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE +// BBOH (0x_bF5D <= code && code <= 0x_bF77) || // Lo [27] HANGUL +// SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH (0x_bF79 <= code && code <= +// 0x_bF93) || // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH +// (0x_bF95 <= code && code <= 0x_bFAF) || // Lo [27] HANGUL SYLLABLE +// BBOEG..HANGUL SYLLABLE BBOEH (0x_bFB1 <= code && code <= 0x_bFCB) || +// // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH (0x_bFCD <= +// code && code <= 0x_bFE7) || // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE +// BBUH (0x_bFE9 <= code && code <= 0x_c003) || // Lo [27] HANGUL +// SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH (0x_c005 <= code && code <= +// 0x_c01F) || // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH +// (0x_c021 <= code && code <= 0x_c03B) || // Lo [27] HANGUL SYLLABLE +// BBWIG..HANGUL SYLLABLE BBWIH (0x_c03D <= code && code <= 0x_c057) || +// // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH (0x_c059 <= +// code && code <= 0x_c073) || // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL +// SYLLABLE BBEUH (0x_c075 <= code && code <= 0x_c08F) || // Lo [27] +// HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH (0x_c091 <= code && code +// <= 0x_c0AB) || // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH +// (0x_c0AD <= code && code <= 0x_c0C7) || // Lo [27] HANGUL SYLLABLE +// SAG..HANGUL SYLLABLE SAH (0x_c0C9 <= code && code <= 0x_c0E3) || // Lo +// [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH (0x_c0E5 <= code && +// code <= 0x_c0FF) || // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH +// (0x_c101 <= code && code <= 0x_c11B) || // Lo [27] HANGUL SYLLABLE +// SYAEG..HANGUL SYLLABLE SYAEH (0x_c11D <= code && code <= 0x_c137) || +// // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH (0x_c139 <= +// code && code <= 0x_c153) || // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE +// SEH (0x_c155 <= code && code <= 0x_c16F) || // Lo [27] HANGUL +// SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH (0x_c171 <= code && code <= +// 0x_c18B) || // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH +// (0x_c18D <= code && code <= 0x_c1A7) || // Lo [27] HANGUL SYLLABLE +// SOG..HANGUL SYLLABLE SOH (0x_c1A9 <= code && code <= 0x_c1C3) || // Lo +// [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH (0x_c1C5 <= code && +// code <= 0x_c1DF) || // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH +// (0x_c1E1 <= code && code <= 0x_c1FB) || // Lo [27] HANGUL SYLLABLE +// SOEG..HANGUL SYLLABLE SOEH (0x_c1FD <= code && code <= 0x_c217) || // +// Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH (0x_c219 <= code +// && code <= 0x_c233) || // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH +// (0x_c235 <= code && code <= 0x_c24F) || // Lo [27] HANGUL SYLLABLE +// SWEOG..HANGUL SYLLABLE SWEOH (0x_c251 <= code && code <= 0x_c26B) || +// // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH (0x_c26D <= +// code && code <= 0x_c287) || // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE +// SWIH (0x_c289 <= code && code <= 0x_c2A3) || // Lo [27] HANGUL +// SYLLABLE SYUG..HANGUL SYLLABLE SYUH (0x_c2A5 <= code && code <= +// 0x_c2BF) || // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH +// (0x_c2C1 <= code && code <= 0x_c2DB) || // Lo [27] HANGUL SYLLABLE +// SYIG..HANGUL SYLLABLE SYIH (0x_c2DD <= code && code <= 0x_c2F7) || // +// Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH (0x_c2F9 <= code && +// code <= 0x_c313) || // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH +// (0x_c315 <= code && code <= 0x_c32F) || // Lo [27] HANGUL SYLLABLE +// SSAEG..HANGUL SYLLABLE SSAEH (0x_c331 <= code && code <= 0x_c34B) || +// // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH (0x_c34D <= +// code && code <= 0x_c367) || // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL +// SYLLABLE SSYAEH (0x_c369 <= code && code <= 0x_c383) || // Lo [27] +// HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH (0x_c385 <= code && code +// <= 0x_c39F) || // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH +// (0x_c3A1 <= code && code <= 0x_c3BB) || // Lo [27] HANGUL SYLLABLE +// SSYEOG..HANGUL SYLLABLE SSYEOH (0x_c3BD <= code && code <= 0x_c3D7) || +// // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH (0x_c3D9 <= +// code && code <= 0x_c3F3) || // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE +// SSOH (0x_c3F5 <= code && code <= 0x_c40F) || // Lo [27] HANGUL +// SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH (0x_c411 <= code && code <= +// 0x_c42B) || // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH +// (0x_c42D <= code && code <= 0x_c447) || // Lo [27] HANGUL SYLLABLE +// SSOEG..HANGUL SYLLABLE SSOEH (0x_c449 <= code && code <= 0x_c463) || +// // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH (0x_c465 <= +// code && code <= 0x_c47F) || // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE +// SSUH (0x_c481 <= code && code <= 0x_c49B) || // Lo [27] HANGUL +// SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH (0x_c49D <= code && code <= +// 0x_c4B7) || // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH +// (0x_c4B9 <= code && code <= 0x_c4D3) || // Lo [27] HANGUL SYLLABLE +// SSWIG..HANGUL SYLLABLE SSWIH (0x_c4D5 <= code && code <= 0x_c4EF) || +// // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH (0x_c4F1 <= +// code && code <= 0x_c50B) || // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL +// SYLLABLE SSEUH (0x_c50D <= code && code <= 0x_c527) || // Lo [27] +// HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH (0x_c529 <= code && code +// <= 0x_c543) || // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH +// (0x_c545 <= code && code <= 0x_c55F) || // Lo [27] HANGUL SYLLABLE +// AG..HANGUL SYLLABLE AH (0x_c561 <= code && code <= 0x_c57B) || // Lo +// [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH (0x_c57D <= code && code +// <= 0x_c597) || // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH +// (0x_c599 <= code && code <= 0x_c5B3) || // Lo [27] HANGUL SYLLABLE +// YAEG..HANGUL SYLLABLE YAEH (0x_c5B5 <= code && code <= 0x_c5CF) || // +// Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH (0x_c5D1 <= code && +// code <= 0x_c5EB) || // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH +// (0x_c5ED <= code && code <= 0x_c607) || // Lo [27] HANGUL SYLLABLE +// YEOG..HANGUL SYLLABLE YEOH (0x_c609 <= code && code <= 0x_c623) || // +// Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH (0x_c625 <= code && +// code <= 0x_c63F) || // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH +// (0x_c641 <= code && code <= 0x_c65B) || // Lo [27] HANGUL SYLLABLE +// WAG..HANGUL SYLLABLE WAH (0x_c65D <= code && code <= 0x_c677) || // Lo +// [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH (0x_c679 <= code && +// code <= 0x_c693) || // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH +// (0x_c695 <= code && code <= 0x_c6AF) || // Lo [27] HANGUL SYLLABLE +// YOG..HANGUL SYLLABLE YOH (0x_c6B1 <= code && code <= 0x_c6CB) || // Lo +// [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH (0x_c6CD <= code && code +// <= 0x_c6E7) || // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH +// (0x_c6E9 <= code && code <= 0x_c703) || // Lo [27] HANGUL SYLLABLE +// WEG..HANGUL SYLLABLE WEH (0x_c705 <= code && code <= 0x_c71F) || // Lo +// [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH (0x_c721 <= code && code +// <= 0x_c73B) || // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH +// (0x_c73D <= code && code <= 0x_c757) || // Lo [27] HANGUL SYLLABLE +// EUG..HANGUL SYLLABLE EUH (0x_c759 <= code && code <= 0x_c773) || // Lo +// [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH (0x_c775 <= code && code +// <= 0x_c78F) || // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH +// (0x_c791 <= code && code <= 0x_c7AB) || // Lo [27] HANGUL SYLLABLE +// JAG..HANGUL SYLLABLE JAH (0x_c7AD <= code && code <= 0x_c7C7) || // Lo +// [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH (0x_c7C9 <= code && +// code <= 0x_c7E3) || // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH +// (0x_c7E5 <= code && code <= 0x_c7FF) || // Lo [27] HANGUL SYLLABLE +// JYAEG..HANGUL SYLLABLE JYAEH (0x_c801 <= code && code <= 0x_c81B) || +// // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH (0x_c81D <= +// code && code <= 0x_c837) || // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE +// JEH (0x_c839 <= code && code <= 0x_c853) || // Lo [27] HANGUL +// SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH (0x_c855 <= code && code <= +// 0x_c86F) || // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH +// (0x_c871 <= code && code <= 0x_c88B) || // Lo [27] HANGUL SYLLABLE +// JOG..HANGUL SYLLABLE JOH (0x_c88D <= code && code <= 0x_c8A7) || // Lo +// [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH (0x_c8A9 <= code && +// code <= 0x_c8C3) || // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH +// (0x_c8C5 <= code && code <= 0x_c8DF) || // Lo [27] HANGUL SYLLABLE +// JOEG..HANGUL SYLLABLE JOEH (0x_c8E1 <= code && code <= 0x_c8FB) || // +// Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH (0x_c8FD <= code +// && code <= 0x_c917) || // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH +// (0x_c919 <= code && code <= 0x_c933) || // Lo [27] HANGUL SYLLABLE +// JWEOG..HANGUL SYLLABLE JWEOH (0x_c935 <= code && code <= 0x_c94F) || +// // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH (0x_c951 <= +// code && code <= 0x_c96B) || // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE +// JWIH (0x_c96D <= code && code <= 0x_c987) || // Lo [27] HANGUL +// SYLLABLE JYUG..HANGUL SYLLABLE JYUH (0x_c989 <= code && code <= +// 0x_c9A3) || // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH +// (0x_c9A5 <= code && code <= 0x_c9BF) || // Lo [27] HANGUL SYLLABLE +// JYIG..HANGUL SYLLABLE JYIH (0x_c9C1 <= code && code <= 0x_c9DB) || // +// Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH (0x_c9DD <= code && +// code <= 0x_c9F7) || // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH +// (0x_c9F9 <= code && code <= 0x_cA13) || // Lo [27] HANGUL SYLLABLE +// JJAEG..HANGUL SYLLABLE JJAEH (0x_cA15 <= code && code <= 0x_cA2F) || +// // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH (0x_cA31 <= +// code && code <= 0x_cA4B) || // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL +// SYLLABLE JJYAEH (0x_cA4D <= code && code <= 0x_cA67) || // Lo [27] +// HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH (0x_cA69 <= code && code +// <= 0x_cA83) || // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH +// (0x_cA85 <= code && code <= 0x_cA9F) || // Lo [27] HANGUL SYLLABLE +// JJYEOG..HANGUL SYLLABLE JJYEOH (0x_cAA1 <= code && code <= 0x_cABB) || +// // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH (0x_cABD <= +// code && code <= 0x_cAD7) || // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE +// JJOH (0x_cAD9 <= code && code <= 0x_cAF3) || // Lo [27] HANGUL +// SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH (0x_cAF5 <= code && code <= +// 0x_cB0F) || // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH +// (0x_cB11 <= code && code <= 0x_cB2B) || // Lo [27] HANGUL SYLLABLE +// JJOEG..HANGUL SYLLABLE JJOEH (0x_cB2D <= code && code <= 0x_cB47) || +// // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH (0x_cB49 <= +// code && code <= 0x_cB63) || // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE +// JJUH (0x_cB65 <= code && code <= 0x_cB7F) || // Lo [27] HANGUL +// SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH (0x_cB81 <= code && code <= +// 0x_cB9B) || // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH +// (0x_cB9D <= code && code <= 0x_cBB7) || // Lo [27] HANGUL SYLLABLE +// JJWIG..HANGUL SYLLABLE JJWIH (0x_cBB9 <= code && code <= 0x_cBD3) || +// // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH (0x_cBD5 <= +// code && code <= 0x_cBEF) || // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL +// SYLLABLE JJEUH (0x_cBF1 <= code && code <= 0x_cC0B) || // Lo [27] +// HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH (0x_cC0D <= code && code +// <= 0x_cC27) || // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH +// (0x_cC29 <= code && code <= 0x_cC43) || // Lo [27] HANGUL SYLLABLE +// CAG..HANGUL SYLLABLE CAH (0x_cC45 <= code && code <= 0x_cC5F) || // Lo +// [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH (0x_cC61 <= code && +// code <= 0x_cC7B) || // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH +// (0x_cC7D <= code && code <= 0x_cC97) || // Lo [27] HANGUL SYLLABLE +// CYAEG..HANGUL SYLLABLE CYAEH (0x_cC99 <= code && code <= 0x_cCB3) || +// // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH (0x_cCB5 <= +// code && code <= 0x_cCCF) || // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE +// CEH (0x_cCD1 <= code && code <= 0x_cCEB) || // Lo [27] HANGUL +// SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH (0x_cCED <= code && code <= +// 0x_cD07) || // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH +// (0x_cD09 <= code && code <= 0x_cD23) || // Lo [27] HANGUL SYLLABLE +// COG..HANGUL SYLLABLE COH (0x_cD25 <= code && code <= 0x_cD3F) || // Lo +// [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH (0x_cD41 <= code && +// code <= 0x_cD5B) || // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH +// (0x_cD5D <= code && code <= 0x_cD77) || // Lo [27] HANGUL SYLLABLE +// COEG..HANGUL SYLLABLE COEH (0x_cD79 <= code && code <= 0x_cD93) || // +// Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH (0x_cD95 <= code +// && code <= 0x_cDAF) || // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH +// (0x_cDB1 <= code && code <= 0x_cDCB) || // Lo [27] HANGUL SYLLABLE +// CWEOG..HANGUL SYLLABLE CWEOH (0x_cDCD <= code && code <= 0x_cDE7) || +// // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH (0x_cDE9 <= +// code && code <= 0x_cE03) || // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE +// CWIH (0x_cE05 <= code && code <= 0x_cE1F) || // Lo [27] HANGUL +// SYLLABLE CYUG..HANGUL SYLLABLE CYUH (0x_cE21 <= code && code <= +// 0x_cE3B) || // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH +// (0x_cE3D <= code && code <= 0x_cE57) || // Lo [27] HANGUL SYLLABLE +// CYIG..HANGUL SYLLABLE CYIH (0x_cE59 <= code && code <= 0x_cE73) || // +// Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH (0x_cE75 <= code && +// code <= 0x_cE8F) || // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH +// (0x_cE91 <= code && code <= 0x_cEAB) || // Lo [27] HANGUL SYLLABLE +// KAEG..HANGUL SYLLABLE KAEH (0x_cEAD <= code && code <= 0x_cEC7) || // +// Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH (0x_cEC9 <= code +// && code <= 0x_cEE3) || // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE +// KYAEH (0x_cEE5 <= code && code <= 0x_cEFF) || // Lo [27] HANGUL +// SYLLABLE KEOG..HANGUL SYLLABLE KEOH (0x_cF01 <= code && code <= +// 0x_cF1B) || // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH +// (0x_cF1D <= code && code <= 0x_cF37) || // Lo [27] HANGUL SYLLABLE +// KYEOG..HANGUL SYLLABLE KYEOH (0x_cF39 <= code && code <= 0x_cF53) || +// // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH (0x_cF55 <= +// code && code <= 0x_cF6F) || // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE +// KOH (0x_cF71 <= code && code <= 0x_cF8B) || // Lo [27] HANGUL +// SYLLABLE KWAG..HANGUL SYLLABLE KWAH (0x_cF8D <= code && code <= +// 0x_cFA7) || // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH +// (0x_cFA9 <= code && code <= 0x_cFC3) || // Lo [27] HANGUL SYLLABLE +// KOEG..HANGUL SYLLABLE KOEH (0x_cFC5 <= code && code <= 0x_cFDF) || // +// Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH (0x_cFE1 <= code +// && code <= 0x_cFFB) || // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH +// (0x_cFFD <= code && code <= 0x_d017) || // Lo [27] HANGUL SYLLABLE +// KWEOG..HANGUL SYLLABLE KWEOH (0x_d019 <= code && code <= 0x_d033) || +// // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH (0x_d035 <= +// code && code <= 0x_d04F) || // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE +// KWIH (0x_d051 <= code && code <= 0x_d06B) || // Lo [27] HANGUL +// SYLLABLE KYUG..HANGUL SYLLABLE KYUH (0x_d06D <= code && code <= +// 0x_d087) || // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH +// (0x_d089 <= code && code <= 0x_d0A3) || // Lo [27] HANGUL SYLLABLE +// KYIG..HANGUL SYLLABLE KYIH (0x_d0A5 <= code && code <= 0x_d0BF) || // +// Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH (0x_d0C1 <= code && +// code <= 0x_d0DB) || // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH +// (0x_d0DD <= code && code <= 0x_d0F7) || // Lo [27] HANGUL SYLLABLE +// TAEG..HANGUL SYLLABLE TAEH (0x_d0F9 <= code && code <= 0x_d113) || // +// Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH (0x_d115 <= code +// && code <= 0x_d12F) || // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE +// TYAEH (0x_d131 <= code && code <= 0x_d14B) || // Lo [27] HANGUL +// SYLLABLE TEOG..HANGUL SYLLABLE TEOH (0x_d14D <= code && code <= +// 0x_d167) || // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH +// (0x_d169 <= code && code <= 0x_d183) || // Lo [27] HANGUL SYLLABLE +// TYEOG..HANGUL SYLLABLE TYEOH (0x_d185 <= code && code <= 0x_d19F) || +// // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH (0x_d1A1 <= +// code && code <= 0x_d1BB) || // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE +// TOH (0x_d1BD <= code && code <= 0x_d1D7) || // Lo [27] HANGUL +// SYLLABLE TWAG..HANGUL SYLLABLE TWAH (0x_d1D9 <= code && code <= +// 0x_d1F3) || // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH +// (0x_d1F5 <= code && code <= 0x_d20F) || // Lo [27] HANGUL SYLLABLE +// TOEG..HANGUL SYLLABLE TOEH (0x_d211 <= code && code <= 0x_d22B) || // +// Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH (0x_d22D <= code +// && code <= 0x_d247) || // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH +// (0x_d249 <= code && code <= 0x_d263) || // Lo [27] HANGUL SYLLABLE +// TWEOG..HANGUL SYLLABLE TWEOH (0x_d265 <= code && code <= 0x_d27F) || +// // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH (0x_d281 <= +// code && code <= 0x_d29B) || // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE +// TWIH (0x_d29D <= code && code <= 0x_d2B7) || // Lo [27] HANGUL +// SYLLABLE TYUG..HANGUL SYLLABLE TYUH (0x_d2B9 <= code && code <= +// 0x_d2D3) || // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH +// (0x_d2D5 <= code && code <= 0x_d2EF) || // Lo [27] HANGUL SYLLABLE +// TYIG..HANGUL SYLLABLE TYIH (0x_d2F1 <= code && code <= 0x_d30B) || // +// Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH (0x_d30D <= code && +// code <= 0x_d327) || // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH +// (0x_d329 <= code && code <= 0x_d343) || // Lo [27] HANGUL SYLLABLE +// PAEG..HANGUL SYLLABLE PAEH (0x_d345 <= code && code <= 0x_d35F) || // +// Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH (0x_d361 <= code +// && code <= 0x_d37B) || // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE +// PYAEH (0x_d37D <= code && code <= 0x_d397) || // Lo [27] HANGUL +// SYLLABLE PEOG..HANGUL SYLLABLE PEOH (0x_d399 <= code && code <= +// 0x_d3B3) || // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH +// (0x_d3B5 <= code && code <= 0x_d3CF) || // Lo [27] HANGUL SYLLABLE +// PYEOG..HANGUL SYLLABLE PYEOH (0x_d3D1 <= code && code <= 0x_d3EB) || +// // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH (0x_d3ED <= +// code && code <= 0x_d407) || // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE +// POH (0x_d409 <= code && code <= 0x_d423) || // Lo [27] HANGUL +// SYLLABLE PWAG..HANGUL SYLLABLE PWAH (0x_d425 <= code && code <= +// 0x_d43F) || // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH +// (0x_d441 <= code && code <= 0x_d45B) || // Lo [27] HANGUL SYLLABLE +// POEG..HANGUL SYLLABLE POEH (0x_d45D <= code && code <= 0x_d477) || // +// Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH (0x_d479 <= code +// && code <= 0x_d493) || // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH +// (0x_d495 <= code && code <= 0x_d4AF) || // Lo [27] HANGUL SYLLABLE +// PWEOG..HANGUL SYLLABLE PWEOH (0x_d4B1 <= code && code <= 0x_d4CB) || +// // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH (0x_d4CD <= +// code && code <= 0x_d4E7) || // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE +// PWIH (0x_d4E9 <= code && code <= 0x_d503) || // Lo [27] HANGUL +// SYLLABLE PYUG..HANGUL SYLLABLE PYUH (0x_d505 <= code && code <= +// 0x_d51F) || // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH +// (0x_d521 <= code && code <= 0x_d53B) || // Lo [27] HANGUL SYLLABLE +// PYIG..HANGUL SYLLABLE PYIH (0x_d53D <= code && code <= 0x_d557) || // +// Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH (0x_d559 <= code && +// code <= 0x_d573) || // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH +// (0x_d575 <= code && code <= 0x_d58F) || // Lo [27] HANGUL SYLLABLE +// HAEG..HANGUL SYLLABLE HAEH (0x_d591 <= code && code <= 0x_d5AB) || // +// Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH (0x_d5AD <= code +// && code <= 0x_d5C7) || // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE +// HYAEH (0x_d5C9 <= code && code <= 0x_d5E3) || // Lo [27] HANGUL +// SYLLABLE HEOG..HANGUL SYLLABLE HEOH (0x_d5E5 <= code && code <= +// 0x_d5FF) || // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH +// (0x_d601 <= code && code <= 0x_d61B) || // Lo [27] HANGUL SYLLABLE +// HYEOG..HANGUL SYLLABLE HYEOH (0x_d61D <= code && code <= 0x_d637) || +// // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH (0x_d639 <= +// code && code <= 0x_d653) || // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE +// HOH (0x_d655 <= code && code <= 0x_d66F) || // Lo [27] HANGUL +// SYLLABLE HWAG..HANGUL SYLLABLE HWAH (0x_d671 <= code && code <= +// 0x_d68B) || // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH +// (0x_d68D <= code && code <= 0x_d6A7) || // Lo [27] HANGUL SYLLABLE +// HOEG..HANGUL SYLLABLE HOEH (0x_d6A9 <= code && code <= 0x_d6C3) || // +// Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH (0x_d6C5 <= code +// && code <= 0x_d6DF) || // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH +// (0x_d6E1 <= code && code <= 0x_d6FB) || // Lo [27] HANGUL SYLLABLE +// HWEOG..HANGUL SYLLABLE HWEOH (0x_d6FD <= code && code <= 0x_d717) || +// // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH (0x_d719 <= +// code && code <= 0x_d733) || // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE +// HWIH (0x_d735 <= code && code <= 0x_d74F) || // Lo [27] HANGUL +// SYLLABLE HYUG..HANGUL SYLLABLE HYUH (0x_d751 <= code && code <= +// 0x_d76B) || // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH +// (0x_d76D <= code && code <= 0x_d787) || // Lo [27] HANGUL SYLLABLE +// HYIG..HANGUL SYLLABLE HYIH (0x_d789 <= code && code <= 0x_d7A3) // Lo +// [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH ){ // return LVT; // } // // if( // 0x261D == code || // So WHITE UP POINTING INDEX // 0x26F9 == code || // So PERSON WITH BALL -// (0x270A <= code && code <= 0x270D) || // So [4] RAISED FIST..WRITING HAND -// 0x1F385 == code || // So FATHER CHRISTMAS -// (0x1F3C2 <= code && code <= 0x1F3C4) || // So [3] SNOWBOARDER..SURFER -// 0x1F3C7 == code || // So HORSE RACING +// (0x270A <= code && code <= 0x270D) || // So [4] RAISED FIST..WRITING +// HAND 0x1F385 == code || // So FATHER CHRISTMAS +// (0x1F3C2 <= code && code <= 0x1F3C4) || // So [3] +// SNOWBOARDER..SURFER 0x1F3C7 == code || // So HORSE RACING // (0x1F3CA <= code && code <= 0x1F3CC) || // So [3] SWIMMER..GOLFER // (0x1F442 <= code && code <= 0x1F443) || // So [2] EAR..NOSE -// (0x1F446 <= code && code <= 0x1F450) || // So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN -// 0x1F46E == code || // So POLICE OFFICER -// (0x1F470 <= code && code <= 0x1F478) || // So [9] BRIDE WITH VEIL..PRINCESS -// 0x1F47C == code || // So BABY ANGEL -// (0x1F481 <= code && code <= 0x1F483) || // So [3] INFORMATION DESK PERSON..DANCER -// (0x1F485 <= code && code <= 0x1F487) || // So [3] NAIL POLISH..HAIRCUT -// 0x1F4AA == code || // So FLEXED BICEPS -// (0x1F574 <= code && code <= 0x1F575) || // So [2] MAN IN BUSINESS SUIT LEVITATING..SLEUTH OR SPY -// 0x1F57A == code || // So MAN DANCING -// 0x1F590 == code || // So RAISED HAND WITH FINGERS SPLAYED -// (0x1F595 <= code && code <= 0x1F596) || // So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS -// (0x1F645 <= code && code <= 0x1F647) || // So [3] FACE WITH NO GOOD GESTURE..PERSON BOWING DEEPLY -// (0x1F64B <= code && code <= 0x1F64F) || // So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED HANDS -// 0x1F6A3 == code || // So ROWBOAT -// (0x1F6B4 <= code && code <= 0x1F6B6) || // So [3] BICYCLIST..PEDESTRIAN -// 0x1F6C0 == code || // So BATH +// (0x1F446 <= code && code <= 0x1F450) || // So [11] WHITE UP POINTING +// BACKHAND INDEX..OPEN HANDS SIGN 0x1F46E == code || // So POLICE +// OFFICER (0x1F470 <= code && code <= 0x1F478) || // So [9] BRIDE WITH +// VEIL..PRINCESS 0x1F47C == code || // So BABY ANGEL +// (0x1F481 <= code && code <= 0x1F483) || // So [3] INFORMATION DESK +// PERSON..DANCER (0x1F485 <= code && code <= 0x1F487) || // So [3] +// NAIL POLISH..HAIRCUT 0x1F4AA == code || // So FLEXED BICEPS +// (0x1F574 <= code && code <= 0x1F575) || // So [2] MAN IN BUSINESS +// SUIT LEVITATING..SLEUTH OR SPY 0x1F57A == code || // So MAN +// DANCING 0x1F590 == code || // So RAISED HAND WITH FINGERS +// SPLAYED (0x1F595 <= code && code <= 0x1F596) || // So [2] REVERSED +// HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND +// RING FINGERS (0x1F645 <= code && code <= 0x1F647) || // So [3] FACE +// WITH NO GOOD GESTURE..PERSON BOWING DEEPLY (0x1F64B <= code && code <= +// 0x1F64F) || // So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED +// HANDS 0x1F6A3 == code || // So ROWBOAT +// (0x1F6B4 <= code && code <= 0x1F6B6) || // So [3] +// BICYCLIST..PEDESTRIAN 0x1F6C0 == code || // So BATH // 0x1F6CC == code || // So SLEEPING ACCOMMODATION -// (0x1F918 <= code && code <= 0x1F91C) || // So [5] SIGN OF THE HORNS..RIGHT-FACING FIST -// (0x1F91E <= code && code <= 0x1F91F) || // So [2] HAND WITH INDEX AND MIDDLE FINGERS CROSSED..I LOVE YOU HAND SIGN +// (0x1F918 <= code && code <= 0x1F91C) || // So [5] SIGN OF THE +// HORNS..RIGHT-FACING FIST (0x1F91E <= code && code <= 0x1F91F) || // So +// [2] HAND WITH INDEX AND MIDDLE FINGERS CROSSED..I LOVE YOU HAND SIGN // 0x1F926 == code || // So FACE PALM -// (0x1F930 <= code && code <= 0x1F939) || // So [10] PREGNANT WOMAN..JUGGLING -// (0x1F93D <= code && code <= 0x1F93E) || // So [2] WATER POLO..HANDBALL -// (0x1F9D1 <= code && code <= 0x1F9DD) // So [13] ADULT..ELF -// ){ +// (0x1F930 <= code && code <= 0x1F939) || // So [10] PREGNANT +// WOMAN..JUGGLING (0x1F93D <= code && code <= 0x1F93E) || // So [2] +// WATER POLO..HANDBALL (0x1F9D1 <= code && code <= 0x1F9DD) // So [13] +// ADULT..ELF ){ // return E_Base; // } // // if( -// (0x1F3FB <= code && code <= 0x1F3FF) // Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 -// ){ +// (0x1F3FB <= code && code <= 0x1F3FF) // Sk [5] EMOJI MODIFIER +// FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 ){ // return E_Modifier; // } // @@ -1832,8 +2112,8 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { // if( // 0x2640 == code || // So FEMALE SIGN // 0x2642 == code || // So MALE SIGN -// (0x2695 <= code && code <= 0x2696) || // So [2] STAFF OF AESCULAPIUS..SCALES -// 0x2708 == code || // So AIRPLANE +// (0x2695 <= code && code <= 0x2696) || // So [2] STAFF OF +// AESCULAPIUS..SCALES 0x2708 == code || // So AIRPLANE // 0x2764 == code || // So HEAVY BLACK HEART // 0x1F308 == code || // So RAINBOW // 0x1F33E == code || // So EAR OF RICE @@ -1844,8 +2124,8 @@ pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { // 0x1F3EB == code || // So SCHOOL // 0x1F3ED == code || // So FACTORY // 0x1F48B == code || // So KISS MARK -// (0x1F4BB <= code && code <= 0x1F4BC) || // So [2] PERSONAL COMPUTER..BRIEFCASE -// 0x1F527 == code || // So WRENCH +// (0x1F4BB <= code && code <= 0x1F4BC) || // So [2] PERSONAL +// COMPUTER..BRIEFCASE 0x1F527 == code || // So WRENCH // 0x1F52C == code || // So MICROSCOPE // 0x1F5E8 == code || // So LEFT SPEECH BUBBLE // 0x1F680 == code || // So ROCKET diff --git a/src/text_processing/line_break.rs b/src/text_processing/line_break.rs index 27f27de..27243b8 100644 --- a/src/text_processing/line_break.rs +++ b/src/text_processing/line_break.rs @@ -1,33 +1,30 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . extern crate unicode_segmentation; -use self::unicode_segmentation::UnicodeSegmentation; -use crate::text_processing::tables::LINE_BREAK_RULES; -use crate::text_processing::types::LineBreakClass; -use core::cmp::Ordering; -use core::iter::Peekable; -use core::str::FromStr; +use core::{cmp::Ordering, iter::Peekable, str::FromStr}; + use LineBreakClass::*; +use self::unicode_segmentation::UnicodeSegmentation; +use crate::text_processing::{tables::LINE_BREAK_RULES, types::LineBreakClass}; + #[derive(Debug, PartialEq)] pub enum LineBreakCandidate { MandatoryBreak, @@ -41,7 +38,7 @@ pub struct LineBreakCandidateIter<'a> { text: &'a str, iter: Peekable>, pos: usize, - /* Needed for rule LB30a */ + /// Needed for rule `LB30a` reg_ind_streak: u32, } @@ -110,14 +107,32 @@ macro_rules! next_grapheme_class { /// Returns positions where breaks can happen /// Examples: /// ``` -/// use text_processing::{self, LineBreakCandidate::{self, *}}; -/// use text_processing::line_break::LineBreakCandidateIter; +/// use text_processing::{ +/// self, +/// line_break::LineBreakCandidateIter, +/// LineBreakCandidate::{self, *}, +/// }; /// -/// assert!(LineBreakCandidateIter::new("").collect::>().is_empty()); -/// assert_eq!(&[(7, BreakAllowed), (12, MandatoryBreak)], -/// LineBreakCandidateIter::new("Sample Text.").collect::>().as_slice()); -/// assert_eq!(&[(3, MandatoryBreak), (7, MandatoryBreak), (10, BreakAllowed), (17, MandatoryBreak)], -/// LineBreakCandidateIter::new("Sa\nmp\r\nle T(e)xt.").collect::>().as_slice()); +/// assert!(LineBreakCandidateIter::new("") +/// .collect::>() +/// .is_empty()); +/// assert_eq!( +/// &[(7, BreakAllowed), (12, MandatoryBreak)], +/// LineBreakCandidateIter::new("Sample Text.") +/// .collect::>() +/// .as_slice() +/// ); +/// assert_eq!( +/// &[ +/// (3, MandatoryBreak), +/// (7, MandatoryBreak), +/// (10, BreakAllowed), +/// (17, MandatoryBreak) +/// ], +/// LineBreakCandidateIter::new("Sa\nmp\r\nle T(e)xt.") +/// .collect::>() +/// .as_slice() +/// ); /// ``` impl<'a> Iterator for LineBreakCandidateIter<'a> { type Item = (usize, LineBreakCandidate); @@ -135,7 +150,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { let (idx, mut grapheme) = self.iter.next().unwrap(); let LineBreakCandidateIter { ref mut iter, - ref text, + text, ref mut reg_ind_streak, ref mut pos, } = self; @@ -155,22 +170,21 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { *reg_ind_streak = 0; } - /* LB1 Assign a line breaking class to each code point of the input. Resolve AI, CB, CJ, - * SA, SG, and XX into other line breaking classes depending on criteria outside the scope - * of this algorithm. - * - * In the absence of such criteria all characters with a specific combination of original - * class and General_Category property value are resolved as follows: - * Resolved Original General_Category - * AL AI, SG, XX Any - * CM SA Only Mn or Mc - * AL SA Any except Mn and Mc - * NS SJ Any - */ + // LB1 Assign a line breaking class to each code point of the input. Resolve + // AI, CB, CJ, SA, SG, and XX into other line breaking classes + // depending on criteria outside the scope of this algorithm. + // + // In the absence of such criteria all characters with a specific combination + // of original class and General_Category property value are resolved + // as follows: Resolved Original General_Category + // AL AI, SG, XX Any + // CM SA Only Mn or Mc + // AL SA Any except Mn and Mc + // NS SJ Any // TODO: LB1 - /* Check if next character class allows breaks before it */ + // Check if next character class allows breaks before it let next_char: Option<&(usize, &str)> = iter.peek(); match class { @@ -195,13 +209,13 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { if let Some((_, next_grapheme)) = next_char { let next_class = get_class!(next_grapheme); match next_class { - /* LB6 Do not break before hard line breaks. × ( BK | CR | LF | NL ) */ + // LB6 Do not break before hard line breaks. × ( BK | CR | LF | NL ) BK | CR | LF | NL => { *pos += grapheme.len(); return self.next(); } - /* LB7 Do not break before spaces or zero width - * space. × SP × ZW */ + // LB7 Do not break before spaces or zero width + // space. × SP × ZW SP | ZW => { *pos += grapheme.len(); return self.next(); @@ -211,8 +225,8 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { } match class { ZW => { - // LB8 Break before any character following a zero-width space, even if one or more - // spaces intervene + // LB8 Break before any character following a zero-width space, even if one or + // more spaces intervene // ZW SP* ÷ *pos += grapheme.len(); while Some(SP) == next_grapheme_class!(iter, grapheme) { @@ -227,26 +241,27 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { } CM => { - // LB9 Do not break a combining character sequence; treat it as if it has the line - // breaking class of the base character in all of the following rules. Treat ZWJ as - // if it were CM. + // LB9 Do not break a combining character sequence; treat it as if it has the + // line breaking class of the base character in all of the + // following rules. Treat ZWJ as if it were CM. // Treat X (CM | ZWJ)* as if it were X. // where X is any line break class except BK, CR, LF, NL, SP, or ZW. - /* Unreachable since we break lines based on graphemes, not characters */ + // Unreachable since we break lines based on graphemes, not characters unreachable!(); } WJ => { - /*: LB11 Do not break before or after Word joiner and related characters.*/ + // : LB11 Do not break before or after Word joiner and related characters. *pos += grapheme.len(); - /* Get next grapheme */ + // Get next grapheme if next_grapheme_class!(iter, grapheme).is_some() { *pos += grapheme.len(); } return self.next(); } GL => { - /*LB12 Non-breaking characters: LB12 Do not break after NBSP and related characters.*/ + // LB12 Non-breaking characters: LB12 Do not break after NBSP and related + // characters. *pos += grapheme.len(); return self.next(); } @@ -256,13 +271,13 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { let next_class = get_class!(next_grapheme); match next_class { GL if ![SP, BA, HY].contains(&class) => { - /* LB12a Do not break before NBSP and related characters, except after spaces and - * hyphens. [^SP BA HY] × GL - * Also LB12 Do not break after NBSP and related characters */ + // LB12a Do not break before NBSP and related characters, except after spaces + // and hyphens. [^SP BA HY] × GL + // Also LB12 Do not break after NBSP and related characters *pos += grapheme.len(); return self.next(); } - /* LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. */ + // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. CL | CP | EX | IS | SY => { *pos = *next_idx; return self.next(); @@ -272,7 +287,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { } match class { - /* LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. */ + // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. SP if [CL, CP, EX, IS, SY].contains(&get_class!(text[idx..].trim_start())) => { *pos += grapheme.len(); while ![CL, CP, EX, IS, SY].contains(&next_grapheme_class!(iter, grapheme).unwrap()) @@ -286,7 +301,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { /* LB14 Do not break after ‘[’, even after spaces. * OP SP* × */ - while let Some((idx, grapheme)) = self.iter.next() { + for (idx, grapheme) in self.iter.by_ref() { *pos = idx + grapheme.len(); if !(get_class!(grapheme) == SP) { break; @@ -305,7 +320,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { return self.next(); } QU => { - /* LB19 Do not break before or after quotation marks, such as ‘ ” ’. */ + // LB19 Do not break before or after quotation marks, such as ‘ ” ’. *pos += grapheme.len(); if let Some((_, g)) = self.iter.next() { *pos += g.len(); @@ -315,8 +330,8 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { LineBreakClass::CL | LineBreakClass::CP if get_class!(text[idx..].trim_start()) == NS => { - /* LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with - * intervening spaces. + /* LB16 Do not break between closing punctuation and a nonstarter (lb=NS), + * even with intervening spaces. * (CL | CP) SP* × NS */ *pos += grapheme.len(); while Some(SP) == next_grapheme_class!(iter, grapheme) { @@ -332,7 +347,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { return self.next(); } SP => { - /* LB18 Break after spaces. SP ÷ */ + // LB18 Break after spaces. SP ÷ // Space 0x20 is 1 byte long. *pos += 1; return Some((*pos, BreakAllowed)); @@ -343,7 +358,7 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { let next_class = get_class!(next_grapheme); match next_class { QU if class != SP => { - /* LB19 Do not break before or after quotation marks, such as ‘ ” ’. */ + // LB19 Do not break before or after quotation marks, such as ‘ ” ’. *pos = *next_idx + next_grapheme.len(); self.iter.next(); return self.next(); @@ -353,12 +368,12 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { } match class { CB => { - /* LB20 Break before and after unresolved CB. */ + // LB20 Break before and after unresolved CB. *pos += grapheme.len(); return Some((*pos - 1, BreakAllowed)); } - /* LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small - * kana, and other non-starters, or after acute accents. × BA, × HY, × NS, BB × */ + // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small + // kana, and other non-starters, or after acute accents. × BA, × HY, × NS, BB × BB => { *pos += grapheme.len(); return self.next(); @@ -370,8 +385,9 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { let next_class = get_class!(next_grapheme); match next_class { BA | HY | NS => { - /* LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small - * kana, and other non-starters, or after acute accents. × BA, × HY, × NS, BB × */ + // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, + // small kana, and other non-starters, or after acute + // accents. × BA, × HY, × NS, BB × *pos += grapheme.len(); return self.next(); } @@ -380,300 +396,300 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { } match class { HL if next_grapheme_class!((next_char is HY, BA)) => { - /* LB21a Don’t break after Hebrew + Hyphen. HL (HY | BA) × */ + // LB21a Don’t break after Hebrew + Hyphen. HL (HY | BA) × let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* LB21b Don’t break between ,Solidus and Hebrew letters. SY × HL */ + // LB21b Don’t break between ,Solidus and Hebrew letters. SY × HL SY if next_grapheme_class!((next_char is HL)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); - /* bypass next_char */ + // bypass next_char self.iter.next().unwrap(); if let Some((idx, next_grapheme)) = self.iter.next() { *pos = idx + next_grapheme.len(); } - return self.next(); + self.next() } - /* LB22 Do not break between two ellipses, or between letters, numbers or excla- - * mations and ellipsis. - * Examples: ‘9...’, ‘a...’, ‘H...’ - * (AL | HL) × IN */ + // LB22 Do not break between two ellipses, or between letters, numbers or excla- + // mations and ellipsis. + // Examples: ‘9...’, ‘a...’, ‘H...’ + // (AL | HL) × IN AL | HL if next_grapheme_class!((next_char is IN)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* EX × IN */ + // EX × IN EX if next_grapheme_class!((next_char is IN)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } EX => { // LB13 *pos += grapheme.len(); - return self.next(); + self.next() } - /* (ID | EB | EM) × IN */ + // (ID | EB | EM) × IN ID | EB | EM if next_grapheme_class!((next_char is IN)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* IN × IN */ + // IN × IN IN if next_grapheme_class!((next_char is IN)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* NU × IN */ + // NU × IN NU if next_grapheme_class!((next_char is IN)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* LB23 Do not break between digits and letters. - * (AL | HL) × NU */ + // LB23 Do not break between digits and letters. + // (AL | HL) × NU AL | HL if next_grapheme_class!((next_char is NU)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* NU × (AL | HL) */ + // NU × (AL | HL) NU if next_grapheme_class!((next_char is AL, HL)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* LB23a Do not break between numeric prefixes and ideographs, or between ideographs - * and numeric postfixes. - * PR × (ID | EB | EM) */ + // LB23a Do not break between numeric prefixes and ideographs, or between ideographs + // and numeric postfixes. + // PR × (ID | EB | EM) PR if next_grapheme_class!((next_char is ID, EB, EM)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* (ID | EB | EM) × PO */ + // (ID | EB | EM) × PO ID | EB | EM if next_grapheme_class!((next_char is PO)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* B24 Do not break between numeric prefix/postfix and letters, or between - letters and prefix/postfix. - (PR | PO) × (AL | HL)*/ + // B24 Do not break between numeric prefix/postfix and letters, or between + // letters and prefix/postfix. + // (PR | PO) × (AL | HL) PR | PO if next_grapheme_class!((next_char is AL, HL)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /*(AL | HL) × (PR | PO) */ + // (AL | HL) × (PR | PO) AL | HL if next_grapheme_class!((next_char is PR, PO)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* LB25 Do not break between the following pairs of classes relevant to numbers: - * CL × PO */ + // LB25 Do not break between the following pairs of classes relevant to numbers: + // CL × PO CL if next_grapheme_class!((next_char is PO)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* CP × PO */ + // CP × PO CP if next_grapheme_class!((next_char is PO)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* CL × PR */ + // CL × PR CL if next_grapheme_class!((next_char is PR)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* CP × PR */ + // CP × PR CP if next_grapheme_class!((next_char is PR)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* NU × PO */ + // NU × PO NU if next_grapheme_class!((next_char is PO)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* NU × PR */ + // NU × PR NU if next_grapheme_class!((next_char is PR)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* PO × OP */ + // PO × OP PO if next_grapheme_class!((next_char is OP)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* PO × NU */ + // PO × NU PO if next_grapheme_class!((next_char is NU)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* PR × OP */ + // PR × OP PR if next_grapheme_class!((next_char is OP)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* PR × NU */ + // PR × NU PR if next_grapheme_class!((next_char is NU)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* HY × NU */ + // HY × NU HY if next_grapheme_class!((next_char is NU)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* IS × NU */ + // IS × NU IS if next_grapheme_class!((next_char is NU)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* NU × NU */ + // NU × NU NU if next_grapheme_class!((next_char is NU)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* SY × NU */ + // SY × NU SY if next_grapheme_class!((next_char is NU)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* LB26 Do not break a Korean syllable. - * JL × (JL | JV | H2 | H3) */ + // LB26 Do not break a Korean syllable. + // JL × (JL | JV | H2 | H3) JL if next_grapheme_class!((next_char is JL, JV, H2, H3)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* (JV | H2) × (JV | JT) */ + // (JV | H2) × (JV | JT) JV | H2 if next_grapheme_class!((next_char is JV, JT)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* (JT | H3) × JT */ + // (JT | H3) × JT JT | H3 if next_grapheme_class!((next_char is JT)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* LB27 Treat a Korean Syllable Block the same as ID. - * (JL | JV | JT | H2 | H3) × IN */ + // LB27 Treat a Korean Syllable Block the same as ID. + // (JL | JV | JT | H2 | H3) × IN JL | JV | JT | H2 | H3 if next_grapheme_class!((next_char is IN)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* (JL | JV | JT | H2 | H3) × PO */ + // (JL | JV | JT | H2 | H3) × PO JL | JV | JT | H2 | H3 if next_grapheme_class!((next_char is PO)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* PR × (JL | JV | JT | H2 | H3) */ + // PR × (JL | JV | JT | H2 | H3) PR if next_grapheme_class!((next_char is JL, JV, JT, H2, H3)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* LB28 Do not break between alphabetics (“at”). - (AL | HL) × (AL | HL) */ + // LB28 Do not break between alphabetics (“at”). + // (AL | HL) × (AL | HL) AL | HL if next_grapheme_class!((next_char is AL, HL)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* LB29 Do not break between numeric punctuation and alphabetics (“e.g.”). - IS × (AL | HL) */ + // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”). + // IS × (AL | HL) IS if next_grapheme_class!((next_char is AL, HL)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* LB30 Do not break between letters, numbers, or ordinary symbols and opening - or closing parentheses. - (AL | HL | NU) × OP */ + // LB30 Do not break between letters, numbers, or ordinary symbols and opening + // or closing parentheses. + // (AL | HL | NU) × OP AL | HL | NU if next_grapheme_class!((next_char is OP)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /* CP × (AL | HL | NU) */ + // CP × (AL | HL | NU) CP if next_grapheme_class!((next_char is AL, HL , NU)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } - /*LB30b Do not break between an emoji base and an emoji modifier. - * EB × EM */ + // LB30b Do not break between an emoji base and an emoji modifier. + // EB × EM EB if next_grapheme_class!((next_char is EM)) => { let (idx, next_grapheme) = next_char.unwrap(); *pos = idx + next_grapheme.len(); self.iter.next(); - return self.next(); + self.next() } RI => { - /* LB30a Break between two regional indicator symbols if and only if there are an - * even number of regional indicators preceding the position of the break. - * sot (RI RI)* RI × RI + /* LB30a Break between two regional indicator symbols if and only if there + * are an even number of regional indicators preceding the + * position of the break. sot (RI RI)* RI × RI * [^RI] (RI RI)* RI × RI */ *reg_ind_streak += 1; *pos += grapheme.len(); @@ -681,11 +697,11 @@ impl<'a> Iterator for LineBreakCandidateIter<'a> { return Some((*pos - grapheme.len(), BreakAllowed)); } self.iter.next(); - return self.next(); + self.next() } _ => { *pos += grapheme.len(); - return Some((*pos - grapheme.len(), BreakAllowed)); + Some((*pos - grapheme.len(), BreakAllowed)) } } } diff --git a/src/text_processing/tables.rs b/src/text_processing/tables.rs index 299dcd5..0f2836e 100644 --- a/src/text_processing/tables.rs +++ b/src/text_processing/tables.rs @@ -1,28 +1,25 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . -use crate::text_processing::types::LineBreakClass; -use crate::text_processing::types::LineBreakClass::*; +use crate::text_processing::types::{LineBreakClass, LineBreakClass::*}; -pub const LINE_BREAK_RULES: &'static [(u32, u32, LineBreakClass)] = &[ +pub const LINE_BREAK_RULES: &[(u32, u32, LineBreakClass)] = &[ (0x0, 0x8, CM), (0x9, 0x9, BA), (0xA, 0xA, LF), diff --git a/src/text_processing/types.rs b/src/text_processing/types.rs index 47961ac..e4596a3 100644 --- a/src/text_processing/types.rs +++ b/src/text_processing/types.rs @@ -1,24 +1,23 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . +#[allow(clippy::upper_case_acronyms)] #[derive(Debug, Copy, Clone, PartialEq)] pub enum LineBreakClass { BK, diff --git a/src/text_processing/wcwidth.rs b/src/text_processing/wcwidth.rs index 6145710..c6819d9 100644 --- a/src/text_processing/wcwidth.rs +++ b/src/text_processing/wcwidth.rs @@ -1,31 +1,27 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . -/* - * This is an implementation of wcwidth() and wcswidth() as defined in - * "The Single UNIX Specification, Version 2, The Open Group, 1997" - * - * - * Markus Kuhn -- 2001-09-08 -- public domain - */ +// This is an implementation of wcwidth() and wcswidth() as defined in +// "The Single UNIX Specification, Version 2, The Open Group, 1997" +// +// +// Markus Kuhn -- 2001-09-08 -- public domain // TODO: Spacing widths // Update to Unicode 12 @@ -48,16 +44,17 @@ pub struct CodePointsIterator<'a> { rest: &'a [u8], } -/* - * UTF-8 uses a system of binary prefixes, in which the high bits of each byte mark whether it’s a single byte, the beginning of a multi-byte sequence, or a continuation byte; the remaining bits, concatenated, give the code point index. This table shows how it works: - * - * UTF-8 (binary) Code point (binary) Range - * 0xxxxxxx xxxxxxx U+0000–U+007F - * 110xxxxx 10yyyyyy xxxxxyyyyyy U+0080–U+07FF - * 1110xxxx 10yyyyyy 10zzzzzz xxxxyyyyyyzzzzzz U+0800–U+FFFF - * 11110xxx 10yyyyyy 10zzzzzz 10wwwwww xxxyyyyyyzzzzzzwwwwww U+10000–U+10FFFF - * - */ +/// UTF-8 uses a system of binary prefixes, in which the high bits of each +/// byte mark whether it’s a single byte, the beginning of a multi-byte +/// sequence, or a continuation byte; the remaining bits, concatenated, give +/// the code point index. This table shows how it works: +/// +/// | UTF-8 (binary) | Code point (binary) | Range | +/// |---------------------------------------|-------------------------|--------------------| +/// | `0xxxxxxx` | `xxxxxxx` | `U+0000–U+007F` | +/// | `110xxxxx 10yyyyyy` | `xxxxxyyyyyy` | `U+0080–U+07FF` | +/// | `1110xxxx 10yyyyyy 10zzzzzz` | `xxxxyyyyyyzzzzzz` | `U+0800–U+FFFF` | +/// | `11110xxx 10yyyyyy 10zzzzzz 10wwwwww` | `xxxyyyyyyzzzzzzwwwwww` | `U+10000–U+10FFFF` | impl<'a> Iterator for CodePointsIterator<'a> { type Item = WChar; @@ -65,7 +62,7 @@ impl<'a> Iterator for CodePointsIterator<'a> { if self.rest.is_empty() { return None; } - /* Input is UTF-8 valid strings, guaranteed by Rust's std */ + // Input is UTF-8 valid strings, guaranteed by Rust's std if self.rest[0] & 0b1000_0000 == 0x0 { let ret: WChar = WChar::from(self.rest[0]); self.rest = &self.rest[1..]; @@ -113,7 +110,7 @@ impl CodePointsIter for &str { } } -/* auxiliary function for binary search in Interval table */ +// auxiliary function for binary search in Interval table fn bisearch(ucs: WChar, table: &'static [Interval]) -> bool { let mut min = 0; let mut mid; @@ -137,38 +134,35 @@ fn bisearch(ucs: WChar, table: &'static [Interval]) -> bool { false } -/* The following functions define the column width of an ISO 10646 - * character as follows: - * - * - The null character (U+0000) has a column width of 0. - * - * - Other C0/C1 control characters and DEL will lead to a return - * value of -1. - * - * - Non-spacing and enclosing combining characters (general - * category code Mn or Me in the Unicode database) have a - * column width of 0. - * - * - Other format characters (general category code Cf in the Unicode - * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. - * - * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) - * have a column width of 0. - * - * - Spacing characters in the East Asian Wide (W) or East Asian - * FullWidth (F) category as defined in Unicode Technical - * Report #11 have a column width of 2. - * - * - All remaining characters (including all printable - * ISO 8859-1 and WGL4 characters, Unicode control characters, - * etc.) have a column width of 1. - * - * This implementation assumes that wchar_t characters are encoded - * in ISO 10646. - */ +// The following functions define the column width of an ISO 10646 +// character as follows: +// +// - The null character (U+0000) has a column width of 0. +// +// - Other C0/C1 control characters and DEL will lead to a return value of +// -1. +// +// - Non-spacing and enclosing combining characters (general category code Mn +// or Me in the Unicode database) have a column width of 0. +// +// - Other format characters (general category code Cf in the Unicode +// database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. +// +// - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) have a +// column width of 0. +// +// - Spacing characters in the East Asian Wide (W) or East Asian FullWidth +// (F) category as defined in Unicode Technical Report #11 have a column +// width of 2. +// +// - All remaining characters (including all printable ISO 8859-1 and WGL4 +// characters, Unicode control characters, etc.) have a column width of 1. +// +// This implementation assumes that wchar_t characters are encoded +// in ISO 10646. pub fn wcwidth(ucs: WChar) -> Option { - /* sorted list of non-overlapping intervals of non-spacing characters */ + // sorted list of non-overlapping intervals of non-spacing characters let combining: &'static [Interval] = &[ (0x0300, 0x034E), (0x0360, 0x0362), @@ -272,37 +266,37 @@ pub fn wcwidth(ucs: WChar) -> Option { (0xFFF9, 0xFFFB), ]; - /* test for 8-bit control characters */ + // test for 8-bit control characters if ucs == 0 { return Some(0); } - if ucs < 32 || (ucs >= 0x7f && ucs < 0xa0) { + if ucs < 32 || (0x7f..0xa0).contains(&ucs) { return None; } - /* binary search in table of emojis */ + // binary search in table of emojis if bisearch(ucs, EMOJI_RANGES) { return Some(2); } - /* binary search in table of non-spacing characters */ + // binary search in table of non-spacing characters if bisearch(ucs, combining) { return Some(1); } - /* if we arrive here, ucs is not a combining or C0/C1 control character */ + // if we arrive here, ucs is not a combining or C0/C1 control character Some( 1 + big_if_true!( ucs >= 0x1100 && (ucs <= 0x115f || /* Hangul Jamo init. consonants */ - (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & !0x0011) != 0x300a && + ((0x2e80..=0xa4cf).contains(&ucs) && (ucs & !0x0011) != 0x300a && ucs != 0x303f) || /* CJK ... Yi */ - (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ - (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ - (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ - (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ - (ucs >= 0xffe0 && ucs <= 0xffe6) || - (ucs >= 0x20000 && ucs <= 0x2ffff)) + (0xac00..=0xd7a3).contains(&ucs) || /* Hangul Syllables */ + (0xf900..=0xfaff).contains(&ucs) || /* CJK Compatibility Ideographs */ + (0xfe30..=0xfe6f).contains(&ucs) || /* CJK Compatibility Forms */ + (0xff00..=0xff5f).contains(&ucs) || /* Fullwidth Forms */ + (0xffe0..=0xffe6).contains(&ucs) || + (0x20000..=0x2ffff).contains(&ucs)) ), ) } @@ -324,359 +318,536 @@ pub fn wcswidth(mut pwcs: WChar, mut n: usize) -> Option { Some(width) } -const EMOJI_RANGES: &'static [Interval] = &[ - (0x231A, 0x231B), // ; Basic_Emoji ; watch # 1.1 [2] (⌚..⌛) - (0x23E9, 0x23EC), // ; Basic_Emoji ; fast-forward button # 6.0 [4] (⏩..⏬) - (0x23F0, 0x23F0), // ; Basic_Emoji ; alarm clock # 6.0 [1] (⏰) - (0x23F3, 0x23F3), // ; Basic_Emoji ; hourglass not done # 6.0 [1] (⏳) - (0x25FD, 0x25FE), // ; Basic_Emoji ; white medium-small square # 3.2 [2] (◽..◾) - (0x2614, 0x2615), // ; Basic_Emoji ; umbrella with rain drops # 4.0 [2] (☔..☕) - (0x2648, 0x2653), // ; Basic_Emoji ; Aries # 1.1 [12] (♈..♓) - (0x267F, 0x267F), // ; Basic_Emoji ; wheelchair symbol # 4.1 [1] (♿) - (0x2693, 0x2693), // ; Basic_Emoji ; anchor # 4.1 [1] (⚓) - (0x26A1, 0x26A1), // ; Basic_Emoji ; high voltage # 4.0 [1] (⚡) - (0x26AA, 0x26AB), // ; Basic_Emoji ; white circle # 4.1 [2] (⚪..⚫) - (0x26BD, 0x26BE), // ; Basic_Emoji ; soccer ball # 5.2 [2] (⚽..⚾) - (0x26C4, 0x26C5), // ; Basic_Emoji ; snowman without snow # 5.2 [2] (⛄..⛅) - (0x26CE, 0x26CE), // ; Basic_Emoji ; Ophiuchus # 6.0 [1] (⛎) - (0x26D4, 0x26D4), // ; Basic_Emoji ; no entry # 5.2 [1] (⛔) - (0x26EA, 0x26EA), // ; Basic_Emoji ; church # 5.2 [1] (⛪) - (0x26F2, 0x26F3), // ; Basic_Emoji ; fountain # 5.2 [2] (⛲..⛳) - (0x26F5, 0x26F5), // ; Basic_Emoji ; sailboat # 5.2 [1] (⛵) - (0x26FA, 0x26FA), // ; Basic_Emoji ; tent # 5.2 [1] (⛺) - (0x26FD, 0x26FD), // ; Basic_Emoji ; fuel pump # 5.2 [1] (⛽) - (0x2705, 0x2705), // ; Basic_Emoji ; check mark button # 6.0 [1] (✅) - (0x270A, 0x270B), // ; Basic_Emoji ; raised fist # 6.0 [2] (✊..✋) - (0x2728, 0x2728), // ; Basic_Emoji ; sparkles # 6.0 [1] (✨) - (0x274C, 0x274C), // ; Basic_Emoji ; cross mark # 6.0 [1] (❌) - (0x274E, 0x274E), // ; Basic_Emoji ; cross mark button # 6.0 [1] (❎) - (0x2753, 0x2755), // ; Basic_Emoji ; question mark # 6.0 [3] (❓..❕) - (0x2757, 0x2757), // ; Basic_Emoji ; exclamation mark # 5.2 [1] (❗) - (0x2795, 0x2797), // ; Basic_Emoji ; plus sign # 6.0 [3] (➕..➗) - (0x27B0, 0x27B0), // ; Basic_Emoji ; curly loop # 6.0 [1] (➰) - (0x27BF, 0x27BF), // ; Basic_Emoji ; double curly loop # 6.0 [1] (➿) - (0x2B1B, 0x2B1C), // ; Basic_Emoji ; black large square # 5.1 [2] (⬛..⬜) - (0x2B50, 0x2B50), // ; Basic_Emoji ; star # 5.1 [1] (⭐) - (0x2B55, 0x2B55), // ; Basic_Emoji ; hollow red circle # 5.2 [1] (⭕) - (0x1F004, 0x1F004), // ; Basic_Emoji ; mahjong red dragon # 5.1 [1] (🀄) - (0x1F0CF, 0x1F0CF), // ; Basic_Emoji ; joker # 6.0 [1] (🃏) - (0x1F18E, 0x1F18E), // ; Basic_Emoji ; AB button (blood type) # 6.0 [1] (🆎) - (0x1F191, 0x1F19A), // ; Basic_Emoji ; CL button # 6.0 [10] (🆑..🆚) - (0x1F201, 0x1F201), // ; Basic_Emoji ; Japanese “here” button # 6.0 [1] (🈁) - (0x1F21A, 0x1F21A), // ; Basic_Emoji ; Japanese “free of charge” button # 5.2 [1] (🈚) - (0x1F22F, 0x1F22F), // ; Basic_Emoji ; Japanese “reserved” button # 5.2 [1] (🈯) - (0x1F232, 0x1F236), // ; Basic_Emoji ; Japanese “prohibited” button # 6.0 [5] (🈲..🈶) - (0x1F238, 0x1F23A), // ; Basic_Emoji ; Japanese “application” button # 6.0 [3] (🈸..🈺) - (0x1F250, 0x1F251), // ; Basic_Emoji ; Japanese “bargain” button # 6.0 [2] (🉐..🉑) - (0x1F300, 0x1F320), // ; Basic_Emoji ; cyclone # 6.0 [33] (🌀..🌠) - (0x1F32D, 0x1F32F), // ; Basic_Emoji ; hot dog # 8.0 [3] (🌭..🌯) - (0x1F330, 0x1F335), // ; Basic_Emoji ; chestnut # 6.0 [6] (🌰..🌵) - (0x1F337, 0x1F37C), // ; Basic_Emoji ; tulip # 6.0 [70] (🌷..🍼) - (0x1F37E, 0x1F37F), // ; Basic_Emoji ; bottle with popping cork # 8.0 [2] (🍾..🍿) - (0x1F380, 0x1F393), // ; Basic_Emoji ; ribbon # 6.0 [20] (🎀..🎓) - (0x1F3A0, 0x1F3C4), // ; Basic_Emoji ; carousel horse # 6.0 [37] (🎠..🏄) - (0x1F3C5, 0x1F3C5), // ; Basic_Emoji ; sports medal # 7.0 [1] (🏅) - (0x1F3C6, 0x1F3CA), // ; Basic_Emoji ; trophy # 6.0 [5] (🏆..🏊) - (0x1F3CF, 0x1F3D3), // ; Basic_Emoji ; cricket game # 8.0 [5] (🏏..🏓) - (0x1F3E0, 0x1F3F0), // ; Basic_Emoji ; house # 6.0 [17] (🏠..🏰) - (0x1F3F4, 0x1F3F4), // ; Basic_Emoji ; black flag # 7.0 [1] (🏴) - (0x1F3F8, 0x1F3FF), // ; Basic_Emoji ; badminton # 8.0 [8] (🏸..🏿) - (0x1F400, 0x1F43E), // ; Basic_Emoji ; rat # 6.0 [63] (🐀..🐾) - (0x1F440, 0x1F440), // ; Basic_Emoji ; eyes # 6.0 [1] (👀) - (0x1F442, 0x1F4F7), // ; Basic_Emoji ; ear # 6.0[182] (👂..📷) - (0x1F4F8, 0x1F4F8), // ; Basic_Emoji ; camera with flash # 7.0 [1] (📸) - (0x1F4F9, 0x1F4FC), // ; Basic_Emoji ; video camera # 6.0 [4] (📹..📼) - (0x1F4FF, 0x1F4FF), // ; Basic_Emoji ; prayer beads # 8.0 [1] (📿) - (0x1F500, 0x1F53D), // ; Basic_Emoji ; shuffle tracks button # 6.0 [62] (🔀..🔽) - (0x1F54B, 0x1F54E), // ; Basic_Emoji ; kaaba # 8.0 [4] (🕋..🕎) - (0x1F550, 0x1F567), // ; Basic_Emoji ; one o’clock # 6.0 [24] (🕐..🕧) - (0x1F57A, 0x1F57A), // ; Basic_Emoji ; man dancing # 9.0 [1] (🕺) - (0x1F595, 0x1F596), // ; Basic_Emoji ; middle finger # 7.0 [2] (🖕..🖖) - (0x1F5A4, 0x1F5A4), // ; Basic_Emoji ; black heart # 9.0 [1] (🖤) - (0x1F5FB, 0x1F5FF), // ; Basic_Emoji ; mount fuji # 6.0 [5] (🗻..🗿) - (0x1F600, 0x1F600), // ; Basic_Emoji ; grinning face # 6.1 [1] (😀) - (0x1F601, 0x1F610), // ; Basic_Emoji ; beaming face with smiling eyes # 6.0 [16] (😁..😐) - (0x1F611, 0x1F611), // ; Basic_Emoji ; expressionless face # 6.1 [1] (😑) - (0x1F612, 0x1F614), // ; Basic_Emoji ; unamused face # 6.0 [3] (😒..😔) - (0x1F615, 0x1F615), // ; Basic_Emoji ; confused face # 6.1 [1] (😕) - (0x1F616, 0x1F616), // ; Basic_Emoji ; confounded face # 6.0 [1] (😖) - (0x1F617, 0x1F617), // ; Basic_Emoji ; kissing face # 6.1 [1] (😗) - (0x1F618, 0x1F618), // ; Basic_Emoji ; face blowing a kiss # 6.0 [1] (😘) - (0x1F619, 0x1F619), // ; Basic_Emoji ; kissing face with smiling eyes # 6.1 [1] (😙) - (0x1F61A, 0x1F61A), // ; Basic_Emoji ; kissing face with closed eyes # 6.0 [1] (😚) - (0x1F61B, 0x1F61B), // ; Basic_Emoji ; face with tongue # 6.1 [1] (😛) - (0x1F61C, 0x1F61E), // ; Basic_Emoji ; winking face with tongue # 6.0 [3] (😜..😞) - (0x1F61F, 0x1F61F), // ; Basic_Emoji ; worried face # 6.1 [1] (😟) - (0x1F620, 0x1F625), // ; Basic_Emoji ; angry face # 6.0 [6] (😠..😥) - (0x1F626, 0x1F627), // ; Basic_Emoji ; frowning face with open mouth # 6.1 [2] (😦..😧) - (0x1F628, 0x1F62B), // ; Basic_Emoji ; fearful face # 6.0 [4] (😨..😫) - (0x1F62C, 0x1F62C), // ; Basic_Emoji ; grimacing face # 6.1 [1] (😬) - (0x1F62D, 0x1F62D), // ; Basic_Emoji ; loudly crying face # 6.0 [1] (😭) - (0x1F62E, 0x1F62F), // ; Basic_Emoji ; face with open mouth # 6.1 [2] (😮..😯) - (0x1F630, 0x1F633), // ; Basic_Emoji ; anxious face with sweat # 6.0 [4] (😰..😳) - (0x1F634, 0x1F634), // ; Basic_Emoji ; sleeping face # 6.1 [1] (😴) - (0x1F635, 0x1F640), // ; Basic_Emoji ; dizzy face # 6.0 [12] (😵..🙀) - (0x1F641, 0x1F642), // ; Basic_Emoji ; slightly frowning face # 7.0 [2] (🙁..🙂) - (0x1F643, 0x1F644), // ; Basic_Emoji ; upside-down face # 8.0 [2] (🙃..🙄) - (0x1F645, 0x1F64F), // ; Basic_Emoji ; person gesturing NO # 6.0 [11] (🙅..🙏) - (0x1F680, 0x1F6C5), // ; Basic_Emoji ; rocket # 6.0 [70] (🚀..🛅) - (0x1F6CC, 0x1F6CC), // ; Basic_Emoji ; person in bed # 7.0 [1] (🛌) - (0x1F6D0, 0x1F6D0), // ; Basic_Emoji ; place of worship # 8.0 [1] (🛐) - (0x1F6D1, 0x1F6D2), // ; Basic_Emoji ; stop sign # 9.0 [2] (🛑..🛒) - (0x1F6D5, 0x1F6D5), // ; Basic_Emoji ; hindu temple # 12.0 [1] (🛕) - (0x1F6EB, 0x1F6EC), // ; Basic_Emoji ; airplane departure # 7.0 [2] (🛫..🛬) - (0x1F6F4, 0x1F6F6), // ; Basic_Emoji ; kick scooter # 9.0 [3] (🛴..🛶) - (0x1F6F7, 0x1F6F8), // ; Basic_Emoji ; sled # 10.0 [2] (🛷..🛸) - (0x1F6F9, 0x1F6F9), // ; Basic_Emoji ; skateboard # 11.0 [1] (🛹) - (0x1F6FA, 0x1F6FA), // ; Basic_Emoji ; auto rickshaw # 12.0 [1] (🛺) - (0x1F7E0, 0x1F7EB), // ; Basic_Emoji ; orange circle # 12.0 [12] (🟠..🟫) - (0x1F90D, 0x1F90F), // ; Basic_Emoji ; white heart # 12.0 [3] (🤍..🤏) - (0x1F910, 0x1F918), // ; Basic_Emoji ; zipper-mouth face # 8.0 [9] (🤐..🤘) - (0x1F919, 0x1F91E), // ; Basic_Emoji ; call me hand # 9.0 [6] (🤙..🤞) - (0x1F91F, 0x1F91F), // ; Basic_Emoji ; love-you gesture # 10.0 [1] (🤟) - (0x1F920, 0x1F927), // ; Basic_Emoji ; cowboy hat face # 9.0 [8] (🤠..🤧) - (0x1F928, 0x1F92F), // ; Basic_Emoji ; face with raised eyebrow # 10.0 [8] (🤨..🤯) - (0x1F930, 0x1F930), // ; Basic_Emoji ; pregnant woman # 9.0 [1] (🤰) - (0x1F931, 0x1F932), // ; Basic_Emoji ; breast-feeding # 10.0 [2] (🤱..🤲) - (0x1F933, 0x1F93A), // ; Basic_Emoji ; selfie # 9.0 [8] (🤳..🤺) - (0x1F93C, 0x1F93E), // ; Basic_Emoji ; people wrestling # 9.0 [3] (🤼..🤾) - (0x1F93F, 0x1F93F), // ; Basic_Emoji ; diving mask # 12.0 [1] (🤿) - (0x1F940, 0x1F945), // ; Basic_Emoji ; wilted flower # 9.0 [6] (🥀..🥅) - (0x1F947, 0x1F94B), // ; Basic_Emoji ; 1st place medal # 9.0 [5] (🥇..🥋) - (0x1F94C, 0x1F94C), // ; Basic_Emoji ; curling stone # 10.0 [1] (🥌) - (0x1F94D, 0x1F94F), // ; Basic_Emoji ; lacrosse # 11.0 [3] (🥍..🥏) - (0x1F950, 0x1F95E), // ; Basic_Emoji ; croissant # 9.0 [15] (🥐..🥞) - (0x1F95F, 0x1F96B), // ; Basic_Emoji ; dumpling # 10.0 [13] (🥟..🥫) - (0x1F96C, 0x1F970), // ; Basic_Emoji ; leafy green # 11.0 [5] (🥬..🥰) - (0x1F971, 0x1F971), // ; Basic_Emoji ; yawning face # 12.0 [1] (🥱) - (0x1F973, 0x1F976), // ; Basic_Emoji ; partying face # 11.0 [4] (🥳..🥶) - (0x1F97A, 0x1F97A), // ; Basic_Emoji ; pleading face # 11.0 [1] (🥺) - (0x1F97B, 0x1F97B), // ; Basic_Emoji ; sari # 12.0 [1] (🥻) - (0x1F97C, 0x1F97F), // ; Basic_Emoji ; lab coat # 11.0 [4] (🥼..🥿) - (0x1F980, 0x1F984), // ; Basic_Emoji ; crab # 8.0 [5] (🦀..🦄) - (0x1F985, 0x1F991), // ; Basic_Emoji ; eagle # 9.0 [13] (🦅..🦑) - (0x1F992, 0x1F997), // ; Basic_Emoji ; giraffe # 10.0 [6] (🦒..🦗) - (0x1F998, 0x1F9A2), // ; Basic_Emoji ; kangaroo # 11.0 [11] (🦘..🦢) - (0x1F9A5, 0x1F9AA), // ; Basic_Emoji ; sloth # 12.0 [6] (🦥..🦪) - (0x1F9AE, 0x1F9AF), // ; Basic_Emoji ; guide dog # 12.0 [2] (🦮..🦯) - (0x1F9B0, 0x1F9B9), // ; Basic_Emoji ; red hair # 11.0 [10] (🦰..🦹) - (0x1F9BA, 0x1F9BF), // ; Basic_Emoji ; safety vest # 12.0 [6] (🦺..🦿) - (0x1F9C0, 0x1F9C0), // ; Basic_Emoji ; cheese wedge # 8.0 [1] (🧀) - (0x1F9C1, 0x1F9C2), // ; Basic_Emoji ; cupcake # 11.0 [2] (🧁..🧂) - (0x1F9C3, 0x1F9CA), // ; Basic_Emoji ; beverage box # 12.0 [8] (🧃..🧊) - (0x1F9CD, 0x1F9CF), // ; Basic_Emoji ; person standing # 12.0 [3] (🧍..🧏) - (0x1F9D0, 0x1F9E6), // ; Basic_Emoji ; face with monocle # 10.0 [23] (🧐..🧦) - (0x1F9E7, 0x1F9FF), // ; Basic_Emoji ; red envelope # 11.0 [25] (🧧..🧿) - (0x1FA70, 0x1FA73), // ; Basic_Emoji ; ballet shoes # 12.0 [4] (🩰..🩳) - (0x1FA78, 0x1FA7A), // ; Basic_Emoji ; drop of blood # 12.0 [3] (🩸..🩺) - (0x1FA80, 0x1FA82), // ; Basic_Emoji ; yo-yo # 12.0 [3] (🪀..🪂) - (0x1FA90, 0x1FA95), // ; Basic_Emoji ; ringed planet # 12.0 [6] (🪐..🪕) +const EMOJI_RANGES: &[Interval] = &[ + (0x231A, 0x231B), /* ; Basic_Emoji ; watch + * # 1.1 [2] (⌚..⌛) */ + (0x23E9, 0x23EC), /* ; Basic_Emoji ; fast-forward button + * # 6.0 [4] (⏩..⏬) */ + (0x23F0, 0x23F0), /* ; Basic_Emoji ; alarm clock + * # 6.0 [1] (⏰) */ + (0x23F3, 0x23F3), /* ; Basic_Emoji ; hourglass not done + * # 6.0 [1] (⏳) */ + (0x25FD, 0x25FE), /* ; Basic_Emoji ; white medium-small square + * # 3.2 [2] (◽..◾) */ + (0x2614, 0x2615), /* ; Basic_Emoji ; umbrella with rain drops + * # 4.0 [2] (☔..☕) */ + (0x2648, 0x2653), /* ; Basic_Emoji ; Aries + * # 1.1 [12] (♈..♓) */ + (0x267F, 0x267F), /* ; Basic_Emoji ; wheelchair symbol + * # 4.1 [1] (♿) */ + (0x2693, 0x2693), /* ; Basic_Emoji ; anchor + * # 4.1 [1] (⚓) */ + (0x26A1, 0x26A1), /* ; Basic_Emoji ; high voltage + * # 4.0 [1] (⚡) */ + (0x26AA, 0x26AB), /* ; Basic_Emoji ; white circle + * # 4.1 [2] (⚪..⚫) */ + (0x26BD, 0x26BE), /* ; Basic_Emoji ; soccer ball + * # 5.2 [2] (⚽..⚾) */ + (0x26C4, 0x26C5), /* ; Basic_Emoji ; snowman without snow + * # 5.2 [2] (⛄..⛅) */ + (0x26CE, 0x26CE), /* ; Basic_Emoji ; Ophiuchus + * # 6.0 [1] (⛎) */ + (0x26D4, 0x26D4), /* ; Basic_Emoji ; no entry + * # 5.2 [1] (⛔) */ + (0x26EA, 0x26EA), /* ; Basic_Emoji ; church + * # 5.2 [1] (⛪) */ + (0x26F2, 0x26F3), /* ; Basic_Emoji ; fountain + * # 5.2 [2] (⛲..⛳) */ + (0x26F5, 0x26F5), /* ; Basic_Emoji ; sailboat + * # 5.2 [1] (⛵) */ + (0x26FA, 0x26FA), /* ; Basic_Emoji ; tent + * # 5.2 [1] (⛺) */ + (0x26FD, 0x26FD), /* ; Basic_Emoji ; fuel pump + * # 5.2 [1] (⛽) */ + (0x2705, 0x2705), /* ; Basic_Emoji ; check mark button + * # 6.0 [1] (✅) */ + (0x270A, 0x270B), /* ; Basic_Emoji ; raised fist + * # 6.0 [2] (✊..✋) */ + (0x2728, 0x2728), /* ; Basic_Emoji ; sparkles + * # 6.0 [1] (✨) */ + (0x274C, 0x274C), /* ; Basic_Emoji ; cross mark + * # 6.0 [1] (❌) */ + (0x274E, 0x274E), /* ; Basic_Emoji ; cross mark button + * # 6.0 [1] (❎) */ + (0x2753, 0x2755), /* ; Basic_Emoji ; question mark + * # 6.0 [3] (❓..❕) */ + (0x2757, 0x2757), /* ; Basic_Emoji ; exclamation mark + * # 5.2 [1] (❗) */ + (0x2795, 0x2797), /* ; Basic_Emoji ; plus sign + * # 6.0 [3] (➕..➗) */ + (0x27B0, 0x27B0), /* ; Basic_Emoji ; curly loop + * # 6.0 [1] (➰) */ + (0x27BF, 0x27BF), /* ; Basic_Emoji ; double curly loop + * # 6.0 [1] (➿) */ + (0x2B1B, 0x2B1C), /* ; Basic_Emoji ; black large square + * # 5.1 [2] (⬛..⬜) */ + (0x2B50, 0x2B50), /* ; Basic_Emoji ; star + * # 5.1 [1] (⭐) */ + (0x2B55, 0x2B55), /* ; Basic_Emoji ; hollow red circle + * # 5.2 [1] (⭕) */ + (0x1F004, 0x1F004), /* ; Basic_Emoji ; mahjong red dragon + * # 5.1 [1] (🀄) */ + (0x1F0CF, 0x1F0CF), /* ; Basic_Emoji ; joker + * # 6.0 [1] (🃏) */ + (0x1F18E, 0x1F18E), /* ; Basic_Emoji ; AB button (blood type) + * # 6.0 [1] (🆎) */ + (0x1F191, 0x1F19A), /* ; Basic_Emoji ; CL button + * # 6.0 [10] (🆑..🆚) */ + (0x1F201, 0x1F201), /* ; Basic_Emoji ; Japanese “here” button + * # 6.0 [1] (🈁) */ + (0x1F21A, 0x1F21A), /* ; Basic_Emoji ; Japanese “free of charge” button + * # 5.2 [1] (🈚) */ + (0x1F22F, 0x1F22F), /* ; Basic_Emoji ; Japanese “reserved” button + * # 5.2 [1] (🈯) */ + (0x1F232, 0x1F236), /* ; Basic_Emoji ; Japanese “prohibited” button + * # 6.0 [5] (🈲..🈶) */ + (0x1F238, 0x1F23A), /* ; Basic_Emoji ; Japanese “application” button + * # 6.0 [3] (🈸..🈺) */ + (0x1F250, 0x1F251), /* ; Basic_Emoji ; Japanese “bargain” button + * # 6.0 [2] (🉐..🉑) */ + (0x1F300, 0x1F320), /* ; Basic_Emoji ; cyclone + * # 6.0 [33] (🌀..🌠) */ + (0x1F32D, 0x1F32F), /* ; Basic_Emoji ; hot dog + * # 8.0 [3] (🌭..🌯) */ + (0x1F330, 0x1F335), /* ; Basic_Emoji ; chestnut + * # 6.0 [6] (🌰..🌵) */ + (0x1F337, 0x1F37C), /* ; Basic_Emoji ; tulip + * # 6.0 [70] (🌷..🍼) */ + (0x1F37E, 0x1F37F), /* ; Basic_Emoji ; bottle with popping cork + * # 8.0 [2] (🍾..🍿) */ + (0x1F380, 0x1F393), /* ; Basic_Emoji ; ribbon + * # 6.0 [20] (🎀..🎓) */ + (0x1F3A0, 0x1F3C4), /* ; Basic_Emoji ; carousel horse + * # 6.0 [37] (🎠..🏄) */ + (0x1F3C5, 0x1F3C5), /* ; Basic_Emoji ; sports medal + * # 7.0 [1] (🏅) */ + (0x1F3C6, 0x1F3CA), /* ; Basic_Emoji ; trophy + * # 6.0 [5] (🏆..🏊) */ + (0x1F3CF, 0x1F3D3), /* ; Basic_Emoji ; cricket game + * # 8.0 [5] (🏏..🏓) */ + (0x1F3E0, 0x1F3F0), /* ; Basic_Emoji ; house + * # 6.0 [17] (🏠..🏰) */ + (0x1F3F4, 0x1F3F4), /* ; Basic_Emoji ; black flag + * # 7.0 [1] (🏴) */ + (0x1F3F8, 0x1F3FF), /* ; Basic_Emoji ; badminton + * # 8.0 [8] (🏸..🏿) */ + (0x1F400, 0x1F43E), /* ; Basic_Emoji ; rat + * # 6.0 [63] (🐀..🐾) */ + (0x1F440, 0x1F440), /* ; Basic_Emoji ; eyes + * # 6.0 [1] (👀) */ + (0x1F442, 0x1F4F7), /* ; Basic_Emoji ; ear + * # 6.0[182] (👂..📷) */ + (0x1F4F8, 0x1F4F8), /* ; Basic_Emoji ; camera with flash + * # 7.0 [1] (📸) */ + (0x1F4F9, 0x1F4FC), /* ; Basic_Emoji ; video camera + * # 6.0 [4] (📹..📼) */ + (0x1F4FF, 0x1F4FF), /* ; Basic_Emoji ; prayer beads + * # 8.0 [1] (📿) */ + (0x1F500, 0x1F53D), /* ; Basic_Emoji ; shuffle tracks button + * # 6.0 [62] (🔀..🔽) */ + (0x1F54B, 0x1F54E), /* ; Basic_Emoji ; kaaba + * # 8.0 [4] (🕋..🕎) */ + (0x1F550, 0x1F567), /* ; Basic_Emoji ; one o’clock + * # 6.0 [24] (🕐..🕧) */ + (0x1F57A, 0x1F57A), /* ; Basic_Emoji ; man dancing + * # 9.0 [1] (🕺) */ + (0x1F595, 0x1F596), /* ; Basic_Emoji ; middle finger + * # 7.0 [2] (🖕..🖖) */ + (0x1F5A4, 0x1F5A4), /* ; Basic_Emoji ; black heart + * # 9.0 [1] (🖤) */ + (0x1F5FB, 0x1F5FF), /* ; Basic_Emoji ; mount fuji + * # 6.0 [5] (🗻..🗿) */ + (0x1F600, 0x1F600), /* ; Basic_Emoji ; grinning face + * # 6.1 [1] (😀) */ + (0x1F601, 0x1F610), /* ; Basic_Emoji ; beaming face with smiling eyes + * # 6.0 [16] (😁..😐) */ + (0x1F611, 0x1F611), /* ; Basic_Emoji ; expressionless face + * # 6.1 [1] (😑) */ + (0x1F612, 0x1F614), /* ; Basic_Emoji ; unamused face + * # 6.0 [3] (😒..😔) */ + (0x1F615, 0x1F615), /* ; Basic_Emoji ; confused face + * # 6.1 [1] (😕) */ + (0x1F616, 0x1F616), /* ; Basic_Emoji ; confounded face + * # 6.0 [1] (😖) */ + (0x1F617, 0x1F617), /* ; Basic_Emoji ; kissing face + * # 6.1 [1] (😗) */ + (0x1F618, 0x1F618), /* ; Basic_Emoji ; face blowing a kiss + * # 6.0 [1] (😘) */ + (0x1F619, 0x1F619), /* ; Basic_Emoji ; kissing face with smiling eyes + * # 6.1 [1] (😙) */ + (0x1F61A, 0x1F61A), /* ; Basic_Emoji ; kissing face with closed eyes + * # 6.0 [1] (😚) */ + (0x1F61B, 0x1F61B), /* ; Basic_Emoji ; face with tongue + * # 6.1 [1] (😛) */ + (0x1F61C, 0x1F61E), /* ; Basic_Emoji ; winking face with tongue + * # 6.0 [3] (😜..😞) */ + (0x1F61F, 0x1F61F), /* ; Basic_Emoji ; worried face + * # 6.1 [1] (😟) */ + (0x1F620, 0x1F625), /* ; Basic_Emoji ; angry face + * # 6.0 [6] (😠..😥) */ + (0x1F626, 0x1F627), /* ; Basic_Emoji ; frowning face with open mouth + * # 6.1 [2] (😦..😧) */ + (0x1F628, 0x1F62B), /* ; Basic_Emoji ; fearful face + * # 6.0 [4] (😨..😫) */ + (0x1F62C, 0x1F62C), /* ; Basic_Emoji ; grimacing face + * # 6.1 [1] (😬) */ + (0x1F62D, 0x1F62D), /* ; Basic_Emoji ; loudly crying face + * # 6.0 [1] (😭) */ + (0x1F62E, 0x1F62F), /* ; Basic_Emoji ; face with open mouth + * # 6.1 [2] (😮..😯) */ + (0x1F630, 0x1F633), /* ; Basic_Emoji ; anxious face with sweat + * # 6.0 [4] (😰..😳) */ + (0x1F634, 0x1F634), /* ; Basic_Emoji ; sleeping face + * # 6.1 [1] (😴) */ + (0x1F635, 0x1F640), /* ; Basic_Emoji ; dizzy face + * # 6.0 [12] (😵..🙀) */ + (0x1F641, 0x1F642), /* ; Basic_Emoji ; slightly frowning face + * # 7.0 [2] (🙁..🙂) */ + (0x1F643, 0x1F644), /* ; Basic_Emoji ; upside-down face + * # 8.0 [2] (🙃..🙄) */ + (0x1F645, 0x1F64F), /* ; Basic_Emoji ; person gesturing NO + * # 6.0 [11] (🙅..🙏) */ + (0x1F680, 0x1F6C5), /* ; Basic_Emoji ; rocket + * # 6.0 [70] (🚀..🛅) */ + (0x1F6CC, 0x1F6CC), /* ; Basic_Emoji ; person in bed + * # 7.0 [1] (🛌) */ + (0x1F6D0, 0x1F6D0), /* ; Basic_Emoji ; place of worship + * # 8.0 [1] (🛐) */ + (0x1F6D1, 0x1F6D2), /* ; Basic_Emoji ; stop sign + * # 9.0 [2] (🛑..🛒) */ + (0x1F6D5, 0x1F6D5), /* ; Basic_Emoji ; hindu temple + * # 12.0 [1] (🛕) */ + (0x1F6EB, 0x1F6EC), /* ; Basic_Emoji ; airplane departure + * # 7.0 [2] (🛫..🛬) */ + (0x1F6F4, 0x1F6F6), /* ; Basic_Emoji ; kick scooter + * # 9.0 [3] (🛴..🛶) */ + (0x1F6F7, 0x1F6F8), /* ; Basic_Emoji ; sled + * # 10.0 [2] (🛷..🛸) */ + (0x1F6F9, 0x1F6F9), /* ; Basic_Emoji ; skateboard + * # 11.0 [1] (🛹) */ + (0x1F6FA, 0x1F6FA), /* ; Basic_Emoji ; auto rickshaw + * # 12.0 [1] (🛺) */ + (0x1F7E0, 0x1F7EB), /* ; Basic_Emoji ; orange circle + * # 12.0 [12] (🟠..🟫) */ + (0x1F90D, 0x1F90F), /* ; Basic_Emoji ; white heart + * # 12.0 [3] (🤍..🤏) */ + (0x1F910, 0x1F918), /* ; Basic_Emoji ; zipper-mouth face + * # 8.0 [9] (🤐..🤘) */ + (0x1F919, 0x1F91E), /* ; Basic_Emoji ; call me hand + * # 9.0 [6] (🤙..🤞) */ + (0x1F91F, 0x1F91F), /* ; Basic_Emoji ; love-you gesture + * # 10.0 [1] (🤟) */ + (0x1F920, 0x1F927), /* ; Basic_Emoji ; cowboy hat face + * # 9.0 [8] (🤠..🤧) */ + (0x1F928, 0x1F92F), /* ; Basic_Emoji ; face with raised eyebrow + * # 10.0 [8] (🤨..🤯) */ + (0x1F930, 0x1F930), /* ; Basic_Emoji ; pregnant woman + * # 9.0 [1] (🤰) */ + (0x1F931, 0x1F932), /* ; Basic_Emoji ; breast-feeding + * # 10.0 [2] (🤱..🤲) */ + (0x1F933, 0x1F93A), /* ; Basic_Emoji ; selfie + * # 9.0 [8] (🤳..🤺) */ + (0x1F93C, 0x1F93E), /* ; Basic_Emoji ; people wrestling + * # 9.0 [3] (🤼..🤾) */ + (0x1F93F, 0x1F93F), /* ; Basic_Emoji ; diving mask + * # 12.0 [1] (🤿) */ + (0x1F940, 0x1F945), /* ; Basic_Emoji ; wilted flower + * # 9.0 [6] (🥀..🥅) */ + (0x1F947, 0x1F94B), /* ; Basic_Emoji ; 1st place medal + * # 9.0 [5] (🥇..🥋) */ + (0x1F94C, 0x1F94C), /* ; Basic_Emoji ; curling stone + * # 10.0 [1] (🥌) */ + (0x1F94D, 0x1F94F), /* ; Basic_Emoji ; lacrosse + * # 11.0 [3] (🥍..🥏) */ + (0x1F950, 0x1F95E), /* ; Basic_Emoji ; croissant + * # 9.0 [15] (🥐..🥞) */ + (0x1F95F, 0x1F96B), /* ; Basic_Emoji ; dumpling + * # 10.0 [13] (🥟..🥫) */ + (0x1F96C, 0x1F970), /* ; Basic_Emoji ; leafy green + * # 11.0 [5] (🥬..🥰) */ + (0x1F971, 0x1F971), /* ; Basic_Emoji ; yawning face + * # 12.0 [1] (🥱) */ + (0x1F973, 0x1F976), /* ; Basic_Emoji ; partying face + * # 11.0 [4] (🥳..🥶) */ + (0x1F97A, 0x1F97A), /* ; Basic_Emoji ; pleading face + * # 11.0 [1] (🥺) */ + (0x1F97B, 0x1F97B), /* ; Basic_Emoji ; sari + * # 12.0 [1] (🥻) */ + (0x1F97C, 0x1F97F), /* ; Basic_Emoji ; lab coat + * # 11.0 [4] (🥼..🥿) */ + (0x1F980, 0x1F984), /* ; Basic_Emoji ; crab + * # 8.0 [5] (🦀..🦄) */ + (0x1F985, 0x1F991), /* ; Basic_Emoji ; eagle + * # 9.0 [13] (🦅..🦑) */ + (0x1F992, 0x1F997), /* ; Basic_Emoji ; giraffe + * # 10.0 [6] (🦒..🦗) */ + (0x1F998, 0x1F9A2), /* ; Basic_Emoji ; kangaroo + * # 11.0 [11] (🦘..🦢) */ + (0x1F9A5, 0x1F9AA), /* ; Basic_Emoji ; sloth + * # 12.0 [6] (🦥..🦪) */ + (0x1F9AE, 0x1F9AF), /* ; Basic_Emoji ; guide dog + * # 12.0 [2] (🦮..🦯) */ + (0x1F9B0, 0x1F9B9), /* ; Basic_Emoji ; red hair + * # 11.0 [10] (🦰..🦹) */ + (0x1F9BA, 0x1F9BF), /* ; Basic_Emoji ; safety vest + * # 12.0 [6] (🦺..🦿) */ + (0x1F9C0, 0x1F9C0), /* ; Basic_Emoji ; cheese wedge + * # 8.0 [1] (🧀) */ + (0x1F9C1, 0x1F9C2), /* ; Basic_Emoji ; cupcake + * # 11.0 [2] (🧁..🧂) */ + (0x1F9C3, 0x1F9CA), /* ; Basic_Emoji ; beverage box + * # 12.0 [8] (🧃..🧊) */ + (0x1F9CD, 0x1F9CF), /* ; Basic_Emoji ; person standing + * # 12.0 [3] (🧍..🧏) */ + (0x1F9D0, 0x1F9E6), /* ; Basic_Emoji ; face with monocle + * # 10.0 [23] (🧐..🧦) */ + (0x1F9E7, 0x1F9FF), /* ; Basic_Emoji ; red envelope + * # 11.0 [25] (🧧..🧿) */ + (0x1FA70, 0x1FA73), /* ; Basic_Emoji ; ballet shoes + * # 12.0 [4] (🩰..🩳) */ + (0x1FA78, 0x1FA7A), /* ; Basic_Emoji ; drop of blood + * # 12.0 [3] (🩸..🩺) */ + (0x1FA80, 0x1FA82), /* ; Basic_Emoji ; yo-yo + * # 12.0 [3] (🪀..🪂) */ + (0x1FA90, 0x1FA95), /* ; Basic_Emoji ; ringed planet + * # 12.0 [6] (🪐..🪕) */ ]; -/* -00A9 FE0F ; Basic_Emoji ; copyright # 3.2 [1] (©️) -00AE FE0F ; Basic_Emoji ; registered # 3.2 [1] (®️) -203C FE0F ; Basic_Emoji ; double exclamation mark # 3.2 [1] (‼️) -2049 FE0F ; Basic_Emoji ; exclamation question mark # 3.2 [1] (⁉️) -2122 FE0F ; Basic_Emoji ; trade mark # 3.2 [1] (™️) -2139 FE0F ; Basic_Emoji ; information # 3.2 [1] (ℹ️) -2194 FE0F ; Basic_Emoji ; left-right arrow # 3.2 [1] (↔️) -2195 FE0F ; Basic_Emoji ; up-down arrow # 3.2 [1] (↕️) -2196 FE0F ; Basic_Emoji ; up-left arrow # 3.2 [1] (↖️) -2197 FE0F ; Basic_Emoji ; up-right arrow # 3.2 [1] (↗️) -2198 FE0F ; Basic_Emoji ; down-right arrow # 3.2 [1] (↘️) -2199 FE0F ; Basic_Emoji ; down-left arrow # 3.2 [1] (↙️) -21A9 FE0F ; Basic_Emoji ; right arrow curving left # 3.2 [1] (↩️) -21AA FE0F ; Basic_Emoji ; left arrow curving right # 3.2 [1] (↪️) -2328 FE0F ; Basic_Emoji ; keyboard # 3.2 [1] (⌨️) -23CF FE0F ; Basic_Emoji ; eject button # 4.0 [1] (⏏️) -23ED FE0F ; Basic_Emoji ; next track button # 6.0 [1] (⏭️) -23EE FE0F ; Basic_Emoji ; last track button # 6.0 [1] (⏮️) -23EF FE0F ; Basic_Emoji ; play or pause button # 6.0 [1] (⏯️) -23F1 FE0F ; Basic_Emoji ; stopwatch # 6.0 [1] (⏱️) -23F2 FE0F ; Basic_Emoji ; timer clock # 6.0 [1] (⏲️) -23F8 FE0F ; Basic_Emoji ; pause button # 7.0 [1] (⏸️) -23F9 FE0F ; Basic_Emoji ; stop button # 7.0 [1] (⏹️) -23FA FE0F ; Basic_Emoji ; record button # 7.0 [1] (⏺️) -24C2 FE0F ; Basic_Emoji ; circled M # 3.2 [1] (Ⓜ️) -25AA FE0F ; Basic_Emoji ; black small square # 3.2 [1] (▪️) -25AB FE0F ; Basic_Emoji ; white small square # 3.2 [1] (▫️) -25B6 FE0F ; Basic_Emoji ; play button # 3.2 [1] (▶️) -25C0 FE0F ; Basic_Emoji ; reverse button # 3.2 [1] (◀️) -25FB FE0F ; Basic_Emoji ; white medium square # 3.2 [1] (◻️) -25FC FE0F ; Basic_Emoji ; black medium square # 3.2 [1] (◼️) -2600 FE0F ; Basic_Emoji ; sun # 3.2 [1] (☀️) -2601 FE0F ; Basic_Emoji ; cloud # 3.2 [1] (☁️) -2602 FE0F ; Basic_Emoji ; umbrella # 3.2 [1] (☂️) -2603 FE0F ; Basic_Emoji ; snowman # 3.2 [1] (☃️) -2604 FE0F ; Basic_Emoji ; comet # 3.2 [1] (☄️) -260E FE0F ; Basic_Emoji ; telephone # 3.2 [1] (☎️) -2611 FE0F ; Basic_Emoji ; check box with check # 3.2 [1] (☑️) -2618 FE0F ; Basic_Emoji ; shamrock # 4.1 [1] (☘️) -261D FE0F ; Basic_Emoji ; index pointing up # 3.2 [1] (☝️) -2620 FE0F ; Basic_Emoji ; skull and crossbones # 3.2 [1] (☠️) -2622 FE0F ; Basic_Emoji ; radioactive # 3.2 [1] (☢️) -2623 FE0F ; Basic_Emoji ; biohazard # 3.2 [1] (☣️) -2626 FE0F ; Basic_Emoji ; orthodox cross # 3.2 [1] (☦️) -262A FE0F ; Basic_Emoji ; star and crescent # 3.2 [1] (☪️) -262E FE0F ; Basic_Emoji ; peace symbol # 3.2 [1] (☮️) -262F FE0F ; Basic_Emoji ; yin yang # 3.2 [1] (☯️) -2638 FE0F ; Basic_Emoji ; wheel of dharma # 3.2 [1] (☸️) -2639 FE0F ; Basic_Emoji ; frowning face # 3.2 [1] (☹️) -263A FE0F ; Basic_Emoji ; smiling face # 3.2 [1] (☺️) -2640 FE0F ; Basic_Emoji ; female sign # 3.2 [1] (♀️) -2642 FE0F ; Basic_Emoji ; male sign # 3.2 [1] (♂️) -265F FE0F ; Basic_Emoji ; chess pawn # 3.2 [1] (♟️) -2660 FE0F ; Basic_Emoji ; spade suit # 3.2 [1] (♠️) -2663 FE0F ; Basic_Emoji ; club suit # 3.2 [1] (♣️) -2665 FE0F ; Basic_Emoji ; heart suit # 3.2 [1] (♥️) -2666 FE0F ; Basic_Emoji ; diamond suit # 3.2 [1] (♦️) -2668 FE0F ; Basic_Emoji ; hot springs # 3.2 [1] (♨️) -267B FE0F ; Basic_Emoji ; recycling symbol # 3.2 [1] (♻️) -267E FE0F ; Basic_Emoji ; infinity # 4.1 [1] (♾️) -2692 FE0F ; Basic_Emoji ; hammer and pick # 4.1 [1] (⚒️) -2694 FE0F ; Basic_Emoji ; crossed swords # 4.1 [1] (⚔️) -2695 FE0F ; Basic_Emoji ; medical symbol # 4.1 [1] (⚕️) -2696 FE0F ; Basic_Emoji ; balance scale # 4.1 [1] (⚖️) -2697 FE0F ; Basic_Emoji ; alembic # 4.1 [1] (⚗️) -2699 FE0F ; Basic_Emoji ; gear # 4.1 [1] (⚙️) -269B FE0F ; Basic_Emoji ; atom symbol # 4.1 [1] (⚛️) -269C FE0F ; Basic_Emoji ; fleur-de-lis # 4.1 [1] (⚜️) -26A0 FE0F ; Basic_Emoji ; warning # 4.0 [1] (⚠️) -26B0 FE0F ; Basic_Emoji ; coffin # 4.1 [1] (⚰️) -26B1 FE0F ; Basic_Emoji ; funeral urn # 4.1 [1] (⚱️) -26C8 FE0F ; Basic_Emoji ; cloud with lightning and rain # 5.2 [1] (⛈️) -26CF FE0F ; Basic_Emoji ; pick # 5.2 [1] (⛏️) -26D1 FE0F ; Basic_Emoji ; rescue worker’s helmet # 5.2 [1] (⛑️) -26D3 FE0F ; Basic_Emoji ; chains # 5.2 [1] (⛓️) -26E9 FE0F ; Basic_Emoji ; shinto shrine # 5.2 [1] (⛩️) -26F0 FE0F ; Basic_Emoji ; mountain # 5.2 [1] (⛰️) -26F1 FE0F ; Basic_Emoji ; umbrella on ground # 5.2 [1] (⛱️) -26F4 FE0F ; Basic_Emoji ; ferry # 5.2 [1] (⛴️) -26F7 FE0F ; Basic_Emoji ; skier # 5.2 [1] (⛷️) -26F8 FE0F ; Basic_Emoji ; ice skate # 5.2 [1] (⛸️) -26F9 FE0F ; Basic_Emoji ; person bouncing ball # 5.2 [1] (⛹️) -2702 FE0F ; Basic_Emoji ; scissors # 3.2 [1] (✂️) -2708 FE0F ; Basic_Emoji ; airplane # 3.2 [1] (✈️) -2709 FE0F ; Basic_Emoji ; envelope # 3.2 [1] (✉️) -270C FE0F ; Basic_Emoji ; victory hand # 3.2 [1] (✌️) -270D FE0F ; Basic_Emoji ; writing hand # 3.2 [1] (✍️) -270F FE0F ; Basic_Emoji ; pencil # 3.2 [1] (✏️) -2712 FE0F ; Basic_Emoji ; black nib # 3.2 [1] (✒️) -2714 FE0F ; Basic_Emoji ; check mark # 3.2 [1] (✔️) -2716 FE0F ; Basic_Emoji ; multiplication sign # 3.2 [1] (✖️) -271D FE0F ; Basic_Emoji ; latin cross # 3.2 [1] (✝️) -2721 FE0F ; Basic_Emoji ; star of David # 3.2 [1] (✡️) -2733 FE0F ; Basic_Emoji ; eight-spoked asterisk # 3.2 [1] (✳️) -2734 FE0F ; Basic_Emoji ; eight-pointed star # 3.2 [1] (✴️) -2744 FE0F ; Basic_Emoji ; snowflake # 3.2 [1] (❄️) -2747 FE0F ; Basic_Emoji ; sparkle # 3.2 [1] (❇️) -2763 FE0F ; Basic_Emoji ; heart exclamation # 3.2 [1] (❣️) -2764 FE0F ; Basic_Emoji ; red heart # 3.2 [1] (❤️) -27A1 FE0F ; Basic_Emoji ; right arrow # 3.2 [1] (➡️) -2934 FE0F ; Basic_Emoji ; right arrow curving up # 3.2 [1] (⤴️) -2935 FE0F ; Basic_Emoji ; right arrow curving down # 3.2 [1] (⤵️) -2B05 FE0F ; Basic_Emoji ; left arrow # 4.0 [1] (⬅️) -2B06 FE0F ; Basic_Emoji ; up arrow # 4.0 [1] (⬆️) -2B07 FE0F ; Basic_Emoji ; down arrow # 4.0 [1] (⬇️) -3030 FE0F ; Basic_Emoji ; wavy dash # 3.2 [1] (〰️) -303D FE0F ; Basic_Emoji ; part alternation mark # 3.2 [1] (〽️) -3297 FE0F ; Basic_Emoji ; Japanese “congratulations” button # 3.2 [1] (㊗️) -3299 FE0F ; Basic_Emoji ; Japanese “secret” button # 3.2 [1] (㊙️) -1F170 FE0F ; Basic_Emoji ; A button (blood type) # 6.0 [1] (🅰️) -1F171 FE0F ; Basic_Emoji ; B button (blood type) # 6.0 [1] (🅱️) -1F17E FE0F ; Basic_Emoji ; O button (blood type) # 6.0 [1] (🅾️) -1F17F FE0F ; Basic_Emoji ; P button # 5.2 [1] (🅿️) -1F202 FE0F ; Basic_Emoji ; Japanese “service charge” button # 6.0 [1] (🈂️) -1F237 FE0F ; Basic_Emoji ; Japanese “monthly amount” button # 6.0 [1] (🈷️) -1F321 FE0F ; Basic_Emoji ; thermometer # 7.0 [1] (🌡️) -1F324 FE0F ; Basic_Emoji ; sun behind small cloud # 7.0 [1] (🌤️) -1F325 FE0F ; Basic_Emoji ; sun behind large cloud # 7.0 [1] (🌥️) -1F326 FE0F ; Basic_Emoji ; sun behind rain cloud # 7.0 [1] (🌦️) -1F327 FE0F ; Basic_Emoji ; cloud with rain # 7.0 [1] (🌧️) -1F328 FE0F ; Basic_Emoji ; cloud with snow # 7.0 [1] (🌨️) -1F329 FE0F ; Basic_Emoji ; cloud with lightning # 7.0 [1] (🌩️) -1F32A FE0F ; Basic_Emoji ; tornado # 7.0 [1] (🌪️) -1F32B FE0F ; Basic_Emoji ; fog # 7.0 [1] (🌫️) -1F32C FE0F ; Basic_Emoji ; wind face # 7.0 [1] (🌬️) -1F336 FE0F ; Basic_Emoji ; hot pepper # 7.0 [1] (🌶️) -1F37D FE0F ; Basic_Emoji ; fork and knife with plate # 7.0 [1] (🍽️) -1F396 FE0F ; Basic_Emoji ; military medal # 7.0 [1] (🎖️) -1F397 FE0F ; Basic_Emoji ; reminder ribbon # 7.0 [1] (🎗️) -1F399 FE0F ; Basic_Emoji ; studio microphone # 7.0 [1] (🎙️) -1F39A FE0F ; Basic_Emoji ; level slider # 7.0 [1] (🎚️) -1F39B FE0F ; Basic_Emoji ; control knobs # 7.0 [1] (🎛️) -1F39E FE0F ; Basic_Emoji ; film frames # 7.0 [1] (🎞️) -1F39F FE0F ; Basic_Emoji ; admission tickets # 7.0 [1] (🎟️) -1F3CB FE0F ; Basic_Emoji ; person lifting weights # 7.0 [1] (🏋️) -1F3CC FE0F ; Basic_Emoji ; person golfing # 7.0 [1] (🏌️) -1F3CD FE0F ; Basic_Emoji ; motorcycle # 7.0 [1] (🏍️) -1F3CE FE0F ; Basic_Emoji ; racing car # 7.0 [1] (🏎️) -1F3D4 FE0F ; Basic_Emoji ; snow-capped mountain # 7.0 [1] (🏔️) -1F3D5 FE0F ; Basic_Emoji ; camping # 7.0 [1] (🏕️) -1F3D6 FE0F ; Basic_Emoji ; beach with umbrella # 7.0 [1] (🏖️) -1F3D7 FE0F ; Basic_Emoji ; building construction # 7.0 [1] (🏗️) -1F3D8 FE0F ; Basic_Emoji ; houses # 7.0 [1] (🏘️) -1F3D9 FE0F ; Basic_Emoji ; cityscape # 7.0 [1] (🏙️) -1F3DA FE0F ; Basic_Emoji ; derelict house # 7.0 [1] (🏚️) -1F3DB FE0F ; Basic_Emoji ; classical building # 7.0 [1] (🏛️) -1F3DC FE0F ; Basic_Emoji ; desert # 7.0 [1] (🏜️) -1F3DD FE0F ; Basic_Emoji ; desert island # 7.0 [1] (🏝️) -1F3DE FE0F ; Basic_Emoji ; national park # 7.0 [1] (🏞️) -1F3DF FE0F ; Basic_Emoji ; stadium # 7.0 [1] (🏟️) -1F3F3 FE0F ; Basic_Emoji ; white flag # 7.0 [1] (🏳️) -1F3F5 FE0F ; Basic_Emoji ; rosette # 7.0 [1] (🏵️) -1F3F7 FE0F ; Basic_Emoji ; label # 7.0 [1] (🏷️) -1F43F FE0F ; Basic_Emoji ; chipmunk # 7.0 [1] (🐿️) -1F441 FE0F ; Basic_Emoji ; eye # 7.0 [1] (👁️) -1F4FD FE0F ; Basic_Emoji ; film projector # 7.0 [1] (📽️) -1F549 FE0F ; Basic_Emoji ; om # 7.0 [1] (🕉️) -1F54A FE0F ; Basic_Emoji ; dove # 7.0 [1] (🕊️) -1F56F FE0F ; Basic_Emoji ; candle # 7.0 [1] (🕯️) -1F570 FE0F ; Basic_Emoji ; mantelpiece clock # 7.0 [1] (🕰️) -1F573 FE0F ; Basic_Emoji ; hole # 7.0 [1] (🕳️) -1F574 FE0F ; Basic_Emoji ; man in suit levitating # 7.0 [1] (🕴️) -1F575 FE0F ; Basic_Emoji ; detective # 7.0 [1] (🕵️) -1F576 FE0F ; Basic_Emoji ; sunglasses # 7.0 [1] (🕶️) -1F577 FE0F ; Basic_Emoji ; spider # 7.0 [1] (🕷️) -1F578 FE0F ; Basic_Emoji ; spider web # 7.0 [1] (🕸️) -1F579 FE0F ; Basic_Emoji ; joystick # 7.0 [1] (🕹️) -1F587 FE0F ; Basic_Emoji ; linked paperclips # 7.0 [1] (🖇️) -1F58A FE0F ; Basic_Emoji ; pen # 7.0 [1] (🖊️) -1F58B FE0F ; Basic_Emoji ; fountain pen # 7.0 [1] (🖋️) -1F58C FE0F ; Basic_Emoji ; paintbrush # 7.0 [1] (🖌️) -1F58D FE0F ; Basic_Emoji ; crayon # 7.0 [1] (🖍️) -1F590 FE0F ; Basic_Emoji ; hand with fingers splayed # 7.0 [1] (🖐️) -1F5A5 FE0F ; Basic_Emoji ; desktop computer # 7.0 [1] (🖥️) -1F5A8 FE0F ; Basic_Emoji ; printer # 7.0 [1] (🖨️) -1F5B1 FE0F ; Basic_Emoji ; computer mouse # 7.0 [1] (🖱️) -1F5B2 FE0F ; Basic_Emoji ; trackball # 7.0 [1] (🖲️) -1F5BC FE0F ; Basic_Emoji ; framed picture # 7.0 [1] (🖼️) -1F5C2 FE0F ; Basic_Emoji ; card index dividers # 7.0 [1] (🗂️) -1F5C3 FE0F ; Basic_Emoji ; card file box # 7.0 [1] (🗃️) -1F5C4 FE0F ; Basic_Emoji ; file cabinet # 7.0 [1] (🗄️) -1F5D1 FE0F ; Basic_Emoji ; wastebasket # 7.0 [1] (🗑️) -1F5D2 FE0F ; Basic_Emoji ; spiral notepad # 7.0 [1] (🗒️) -1F5D3 FE0F ; Basic_Emoji ; spiral calendar # 7.0 [1] (🗓️) -1F5DC FE0F ; Basic_Emoji ; clamp # 7.0 [1] (🗜️) -1F5DD FE0F ; Basic_Emoji ; old key # 7.0 [1] (🗝️) -1F5DE FE0F ; Basic_Emoji ; rolled-up newspaper # 7.0 [1] (🗞️) -1F5E1 FE0F ; Basic_Emoji ; dagger # 7.0 [1] (🗡️) -1F5E3 FE0F ; Basic_Emoji ; speaking head # 7.0 [1] (🗣️) -1F5E8 FE0F ; Basic_Emoji ; left speech bubble # 7.0 [1] (🗨️) -1F5EF FE0F ; Basic_Emoji ; right anger bubble # 7.0 [1] (🗯️) -1F5F3 FE0F ; Basic_Emoji ; ballot box with ballot # 7.0 [1] (🗳️) -1F5FA FE0F ; Basic_Emoji ; world map # 7.0 [1] (🗺️) -1F6CB FE0F ; Basic_Emoji ; couch and lamp # 7.0 [1] (🛋️) -1F6CD FE0F ; Basic_Emoji ; shopping bags # 7.0 [1] (🛍️) -1F6CE FE0F ; Basic_Emoji ; bellhop bell # 7.0 [1] (🛎️) -1F6CF FE0F ; Basic_Emoji ; bed # 7.0 [1] (🛏️) -1F6E0 FE0F ; Basic_Emoji ; hammer and wrench # 7.0 [1] (🛠️) -1F6E1 FE0F ; Basic_Emoji ; shield # 7.0 [1] (🛡️) -1F6E2 FE0F ; Basic_Emoji ; oil drum # 7.0 [1] (🛢️) -1F6E3 FE0F ; Basic_Emoji ; motorway # 7.0 [1] (🛣️) -1F6E4 FE0F ; Basic_Emoji ; railway track # 7.0 [1] (🛤️) -1F6E5 FE0F ; Basic_Emoji ; motor boat # 7.0 [1] (🛥️) -1F6E9 FE0F ; Basic_Emoji ; small airplane # 7.0 [1] (🛩️) -1F6F0 FE0F ; Basic_Emoji ; satellite # 7.0 [1] (🛰️) -1F6F3 FE0F ; Basic_Emoji ; passenger ship # 7.0 [1] (🛳️) -*/ +// 00A9 FE0F ; Basic_Emoji ; copyright +// # 3.2 [1] (©️) 00AE FE0F ; Basic_Emoji ; registered +// # 3.2 [1] (®️) 203C FE0F ; Basic_Emoji ; double +// exclamation mark # 3.2 [1] (‼️) 2049 +// FE0F ; Basic_Emoji ; exclamation question mark +// # 3.2 [1] (⁉️) 2122 FE0F ; Basic_Emoji ; trade mark +// # 3.2 [1] (™️) 2139 FE0F ; Basic_Emoji ; information +// # 3.2 [1] (ℹ️) 2194 FE0F ; Basic_Emoji ; left-right arrow +// # 3.2 [1] (↔️) 2195 FE0F ; Basic_Emoji ; up-down arrow +// # 3.2 [1] (↕️) 2196 FE0F ; Basic_Emoji ; up-left arrow +// # 3.2 [1] (↖️) 2197 FE0F ; Basic_Emoji ; up-right arrow +// # 3.2 [1] (↗️) 2198 FE0F ; Basic_Emoji ; down-right arrow +// # 3.2 [1] (↘️) 2199 FE0F ; Basic_Emoji ; down-left arrow +// # 3.2 [1] (↙️) 21A9 FE0F ; Basic_Emoji ; right arrow +// curving left # 3.2 [1] (↩️) 21AA FE0F +// ; Basic_Emoji ; left arrow curving right +// # 3.2 [1] (↪️) 2328 FE0F ; Basic_Emoji ; keyboard +// # 3.2 [1] (⌨️) 23CF FE0F ; Basic_Emoji ; eject button +// # 4.0 [1] (⏏️) 23ED FE0F ; Basic_Emoji ; next track button +// # 6.0 [1] (⏭️) 23EE FE0F ; Basic_Emoji ; last track button +// # 6.0 [1] (⏮️) 23EF FE0F ; Basic_Emoji ; play or pause +// button # 6.0 [1] (⏯️) 23F1 FE0F +// ; Basic_Emoji ; stopwatch +// # 6.0 [1] (⏱️) 23F2 FE0F ; Basic_Emoji ; timer clock +// # 6.0 [1] (⏲️) 23F8 FE0F ; Basic_Emoji ; pause button +// # 7.0 [1] (⏸️) 23F9 FE0F ; Basic_Emoji ; stop button +// # 7.0 [1] (⏹️) 23FA FE0F ; Basic_Emoji ; record button +// # 7.0 [1] (⏺️) 24C2 FE0F ; Basic_Emoji ; circled M +// # 3.2 [1] (Ⓜ️) 25AA FE0F ; Basic_Emoji ; black small +// square # 3.2 [1] (▪️) 25AB FE0F +// ; Basic_Emoji ; white small square +// # 3.2 [1] (▫️) 25B6 FE0F ; Basic_Emoji ; play button +// # 3.2 [1] (▶️) 25C0 FE0F ; Basic_Emoji ; reverse button +// # 3.2 [1] (◀️) 25FB FE0F ; Basic_Emoji ; white medium +// square # 3.2 [1] (◻️) 25FC FE0F +// ; Basic_Emoji ; black medium square +// # 3.2 [1] (◼️) 2600 FE0F ; Basic_Emoji ; sun +// # 3.2 [1] (☀️) 2601 FE0F ; Basic_Emoji ; cloud +// # 3.2 [1] (☁️) 2602 FE0F ; Basic_Emoji ; umbrella +// # 3.2 [1] (☂️) 2603 FE0F ; Basic_Emoji ; snowman +// # 3.2 [1] (☃️) 2604 FE0F ; Basic_Emoji ; comet +// # 3.2 [1] (☄️) 260E FE0F ; Basic_Emoji ; telephone +// # 3.2 [1] (☎️) 2611 FE0F ; Basic_Emoji ; check box with +// check # 3.2 [1] (☑️) 2618 FE0F +// ; Basic_Emoji ; shamrock +// # 4.1 [1] (☘️) 261D FE0F ; Basic_Emoji ; index pointing up +// # 3.2 [1] (☝️) 2620 FE0F ; Basic_Emoji ; skull and +// crossbones # 3.2 [1] (☠️) +// 2622 FE0F ; Basic_Emoji ; radioactive +// # 3.2 [1] (☢️) 2623 FE0F ; Basic_Emoji ; biohazard +// # 3.2 [1] (☣️) 2626 FE0F ; Basic_Emoji ; orthodox cross +// # 3.2 [1] (☦️) 262A FE0F ; Basic_Emoji ; star and crescent +// # 3.2 [1] (☪️) 262E FE0F ; Basic_Emoji ; peace symbol +// # 3.2 [1] (☮️) 262F FE0F ; Basic_Emoji ; yin yang +// # 3.2 [1] (☯️) 2638 FE0F ; Basic_Emoji ; wheel of dharma +// # 3.2 [1] (☸️) 2639 FE0F ; Basic_Emoji ; frowning face +// # 3.2 [1] (☹️) 263A FE0F ; Basic_Emoji ; smiling face +// # 3.2 [1] (☺️) 2640 FE0F ; Basic_Emoji ; female sign +// # 3.2 [1] (♀️) 2642 FE0F ; Basic_Emoji ; male sign +// # 3.2 [1] (♂️) 265F FE0F ; Basic_Emoji ; chess pawn +// # 3.2 [1] (♟️) 2660 FE0F ; Basic_Emoji ; spade suit +// # 3.2 [1] (♠️) 2663 FE0F ; Basic_Emoji ; club suit +// # 3.2 [1] (♣️) 2665 FE0F ; Basic_Emoji ; heart suit +// # 3.2 [1] (♥️) 2666 FE0F ; Basic_Emoji ; diamond suit +// # 3.2 [1] (♦️) 2668 FE0F ; Basic_Emoji ; hot springs +// # 3.2 [1] (♨️) 267B FE0F ; Basic_Emoji ; recycling symbol +// # 3.2 [1] (♻️) 267E FE0F ; Basic_Emoji ; infinity +// # 4.1 [1] (♾️) 2692 FE0F ; Basic_Emoji ; hammer and pick +// # 4.1 [1] (⚒️) 2694 FE0F ; Basic_Emoji ; crossed swords +// # 4.1 [1] (⚔️) 2695 FE0F ; Basic_Emoji ; medical symbol +// # 4.1 [1] (⚕️) 2696 FE0F ; Basic_Emoji ; balance scale +// # 4.1 [1] (⚖️) 2697 FE0F ; Basic_Emoji ; alembic +// # 4.1 [1] (⚗️) 2699 FE0F ; Basic_Emoji ; gear +// # 4.1 [1] (⚙️) 269B FE0F ; Basic_Emoji ; atom symbol +// # 4.1 [1] (⚛️) 269C FE0F ; Basic_Emoji ; fleur-de-lis +// # 4.1 [1] (⚜️) 26A0 FE0F ; Basic_Emoji ; warning +// # 4.0 [1] (⚠️) 26B0 FE0F ; Basic_Emoji ; coffin +// # 4.1 [1] (⚰️) 26B1 FE0F ; Basic_Emoji ; funeral urn +// # 4.1 [1] (⚱️) 26C8 FE0F ; Basic_Emoji ; cloud with +// lightning and rain # 5.2 [1] (⛈️) +// 26CF FE0F ; Basic_Emoji ; pick +// # 5.2 [1] (⛏️) 26D1 FE0F ; Basic_Emoji ; rescue worker’s +// helmet # 5.2 [1] (⛑️) 26D3 FE0F +// ; Basic_Emoji ; chains +// # 5.2 [1] (⛓️) 26E9 FE0F ; Basic_Emoji ; shinto shrine +// # 5.2 [1] (⛩️) 26F0 FE0F ; Basic_Emoji ; mountain +// # 5.2 [1] (⛰️) 26F1 FE0F ; Basic_Emoji ; umbrella on +// ground # 5.2 [1] (⛱️) 26F4 FE0F +// ; Basic_Emoji ; ferry +// # 5.2 [1] (⛴️) 26F7 FE0F ; Basic_Emoji ; skier +// # 5.2 [1] (⛷️) 26F8 FE0F ; Basic_Emoji ; ice skate +// # 5.2 [1] (⛸️) 26F9 FE0F ; Basic_Emoji ; person bouncing +// ball # 5.2 [1] (⛹️) 2702 FE0F +// ; Basic_Emoji ; scissors +// # 3.2 [1] (✂️) 2708 FE0F ; Basic_Emoji ; airplane +// # 3.2 [1] (✈️) 2709 FE0F ; Basic_Emoji ; envelope +// # 3.2 [1] (✉️) 270C FE0F ; Basic_Emoji ; victory hand +// # 3.2 [1] (✌️) 270D FE0F ; Basic_Emoji ; writing hand +// # 3.2 [1] (✍️) 270F FE0F ; Basic_Emoji ; pencil +// # 3.2 [1] (✏️) 2712 FE0F ; Basic_Emoji ; black nib +// # 3.2 [1] (✒️) 2714 FE0F ; Basic_Emoji ; check mark +// # 3.2 [1] (✔️) 2716 FE0F ; Basic_Emoji ; multiplication +// sign # 3.2 [1] (✖️) 271D FE0F +// ; Basic_Emoji ; latin cross +// # 3.2 [1] (✝️) 2721 FE0F ; Basic_Emoji ; star of David +// # 3.2 [1] (✡️) 2733 FE0F ; Basic_Emoji ; eight-spoked +// asterisk # 3.2 [1] (✳️) 2734 FE0F +// ; Basic_Emoji ; eight-pointed star +// # 3.2 [1] (✴️) 2744 FE0F ; Basic_Emoji ; snowflake +// # 3.2 [1] (❄️) 2747 FE0F ; Basic_Emoji ; sparkle +// # 3.2 [1] (❇️) 2763 FE0F ; Basic_Emoji ; heart exclamation +// # 3.2 [1] (❣️) 2764 FE0F ; Basic_Emoji ; red heart +// # 3.2 [1] (❤️) 27A1 FE0F ; Basic_Emoji ; right arrow +// # 3.2 [1] (➡️) 2934 FE0F ; Basic_Emoji ; right arrow +// curving up # 3.2 [1] (⤴️) 2935 FE0F +// ; Basic_Emoji ; right arrow curving down +// # 3.2 [1] (⤵️) 2B05 FE0F ; Basic_Emoji ; left arrow +// # 4.0 [1] (⬅️) 2B06 FE0F ; Basic_Emoji ; up arrow +// # 4.0 [1] (⬆️) 2B07 FE0F ; Basic_Emoji ; down arrow +// # 4.0 [1] (⬇️) 3030 FE0F ; Basic_Emoji ; wavy dash +// # 3.2 [1] (〰️) 303D FE0F ; Basic_Emoji ; part alternation +// mark # 3.2 [1] (〽️) 3297 FE0F +// ; Basic_Emoji ; Japanese “congratulations” button +// # 3.2 [1] (㊗️) 3299 FE0F ; Basic_Emoji ; Japanese “secret” +// button # 3.2 [1] (㊙️) 1F170 FE0F ; +// Basic_Emoji ; A button (blood type) +// # 6.0 [1] (🅰️) 1F171 FE0F ; Basic_Emoji ; B button (blood +// type) # 6.0 [1] (🅱️) 1F17E FE0F +// ; Basic_Emoji ; O button (blood type) +// # 6.0 [1] (🅾️) 1F17F FE0F ; Basic_Emoji ; P button +// # 5.2 [1] (🅿️) 1F202 FE0F ; Basic_Emoji ; Japanese “service +// charge” button # 6.0 [1] (🈂️) 1F237 FE0F ; +// Basic_Emoji ; Japanese “monthly amount” button +// # 6.0 [1] (🈷️) 1F321 FE0F ; Basic_Emoji ; thermometer +// # 7.0 [1] (🌡️) 1F324 FE0F ; Basic_Emoji ; sun behind small +// cloud # 7.0 [1] (🌤️) 1F325 FE0F +// ; Basic_Emoji ; sun behind large cloud +// # 7.0 [1] (🌥️) 1F326 FE0F ; Basic_Emoji ; sun behind rain +// cloud # 7.0 [1] (🌦️) 1F327 FE0F +// ; Basic_Emoji ; cloud with rain +// # 7.0 [1] (🌧️) 1F328 FE0F ; Basic_Emoji ; cloud with snow +// # 7.0 [1] (🌨️) 1F329 FE0F ; Basic_Emoji ; cloud with +// lightning # 7.0 [1] (🌩️) +// 1F32A FE0F ; Basic_Emoji ; tornado +// # 7.0 [1] (🌪️) 1F32B FE0F ; Basic_Emoji ; fog +// # 7.0 [1] (🌫️) 1F32C FE0F ; Basic_Emoji ; wind face +// # 7.0 [1] (🌬️) 1F336 FE0F ; Basic_Emoji ; hot pepper +// # 7.0 [1] (🌶️) 1F37D FE0F ; Basic_Emoji ; fork and knife +// with plate # 7.0 [1] (🍽️) 1F396 FE0F +// ; Basic_Emoji ; military medal +// # 7.0 [1] (🎖️) 1F397 FE0F ; Basic_Emoji ; reminder ribbon +// # 7.0 [1] (🎗️) 1F399 FE0F ; Basic_Emoji ; studio microphone +// # 7.0 [1] (🎙️) 1F39A FE0F ; Basic_Emoji ; level slider +// # 7.0 [1] (🎚️) 1F39B FE0F ; Basic_Emoji ; control knobs +// # 7.0 [1] (🎛️) 1F39E FE0F ; Basic_Emoji ; film frames +// # 7.0 [1] (🎞️) 1F39F FE0F ; Basic_Emoji ; admission tickets +// # 7.0 [1] (🎟️) 1F3CB FE0F ; Basic_Emoji ; person lifting +// weights # 7.0 [1] (🏋️) 1F3CC FE0F +// ; Basic_Emoji ; person golfing +// # 7.0 [1] (🏌️) 1F3CD FE0F ; Basic_Emoji ; motorcycle +// # 7.0 [1] (🏍️) 1F3CE FE0F ; Basic_Emoji ; racing car +// # 7.0 [1] (🏎️) 1F3D4 FE0F ; Basic_Emoji ; snow-capped +// mountain # 7.0 [1] (🏔️) +// 1F3D5 FE0F ; Basic_Emoji ; camping +// # 7.0 [1] (🏕️) 1F3D6 FE0F ; Basic_Emoji ; beach with +// umbrella # 7.0 [1] (🏖️) +// 1F3D7 FE0F ; Basic_Emoji ; building construction +// # 7.0 [1] (🏗️) 1F3D8 FE0F ; Basic_Emoji ; houses +// # 7.0 [1] (🏘️) 1F3D9 FE0F ; Basic_Emoji ; cityscape +// # 7.0 [1] (🏙️) 1F3DA FE0F ; Basic_Emoji ; derelict house +// # 7.0 [1] (🏚️) 1F3DB FE0F ; Basic_Emoji ; classical +// building # 7.0 [1] (🏛️) +// 1F3DC FE0F ; Basic_Emoji ; desert +// # 7.0 [1] (🏜️) 1F3DD FE0F ; Basic_Emoji ; desert island +// # 7.0 [1] (🏝️) 1F3DE FE0F ; Basic_Emoji ; national park +// # 7.0 [1] (🏞️) 1F3DF FE0F ; Basic_Emoji ; stadium +// # 7.0 [1] (🏟️) 1F3F3 FE0F ; Basic_Emoji ; white flag +// # 7.0 [1] (🏳️) 1F3F5 FE0F ; Basic_Emoji ; rosette +// # 7.0 [1] (🏵️) 1F3F7 FE0F ; Basic_Emoji ; label +// # 7.0 [1] (🏷️) 1F43F FE0F ; Basic_Emoji ; chipmunk +// # 7.0 [1] (🐿️) 1F441 FE0F ; Basic_Emoji ; eye +// # 7.0 [1] (👁️) 1F4FD FE0F ; Basic_Emoji ; film projector +// # 7.0 [1] (📽️) 1F549 FE0F ; Basic_Emoji ; om +// # 7.0 [1] (🕉️) 1F54A FE0F ; Basic_Emoji ; dove +// # 7.0 [1] (🕊️) 1F56F FE0F ; Basic_Emoji ; candle +// # 7.0 [1] (🕯️) 1F570 FE0F ; Basic_Emoji ; mantelpiece clock +// # 7.0 [1] (🕰️) 1F573 FE0F ; Basic_Emoji ; hole +// # 7.0 [1] (🕳️) 1F574 FE0F ; Basic_Emoji ; man in suit +// levitating # 7.0 [1] (🕴️) +// 1F575 FE0F ; Basic_Emoji ; detective +// # 7.0 [1] (🕵️) 1F576 FE0F ; Basic_Emoji ; sunglasses +// # 7.0 [1] (🕶️) 1F577 FE0F ; Basic_Emoji ; spider +// # 7.0 [1] (🕷️) 1F578 FE0F ; Basic_Emoji ; spider web +// # 7.0 [1] (🕸️) 1F579 FE0F ; Basic_Emoji ; joystick +// # 7.0 [1] (🕹️) 1F587 FE0F ; Basic_Emoji ; linked paperclips +// # 7.0 [1] (🖇️) 1F58A FE0F ; Basic_Emoji ; pen +// # 7.0 [1] (🖊️) 1F58B FE0F ; Basic_Emoji ; fountain pen +// # 7.0 [1] (🖋️) 1F58C FE0F ; Basic_Emoji ; paintbrush +// # 7.0 [1] (🖌️) 1F58D FE0F ; Basic_Emoji ; crayon +// # 7.0 [1] (🖍️) 1F590 FE0F ; Basic_Emoji ; hand with fingers +// splayed # 7.0 [1] (🖐️) 1F5A5 FE0F ; +// Basic_Emoji ; desktop computer +// # 7.0 [1] (🖥️) 1F5A8 FE0F ; Basic_Emoji ; printer +// # 7.0 [1] (🖨️) 1F5B1 FE0F ; Basic_Emoji ; computer mouse +// # 7.0 [1] (🖱️) 1F5B2 FE0F ; Basic_Emoji ; trackball +// # 7.0 [1] (🖲️) 1F5BC FE0F ; Basic_Emoji ; framed picture +// # 7.0 [1] (🖼️) 1F5C2 FE0F ; Basic_Emoji ; card index +// dividers # 7.0 [1] (🗂️) +// 1F5C3 FE0F ; Basic_Emoji ; card file box +// # 7.0 [1] (🗃️) 1F5C4 FE0F ; Basic_Emoji ; file cabinet +// # 7.0 [1] (🗄️) 1F5D1 FE0F ; Basic_Emoji ; wastebasket +// # 7.0 [1] (🗑️) 1F5D2 FE0F ; Basic_Emoji ; spiral notepad +// # 7.0 [1] (🗒️) 1F5D3 FE0F ; Basic_Emoji ; spiral calendar +// # 7.0 [1] (🗓️) 1F5DC FE0F ; Basic_Emoji ; clamp +// # 7.0 [1] (🗜️) 1F5DD FE0F ; Basic_Emoji ; old key +// # 7.0 [1] (🗝️) 1F5DE FE0F ; Basic_Emoji ; rolled-up +// newspaper # 7.0 [1] (🗞️) +// 1F5E1 FE0F ; Basic_Emoji ; dagger +// # 7.0 [1] (🗡️) 1F5E3 FE0F ; Basic_Emoji ; speaking head +// # 7.0 [1] (🗣️) 1F5E8 FE0F ; Basic_Emoji ; left speech +// bubble # 7.0 [1] (🗨️) +// 1F5EF FE0F ; Basic_Emoji ; right anger bubble +// # 7.0 [1] (🗯️) 1F5F3 FE0F ; Basic_Emoji ; ballot box with +// ballot # 7.0 [1] (🗳️) 1F5FA FE0F +// ; Basic_Emoji ; world map +// # 7.0 [1] (🗺️) 1F6CB FE0F ; Basic_Emoji ; couch and lamp +// # 7.0 [1] (🛋️) 1F6CD FE0F ; Basic_Emoji ; shopping bags +// # 7.0 [1] (🛍️) 1F6CE FE0F ; Basic_Emoji ; bellhop bell +// # 7.0 [1] (🛎️) 1F6CF FE0F ; Basic_Emoji ; bed +// # 7.0 [1] (🛏️) 1F6E0 FE0F ; Basic_Emoji ; hammer and wrench +// # 7.0 [1] (🛠️) 1F6E1 FE0F ; Basic_Emoji ; shield +// # 7.0 [1] (🛡️) 1F6E2 FE0F ; Basic_Emoji ; oil drum +// # 7.0 [1] (🛢️) 1F6E3 FE0F ; Basic_Emoji ; motorway +// # 7.0 [1] (🛣️) 1F6E4 FE0F ; Basic_Emoji ; railway track +// # 7.0 [1] (🛤️) 1F6E5 FE0F ; Basic_Emoji ; motor boat +// # 7.0 [1] (🛥️) 1F6E9 FE0F ; Basic_Emoji ; small airplane +// # 7.0 [1] (🛩️) 1F6F0 FE0F ; Basic_Emoji ; satellite +// # 7.0 [1] (🛰️) 1F6F3 FE0F ; Basic_Emoji ; passenger ship +// # 7.0 [1] (🛳️) diff --git a/src/types.rs b/src/types.rs index c121ca4..a5cd4bb 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,28 +1,26 @@ -/* - * bb - * - * Copyright 2019 Manos Pitsidianakis - * - * This file is part of bb. - * - * bb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * bb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with bb. If not, see . - */ +// bb +// +// Copyright 2019 Manos Pitsidianakis +// +// This file is part of bb. +// +// bb is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// bb is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with bb. If not, see . use crate::Key; -/// `ThreadEvent` encapsulates all of the possible values we need to transfer between our threads -/// to the main process. +/// `ThreadEvent` encapsulates all of the possible values we need to transfer +/// between our threads to the main process. #[derive(Debug)] pub enum ThreadEvent { Input(Key),