1#![doc = include_str!("../README.md")]
2
3use gstring::*;
4
5use std::collections::BTreeMap;
6
7pub 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
93pub fn close() -> BTreeMap<&'static str, &'static str> {
97 MATCHING.iter().cloned().collect()
98}
99
100pub fn open() -> BTreeMap<&'static str, &'static str> {
104 MATCHING
105 .iter()
106 .cloned()
107 .map(|(open, close)| (close, open))
108 .collect()
109}
110
111pub 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
123pub 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
191pub fn close_brackets() -> BTreeMap<&'static str, &'static str> {
195 BRACKETS.iter().cloned().collect()
196}
197
198pub fn open_brackets() -> BTreeMap<&'static str, &'static str> {
202 BRACKETS
203 .iter()
204 .cloned()
205 .map(|(open, close)| (close, open))
206 .collect()
207}
208
209pub 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
221pub 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
439pub fn close_mirroring() -> BTreeMap<&'static str, &'static str> {
444 MIRRORING.iter().cloned().collect()
445}
446
447pub fn open_mirroring() -> BTreeMap<&'static str, &'static str> {
452 MIRRORING
453 .iter()
454 .cloned()
455 .map(|(open, close)| (close, open))
456 .collect()
457}
458
459pub 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
471pub 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
560pub fn close_brackets_matching() -> BTreeMap<&'static str, &'static str> {
565 BRACKETS_MATCHING.iter().cloned().collect()
566}
567
568pub 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
580pub 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
592pub 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
811pub fn close_brackets_mirroring() -> BTreeMap<&'static str, &'static str> {
816 BRACKETS_MIRRORING.iter().cloned().collect()
817}
818
819pub 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
831pub 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
843pub 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
1075pub fn close_mirroring_matching() -> BTreeMap<&'static str, &'static str> {
1080 MIRRORING_MATCHING.iter().cloned().collect()
1081}
1082
1083pub 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
1095pub 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
1107pub 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
1339pub fn close_all() -> BTreeMap<&'static str, &'static str> {
1344 ALL.iter().cloned().collect()
1345}
1346
1347pub fn open_all() -> BTreeMap<&'static str, &'static str> {
1352 ALL.iter()
1353 .cloned()
1354 .map(|(open, close)| (close, open))
1355 .collect()
1356}
1357
1358pub 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
1369pub trait FindMatching {
1371 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 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 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 if let Some(prev) = stack.pop() {
1439 if prev.1 == open {
1441 if prev.0 == position {
1444 return i;
1446 } else if i == position {
1447 return prev.0;
1449 }
1450 } else if closing.contains_key(&g.as_str()) {
1451 stack.push(prev);
1453 stack.push((i, g));
1454 } else {
1455 return position;
1458 }
1459 } else if closing.contains_key(&g.as_str()) {
1460 stack.push((i, g));
1462 }
1463 } else if closing.contains_key(&g.as_str()) {
1464 stack.push((i, g));
1466 }
1467 }
1468
1469 position
1470 }
1471}