/
generator.go
121 lines (105 loc) · 3.45 KB
/
generator.go
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package main
import (
"bytes"
"github.com/apaxa-go/helper/strconvh"
"github.com/apaxa-go/helper/stringsh"
"github.com/apaxa-go/helper/unicodeh/internal/generator/is-generator"
"github.com/apaxa-go/helper/unicodeh/internal/generator/name"
"github.com/apaxa-go/helper/unicodeh/internal/generator/other-generator"
"github.com/apaxa-go/helper/unicodeh/internal/generator/ucdparser"
"github.com/apaxa-go/helper/unicodeh/rangetableh"
"go/format"
"io/ioutil"
"os"
"strings"
)
const numLen = 3
const pkgName = "unicodeh"
func prepareTables(p *ucdparser.Parser) (r [][]byte) {
for _, prop := range p.Properties {
data := bytes.NewBuffer(nil)
//
// Public variables
//
knownAs := ""
if len(prop.KnownAs) > 1 {
knownAs = " (known as " + strings.Join(stringsh.Surround(prop.KnownAs, `"`, `"`), ", ") + ")"
}
data.WriteString(`// Unicode property "` + prop.LongName + `"` + knownAs + ".\n")
data.WriteString(`// Kind of property: "` + prop.Kind + "\".\n")
data.WriteString(`// Based on file "` + prop.File + "\".\n")
data.WriteString("var (\n")
for _, val := range prop.Values {
publicName := name.Make(prop.LongName, val.LongName, false)
privateName := name.Make(prop.LongName, val.LongName, true)
knownAs := ""
if len(val.KnownAs) > 1 {
knownAs = " (known as " + strings.Join(stringsh.Surround(val.KnownAs, `"`, `"`), ", ") + ")"
}
data.WriteString(publicName + " = " + privateName + ` // Value "` + val.LongName + `"` + knownAs + ".\n")
}
data.WriteString(")\n\n")
//
// Private variables
//
data.WriteString("var (\n")
for _, val := range prop.Values {
data.WriteString(name.Make(prop.LongName, val.LongName, true))
data.WriteString("=")
data.WriteString(rangetableh.GoString(val.Ranges))
data.WriteString("\n")
}
data.WriteString(")\n\n")
//
r = append(r, data.Bytes())
}
return
}
func prepareMeta(p *ucdparser.Parser) []byte {
return []byte("// Version is the Unicode edition from which the tables are derived.\nconst Version=\"" + p.Version + "\"\n")
}
func saveFile(fileName string, packageName string, imports []string, data []byte) {
start := "package " + packageName + "\n\n"
for _, i := range imports {
start += "import \"" + i + "\"\n"
}
start += "\n"
data = append([]byte(start), data...)
data, err := format.Source(data)
if err != nil {
panic("Syntax error in file " + fileName + ": " + err.Error())
}
if err := ioutil.WriteFile(fileName, data, 0); err != nil {
panic(err)
}
}
func main() {
const usage = "Bad usage. Usage: \"generator path-to-ucd-directory\""
if len(os.Args) != 2 {
panic(usage)
}
srcDir := os.Args[1]
parser := ucdparser.NewParser(srcDir)
parser.Properties = ucdparser.ParseStructureUCD(srcDir)
parser.Parse()
// TODO delete old files
saveFile("meta-gen.go", pkgName, nil, prepareMeta(parser))
for i, data := range prepareTables(parser) {
iStr := stringsh.PadLeft(strconvh.FormatInt(i), "0", numLen) // 000,001,002,...
fileName := "tables-" + iStr + "-gen.go"
saveFile(fileName, pkgName, []string{"unicode"}, data)
}
saveFile("other-gen.go", pkgName, nil, other_generator.GenerateOther(srcDir))
{
datas, importUnicode := is_generator.Generate(&parser.Properties)
for i, data := range datas {
iStr := stringsh.PadLeft(strconvh.FormatInt(i), "0", numLen) // 000,001,002,...
fileName := "is-" + iStr + "-gen.go"
var imports []string
if importUnicode[i] {
imports = []string{"unicode"}
}
saveFile(fileName, pkgName, imports, data)
}
}
}