Expand description
Rust library crate to match Unicode open/close brackets
Source is generated by a Perl script (bin/matching.pl) to download and parse the following Unicode
database files.
- https://www.unicode.org/Public/UNIDATA/UnicodeData.txt
- https://www.unicode.org/Public/UNIDATA/BidiBrackets.txt
- https://www.unicode.org/Public/UNIDATA/BidiMirroring.txt
Original idea is from this StackOverflow thread and this comment.
§Example
// Use the `FindMatching` trait
use unicode_matching::FindMatching;
// Generate the close/open `BTreeMap`s
let close = unicode_matching::close();
let open = unicode_matching::open();
let s = "fn main() {\n println!(\"Hello!\");\n}";
// 000000000011 11111111222222 2222333 333 33
// 012345678901 23456789012345 6789012 345 67
// Match the open/close parentheses in `main()`
assert_eq!(s.find_matching(7, &close, &open), 8);
assert_eq!(s.find_matching(8, &close, &open), 7);
// Match the open/close curly braces in `main() {...}`
assert_eq!(s.find_matching(10, &close, &open), 36);
assert_eq!(s.find_matching(36, &close, &open), 10);
// Match the open/close parentheses in `println!("...")`
assert_eq!(s.find_matching(24, &close, &open), 33);
assert_eq!(s.find_matching(33, &close, &open), 24);
let length = s.len();
let more = length + 1;
// Any other index (whether valid or invalid) returns itself
assert_eq!(s.find_matching(0, &close, &open), 0);
assert_eq!(s.find_matching(length, &close, &open), length);
assert_eq!(s.find_matching(more, &close, &open), more);
// Note that regular/straight single or double quotes do not match because they aren't valid
// matching graphemes according to Unicode
assert_eq!(s.find_matching(25, &close, &open), 25);
assert_eq!(s.find_matching(32, &close, &open), 32);
// ... but they can be added manually and then it works
use std::collections::BTreeMap;
let close = unicode_matching::close().into_iter().chain([("'", "'"), ("\"", "\"")]).collect::<BTreeMap<_, _>>();
let open = unicode_matching::open().into_iter().chain([("'", "'"), ("\"", "\"")]).collect::<BTreeMap<_, _>>();
assert_eq!(s.find_matching(25, &close, &open), 32);
assert_eq!(s.find_matching(32, &close, &open), 25);Constants§
- ALL
- Matching open/close brackets from
UnicodeData.txt,BidiBrackets.txt, andBidiMirroring.txt - BRACKETS
- Matching open/close brackets from
BidiBrackets.txt - BRACKETS_
MATCHING - Matching open/close brackets from
UnicodeData.txtandBidiBrackets.txt - BRACKETS_
MIRRORING - Matching open/close brackets from
BidiMirroring.txtandBidiBrackets.txt - MATCHING
- Matching open/close brackets from
UnicodeData.txt - MIRRORING
- Matching open/close brackets from
BidiMirroring.txt - MIRRORING_
MATCHING - Matching open/close brackets from
UnicodeData.txtandBidiMirroring.txt
Traits§
- Find
Matching - Trait to provide the
FindMatching::find_matchingmethod
Functions§
- close
- Generate a
BTreeMapwith the matching close bracket for each open bracket inUnicodeData.txt - close_
all - Generate a
BTreeMapwith the matching close bracket for each open bracket inUnicodeData.txt,BidiBrackets.txt, andBidiMirroring.txt - close_
brackets - Generate a
BTreeMapwith the matching close bracket for each open bracket inBidiBrackets.txt - close_
brackets_ matching - Generate a
BTreeMapwith the matching close bracket for each open bracket inUnicodeData.txtandBidiBrackets.txt - close_
brackets_ mirroring - Generate a
BTreeMapwith the matching close bracket for each open bracket inBidiMirroring.txtandBidiBrackets.txt - close_
mirroring - Generate a
BTreeMapwith the matching close bracket for each open bracket inBidiMirroring.txt - close_
mirroring_ matching - Generate a
BTreeMapwith the matching close bracket for each open bracket inUnicodeData.txtandBidiMirroring.txt - matching
- Generate a
BTreeMapwith an entry for each pair of opening and closing brackets inUnicodeData.txt - matching_
all - Generate a
BTreeMapwith an entry for each pair of opening and closing brackets inUnicodeData.txt,BidiBrackets.txt, andBidiMirroring.txt - matching_
brackets - Generate a
BTreeMapwith an entry for each pair of opening and closing brackets inBidiBrackets.txt - matching_
brackets_ matching - Generate a
BTreeMapwith an entry for each pair of opening and closing brackets inUnicodeData.txtandBidiBrackets.txt - matching_
brackets_ mirroring - Generate a
BTreeMapwith an entry for each pair of opening and closing brackets inBidiMirroring.txtandBidiBrackets.txt - matching_
mirroring - Generate a
BTreeMapwith an entry for each pair of opening and closing brackets inBidiMirroring.txt - matching_
mirroring_ matching - Generate a
BTreeMapwith an entry for each pair of opening and closing brackets inUnicodeData.txtandBidiMirroring.txt - open
- Generate a
BTreeMapwith the matching open bracket for each close bracket inUnicodeData.txt - open_
all - Generate a
BTreeMapwith the matching open bracket for each close bracket inUnicodeData.txt,BidiBrackets.txt, andBidiMirroring.txt - open_
brackets - Generate a
BTreeMapwith the matching open bracket for each close bracket inBidiBrackets.txt - open_
brackets_ matching - Generate a
BTreeMapwith the matching open bracket for each close bracket inUnicodeData.txtandBidiBrackets.txt - open_
brackets_ mirroring - Generate a
BTreeMapwith the matching open bracket for each close bracket inBidiMirroring.txtandBidiBrackets.txt - open_
mirroring - Generate a
BTreeMapwith the matching open bracket for each close bracket inBidiMirroring.txt - open_
mirroring_ matching - Generate a
BTreeMapwith the matching open bracket for each close bracket inUnicodeData.txtandBidiMirroring.txt