aboutsummaryrefslogtreecommitdiff
path: root/src/urubu/ucd/scripts.go
blob: 5040283d81abcc8db5292e9a0987e1641d068742 (plain) (blame)
1
2
3
4
5
6
7
8
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
package ucd

import (
	"fmt"
	"io"
)

type Scripts struct {
	Script             map[string][]*CodePointRange
	ScriptDefaultRange *CodePointRange
	ScriptDefaultValue string
}

// ParseScripts parses the Scripts.txt.
func ParseScripts(r io.Reader, propValAliases *PropertyValueAliases) (*Scripts, error) {
	ss := map[string][]*CodePointRange{}
	var defaultRange *CodePointRange
	var defaultValue string
	p := newParser(r)
	for p.parse() {
		if len(p.fields) > 0 {
			cp, err := p.fields[0].codePointRange()
			if err != nil {
				return nil, err
			}

			name, ok := propValAliases.Script[p.fields[1].normalizedSymbol()]
			if !ok {
				return nil, fmt.Errorf("unknown property: %v", p.fields[1].symbol())
			}
			ss[name] = append(ss[name], cp)
		}

		if len(p.defaultFields) > 0 {
			var err error
			defaultRange, err = p.defaultFields[0].codePointRange()
			if err != nil {
				return nil, err
			}
			defaultValue = p.defaultFields[1].normalizedSymbol()
		}
	}
	if p.err != nil {
		return nil, p.err
	}

	return &Scripts{
		Script:             ss,
		ScriptDefaultRange: defaultRange,
		ScriptDefaultValue: defaultValue,
	}, nil
}