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