func main() { flag.Parse() r := gen.OpenCLDRCoreZip() buffer, err := ioutil.ReadAll(r) if err != nil { log.Fatal("Could not read zip file") } r.Close() z, err := zip.NewReader(bytes.NewReader(buffer), int64(len(buffer))) if err != nil { log.Fatalf("Could not read zip archive: %v", err) } var buf bytes.Buffer version := gen.CLDRVersion() for _, dtd := range files { for _, f := range z.File { if strings.HasSuffix(f.Name, dtd.file+".dtd") { r, err := f.Open() failOnError(err) b := makeBuilder(&buf, dtd) b.parseDTD(r) b.resolve(b.index[dtd.top[0]]) b.write() if b.version != "" && version != b.version { println(f.Name) log.Fatalf("main: inconsistent versions: found %s; want %s", b.version, version) } break } } } fmt.Fprintln(&buf, "// Version is the version of CLDR from which the XML definitions are generated.") fmt.Fprintf(&buf, "const Version = %q\n", version) gen.WriteGoFile(*outputFile, "cldr", buf.Bytes()) }
func main() { r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml") reg := ®istry{} if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF { log.Fatalf("Error decoding charset registry: %v", err) } if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" { log.Fatalf("Unexpected ID %s", reg.Registry[0].ID) } w := &bytes.Buffer{} fmt.Fprintf(w, "const (\n") for _, rec := range reg.Registry[0].Record { constName := "" for _, a := range rec.Alias { if strings.HasPrefix(a, "cs") && strings.IndexByte(a, '-') == -1 { // Some of the constant definitions have comments in them. Strip those. constName = strings.Title(strings.SplitN(a[2:], "\n", 2)[0]) } } if constName == "" { switch rec.MIB { case "2085": constName = "HZGB2312" // Not listed as alias for some reason. default: log.Fatalf("No cs alias defined for %s.", rec.MIB) } } if rec.MIME != "" { rec.MIME = fmt.Sprintf(" (MIME: %s)", rec.MIME) } fmt.Fprintf(w, "// %s is the MIB identifier with IANA name %s%s.\n//\n", constName, rec.Name, rec.MIME) if len(rec.Desc.Data) > 0 { fmt.Fprint(w, "// ") d := xml.NewDecoder(strings.NewReader(rec.Desc.Data)) inElem := true attr := "" for { t, err := d.Token() if err != nil { if err != io.EOF { log.Fatal(err) } break } switch x := t.(type) { case xml.CharData: attr = "" // Don't need attribute info. a := bytes.Split([]byte(x), []byte("\n")) for i, b := range a { if b = bytes.TrimSpace(b); len(b) != 0 { if !inElem && i > 0 { fmt.Fprint(w, "\n// ") } inElem = false fmt.Fprintf(w, "%s ", string(b)) } } case xml.StartElement: if x.Name.Local == "xref" { inElem = true use := false for _, a := range x.Attr { if a.Name.Local == "type" { use = use || a.Value != "person" } if a.Name.Local == "data" && use { attr = a.Value + " " } } } case xml.EndElement: inElem = false fmt.Fprint(w, attr) } } fmt.Fprint(w, "\n") } for _, x := range rec.Xref { switch x.Type { case "rfc": fmt.Fprintf(w, "// Reference: %s\n", strings.ToUpper(x.Data)) case "uri": fmt.Fprintf(w, "// Reference: %s\n", x.Data) } } fmt.Fprintf(w, "%s MIB = %s\n", constName, rec.MIB) fmt.Fprintln(w) } fmt.Fprintln(w, ")") gen.WriteGoFile("mib.go", "identifier", w.Bytes()) }