diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-04-30 01:54:02 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-04-30 01:54:02 +0900 |
commit | 43fdbf94ad87ea91a173c72688cad70a0a5f1ab4 (patch) | |
tree | 655f651e39f13b5e415445d1ef24f4ecb7511041 /compiler/ucd.go | |
parent | Add code point expression (Meet RL1.1 of UTS #18) (diff) | |
download | tre-43fdbf94ad87ea91a173c72688cad70a0a5f1ab4.tar.gz tre-43fdbf94ad87ea91a173c72688cad70a0a5f1ab4.tar.xz |
Add character property expression (Meet RL1.2 of UTS #18 partially)
\p{property name=property value} matches a character has the property.
When the property name is General_Category, it can be omitted.
That is, \p{Letter} equals \p{General_Category=Letter}.
Currently, only General_Category is supported.
This feature meets RL1.2 of UTS #18 partially.
RL1.2 Properties: https://unicode.org/reports/tr18/#RL1.2
Diffstat (limited to 'compiler/ucd.go')
-rw-r--r-- | compiler/ucd.go | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/compiler/ucd.go b/compiler/ucd.go new file mode 100644 index 0000000..7432ba6 --- /dev/null +++ b/compiler/ucd.go @@ -0,0 +1,36 @@ +//go:generate go run ../generator/main.go +//go:generate gofmt -w ucd_table.go + +package compiler + +import ( + "fmt" + + "github.com/nihei9/maleeni/ucd" +) + +func findCodePointRanges(propName, propVal string) ([]*ucd.CodePointRange, error) { + name := ucd.NormalizeSymbolicValue(propName) + val := ucd.NormalizeSymbolicValue(propVal) + name, ok := propertyNameAbbs[name] + if !ok { + return nil, fmt.Errorf("unsupported character property: %v", propName) + } + val, ok = generalCategoryValueAbbs[val] + if !ok { + return nil, fmt.Errorf("unsupported character property value: %v", val) + } + vals, ok := compositGeneralCategories[val] + if !ok { + vals = []string{val} + } + var ranges []*ucd.CodePointRange + for _, v := range vals { + rs, ok := generalCategoryCodePoints[v] + if !ok { + return nil, fmt.Errorf("invalie value of the General_Category property: %v", v) + } + ranges = append(ranges, rs...) + } + return ranges, nil +} |