gen.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // +build ignore
  2. package main
  3. // Download http://encoding.spec.whatwg.org/encodings.json and use it to
  4. // generate table.go.
  5. import (
  6. "encoding/json"
  7. "fmt"
  8. "log"
  9. "net/http"
  10. "strings"
  11. )
  12. type enc struct {
  13. Name string
  14. Labels []string
  15. }
  16. type group struct {
  17. Encodings []enc
  18. Heading string
  19. }
  20. const specURL = "http://encoding.spec.whatwg.org/encodings.json"
  21. func main() {
  22. resp, err := http.Get(specURL)
  23. if err != nil {
  24. log.Fatalf("error fetching %s: %s", specURL, err)
  25. }
  26. if resp.StatusCode != 200 {
  27. log.Fatalf("error fetching %s: HTTP status %s", specURL, resp.Status)
  28. }
  29. defer resp.Body.Close()
  30. var groups []group
  31. d := json.NewDecoder(resp.Body)
  32. err = d.Decode(&groups)
  33. if err != nil {
  34. log.Fatalf("error reading encodings.json: %s", err)
  35. }
  36. fmt.Println("// generated by go run gen.go; DO NOT EDIT")
  37. fmt.Println()
  38. fmt.Println("package charset")
  39. fmt.Println()
  40. fmt.Println("import (")
  41. fmt.Println(`"code.google.com/p/go.text/encoding"`)
  42. for _, pkg := range []string{"charmap", "japanese", "korean", "simplifiedchinese", "traditionalchinese", "unicode"} {
  43. fmt.Printf("\"code.google.com/p/go.text/encoding/%s\"\n", pkg)
  44. }
  45. fmt.Println(")")
  46. fmt.Println()
  47. fmt.Println("var encodings = map[string]struct{e encoding.Encoding; name string} {")
  48. for _, g := range groups {
  49. for _, e := range g.Encodings {
  50. goName, ok := miscNames[e.Name]
  51. if !ok {
  52. for k, v := range prefixes {
  53. if strings.HasPrefix(e.Name, k) {
  54. goName = v + e.Name[len(k):]
  55. break
  56. }
  57. }
  58. if goName == "" {
  59. log.Fatalf("unrecognized encoding name: %s", e.Name)
  60. }
  61. }
  62. for _, label := range e.Labels {
  63. fmt.Printf("%q: {%s, %q},\n", label, goName, e.Name)
  64. }
  65. }
  66. }
  67. fmt.Println("}")
  68. }
  69. var prefixes = map[string]string{
  70. "iso-8859-": "charmap.ISO8859_",
  71. "windows-": "charmap.Windows",
  72. }
  73. var miscNames = map[string]string{
  74. "utf-8": "encoding.Nop",
  75. "ibm866": "charmap.CodePage866",
  76. "iso-8859-8-i": "charmap.ISO8859_8",
  77. "koi8-r": "charmap.KOI8R",
  78. "koi8-u": "charmap.KOI8U",
  79. "macintosh": "charmap.Macintosh",
  80. "x-mac-cyrillic": "charmap.MacintoshCyrillic",
  81. "gbk": "simplifiedchinese.GBK",
  82. "gb18030": "simplifiedchinese.GB18030",
  83. "hz-gb-2312": "simplifiedchinese.HZGB2312",
  84. "big5": "traditionalchinese.Big5",
  85. "euc-jp": "japanese.EUCJP",
  86. "iso-2022-jp": "japanese.ISO2022JP",
  87. "shift_jis": "japanese.ShiftJIS",
  88. "euc-kr": "korean.EUCKR",
  89. "replacement": "encoding.Replacement",
  90. "utf-16be": "unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)",
  91. "utf-16le": "unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM)",
  92. "x-user-defined": "charmap.XUserDefined",
  93. }