aboutsummaryrefslogtreecommitdiff
path: root/compiler/ucd.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-04-30 01:54:02 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-04-30 01:54:02 +0900
commit43fdbf94ad87ea91a173c72688cad70a0a5f1ab4 (patch)
tree655f651e39f13b5e415445d1ef24f4ecb7511041 /compiler/ucd.go
parentAdd code point expression (Meet RL1.1 of UTS #18) (diff)
downloadtre-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.go36
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
+}