func main() { gen.Init() r := gen.Open("http://www.w3.org/TR", "w3", "encoding/indexes/encodings.json") var groups []group if err := json.NewDecoder(r).Decode(&groups); err != nil { log.Fatalf("Error reading encodings.json: %v", err) } w := &bytes.Buffer{} fmt.Fprintln(w, "type htmlEncoding byte") fmt.Fprintln(w, "const (") for i, g := range groups { for _, e := range g.Encodings { name := consts[e.Name] if name == "" { log.Fatalf("No const defined for %s.", e.Name) } if i == 0 { fmt.Fprintf(w, "%s htmlEncoding = iota\n", name) } else { fmt.Fprintf(w, "%s\n", name) } } } fmt.Fprintln(w, "numEncodings") fmt.Fprint(w, ")\n\n") fmt.Fprintln(w, "var canonical = [numEncodings]string{") for _, g := range groups { for _, e := range g.Encodings { fmt.Fprintf(w, "%q,\n", e.Name) } } fmt.Fprint(w, "}\n\n") fmt.Fprintln(w, "var nameMap = map[string]htmlEncoding{") for _, g := range groups { for _, e := range g.Encodings { for _, l := range e.Labels { fmt.Fprintf(w, "%q: %s,\n", l, consts[e.Name]) } } } fmt.Fprint(w, "}\n\n") var tags []string fmt.Fprintln(w, "var localeMap = []htmlEncoding{") for _, loc := range locales { tags = append(tags, loc.tag) fmt.Fprintf(w, "%s, // %s \n", consts[loc.name], loc.tag) } fmt.Fprint(w, "}\n\n") fmt.Fprintf(w, "const locales = %q\n", strings.Join(tags, " ")) gen.WriteGoFile("tables.go", "htmlindex", w.Bytes()) }
// parse calls f for each entry in the given UCD file. func parse(version string, f func(p *ucd.Parser)) { r := gen.Open("http://www.unicode.org/Public/", "", version+"/ucd/UnicodeData.txt") defer r.Close() p := ucd.New(r) for p.Next() { f(p) } if err := p.Err(); err != nil { log.Fatal(err) } }
func main() { gen.Init() versions := getVersions() w := &bytes.Buffer{} fmt.Fprintf(w, "//go:generate go run gen.go --versions=%s\n\n", strings.Join(versions, ",")) fmt.Fprintf(w, "import \"unicode\"\n\n") vstr := func(s string) string { return strings.Replace(s, ".", "_", -1) } fmt.Fprintf(w, "var assigned = map[string]*unicode.RangeTable{\n") for _, v := range versions { fmt.Fprintf(w, "\t%q: assigned%s,\n", v, vstr(v)) } fmt.Fprintf(w, "}\n\n") var size int for _, v := range versions { assigned := []rune{} r := gen.Open("http://www.unicode.org/Public/", "", v+"/ucd/UnicodeData.txt") ucd.Parse(r, func(p *ucd.Parser) { assigned = append(assigned, p.Rune(0)) }) rt := rangetable.New(assigned...) sz := int(reflect.TypeOf(unicode.RangeTable{}).Size()) sz += int(reflect.TypeOf(unicode.Range16{}).Size()) * len(rt.R16) sz += int(reflect.TypeOf(unicode.Range32{}).Size()) * len(rt.R32) fmt.Fprintf(w, "// size %d bytes (%d KiB)\n", sz, sz/1024) fmt.Fprintf(w, "var assigned%s = ", vstr(v)) print(w, rt) size += sz } fmt.Fprintf(w, "// Total size %d bytes (%d KiB)\n", size, size/1024) gen.WriteGoFile("tables.go", "rangetable", w.Bytes()) }