diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-11-28 16:18:04 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-11-28 17:16:26 +0900 |
commit | 301d02dd659ae8dea326684984710729401b92d1 (patch) | |
tree | 4fc5593ffc655ce4f24b57c2d113b8b2bcbd1d08 /ucd/api.go | |
parent | Make contributory properties unavailable except internal use (diff) | |
download | tre-301d02dd659ae8dea326684984710729401b92d1.tar.gz tre-301d02dd659ae8dea326684984710729401b92d1.tar.xz |
Support Script property (Meet RL1.2 of UTS #18 partially)
Diffstat (limited to 'ucd/api.go')
-rw-r--r-- | ucd/api.go | 37 |
1 files changed, 35 insertions, 2 deletions
@@ -8,11 +8,19 @@ import ( "strings" ) +const ( + // https://www.unicode.org/versions/Unicode13.0.0/ch03.pdf + // 3.4 Characters and Encoding + // > D9 Unicode codespace: A range of integers from 0 to 10FFFF16. + codePointMin = 0x0 + codePointMax = 0x10FFFF +) + func NormalizeCharacterProperty(propName, propVal string) (string, error) { if propName == "" { propName = "gc" } - + name, ok := propertyNameAbbs[normalizeSymbolicValue(propName)] if !ok { return "", fmt.Errorf("unsupported character property name: %v", propName) @@ -43,7 +51,7 @@ func IsContributoryProperty(propName string) bool { if propName == "" { return false } - + for _, p := range contributoryProperties { if propName == p { return true @@ -80,6 +88,31 @@ func FindCodePointRanges(propName, propVal string) ([]*CodePointRange, bool, err ranges = append(ranges, rs...) } return ranges, false, nil + case "sc": + val, ok := scriptValueAbbs[normalizeSymbolicValue(propVal)] + if !ok { + return nil, false, fmt.Errorf("unsupported character property value: %v", propVal) + } + if val == scriptValueAbbs[normalizeSymbolicValue(scriptDefaultValue)] { + var allCPs []*CodePointRange + if scriptDefaultRange.From > codePointMin { + allCPs = append(allCPs, &CodePointRange{ + From: codePointMin, + To: scriptDefaultRange.From - 1, + }) + } + if scriptDefaultRange.To < codePointMax { + allCPs = append(allCPs, &CodePointRange{ + From: scriptDefaultRange.To + 1, + To: codePointMax, + }) + } + for _, cp := range scriptCodepoints { + allCPs = append(allCPs, cp...) + } + return allCPs, true, nil + } + return scriptCodepoints[val], false, nil case "oalpha": yes, ok := binaryValues[normalizeSymbolicValue(propVal)] if !ok { |