unicode_brackets/
lib.rs

1//! Provides methods for determining whether a character is an opening or closing bracket and for
2//! changing the direction of these characters.
3//!
4//! The definitions used in this crate are from the unicode bidirectional algorithm
5//! [(UAX #9)](http://unicode.org/reports/tr9/). Specifically, see the file
6//! http://www.unicode.org/Public/UCD/latest/ucd/BidiBrackets.txt
7//!
8//! This crate uses the `no_std` attribute which eliminates dependence on `std`.
9//!
10//! ```rust
11//! extern crate unicode_brackets;
12//! use unicode_brackets::UnicodeBrackets;
13//! 
14//! fn main() {
15//!     // Some of the many different kinds of opening bracket.
16//!     let opening_chars = ['(', '[', '⦑'];
17//! 
18//!     for c in opening_chars.iter() {
19//!         assert!(c.is_open_bracket());
20//!     }
21//! 
22//!     let closing_chars: Vec<char> = opening_chars.iter()
23//!                                                 .map(|c| c.to_close_bracket())
24//!                                                 .collect();
25//!     assert_eq!(closing_chars[..], [')', ']', '⦒']);
26//! }
27//! ```
28
29#![deny(missing_docs, unsafe_code)]
30#![no_std]
31
32/// The version of [Unicode](http://www.unicode.org/) that this version of unicode-brackets is
33/// based on.
34pub const UNICODE_VERSION: (u64, u64, u64) = (9, 0, 0);
35
36/// Methods for determining whether a character is an opening or closing bracket and for changing
37/// the direction of such characters.
38///
39/// The definitions used in this crate are from the unicode bidirectional algorithm
40/// [(UAX #9)](http://unicode.org/reports/tr9/). Specifically, see the file
41/// http://www.unicode.org/Public/UCD/latest/ucd/BidiBrackets.txt
42pub trait UnicodeBrackets {
43    /// Determine whether a character is an opening bracket.
44    fn is_open_bracket(&self) -> bool;
45
46    /// Determine whether a character is a closing bracket.
47    fn is_close_bracket(&self) -> bool;
48
49    /// Convert a closing bracket character to an opening bracket. Returns `self` if the character
50    /// is not a closing bracket.
51    fn to_open_bracket(&self) -> Self;
52
53    /// Convert an opening bracket character to a closing bracket. Returns `self` if the character
54    /// is not an opening bracket.
55    fn to_close_bracket(&self) -> Self;
56}
57
58impl UnicodeBrackets for char {
59    fn is_open_bracket(&self) -> bool {
60        match *self {
61            '\u{0028}' => true, // LEFT PARENTHESIS
62            '\u{005B}' => true, // LEFT SQUARE BRACKET
63            '\u{007B}' => true, // LEFT CURLY BRACKET
64            '\u{0F3A}' => true, // TIBETAN MARK GUG RTAGS GYON
65            '\u{0F3C}' => true, // TIBETAN MARK ANG KHANG GYON
66            '\u{169B}' => true, // OGHAM FEATHER MARK
67            '\u{2045}' => true, // LEFT SQUARE BRACKET WITH QUILL
68            '\u{207D}' => true, // SUPERSCRIPT LEFT PARENTHESIS
69            '\u{208D}' => true, // SUBSCRIPT LEFT PARENTHESIS
70            '\u{2308}' => true, // LEFT CEILING
71            '\u{230A}' => true, // LEFT FLOOR
72            '\u{2329}' => true, // LEFT-POINTING ANGLE BRACKET
73            '\u{2768}' => true, // MEDIUM LEFT PARENTHESIS ORNAMENT
74            '\u{276A}' => true, // MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
75            '\u{276C}' => true, // MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
76            '\u{276E}' => true, // HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
77            '\u{2770}' => true, // HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
78            '\u{2772}' => true, // LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
79            '\u{2774}' => true, // MEDIUM LEFT CURLY BRACKET ORNAMENT
80            '\u{27C5}' => true, // LEFT S-SHAPED BAG DELIMITER
81            '\u{27E6}' => true, // MATHEMATICAL LEFT WHITE SQUARE BRACKET
82            '\u{27E8}' => true, // MATHEMATICAL LEFT ANGLE BRACKET
83            '\u{27EA}' => true, // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
84            '\u{27EC}' => true, // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
85            '\u{27EE}' => true, // MATHEMATICAL LEFT FLATTENED PARENTHESIS
86            '\u{2983}' => true, // LEFT WHITE CURLY BRACKET
87            '\u{2985}' => true, // LEFT WHITE PARENTHESIS
88            '\u{2987}' => true, // Z NOTATION LEFT IMAGE BRACKET
89            '\u{2989}' => true, // Z NOTATION LEFT BINDING BRACKET
90            '\u{298B}' => true, // LEFT SQUARE BRACKET WITH UNDERBAR
91            '\u{298D}' => true, // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
92            '\u{298F}' => true, // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
93            '\u{2991}' => true, // LEFT ANGLE BRACKET WITH DOT
94            '\u{2993}' => true, // LEFT ARC LESS-THAN BRACKET
95            '\u{2995}' => true, // DOUBLE LEFT ARC GREATER-THAN BRACKET
96            '\u{2997}' => true, // LEFT BLACK TORTOISE SHELL BRACKET
97            '\u{29D8}' => true, // LEFT WIGGLY FENCE
98            '\u{29DA}' => true, // LEFT DOUBLE WIGGLY FENCE
99            '\u{29FC}' => true, // LEFT-POINTING CURVED ANGLE BRACKET
100            '\u{2E22}' => true, // TOP LEFT HALF BRACKET
101            '\u{2E24}' => true, // BOTTOM LEFT HALF BRACKET
102            '\u{2E26}' => true, // LEFT SIDEWAYS U BRACKET
103            '\u{2E28}' => true, // LEFT DOUBLE PARENTHESIS
104            '\u{3008}' => true, // LEFT ANGLE BRACKET
105            '\u{300A}' => true, // LEFT DOUBLE ANGLE BRACKET
106            '\u{300C}' => true, // LEFT CORNER BRACKET
107            '\u{300E}' => true, // LEFT WHITE CORNER BRACKET
108            '\u{3010}' => true, // LEFT BLACK LENTICULAR BRACKET
109            '\u{3014}' => true, // LEFT TORTOISE SHELL BRACKET
110            '\u{3016}' => true, // LEFT WHITE LENTICULAR BRACKET
111            '\u{3018}' => true, // LEFT WHITE TORTOISE SHELL BRACKET
112            '\u{301A}' => true, // LEFT WHITE SQUARE BRACKET
113            '\u{FE59}' => true, // SMALL LEFT PARENTHESIS
114            '\u{FE5B}' => true, // SMALL LEFT CURLY BRACKET
115            '\u{FE5D}' => true, // SMALL LEFT TORTOISE SHELL BRACKET
116            '\u{FF08}' => true, // FULLWIDTH LEFT PARENTHESIS
117            '\u{FF3B}' => true, // FULLWIDTH LEFT SQUARE BRACKET
118            '\u{FF5B}' => true, // FULLWIDTH LEFT CURLY BRACKET
119            '\u{FF5F}' => true, // FULLWIDTH LEFT WHITE PARENTHESIS
120            '\u{FF62}' => true, // HALFWIDTH LEFT CORNER BRACKET
121            _ => false,
122        }
123    }
124
125    fn is_close_bracket(&self) -> bool {
126        match *self {
127            '\u{0029}' => true, // RIGHT PARENTHESIS
128            '\u{005D}' => true, // RIGHT SQUARE BRACKET
129            '\u{007D}' => true, // RIGHT CURLY BRACKET
130            '\u{0F3B}' => true, // TIBETAN MARK GUG RTAGS GYAS
131            '\u{0F3D}' => true, // TIBETAN MARK ANG KHANG GYAS
132            '\u{169C}' => true, // OGHAM REVERSED FEATHER MARK
133            '\u{2046}' => true, // RIGHT SQUARE BRACKET WITH QUILL
134            '\u{207E}' => true, // SUPERSCRIPT RIGHT PARENTHESIS
135            '\u{208E}' => true, // SUBSCRIPT RIGHT PARENTHESIS
136            '\u{2309}' => true, // RIGHT CEILING
137            '\u{230B}' => true, // RIGHT FLOOR
138            '\u{232A}' => true, // RIGHT-POINTING ANGLE BRACKET
139            '\u{2769}' => true, // MEDIUM RIGHT PARENTHESIS ORNAMENT
140            '\u{276B}' => true, // MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
141            '\u{276D}' => true, // MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
142            '\u{276F}' => true, // HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
143            '\u{2771}' => true, // HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
144            '\u{2773}' => true, // LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
145            '\u{2775}' => true, // MEDIUM RIGHT CURLY BRACKET ORNAMENT
146            '\u{27C6}' => true, // RIGHT S-SHAPED BAG DELIMITER
147            '\u{27E7}' => true, // MATHEMATICAL RIGHT WHITE SQUARE BRACKET
148            '\u{27E9}' => true, // MATHEMATICAL RIGHT ANGLE BRACKET
149            '\u{27EB}' => true, // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
150            '\u{27ED}' => true, // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
151            '\u{27EF}' => true, // MATHEMATICAL RIGHT FLATTENED PARENTHESIS
152            '\u{2984}' => true, // RIGHT WHITE CURLY BRACKET
153            '\u{2986}' => true, // RIGHT WHITE PARENTHESIS
154            '\u{2988}' => true, // Z NOTATION RIGHT IMAGE BRACKET
155            '\u{298A}' => true, // Z NOTATION RIGHT BINDING BRACKET
156            '\u{298C}' => true, // RIGHT SQUARE BRACKET WITH UNDERBAR
157            '\u{298E}' => true, // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
158            '\u{2990}' => true, // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
159            '\u{2992}' => true, // RIGHT ANGLE BRACKET WITH DOT
160            '\u{2994}' => true, // RIGHT ARC GREATER-THAN BRACKET
161            '\u{2996}' => true, // DOUBLE RIGHT ARC LESS-THAN BRACKET
162            '\u{2998}' => true, // RIGHT BLACK TORTOISE SHELL BRACKET
163            '\u{29D9}' => true, // RIGHT WIGGLY FENCE
164            '\u{29DB}' => true, // RIGHT DOUBLE WIGGLY FENCE
165            '\u{29FD}' => true, // RIGHT-POINTING CURVED ANGLE BRACKET
166            '\u{2E23}' => true, // TOP RIGHT HALF BRACKET
167            '\u{2E25}' => true, // BOTTOM RIGHT HALF BRACKET
168            '\u{2E27}' => true, // RIGHT SIDEWAYS U BRACKET
169            '\u{2E29}' => true, // RIGHT DOUBLE PARENTHESIS
170            '\u{3009}' => true, // RIGHT ANGLE BRACKET
171            '\u{300B}' => true, // RIGHT DOUBLE ANGLE BRACKET
172            '\u{300D}' => true, // RIGHT CORNER BRACKET
173            '\u{300F}' => true, // RIGHT WHITE CORNER BRACKET
174            '\u{3011}' => true, // RIGHT BLACK LENTICULAR BRACKET
175            '\u{3015}' => true, // RIGHT TORTOISE SHELL BRACKET
176            '\u{3017}' => true, // RIGHT WHITE LENTICULAR BRACKET
177            '\u{3019}' => true, // RIGHT WHITE TORTOISE SHELL BRACKET
178            '\u{301B}' => true, // RIGHT WHITE SQUARE BRACKET
179            '\u{FE5A}' => true, // SMALL RIGHT PARENTHESIS
180            '\u{FE5C}' => true, // SMALL RIGHT CURLY BRACKET
181            '\u{FE5E}' => true, // SMALL RIGHT TORTOISE SHELL BRACKET
182            '\u{FF09}' => true, // FULLWIDTH RIGHT PARENTHESIS
183            '\u{FF3D}' => true, // FULLWIDTH RIGHT SQUARE BRACKET
184            '\u{FF5D}' => true, // FULLWIDTH RIGHT CURLY BRACKET
185            '\u{FF60}' => true, // FULLWIDTH RIGHT WHITE PARENTHESIS
186            '\u{FF63}' => true, // HALFWIDTH RIGHT CORNER BRACKET
187            _ => false,
188        }        
189    }
190
191    fn to_close_bracket(&self) -> char {
192        match *self {
193            '\u{0028}' => '\u{0029}', // LEFT PARENTHESIS
194            '\u{005B}' => '\u{005D}', // LEFT SQUARE BRACKET
195            '\u{007B}' => '\u{007D}', // LEFT CURLY BRACKET
196            '\u{0F3A}' => '\u{0F3B}', // TIBETAN MARK GUG RTAGS GYON
197            '\u{0F3C}' => '\u{0F3D}', // TIBETAN MARK ANG KHANG GYON
198            '\u{169B}' => '\u{169C}', // OGHAM FEATHER MARK
199            '\u{2045}' => '\u{2046}', // LEFT SQUARE BRACKET WITH QUILL
200            '\u{207D}' => '\u{207E}', // SUPERSCRIPT LEFT PARENTHESIS
201            '\u{208D}' => '\u{208E}', // SUBSCRIPT LEFT PARENTHESIS
202            '\u{2308}' => '\u{2309}', // LEFT CEILING
203            '\u{230A}' => '\u{230B}', // LEFT FLOOR
204            '\u{2329}' => '\u{232A}', // LEFT-POINTING ANGLE BRACKET
205            '\u{2768}' => '\u{2769}', // MEDIUM LEFT PARENTHESIS ORNAMENT
206            '\u{276A}' => '\u{276B}', // MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
207            '\u{276C}' => '\u{276D}', // MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
208            '\u{276E}' => '\u{276F}', // HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
209            '\u{2770}' => '\u{2771}', // HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
210            '\u{2772}' => '\u{2773}', // LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
211            '\u{2774}' => '\u{2775}', // MEDIUM LEFT CURLY BRACKET ORNAMENT
212            '\u{27C5}' => '\u{27C6}', // LEFT S-SHAPED BAG DELIMITER
213            '\u{27E6}' => '\u{27E7}', // MATHEMATICAL LEFT WHITE SQUARE BRACKET
214            '\u{27E8}' => '\u{27E9}', // MATHEMATICAL LEFT ANGLE BRACKET
215            '\u{27EA}' => '\u{27EB}', // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
216            '\u{27EC}' => '\u{27ED}', // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
217            '\u{27EE}' => '\u{27EF}', // MATHEMATICAL LEFT FLATTENED PARENTHESIS
218            '\u{2983}' => '\u{2984}', // LEFT WHITE CURLY BRACKET
219            '\u{2985}' => '\u{2986}', // LEFT WHITE PARENTHESIS
220            '\u{2987}' => '\u{2988}', // Z NOTATION LEFT IMAGE BRACKET
221            '\u{2989}' => '\u{298A}', // Z NOTATION LEFT BINDING BRACKET
222            '\u{298B}' => '\u{298C}', // LEFT SQUARE BRACKET WITH UNDERBAR
223            '\u{298D}' => '\u{2990}', // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
224            '\u{298F}' => '\u{298E}', // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
225            '\u{2991}' => '\u{2992}', // LEFT ANGLE BRACKET WITH DOT
226            '\u{2993}' => '\u{2994}', // LEFT ARC LESS-THAN BRACKET
227            '\u{2995}' => '\u{2996}', // DOUBLE LEFT ARC GREATER-THAN BRACKET
228            '\u{2997}' => '\u{2998}', // LEFT BLACK TORTOISE SHELL BRACKET
229            '\u{29D8}' => '\u{29D9}', // LEFT WIGGLY FENCE
230            '\u{29DA}' => '\u{29DB}', // LEFT DOUBLE WIGGLY FENCE
231            '\u{29FC}' => '\u{29FD}', // LEFT-POINTING CURVED ANGLE BRACKET
232            '\u{2E22}' => '\u{2E23}', // TOP LEFT HALF BRACKET
233            '\u{2E24}' => '\u{2E25}', // BOTTOM LEFT HALF BRACKET
234            '\u{2E26}' => '\u{2E27}', // LEFT SIDEWAYS U BRACKET
235            '\u{2E28}' => '\u{2E29}', // LEFT DOUBLE PARENTHESIS
236            '\u{3008}' => '\u{3009}', // LEFT ANGLE BRACKET
237            '\u{300A}' => '\u{300B}', // LEFT DOUBLE ANGLE BRACKET
238            '\u{300C}' => '\u{300D}', // LEFT CORNER BRACKET
239            '\u{300E}' => '\u{300F}', // LEFT WHITE CORNER BRACKET
240            '\u{3010}' => '\u{3011}', // LEFT BLACK LENTICULAR BRACKET
241            '\u{3014}' => '\u{3015}', // LEFT TORTOISE SHELL BRACKET
242            '\u{3016}' => '\u{3017}', // LEFT WHITE LENTICULAR BRACKET
243            '\u{3018}' => '\u{3019}', // LEFT WHITE TORTOISE SHELL BRACKET
244            '\u{301A}' => '\u{301B}', // LEFT WHITE SQUARE BRACKET
245            '\u{FE59}' => '\u{FE5A}', // SMALL LEFT PARENTHESIS
246            '\u{FE5B}' => '\u{FE5C}', // SMALL LEFT CURLY BRACKET
247            '\u{FE5D}' => '\u{FE5E}', // SMALL LEFT TORTOISE SHELL BRACKET
248            '\u{FF08}' => '\u{FF09}', // FULLWIDTH LEFT PARENTHESIS
249            '\u{FF3B}' => '\u{FF3D}', // FULLWIDTH LEFT SQUARE BRACKET
250            '\u{FF5B}' => '\u{FF5D}', // FULLWIDTH LEFT CURLY BRACKET
251            '\u{FF5F}' => '\u{FF60}', // FULLWIDTH LEFT WHITE PARENTHESIS
252            '\u{FF62}' => '\u{FF63}', // HALFWIDTH LEFT CORNER BRACKET
253            _ => *self,
254        }
255    }
256
257    fn to_open_bracket(&self) -> char {
258        match *self {
259            '\u{0029}' => '\u{0028}', // RIGHT PARENTHESIS
260            '\u{005D}' => '\u{005B}', // RIGHT SQUARE BRACKET
261            '\u{007D}' => '\u{007B}', // RIGHT CURLY BRACKET
262            '\u{0F3B}' => '\u{0F3A}', // TIBETAN MARK GUG RTAGS GYAS
263            '\u{0F3D}' => '\u{0F3C}', // TIBETAN MARK ANG KHANG GYAS
264            '\u{169C}' => '\u{169B}', // OGHAM REVERSED FEATHER MARK
265            '\u{2046}' => '\u{2045}', // RIGHT SQUARE BRACKET WITH QUILL
266            '\u{207E}' => '\u{207D}', // SUPERSCRIPT RIGHT PARENTHESIS
267            '\u{208E}' => '\u{208D}', // SUBSCRIPT RIGHT PARENTHESIS
268            '\u{2309}' => '\u{2308}', // RIGHT CEILING
269            '\u{230B}' => '\u{230A}', // RIGHT FLOOR
270            '\u{232A}' => '\u{2329}', // RIGHT-POINTING ANGLE BRACKET
271            '\u{2769}' => '\u{2768}', // MEDIUM RIGHT PARENTHESIS ORNAMENT
272            '\u{276B}' => '\u{276A}', // MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
273            '\u{276D}' => '\u{276C}', // MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
274            '\u{276F}' => '\u{276E}', // HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
275            '\u{2771}' => '\u{2770}', // HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
276            '\u{2773}' => '\u{2772}', // LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
277            '\u{2775}' => '\u{2774}', // MEDIUM RIGHT CURLY BRACKET ORNAMENT
278            '\u{27C6}' => '\u{27C5}', // RIGHT S-SHAPED BAG DELIMITER
279            '\u{27E7}' => '\u{27E6}', // MATHEMATICAL RIGHT WHITE SQUARE BRACKET
280            '\u{27E9}' => '\u{27E8}', // MATHEMATICAL RIGHT ANGLE BRACKET
281            '\u{27EB}' => '\u{27EA}', // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
282            '\u{27ED}' => '\u{27EC}', // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
283            '\u{27EF}' => '\u{27EE}', // MATHEMATICAL RIGHT FLATTENED PARENTHESIS
284            '\u{2984}' => '\u{2983}', // RIGHT WHITE CURLY BRACKET
285            '\u{2986}' => '\u{2985}', // RIGHT WHITE PARENTHESIS
286            '\u{2988}' => '\u{2987}', // Z NOTATION RIGHT IMAGE BRACKET
287            '\u{298A}' => '\u{2989}', // Z NOTATION RIGHT BINDING BRACKET
288            '\u{298C}' => '\u{298B}', // RIGHT SQUARE BRACKET WITH UNDERBAR
289            '\u{298E}' => '\u{298F}', // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
290            '\u{2990}' => '\u{298D}', // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
291            '\u{2992}' => '\u{2991}', // RIGHT ANGLE BRACKET WITH DOT
292            '\u{2994}' => '\u{2993}', // RIGHT ARC GREATER-THAN BRACKET
293            '\u{2996}' => '\u{2995}', // DOUBLE RIGHT ARC LESS-THAN BRACKET
294            '\u{2998}' => '\u{2997}', // RIGHT BLACK TORTOISE SHELL BRACKET
295            '\u{29D9}' => '\u{29D8}', // RIGHT WIGGLY FENCE
296            '\u{29DB}' => '\u{29DA}', // RIGHT DOUBLE WIGGLY FENCE
297            '\u{29FD}' => '\u{29FC}', // RIGHT-POINTING CURVED ANGLE BRACKET
298            '\u{2E23}' => '\u{2E22}', // TOP RIGHT HALF BRACKET
299            '\u{2E25}' => '\u{2E24}', // BOTTOM RIGHT HALF BRACKET
300            '\u{2E27}' => '\u{2E26}', // RIGHT SIDEWAYS U BRACKET
301            '\u{2E29}' => '\u{2E28}', // RIGHT DOUBLE PARENTHESIS
302            '\u{3009}' => '\u{3008}', // RIGHT ANGLE BRACKET
303            '\u{300B}' => '\u{300A}', // RIGHT DOUBLE ANGLE BRACKET
304            '\u{300D}' => '\u{300C}', // RIGHT CORNER BRACKET
305            '\u{300F}' => '\u{300E}', // RIGHT WHITE CORNER BRACKET
306            '\u{3011}' => '\u{3010}', // RIGHT BLACK LENTICULAR BRACKET
307            '\u{3015}' => '\u{3014}', // RIGHT TORTOISE SHELL BRACKET
308            '\u{3017}' => '\u{3016}', // RIGHT WHITE LENTICULAR BRACKET
309            '\u{3019}' => '\u{3018}', // RIGHT WHITE TORTOISE SHELL BRACKET
310            '\u{301B}' => '\u{301A}', // RIGHT WHITE SQUARE BRACKET
311            '\u{FE5A}' => '\u{FE59}', // SMALL RIGHT PARENTHESIS
312            '\u{FE5C}' => '\u{FE5B}', // SMALL RIGHT CURLY BRACKET
313            '\u{FE5E}' => '\u{FE5D}', // SMALL RIGHT TORTOISE SHELL BRACKET
314            '\u{FF09}' => '\u{FF08}', // FULLWIDTH RIGHT PARENTHESIS
315            '\u{FF3D}' => '\u{FF3B}', // FULLWIDTH RIGHT SQUARE BRACKET
316            '\u{FF5D}' => '\u{FF5B}', // FULLWIDTH RIGHT CURLY BRACKET
317            '\u{FF60}' => '\u{FF5F}', // FULLWIDTH RIGHT WHITE PARENTHESIS
318            '\u{FF63}' => '\u{FF62}', // HALFWIDTH RIGHT CORNER BRACKET
319            _ => *self,
320        }
321    }
322}
323