1 // Copyright 2015 The Servo Project Developers. See the
2 // COPYRIGHT file at the top-level directory of this distribution.
4 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
5 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7 // option. This file may not be copied, modified, or distributed
8 // except according to those terms.
10 //! Accessor for `Bidi_Class` property from Unicode Character Database (UCD)
14 pub use self::tables
::{BidiClass, UNICODE_VERSION}
;
15 #[cfg(feature = "hardcoded-data")]
17 #[cfg(feature = "hardcoded-data")]
18 use core
::cmp
::Ordering
::{Equal, Greater, Less}
;
20 #[cfg(feature = "hardcoded-data")]
21 use self::tables
::bidi_class_table
;
22 use crate::BidiClass
::*;
23 #[cfg(feature = "hardcoded-data")]
24 use crate::BidiDataSource
;
26 /// Hardcoded Bidi data that ships with the unicode-bidi crate.
28 /// This can be enabled with the default `hardcoded-data` Cargo feature.
29 #[cfg(feature = "hardcoded-data")]
30 pub struct HardcodedBidiData
;
32 #[cfg(feature = "hardcoded-data")]
33 impl BidiDataSource
for HardcodedBidiData
{
34 fn bidi_class(&self, c
: char) -> BidiClass
{
35 bsearch_range_value_table(c
, bidi_class_table
)
39 /// Find the `BidiClass` of a single char.
40 #[cfg(feature = "hardcoded-data")]
41 pub fn bidi_class(c
: char) -> BidiClass
{
42 bsearch_range_value_table(c
, bidi_class_table
)
45 pub fn is_rtl(bidi_class
: BidiClass
) -> bool
{
47 RLE
| RLO
| RLI
=> true,
52 #[cfg(feature = "hardcoded-data")]
53 fn bsearch_range_value_table(c
: char, r
: &'
static [(char, char, BidiClass
)]) -> BidiClass
{
54 match r
.binary_search_by(|&(lo
, hi
, _
)| {
55 if lo
<= c
&& c
<= hi
{
64 let (_
, _
, cat
) = r
[idx
];
67 // UCD/extracted/DerivedBidiClass.txt: "All code points not explicitly listed
68 // for Bidi_Class have the value Left_To_Right (L)."
73 #[cfg(all(test, feature = "hardcoded-data"))]
79 assert_eq
!(bidi_class('
\u{0000}'
), BN
);
80 assert_eq
!(bidi_class('
\u{0040}'
), ON
);
81 assert_eq
!(bidi_class('
\u{0041}'
), L
);
82 assert_eq
!(bidi_class('
\u{0062}'
), L
);
83 assert_eq
!(bidi_class('
\u{007F}'
), BN
);
89 assert_eq
!(bidi_class('
\u{0590}'
), R
);
90 assert_eq
!(bidi_class('
\u{05D0}'
), R
);
91 assert_eq
!(bidi_class('
\u{05D1}'
), R
);
92 assert_eq
!(bidi_class('
\u{05FF}'
), R
);
95 assert_eq
!(bidi_class('
\u{0600}'
), AN
);
96 assert_eq
!(bidi_class('
\u{0627}'
), AL
);
97 assert_eq
!(bidi_class('
\u{07BF}'
), AL
);
99 // Default R + Arabic Extras
100 assert_eq
!(bidi_class('
\u{07C0}'
), R
);
101 assert_eq
!(bidi_class('
\u{085F}'
), R
);
102 assert_eq
!(bidi_class('
\u{0860}'
), AL
);
103 assert_eq
!(bidi_class('
\u{0870}'
), AL
);
104 assert_eq
!(bidi_class('
\u{089F}'
), NSM
);
105 assert_eq
!(bidi_class('
\u{08A0}'
), AL
);
106 assert_eq
!(bidi_class('
\u{089F}'
), NSM
);
107 assert_eq
!(bidi_class('
\u{08FF}'
), NSM
);
110 assert_eq
!(bidi_class('
\u{20A0}'
), ET
);
111 assert_eq
!(bidi_class('
\u{20CF}'
), ET
);
113 // Arabic Presentation Forms
114 assert_eq
!(bidi_class('
\u{FB1D}'
), R
);
115 assert_eq
!(bidi_class('
\u{FB4F}'
), R
);
116 assert_eq
!(bidi_class('
\u{FB50}'
), AL
);
117 assert_eq
!(bidi_class('
\u{FDCF}'
), ON
);
118 assert_eq
!(bidi_class('
\u{FDF0}'
), AL
);
119 assert_eq
!(bidi_class('
\u{FDFF}'
), ON
);
120 assert_eq
!(bidi_class('
\u{FE70}'
), AL
);
121 assert_eq
!(bidi_class('
\u{FEFE}'
), AL
);
122 assert_eq
!(bidi_class('
\u{FEFF}'
), BN
);
125 assert_eq
!(bidi_class('
\u{FDD0}'
), L
);
126 assert_eq
!(bidi_class('
\u{FDD1}'
), L
);
127 assert_eq
!(bidi_class('
\u{FDEE}'
), L
);
128 assert_eq
!(bidi_class('
\u{FDEF}'
), L
);
129 assert_eq
!(bidi_class('
\u{FFFE}'
), L
);
130 assert_eq
!(bidi_class('
\u{FFFF}'
), L
);
136 assert_eq
!(bidi_class('
\u{10800}'
), R
);
137 assert_eq
!(bidi_class('
\u{10FFF}'
), R
);
138 assert_eq
!(bidi_class('
\u{1E800}'
), R
);
139 assert_eq
!(bidi_class('
\u{1EDFF}'
), R
);
140 assert_eq
!(bidi_class('
\u{1EE00}'
), AL
);
141 assert_eq
!(bidi_class('
\u{1EEFF}'
), AL
);
142 assert_eq
!(bidi_class('
\u{1EF00}'
), R
);
143 assert_eq
!(bidi_class('
\u{1EFFF}'
), R
);
147 fn test_unassigned_planes() {
148 assert_eq
!(bidi_class('
\u{30000}'
), L
);
149 assert_eq
!(bidi_class('
\u{40000}'
), L
);
150 assert_eq
!(bidi_class('
\u{50000}'
), L
);
151 assert_eq
!(bidi_class('
\u{60000}'
), L
);
152 assert_eq
!(bidi_class('
\u{70000}'
), L
);
153 assert_eq
!(bidi_class('
\u{80000}'
), L
);
154 assert_eq
!(bidi_class('
\u{90000}'
), L
);
155 assert_eq
!(bidi_class('
\u{a0000}'
), L
);