package main import ( "bufio" "encoding/json" "log" "os" "strings" "text/template" ) // wget http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry const ( inFilename = "language-subtag-registry" outJSONFilename = "json/language.json" outGoFilename = "lang/language.go" ) type Item struct { Lang string `json:"lang"` Description string `json:"description"` } func main() { f, e := os.Open(inFilename) if e != nil { log.Fatal(e.Error()) } scanner := bufio.NewScanner(f) items := []*Item{} for scanner.Scan() { if scanner.Text() == "%%" { item := new(Item) scanner.Scan() if scanner.Text() == "Type: language" { for !strings.HasPrefix(scanner.Text(), "Subtag:") { scanner.Scan() } if strings.HasPrefix(scanner.Text(), "Subtag:") { ss := strings.Split(scanner.Text(), ": ") item.Lang = strings.Trim(ss[1], " ") if len(item.Lang) > 2 { continue } } for !strings.HasPrefix(scanner.Text(), "Description:") { scanner.Scan() } if strings.HasPrefix(scanner.Text(), "Description:") { ss := strings.Split(scanner.Text(), ": ") item.Description = strings.Trim(ss[1], " ") scanner.Scan() if strings.HasPrefix(scanner.Text(), " ") { item.Description += strings.TrimPrefix(scanner.Text(), " ") } } items = append(items, item) } } } if e := f.Close(); e != nil { log.Fatal(e.Error()) } jw, e := os.Create(outJSONFilename) if e != nil { log.Fatal(e.Error()) } if e := json.NewEncoder(jw).Encode(items); e != nil { log.Fatal(e.Error()) } if e := jw.Close(); e != nil { log.Fatal(e.Error()) } gw, e := os.Create(outGoFilename) if e != nil { log.Fatal(e.Error()) } gotmpl := template.Must(template.ParseFiles("gotemplate")) ctx := make(map[string]interface{}) ctx["Items"] = items if e := gotmpl.Execute(gw, ctx); e != nil { log.Fatal(e.Error()) } if e := gw.Close(); e != nil { log.Fatal(e.Error()) } }