unicode_matching/
lib.rs

1#![doc = include_str!("../README.md")]
2
3use gstring::*;
4
5use std::collections::BTreeMap;
6
7/// Matching open/close brackets from `UnicodeData.txt`
8pub const MATCHING: &[(&str, &str)] = &[
9    ("(", ")"),
10    ("[", "]"),
11    ("{", "}"),
12    ("«", "»"),
13    ("‘", "’"),
14    ("“", "”"),
15    ("‹", "›"),
16    ("⁅", "⁆"),
17    ("⁽", "⁾"),
18    ("₍", "₎"),
19    ("⌈", "⌉"),
20    ("⌊", "⌋"),
21    ("〈", "〉"),
22    ("❨", "❩"),
23    ("❪", "❫"),
24    ("❬", "❭"),
25    ("❮", "❯"),
26    ("❰", "❱"),
27    ("❲", "❳"),
28    ("❴", "❵"),
29    ("⟅", "⟆"),
30    ("⟦", "⟧"),
31    ("⟨", "⟩"),
32    ("⟪", "⟫"),
33    ("⟬", "⟭"),
34    ("⟮", "⟯"),
35    ("⦃", "⦄"),
36    ("⦅", "⦆"),
37    ("⦇", "⦈"),
38    ("⦉", "⦊"),
39    ("⦋", "⦌"),
40    ("⦍", "⦎"),
41    ("⦏", "⦐"),
42    ("⦑", "⦒"),
43    ("⦓", "⦔"),
44    ("⦕", "⦖"),
45    ("⦗", "⦘"),
46    ("⧘", "⧙"),
47    ("⧚", "⧛"),
48    ("⧼", "⧽"),
49    ("⸂", "⸃"),
50    ("⸄", "⸅"),
51    ("⸉", "⸊"),
52    ("⸌", "⸍"),
53    ("⸜", "⸝"),
54    ("⸠", "⸡"),
55    ("⸢", "⸣"),
56    ("⸤", "⸥"),
57    ("⸦", "⸧"),
58    ("⸨", "⸩"),
59    ("⹕", "⹖"),
60    ("⹗", "⹘"),
61    ("⹙", "⹚"),
62    ("⹛", "⹜"),
63    ("〈", "〉"),
64    ("《", "》"),
65    ("「", "」"),
66    ("『", "』"),
67    ("【", "】"),
68    ("〔", "〕"),
69    ("〖", "〗"),
70    ("〘", "〙"),
71    ("〚", "〛"),
72    ("﴾", "﴿"),
73    ("︗", "︘"),
74    ("︵", "︶"),
75    ("︷", "︸"),
76    ("︹", "︺"),
77    ("︻", "︼"),
78    ("︽", "︾"),
79    ("︿", "﹀"),
80    ("﹁", "﹂"),
81    ("﹃", "﹄"),
82    ("﹇", "﹈"),
83    ("﹙", "﹚"),
84    ("﹛", "﹜"),
85    ("﹝", "﹞"),
86    ("(", ")"),
87    ("[", "]"),
88    ("{", "}"),
89    ("⦅", "⦆"),
90    ("「", "」"),
91];
92
93/**
94Generate a [`BTreeMap`] with the matching close bracket for each open bracket in `UnicodeData.txt`
95*/
96pub fn close() -> BTreeMap<&'static str, &'static str> {
97    MATCHING.iter().cloned().collect()
98}
99
100/**
101Generate a [`BTreeMap`] with the matching open bracket for each close bracket in `UnicodeData.txt`
102*/
103pub fn open() -> BTreeMap<&'static str, &'static str> {
104    MATCHING
105        .iter()
106        .cloned()
107        .map(|(open, close)| (close, open))
108        .collect()
109}
110
111/**
112Generate a [`BTreeMap`] with an entry for each pair of opening and closing brackets in
113`UnicodeData.txt`
114*/
115pub fn matching() -> BTreeMap<&'static str, &'static str> {
116    MATCHING
117        .iter()
118        .cloned()
119        .flat_map(|(open, close)| [(open, close), (close, open)])
120        .collect()
121}
122
123/// Matching open/close brackets from `BidiBrackets.txt`
124pub const BRACKETS: &[(&str, &str)] = &[
125    ("(", ")"),
126    ("[", "]"),
127    ("{", "}"),
128    ("༺", "༻"),
129    ("༼", "༽"),
130    ("᚛", "᚜"),
131    ("⁅", "⁆"),
132    ("⁽", "⁾"),
133    ("₍", "₎"),
134    ("⌈", "⌉"),
135    ("⌊", "⌋"),
136    ("〈", "〉"),
137    ("❨", "❩"),
138    ("❪", "❫"),
139    ("❬", "❭"),
140    ("❮", "❯"),
141    ("❰", "❱"),
142    ("❲", "❳"),
143    ("❴", "❵"),
144    ("⟅", "⟆"),
145    ("⟦", "⟧"),
146    ("⟨", "⟩"),
147    ("⟪", "⟫"),
148    ("⟬", "⟭"),
149    ("⟮", "⟯"),
150    ("⦃", "⦄"),
151    ("⦅", "⦆"),
152    ("⦇", "⦈"),
153    ("⦉", "⦊"),
154    ("⦋", "⦌"),
155    ("⦍", "⦐"),
156    ("⦏", "⦎"),
157    ("⦑", "⦒"),
158    ("⦓", "⦔"),
159    ("⦕", "⦖"),
160    ("⦗", "⦘"),
161    ("⧘", "⧙"),
162    ("⧚", "⧛"),
163    ("⧼", "⧽"),
164    ("⸢", "⸣"),
165    ("⸤", "⸥"),
166    ("⸦", "⸧"),
167    ("⸨", "⸩"),
168    ("⹕", "⹖"),
169    ("⹗", "⹘"),
170    ("⹙", "⹚"),
171    ("⹛", "⹜"),
172    ("〈", "〉"),
173    ("《", "》"),
174    ("「", "」"),
175    ("『", "』"),
176    ("【", "】"),
177    ("〔", "〕"),
178    ("〖", "〗"),
179    ("〘", "〙"),
180    ("〚", "〛"),
181    ("﹙", "﹚"),
182    ("﹛", "﹜"),
183    ("﹝", "﹞"),
184    ("(", ")"),
185    ("[", "]"),
186    ("{", "}"),
187    ("⦅", "⦆"),
188    ("「", "」"),
189];
190
191/**
192Generate a [`BTreeMap`] with the matching close bracket for each open bracket in `BidiBrackets.txt`
193*/
194pub fn close_brackets() -> BTreeMap<&'static str, &'static str> {
195    BRACKETS.iter().cloned().collect()
196}
197
198/**
199Generate a [`BTreeMap`] with the matching open bracket for each close bracket in `BidiBrackets.txt`
200*/
201pub fn open_brackets() -> BTreeMap<&'static str, &'static str> {
202    BRACKETS
203        .iter()
204        .cloned()
205        .map(|(open, close)| (close, open))
206        .collect()
207}
208
209/**
210Generate a [`BTreeMap`] with an entry for each pair of opening and closing brackets in
211`BidiBrackets.txt`
212*/
213pub fn matching_brackets() -> BTreeMap<&'static str, &'static str> {
214    BRACKETS
215        .iter()
216        .cloned()
217        .flat_map(|(open, close)| [(open, close), (close, open)])
218        .collect()
219}
220
221/// Matching open/close brackets from `BidiMirroring.txt`
222pub const MIRRORING: &[(&str, &str)] = &[
223    ("(", ")"),
224    ("<", ">"),
225    ("[", "]"),
226    ("{", "}"),
227    ("«", "»"),
228    ("༺", "༻"),
229    ("༼", "༽"),
230    ("᚛", "᚜"),
231    ("‹", "›"),
232    ("⁅", "⁆"),
233    ("⁽", "⁾"),
234    ("₍", "₎"),
235    ("∈", "∋"),
236    ("∉", "∌"),
237    ("∊", "∍"),
238    ("∕", "⧵"),
239    ("∟", "⯾"),
240    ("∠", "⦣"),
241    ("∡", "⦛"),
242    ("∢", "⦠"),
243    ("∤", "⫮"),
244    ("∼", "∽"),
245    ("≃", "⋍"),
246    ("≅", "≌"),
247    ("≒", "≓"),
248    ("≔", "≕"),
249    ("≤", "≥"),
250    ("≦", "≧"),
251    ("≨", "≩"),
252    ("≪", "≫"),
253    ("≮", "≯"),
254    ("≰", "≱"),
255    ("≲", "≳"),
256    ("≴", "≵"),
257    ("≶", "≷"),
258    ("≸", "≹"),
259    ("≺", "≻"),
260    ("≼", "≽"),
261    ("≾", "≿"),
262    ("⊀", "⊁"),
263    ("⊂", "⊃"),
264    ("⊄", "⊅"),
265    ("⊆", "⊇"),
266    ("⊈", "⊉"),
267    ("⊊", "⊋"),
268    ("⊏", "⊐"),
269    ("⊑", "⊒"),
270    ("⊘", "⦸"),
271    ("⊢", "⊣"),
272    ("⊦", "⫞"),
273    ("⊨", "⫤"),
274    ("⊩", "⫣"),
275    ("⊫", "⫥"),
276    ("⊰", "⊱"),
277    ("⊲", "⊳"),
278    ("⊴", "⊵"),
279    ("⊶", "⊷"),
280    ("⊸", "⟜"),
281    ("⋉", "⋊"),
282    ("⋋", "⋌"),
283    ("⋐", "⋑"),
284    ("⋖", "⋗"),
285    ("⋘", "⋙"),
286    ("⋚", "⋛"),
287    ("⋜", "⋝"),
288    ("⋞", "⋟"),
289    ("⋠", "⋡"),
290    ("⋢", "⋣"),
291    ("⋤", "⋥"),
292    ("⋦", "⋧"),
293    ("⋨", "⋩"),
294    ("⋪", "⋫"),
295    ("⋬", "⋭"),
296    ("⋰", "⋱"),
297    ("⋲", "⋺"),
298    ("⋳", "⋻"),
299    ("⋴", "⋼"),
300    ("⋶", "⋽"),
301    ("⋷", "⋾"),
302    ("⌈", "⌉"),
303    ("⌊", "⌋"),
304    ("〈", "〉"),
305    ("❨", "❩"),
306    ("❪", "❫"),
307    ("❬", "❭"),
308    ("❮", "❯"),
309    ("❰", "❱"),
310    ("❲", "❳"),
311    ("❴", "❵"),
312    ("⟃", "⟄"),
313    ("⟅", "⟆"),
314    ("⟈", "⟉"),
315    ("⟋", "⟍"),
316    ("⟕", "⟖"),
317    ("⟝", "⟞"),
318    ("⟢", "⟣"),
319    ("⟤", "⟥"),
320    ("⟦", "⟧"),
321    ("⟨", "⟩"),
322    ("⟪", "⟫"),
323    ("⟬", "⟭"),
324    ("⟮", "⟯"),
325    ("⦃", "⦄"),
326    ("⦅", "⦆"),
327    ("⦇", "⦈"),
328    ("⦉", "⦊"),
329    ("⦋", "⦌"),
330    ("⦍", "⦐"),
331    ("⦎", "⦏"),
332    ("⦑", "⦒"),
333    ("⦓", "⦔"),
334    ("⦕", "⦖"),
335    ("⦗", "⦘"),
336    ("⦤", "⦥"),
337    ("⦨", "⦩"),
338    ("⦪", "⦫"),
339    ("⦬", "⦭"),
340    ("⦮", "⦯"),
341    ("⧀", "⧁"),
342    ("⧄", "⧅"),
343    ("⧏", "⧐"),
344    ("⧑", "⧒"),
345    ("⧔", "⧕"),
346    ("⧘", "⧙"),
347    ("⧚", "⧛"),
348    ("⧨", "⧩"),
349    ("⧸", "⧹"),
350    ("⧼", "⧽"),
351    ("⨫", "⨬"),
352    ("⨭", "⨮"),
353    ("⨴", "⨵"),
354    ("⨼", "⨽"),
355    ("⩤", "⩥"),
356    ("⩹", "⩺"),
357    ("⩻", "⩼"),
358    ("⩽", "⩾"),
359    ("⩿", "⪀"),
360    ("⪁", "⪂"),
361    ("⪃", "⪄"),
362    ("⪅", "⪆"),
363    ("⪇", "⪈"),
364    ("⪉", "⪊"),
365    ("⪋", "⪌"),
366    ("⪍", "⪎"),
367    ("⪏", "⪐"),
368    ("⪑", "⪒"),
369    ("⪓", "⪔"),
370    ("⪕", "⪖"),
371    ("⪗", "⪘"),
372    ("⪙", "⪚"),
373    ("⪛", "⪜"),
374    ("⪝", "⪞"),
375    ("⪟", "⪠"),
376    ("⪡", "⪢"),
377    ("⪦", "⪧"),
378    ("⪨", "⪩"),
379    ("⪪", "⪫"),
380    ("⪬", "⪭"),
381    ("⪯", "⪰"),
382    ("⪱", "⪲"),
383    ("⪳", "⪴"),
384    ("⪵", "⪶"),
385    ("⪷", "⪸"),
386    ("⪹", "⪺"),
387    ("⪻", "⪼"),
388    ("⪽", "⪾"),
389    ("⪿", "⫀"),
390    ("⫁", "⫂"),
391    ("⫃", "⫄"),
392    ("⫅", "⫆"),
393    ("⫇", "⫈"),
394    ("⫉", "⫊"),
395    ("⫋", "⫌"),
396    ("⫍", "⫎"),
397    ("⫏", "⫐"),
398    ("⫑", "⫒"),
399    ("⫓", "⫔"),
400    ("⫕", "⫖"),
401    ("⫬", "⫭"),
402    ("⫷", "⫸"),
403    ("⫹", "⫺"),
404    ("⸂", "⸃"),
405    ("⸄", "⸅"),
406    ("⸉", "⸊"),
407    ("⸌", "⸍"),
408    ("⸜", "⸝"),
409    ("⸠", "⸡"),
410    ("⸢", "⸣"),
411    ("⸤", "⸥"),
412    ("⸦", "⸧"),
413    ("⸨", "⸩"),
414    ("⹕", "⹖"),
415    ("⹗", "⹘"),
416    ("⹙", "⹚"),
417    ("⹛", "⹜"),
418    ("〈", "〉"),
419    ("《", "》"),
420    ("「", "」"),
421    ("『", "』"),
422    ("【", "】"),
423    ("〔", "〕"),
424    ("〖", "〗"),
425    ("〘", "〙"),
426    ("〚", "〛"),
427    ("﹙", "﹚"),
428    ("﹛", "﹜"),
429    ("﹝", "﹞"),
430    ("﹤", "﹥"),
431    ("(", ")"),
432    ("<", ">"),
433    ("[", "]"),
434    ("{", "}"),
435    ("⦅", "⦆"),
436    ("「", "」"),
437];
438
439/**
440Generate a [`BTreeMap`] with the matching close bracket for each open bracket in
441`BidiMirroring.txt`
442*/
443pub fn close_mirroring() -> BTreeMap<&'static str, &'static str> {
444    MIRRORING.iter().cloned().collect()
445}
446
447/**
448Generate a [`BTreeMap`] with the matching open bracket for each close bracket in
449`BidiMirroring.txt`
450*/
451pub fn open_mirroring() -> BTreeMap<&'static str, &'static str> {
452    MIRRORING
453        .iter()
454        .cloned()
455        .map(|(open, close)| (close, open))
456        .collect()
457}
458
459/**
460Generate a [`BTreeMap`] with an entry for each pair of opening and closing brackets in
461`BidiMirroring.txt`
462*/
463pub fn matching_mirroring() -> BTreeMap<&'static str, &'static str> {
464    MIRRORING
465        .iter()
466        .cloned()
467        .flat_map(|(open, close)| [(open, close), (close, open)])
468        .collect()
469}
470
471/// Matching open/close brackets from `UnicodeData.txt` and `BidiBrackets.txt`
472pub const BRACKETS_MATCHING: &[(&str, &str)] = &[
473    ("(", ")"),
474    ("[", "]"),
475    ("{", "}"),
476    ("«", "»"),
477    ("༺", "༻"),
478    ("༼", "༽"),
479    ("᚛", "᚜"),
480    ("‘", "’"),
481    ("“", "”"),
482    ("‹", "›"),
483    ("⁅", "⁆"),
484    ("⁽", "⁾"),
485    ("₍", "₎"),
486    ("⌈", "⌉"),
487    ("⌊", "⌋"),
488    ("〈", "〉"),
489    ("❨", "❩"),
490    ("❪", "❫"),
491    ("❬", "❭"),
492    ("❮", "❯"),
493    ("❰", "❱"),
494    ("❲", "❳"),
495    ("❴", "❵"),
496    ("⟅", "⟆"),
497    ("⟦", "⟧"),
498    ("⟨", "⟩"),
499    ("⟪", "⟫"),
500    ("⟬", "⟭"),
501    ("⟮", "⟯"),
502    ("⦃", "⦄"),
503    ("⦅", "⦆"),
504    ("⦇", "⦈"),
505    ("⦉", "⦊"),
506    ("⦋", "⦌"),
507    ("⦍", "⦎"),
508    ("⦏", "⦐"),
509    ("⦑", "⦒"),
510    ("⦓", "⦔"),
511    ("⦕", "⦖"),
512    ("⦗", "⦘"),
513    ("⧘", "⧙"),
514    ("⧚", "⧛"),
515    ("⧼", "⧽"),
516    ("⸂", "⸃"),
517    ("⸄", "⸅"),
518    ("⸉", "⸊"),
519    ("⸌", "⸍"),
520    ("⸜", "⸝"),
521    ("⸠", "⸡"),
522    ("⸢", "⸣"),
523    ("⸤", "⸥"),
524    ("⸦", "⸧"),
525    ("⸨", "⸩"),
526    ("⹕", "⹖"),
527    ("⹗", "⹘"),
528    ("⹙", "⹚"),
529    ("⹛", "⹜"),
530    ("〈", "〉"),
531    ("《", "》"),
532    ("「", "」"),
533    ("『", "』"),
534    ("【", "】"),
535    ("〔", "〕"),
536    ("〖", "〗"),
537    ("〘", "〙"),
538    ("〚", "〛"),
539    ("﴾", "﴿"),
540    ("︗", "︘"),
541    ("︵", "︶"),
542    ("︷", "︸"),
543    ("︹", "︺"),
544    ("︻", "︼"),
545    ("︽", "︾"),
546    ("︿", "﹀"),
547    ("﹁", "﹂"),
548    ("﹃", "﹄"),
549    ("﹇", "﹈"),
550    ("﹙", "﹚"),
551    ("﹛", "﹜"),
552    ("﹝", "﹞"),
553    ("(", ")"),
554    ("[", "]"),
555    ("{", "}"),
556    ("⦅", "⦆"),
557    ("「", "」"),
558];
559
560/**
561Generate a [`BTreeMap`] with the matching close bracket for each open bracket in `UnicodeData.txt`
562and `BidiBrackets.txt`
563*/
564pub fn close_brackets_matching() -> BTreeMap<&'static str, &'static str> {
565    BRACKETS_MATCHING.iter().cloned().collect()
566}
567
568/**
569Generate a [`BTreeMap`] with the matching open bracket for each close bracket in `UnicodeData.txt`
570and `BidiBrackets.txt`
571*/
572pub fn open_brackets_matching() -> BTreeMap<&'static str, &'static str> {
573    BRACKETS_MATCHING
574        .iter()
575        .cloned()
576        .map(|(open, close)| (close, open))
577        .collect()
578}
579
580/**
581Generate a [`BTreeMap`] with an entry for each pair of opening and closing brackets in
582`UnicodeData.txt` and `BidiBrackets.txt`
583*/
584pub fn matching_brackets_matching() -> BTreeMap<&'static str, &'static str> {
585    BRACKETS_MATCHING
586        .iter()
587        .cloned()
588        .flat_map(|(open, close)| [(open, close), (close, open)])
589        .collect()
590}
591
592/// Matching open/close brackets from `BidiMirroring.txt` and `BidiBrackets.txt`
593pub const BRACKETS_MIRRORING: &[(&str, &str)] = &[
594    ("(", ")"),
595    ("<", ">"),
596    ("[", "]"),
597    ("{", "}"),
598    ("«", "»"),
599    ("༺", "༻"),
600    ("༼", "༽"),
601    ("᚛", "᚜"),
602    ("‹", "›"),
603    ("⁅", "⁆"),
604    ("⁽", "⁾"),
605    ("₍", "₎"),
606    ("∈", "∋"),
607    ("∉", "∌"),
608    ("∊", "∍"),
609    ("∕", "⧵"),
610    ("∟", "⯾"),
611    ("∠", "⦣"),
612    ("∡", "⦛"),
613    ("∢", "⦠"),
614    ("∤", "⫮"),
615    ("∼", "∽"),
616    ("≃", "⋍"),
617    ("≅", "≌"),
618    ("≒", "≓"),
619    ("≔", "≕"),
620    ("≤", "≥"),
621    ("≦", "≧"),
622    ("≨", "≩"),
623    ("≪", "≫"),
624    ("≮", "≯"),
625    ("≰", "≱"),
626    ("≲", "≳"),
627    ("≴", "≵"),
628    ("≶", "≷"),
629    ("≸", "≹"),
630    ("≺", "≻"),
631    ("≼", "≽"),
632    ("≾", "≿"),
633    ("⊀", "⊁"),
634    ("⊂", "⊃"),
635    ("⊄", "⊅"),
636    ("⊆", "⊇"),
637    ("⊈", "⊉"),
638    ("⊊", "⊋"),
639    ("⊏", "⊐"),
640    ("⊑", "⊒"),
641    ("⊘", "⦸"),
642    ("⊢", "⊣"),
643    ("⊦", "⫞"),
644    ("⊨", "⫤"),
645    ("⊩", "⫣"),
646    ("⊫", "⫥"),
647    ("⊰", "⊱"),
648    ("⊲", "⊳"),
649    ("⊴", "⊵"),
650    ("⊶", "⊷"),
651    ("⊸", "⟜"),
652    ("⋉", "⋊"),
653    ("⋋", "⋌"),
654    ("⋐", "⋑"),
655    ("⋖", "⋗"),
656    ("⋘", "⋙"),
657    ("⋚", "⋛"),
658    ("⋜", "⋝"),
659    ("⋞", "⋟"),
660    ("⋠", "⋡"),
661    ("⋢", "⋣"),
662    ("⋤", "⋥"),
663    ("⋦", "⋧"),
664    ("⋨", "⋩"),
665    ("⋪", "⋫"),
666    ("⋬", "⋭"),
667    ("⋰", "⋱"),
668    ("⋲", "⋺"),
669    ("⋳", "⋻"),
670    ("⋴", "⋼"),
671    ("⋶", "⋽"),
672    ("⋷", "⋾"),
673    ("⌈", "⌉"),
674    ("⌊", "⌋"),
675    ("〈", "〉"),
676    ("❨", "❩"),
677    ("❪", "❫"),
678    ("❬", "❭"),
679    ("❮", "❯"),
680    ("❰", "❱"),
681    ("❲", "❳"),
682    ("❴", "❵"),
683    ("⟃", "⟄"),
684    ("⟅", "⟆"),
685    ("⟈", "⟉"),
686    ("⟋", "⟍"),
687    ("⟕", "⟖"),
688    ("⟝", "⟞"),
689    ("⟢", "⟣"),
690    ("⟤", "⟥"),
691    ("⟦", "⟧"),
692    ("⟨", "⟩"),
693    ("⟪", "⟫"),
694    ("⟬", "⟭"),
695    ("⟮", "⟯"),
696    ("⦃", "⦄"),
697    ("⦅", "⦆"),
698    ("⦇", "⦈"),
699    ("⦉", "⦊"),
700    ("⦋", "⦌"),
701    ("⦍", "⦐"),
702    ("⦎", "⦏"),
703    ("⦏", "⦎"),
704    ("⦑", "⦒"),
705    ("⦓", "⦔"),
706    ("⦕", "⦖"),
707    ("⦗", "⦘"),
708    ("⦤", "⦥"),
709    ("⦨", "⦩"),
710    ("⦪", "⦫"),
711    ("⦬", "⦭"),
712    ("⦮", "⦯"),
713    ("⧀", "⧁"),
714    ("⧄", "⧅"),
715    ("⧏", "⧐"),
716    ("⧑", "⧒"),
717    ("⧔", "⧕"),
718    ("⧘", "⧙"),
719    ("⧚", "⧛"),
720    ("⧨", "⧩"),
721    ("⧸", "⧹"),
722    ("⧼", "⧽"),
723    ("⨫", "⨬"),
724    ("⨭", "⨮"),
725    ("⨴", "⨵"),
726    ("⨼", "⨽"),
727    ("⩤", "⩥"),
728    ("⩹", "⩺"),
729    ("⩻", "⩼"),
730    ("⩽", "⩾"),
731    ("⩿", "⪀"),
732    ("⪁", "⪂"),
733    ("⪃", "⪄"),
734    ("⪅", "⪆"),
735    ("⪇", "⪈"),
736    ("⪉", "⪊"),
737    ("⪋", "⪌"),
738    ("⪍", "⪎"),
739    ("⪏", "⪐"),
740    ("⪑", "⪒"),
741    ("⪓", "⪔"),
742    ("⪕", "⪖"),
743    ("⪗", "⪘"),
744    ("⪙", "⪚"),
745    ("⪛", "⪜"),
746    ("⪝", "⪞"),
747    ("⪟", "⪠"),
748    ("⪡", "⪢"),
749    ("⪦", "⪧"),
750    ("⪨", "⪩"),
751    ("⪪", "⪫"),
752    ("⪬", "⪭"),
753    ("⪯", "⪰"),
754    ("⪱", "⪲"),
755    ("⪳", "⪴"),
756    ("⪵", "⪶"),
757    ("⪷", "⪸"),
758    ("⪹", "⪺"),
759    ("⪻", "⪼"),
760    ("⪽", "⪾"),
761    ("⪿", "⫀"),
762    ("⫁", "⫂"),
763    ("⫃", "⫄"),
764    ("⫅", "⫆"),
765    ("⫇", "⫈"),
766    ("⫉", "⫊"),
767    ("⫋", "⫌"),
768    ("⫍", "⫎"),
769    ("⫏", "⫐"),
770    ("⫑", "⫒"),
771    ("⫓", "⫔"),
772    ("⫕", "⫖"),
773    ("⫬", "⫭"),
774    ("⫷", "⫸"),
775    ("⫹", "⫺"),
776    ("⸂", "⸃"),
777    ("⸄", "⸅"),
778    ("⸉", "⸊"),
779    ("⸌", "⸍"),
780    ("⸜", "⸝"),
781    ("⸠", "⸡"),
782    ("⸢", "⸣"),
783    ("⸤", "⸥"),
784    ("⸦", "⸧"),
785    ("⸨", "⸩"),
786    ("⹕", "⹖"),
787    ("⹗", "⹘"),
788    ("⹙", "⹚"),
789    ("⹛", "⹜"),
790    ("〈", "〉"),
791    ("《", "》"),
792    ("「", "」"),
793    ("『", "』"),
794    ("【", "】"),
795    ("〔", "〕"),
796    ("〖", "〗"),
797    ("〘", "〙"),
798    ("〚", "〛"),
799    ("﹙", "﹚"),
800    ("﹛", "﹜"),
801    ("﹝", "﹞"),
802    ("﹤", "﹥"),
803    ("(", ")"),
804    ("<", ">"),
805    ("[", "]"),
806    ("{", "}"),
807    ("⦅", "⦆"),
808    ("「", "」"),
809];
810
811/**
812Generate a [`BTreeMap`] with the matching close bracket for each open bracket in
813`BidiMirroring.txt` and `BidiBrackets.txt`
814*/
815pub fn close_brackets_mirroring() -> BTreeMap<&'static str, &'static str> {
816    BRACKETS_MIRRORING.iter().cloned().collect()
817}
818
819/**
820Generate a [`BTreeMap`] with the matching open bracket for each close bracket in
821`BidiMirroring.txt` and `BidiBrackets.txt`
822*/
823pub fn open_brackets_mirroring() -> BTreeMap<&'static str, &'static str> {
824    BRACKETS_MIRRORING
825        .iter()
826        .cloned()
827        .map(|(open, close)| (close, open))
828        .collect()
829}
830
831/**
832Generate a [`BTreeMap`] with an entry for each pair of opening and closing brackets in
833`BidiMirroring.txt` and `BidiBrackets.txt`
834*/
835pub fn matching_brackets_mirroring() -> BTreeMap<&'static str, &'static str> {
836    BRACKETS_MIRRORING
837        .iter()
838        .cloned()
839        .flat_map(|(open, close)| [(open, close), (close, open)])
840        .collect()
841}
842
843/// Matching open/close brackets from `UnicodeData.txt` and `BidiMirroring.txt`
844pub const MIRRORING_MATCHING: &[(&str, &str)] = &[
845    ("(", ")"),
846    ("<", ">"),
847    ("[", "]"),
848    ("{", "}"),
849    ("«", "»"),
850    ("༺", "༻"),
851    ("༼", "༽"),
852    ("᚛", "᚜"),
853    ("‘", "’"),
854    ("“", "”"),
855    ("‹", "›"),
856    ("⁅", "⁆"),
857    ("⁽", "⁾"),
858    ("₍", "₎"),
859    ("∈", "∋"),
860    ("∉", "∌"),
861    ("∊", "∍"),
862    ("∕", "⧵"),
863    ("∟", "⯾"),
864    ("∠", "⦣"),
865    ("∡", "⦛"),
866    ("∢", "⦠"),
867    ("∤", "⫮"),
868    ("∼", "∽"),
869    ("≃", "⋍"),
870    ("≅", "≌"),
871    ("≒", "≓"),
872    ("≔", "≕"),
873    ("≤", "≥"),
874    ("≦", "≧"),
875    ("≨", "≩"),
876    ("≪", "≫"),
877    ("≮", "≯"),
878    ("≰", "≱"),
879    ("≲", "≳"),
880    ("≴", "≵"),
881    ("≶", "≷"),
882    ("≸", "≹"),
883    ("≺", "≻"),
884    ("≼", "≽"),
885    ("≾", "≿"),
886    ("⊀", "⊁"),
887    ("⊂", "⊃"),
888    ("⊄", "⊅"),
889    ("⊆", "⊇"),
890    ("⊈", "⊉"),
891    ("⊊", "⊋"),
892    ("⊏", "⊐"),
893    ("⊑", "⊒"),
894    ("⊘", "⦸"),
895    ("⊢", "⊣"),
896    ("⊦", "⫞"),
897    ("⊨", "⫤"),
898    ("⊩", "⫣"),
899    ("⊫", "⫥"),
900    ("⊰", "⊱"),
901    ("⊲", "⊳"),
902    ("⊴", "⊵"),
903    ("⊶", "⊷"),
904    ("⊸", "⟜"),
905    ("⋉", "⋊"),
906    ("⋋", "⋌"),
907    ("⋐", "⋑"),
908    ("⋖", "⋗"),
909    ("⋘", "⋙"),
910    ("⋚", "⋛"),
911    ("⋜", "⋝"),
912    ("⋞", "⋟"),
913    ("⋠", "⋡"),
914    ("⋢", "⋣"),
915    ("⋤", "⋥"),
916    ("⋦", "⋧"),
917    ("⋨", "⋩"),
918    ("⋪", "⋫"),
919    ("⋬", "⋭"),
920    ("⋰", "⋱"),
921    ("⋲", "⋺"),
922    ("⋳", "⋻"),
923    ("⋴", "⋼"),
924    ("⋶", "⋽"),
925    ("⋷", "⋾"),
926    ("⌈", "⌉"),
927    ("⌊", "⌋"),
928    ("〈", "〉"),
929    ("❨", "❩"),
930    ("❪", "❫"),
931    ("❬", "❭"),
932    ("❮", "❯"),
933    ("❰", "❱"),
934    ("❲", "❳"),
935    ("❴", "❵"),
936    ("⟃", "⟄"),
937    ("⟅", "⟆"),
938    ("⟈", "⟉"),
939    ("⟋", "⟍"),
940    ("⟕", "⟖"),
941    ("⟝", "⟞"),
942    ("⟢", "⟣"),
943    ("⟤", "⟥"),
944    ("⟦", "⟧"),
945    ("⟨", "⟩"),
946    ("⟪", "⟫"),
947    ("⟬", "⟭"),
948    ("⟮", "⟯"),
949    ("⦃", "⦄"),
950    ("⦅", "⦆"),
951    ("⦇", "⦈"),
952    ("⦉", "⦊"),
953    ("⦋", "⦌"),
954    ("⦍", "⦎"),
955    ("⦎", "⦏"),
956    ("⦏", "⦐"),
957    ("⦑", "⦒"),
958    ("⦓", "⦔"),
959    ("⦕", "⦖"),
960    ("⦗", "⦘"),
961    ("⦤", "⦥"),
962    ("⦨", "⦩"),
963    ("⦪", "⦫"),
964    ("⦬", "⦭"),
965    ("⦮", "⦯"),
966    ("⧀", "⧁"),
967    ("⧄", "⧅"),
968    ("⧏", "⧐"),
969    ("⧑", "⧒"),
970    ("⧔", "⧕"),
971    ("⧘", "⧙"),
972    ("⧚", "⧛"),
973    ("⧨", "⧩"),
974    ("⧸", "⧹"),
975    ("⧼", "⧽"),
976    ("⨫", "⨬"),
977    ("⨭", "⨮"),
978    ("⨴", "⨵"),
979    ("⨼", "⨽"),
980    ("⩤", "⩥"),
981    ("⩹", "⩺"),
982    ("⩻", "⩼"),
983    ("⩽", "⩾"),
984    ("⩿", "⪀"),
985    ("⪁", "⪂"),
986    ("⪃", "⪄"),
987    ("⪅", "⪆"),
988    ("⪇", "⪈"),
989    ("⪉", "⪊"),
990    ("⪋", "⪌"),
991    ("⪍", "⪎"),
992    ("⪏", "⪐"),
993    ("⪑", "⪒"),
994    ("⪓", "⪔"),
995    ("⪕", "⪖"),
996    ("⪗", "⪘"),
997    ("⪙", "⪚"),
998    ("⪛", "⪜"),
999    ("⪝", "⪞"),
1000    ("⪟", "⪠"),
1001    ("⪡", "⪢"),
1002    ("⪦", "⪧"),
1003    ("⪨", "⪩"),
1004    ("⪪", "⪫"),
1005    ("⪬", "⪭"),
1006    ("⪯", "⪰"),
1007    ("⪱", "⪲"),
1008    ("⪳", "⪴"),
1009    ("⪵", "⪶"),
1010    ("⪷", "⪸"),
1011    ("⪹", "⪺"),
1012    ("⪻", "⪼"),
1013    ("⪽", "⪾"),
1014    ("⪿", "⫀"),
1015    ("⫁", "⫂"),
1016    ("⫃", "⫄"),
1017    ("⫅", "⫆"),
1018    ("⫇", "⫈"),
1019    ("⫉", "⫊"),
1020    ("⫋", "⫌"),
1021    ("⫍", "⫎"),
1022    ("⫏", "⫐"),
1023    ("⫑", "⫒"),
1024    ("⫓", "⫔"),
1025    ("⫕", "⫖"),
1026    ("⫬", "⫭"),
1027    ("⫷", "⫸"),
1028    ("⫹", "⫺"),
1029    ("⸂", "⸃"),
1030    ("⸄", "⸅"),
1031    ("⸉", "⸊"),
1032    ("⸌", "⸍"),
1033    ("⸜", "⸝"),
1034    ("⸠", "⸡"),
1035    ("⸢", "⸣"),
1036    ("⸤", "⸥"),
1037    ("⸦", "⸧"),
1038    ("⸨", "⸩"),
1039    ("⹕", "⹖"),
1040    ("⹗", "⹘"),
1041    ("⹙", "⹚"),
1042    ("⹛", "⹜"),
1043    ("〈", "〉"),
1044    ("《", "》"),
1045    ("「", "」"),
1046    ("『", "』"),
1047    ("【", "】"),
1048    ("〔", "〕"),
1049    ("〖", "〗"),
1050    ("〘", "〙"),
1051    ("〚", "〛"),
1052    ("﴾", "﴿"),
1053    ("︗", "︘"),
1054    ("︵", "︶"),
1055    ("︷", "︸"),
1056    ("︹", "︺"),
1057    ("︻", "︼"),
1058    ("︽", "︾"),
1059    ("︿", "﹀"),
1060    ("﹁", "﹂"),
1061    ("﹃", "﹄"),
1062    ("﹇", "﹈"),
1063    ("﹙", "﹚"),
1064    ("﹛", "﹜"),
1065    ("﹝", "﹞"),
1066    ("﹤", "﹥"),
1067    ("(", ")"),
1068    ("<", ">"),
1069    ("[", "]"),
1070    ("{", "}"),
1071    ("⦅", "⦆"),
1072    ("「", "」"),
1073];
1074
1075/**
1076Generate a [`BTreeMap`] with the matching close bracket for each open bracket in `UnicodeData.txt`
1077and `BidiMirroring.txt`
1078*/
1079pub fn close_mirroring_matching() -> BTreeMap<&'static str, &'static str> {
1080    MIRRORING_MATCHING.iter().cloned().collect()
1081}
1082
1083/**
1084Generate a [`BTreeMap`] with the matching open bracket for each close bracket in `UnicodeData.txt`
1085and `BidiMirroring.txt`
1086*/
1087pub fn open_mirroring_matching() -> BTreeMap<&'static str, &'static str> {
1088    MIRRORING_MATCHING
1089        .iter()
1090        .cloned()
1091        .map(|(open, close)| (close, open))
1092        .collect()
1093}
1094
1095/**
1096Generate a [`BTreeMap`] with an entry for each pair of opening and closing brackets in
1097`UnicodeData.txt` and `BidiMirroring.txt`
1098*/
1099pub fn matching_mirroring_matching() -> BTreeMap<&'static str, &'static str> {
1100    MIRRORING_MATCHING
1101        .iter()
1102        .cloned()
1103        .flat_map(|(open, close)| [(open, close), (close, open)])
1104        .collect()
1105}
1106
1107/// Matching open/close brackets from `UnicodeData.txt`, `BidiBrackets.txt`, and `BidiMirroring.txt`
1108pub const ALL: &[(&str, &str)] = &[
1109    ("(", ")"),
1110    ("<", ">"),
1111    ("[", "]"),
1112    ("{", "}"),
1113    ("«", "»"),
1114    ("༺", "༻"),
1115    ("༼", "༽"),
1116    ("᚛", "᚜"),
1117    ("‘", "’"),
1118    ("“", "”"),
1119    ("‹", "›"),
1120    ("⁅", "⁆"),
1121    ("⁽", "⁾"),
1122    ("₍", "₎"),
1123    ("∈", "∋"),
1124    ("∉", "∌"),
1125    ("∊", "∍"),
1126    ("∕", "⧵"),
1127    ("∟", "⯾"),
1128    ("∠", "⦣"),
1129    ("∡", "⦛"),
1130    ("∢", "⦠"),
1131    ("∤", "⫮"),
1132    ("∼", "∽"),
1133    ("≃", "⋍"),
1134    ("≅", "≌"),
1135    ("≒", "≓"),
1136    ("≔", "≕"),
1137    ("≤", "≥"),
1138    ("≦", "≧"),
1139    ("≨", "≩"),
1140    ("≪", "≫"),
1141    ("≮", "≯"),
1142    ("≰", "≱"),
1143    ("≲", "≳"),
1144    ("≴", "≵"),
1145    ("≶", "≷"),
1146    ("≸", "≹"),
1147    ("≺", "≻"),
1148    ("≼", "≽"),
1149    ("≾", "≿"),
1150    ("⊀", "⊁"),
1151    ("⊂", "⊃"),
1152    ("⊄", "⊅"),
1153    ("⊆", "⊇"),
1154    ("⊈", "⊉"),
1155    ("⊊", "⊋"),
1156    ("⊏", "⊐"),
1157    ("⊑", "⊒"),
1158    ("⊘", "⦸"),
1159    ("⊢", "⊣"),
1160    ("⊦", "⫞"),
1161    ("⊨", "⫤"),
1162    ("⊩", "⫣"),
1163    ("⊫", "⫥"),
1164    ("⊰", "⊱"),
1165    ("⊲", "⊳"),
1166    ("⊴", "⊵"),
1167    ("⊶", "⊷"),
1168    ("⊸", "⟜"),
1169    ("⋉", "⋊"),
1170    ("⋋", "⋌"),
1171    ("⋐", "⋑"),
1172    ("⋖", "⋗"),
1173    ("⋘", "⋙"),
1174    ("⋚", "⋛"),
1175    ("⋜", "⋝"),
1176    ("⋞", "⋟"),
1177    ("⋠", "⋡"),
1178    ("⋢", "⋣"),
1179    ("⋤", "⋥"),
1180    ("⋦", "⋧"),
1181    ("⋨", "⋩"),
1182    ("⋪", "⋫"),
1183    ("⋬", "⋭"),
1184    ("⋰", "⋱"),
1185    ("⋲", "⋺"),
1186    ("⋳", "⋻"),
1187    ("⋴", "⋼"),
1188    ("⋶", "⋽"),
1189    ("⋷", "⋾"),
1190    ("⌈", "⌉"),
1191    ("⌊", "⌋"),
1192    ("〈", "〉"),
1193    ("❨", "❩"),
1194    ("❪", "❫"),
1195    ("❬", "❭"),
1196    ("❮", "❯"),
1197    ("❰", "❱"),
1198    ("❲", "❳"),
1199    ("❴", "❵"),
1200    ("⟃", "⟄"),
1201    ("⟅", "⟆"),
1202    ("⟈", "⟉"),
1203    ("⟋", "⟍"),
1204    ("⟕", "⟖"),
1205    ("⟝", "⟞"),
1206    ("⟢", "⟣"),
1207    ("⟤", "⟥"),
1208    ("⟦", "⟧"),
1209    ("⟨", "⟩"),
1210    ("⟪", "⟫"),
1211    ("⟬", "⟭"),
1212    ("⟮", "⟯"),
1213    ("⦃", "⦄"),
1214    ("⦅", "⦆"),
1215    ("⦇", "⦈"),
1216    ("⦉", "⦊"),
1217    ("⦋", "⦌"),
1218    ("⦍", "⦎"),
1219    ("⦎", "⦏"),
1220    ("⦏", "⦐"),
1221    ("⦑", "⦒"),
1222    ("⦓", "⦔"),
1223    ("⦕", "⦖"),
1224    ("⦗", "⦘"),
1225    ("⦤", "⦥"),
1226    ("⦨", "⦩"),
1227    ("⦪", "⦫"),
1228    ("⦬", "⦭"),
1229    ("⦮", "⦯"),
1230    ("⧀", "⧁"),
1231    ("⧄", "⧅"),
1232    ("⧏", "⧐"),
1233    ("⧑", "⧒"),
1234    ("⧔", "⧕"),
1235    ("⧘", "⧙"),
1236    ("⧚", "⧛"),
1237    ("⧨", "⧩"),
1238    ("⧸", "⧹"),
1239    ("⧼", "⧽"),
1240    ("⨫", "⨬"),
1241    ("⨭", "⨮"),
1242    ("⨴", "⨵"),
1243    ("⨼", "⨽"),
1244    ("⩤", "⩥"),
1245    ("⩹", "⩺"),
1246    ("⩻", "⩼"),
1247    ("⩽", "⩾"),
1248    ("⩿", "⪀"),
1249    ("⪁", "⪂"),
1250    ("⪃", "⪄"),
1251    ("⪅", "⪆"),
1252    ("⪇", "⪈"),
1253    ("⪉", "⪊"),
1254    ("⪋", "⪌"),
1255    ("⪍", "⪎"),
1256    ("⪏", "⪐"),
1257    ("⪑", "⪒"),
1258    ("⪓", "⪔"),
1259    ("⪕", "⪖"),
1260    ("⪗", "⪘"),
1261    ("⪙", "⪚"),
1262    ("⪛", "⪜"),
1263    ("⪝", "⪞"),
1264    ("⪟", "⪠"),
1265    ("⪡", "⪢"),
1266    ("⪦", "⪧"),
1267    ("⪨", "⪩"),
1268    ("⪪", "⪫"),
1269    ("⪬", "⪭"),
1270    ("⪯", "⪰"),
1271    ("⪱", "⪲"),
1272    ("⪳", "⪴"),
1273    ("⪵", "⪶"),
1274    ("⪷", "⪸"),
1275    ("⪹", "⪺"),
1276    ("⪻", "⪼"),
1277    ("⪽", "⪾"),
1278    ("⪿", "⫀"),
1279    ("⫁", "⫂"),
1280    ("⫃", "⫄"),
1281    ("⫅", "⫆"),
1282    ("⫇", "⫈"),
1283    ("⫉", "⫊"),
1284    ("⫋", "⫌"),
1285    ("⫍", "⫎"),
1286    ("⫏", "⫐"),
1287    ("⫑", "⫒"),
1288    ("⫓", "⫔"),
1289    ("⫕", "⫖"),
1290    ("⫬", "⫭"),
1291    ("⫷", "⫸"),
1292    ("⫹", "⫺"),
1293    ("⸂", "⸃"),
1294    ("⸄", "⸅"),
1295    ("⸉", "⸊"),
1296    ("⸌", "⸍"),
1297    ("⸜", "⸝"),
1298    ("⸠", "⸡"),
1299    ("⸢", "⸣"),
1300    ("⸤", "⸥"),
1301    ("⸦", "⸧"),
1302    ("⸨", "⸩"),
1303    ("⹕", "⹖"),
1304    ("⹗", "⹘"),
1305    ("⹙", "⹚"),
1306    ("⹛", "⹜"),
1307    ("〈", "〉"),
1308    ("《", "》"),
1309    ("「", "」"),
1310    ("『", "』"),
1311    ("【", "】"),
1312    ("〔", "〕"),
1313    ("〖", "〗"),
1314    ("〘", "〙"),
1315    ("〚", "〛"),
1316    ("﴾", "﴿"),
1317    ("︗", "︘"),
1318    ("︵", "︶"),
1319    ("︷", "︸"),
1320    ("︹", "︺"),
1321    ("︻", "︼"),
1322    ("︽", "︾"),
1323    ("︿", "﹀"),
1324    ("﹁", "﹂"),
1325    ("﹃", "﹄"),
1326    ("﹇", "﹈"),
1327    ("﹙", "﹚"),
1328    ("﹛", "﹜"),
1329    ("﹝", "﹞"),
1330    ("﹤", "﹥"),
1331    ("(", ")"),
1332    ("<", ">"),
1333    ("[", "]"),
1334    ("{", "}"),
1335    ("⦅", "⦆"),
1336    ("「", "」"),
1337];
1338
1339/**
1340Generate a [`BTreeMap`] with the matching close bracket for each open bracket in `UnicodeData.txt`,
1341`BidiBrackets.txt`, and `BidiMirroring.txt`
1342*/
1343pub fn close_all() -> BTreeMap<&'static str, &'static str> {
1344    ALL.iter().cloned().collect()
1345}
1346
1347/**
1348Generate a [`BTreeMap`] with the matching open bracket for each close bracket in `UnicodeData.txt`,
1349`BidiBrackets.txt`, and `BidiMirroring.txt`
1350*/
1351pub fn open_all() -> BTreeMap<&'static str, &'static str> {
1352    ALL.iter()
1353        .cloned()
1354        .map(|(open, close)| (close, open))
1355        .collect()
1356}
1357
1358/**
1359Generate a [`BTreeMap`] with an entry for each pair of opening and closing brackets in
1360`UnicodeData.txt`, `BidiBrackets.txt`, and `BidiMirroring.txt`
1361*/
1362pub fn matching_all() -> BTreeMap<&'static str, &'static str> {
1363    ALL.iter()
1364        .cloned()
1365        .flat_map(|(open, close)| [(open, close), (close, open)])
1366        .collect()
1367}
1368
1369/// Trait to provide the [`FindMatching::find_matching`] method
1370pub trait FindMatching {
1371    /**
1372    Find the index of the matching open or close grapheme for the grapheme at `position`, given the
1373    matching `closing` and `opening` brackets
1374
1375    If the grapheme at `position` is not an opening or closing grapheme, `position` is greater or
1376    equal to the length of `self`, or the algorithm fails to find the matching grapheme (e.g.
1377    matching graphemes are unbalanced), the given `position` is returned.
1378    */
1379    fn find_matching(
1380        &self,
1381        position: usize,
1382        closing: &BTreeMap<&str, &str>,
1383        opening: &BTreeMap<&str, &str>,
1384    ) -> usize;
1385}
1386
1387impl FindMatching for str {
1388    /**
1389    Find the index of the matching open or close grapheme for the grapheme at `position`, given the
1390    matching `closing` and `opening` brackets
1391
1392    If the grapheme at `position` is not an opening or closing grapheme, `position` is greater or
1393    equal to the length of `self`, or the algorithm fails to find the matching grapheme (e.g.
1394    matching graphemes are unbalanced), the given `position` is returned.
1395    */
1396    fn find_matching(
1397        &self,
1398        position: usize,
1399        closing: &BTreeMap<&str, &str>,
1400        opening: &BTreeMap<&str, &str>,
1401    ) -> usize {
1402        self.gstring().find_matching(position, closing, opening)
1403    }
1404}
1405
1406impl FindMatching for GString {
1407    /**
1408    Find the index of the matching open or close grapheme for the grapheme at `position`, given the
1409    matching `closing` and `opening` brackets
1410
1411    If the grapheme at `position` is not an opening or closing grapheme, `position` is greater or
1412    equal to the length of `self`, or the algorithm fails to find the matching grapheme (e.g.
1413    matching graphemes are unbalanced), the given `position` is returned.
1414    */
1415    fn find_matching(
1416        &self,
1417        position: usize,
1418        closing: &BTreeMap<&str, &str>,
1419        opening: &BTreeMap<&str, &str>,
1420    ) -> usize {
1421        let v = self.graphemes();
1422
1423        if position >= v.len() {
1424            return position;
1425        }
1426
1427        let close = closing.get(&v[position].as_str());
1428        let open = opening.get(&v[position].as_str());
1429
1430        if close.is_none() && open.is_none() {
1431            return position;
1432        }
1433
1434        let mut stack: Vec<(usize, &String)> = vec![];
1435        for (i, g) in v.iter().enumerate() {
1436            if let Some(open) = opening.get(&g.as_str()) {
1437                // g is a close
1438                if let Some(prev) = stack.pop() {
1439                    // There is a previous open
1440                    if prev.1 == open {
1441                        // This close matches the previous open
1442
1443                        if prev.0 == position {
1444                            // Return this close's position if the open is at the position
1445                            return i;
1446                        } else if i == position {
1447                            // Return the previous open's position if this close is at the position
1448                            return prev.0;
1449                        }
1450                    } else if closing.contains_key(&g.as_str()) {
1451                        // This close doesn't match the previous open but is also an open
1452                        stack.push(prev);
1453                        stack.push((i, g));
1454                    } else {
1455                        // This close doesn't match the previous open and is not an open
1456                        // So it's a mismatched close and should just return the position
1457                        return position;
1458                    }
1459                } else if closing.contains_key(&g.as_str()) {
1460                    // There is no previous open and is an open
1461                    stack.push((i, g));
1462                }
1463            } else if closing.contains_key(&g.as_str()) {
1464                // g is an open
1465                stack.push((i, g));
1466            }
1467        }
1468
1469        position
1470    }
1471}