1//go:build none
 2// +build none
 3
 4package main
 5
 6import (
 7	"bytes"
 8	"compress/zlib"
 9	"encoding/binary"
10	"fmt"
11	"go/format"
12	"io/ioutil"
13	"strconv"
14	"strings"
15)
16
17func main() {
18	data, err := ioutil.ReadFile("table.txt")
19	if err != nil {
20		panic(err)
21	}
22	var buf bytes.Buffer
23	previousVal := int64(-1)
24	for _, line := range strings.Split(string(data), "\n") {
25		if strings.HasPrefix(line, "/*") || line == "" {
26			continue
27		}
28		sep := strings.IndexByte(line, ':')
29		if sep == -1 {
30			panic(line)
31		}
32		val, err := strconv.ParseInt(line[:sep], 0, 32)
33		if err != nil {
34			panic(err)
35		}
36
37		if previousVal+1 != val {
38			rangechars := 0
39			for i := previousVal + 1; i <= val-1; i++ {
40				if err := binary.Write(&buf, binary.LittleEndian, uint8(0xff)); err != nil {
41					panic(err)
42				}
43				rangechars++
44			}
45			fmt.Printf("Filled dummy range: 0x%04x - 0x%04x (%4d chars)\n", previousVal+1, val-1, rangechars)
46		}
47
48		s, err := strconv.Unquote(line[sep+2:])
49		if err != nil {
50			panic(err)
51		}
52		if err := binary.Write(&buf, binary.LittleEndian, uint8(len(s))); err != nil {
53			panic(err)
54		}
55		previousVal = val
56		buf.WriteString(s)
57	}
58	var cbuf bytes.Buffer
59	w, err := zlib.NewWriterLevel(&cbuf, zlib.BestCompression)
60	if err != nil {
61		panic(err)
62	}
63	if _, err := w.Write(buf.Bytes()); err != nil {
64		panic(err)
65	}
66	if err := w.Close(); err != nil {
67		panic(err)
68	}
69	buf.Reset()
70	buf.WriteString("package unidecode\n")
71	buf.WriteString("// AUTOGENERATED - DO NOT EDIT!\n\n")
72	fmt.Fprintf(&buf, "const tableData = %q;\n", cbuf.String())
73	dst, err := format.Source(buf.Bytes())
74	if err != nil {
75		panic(err)
76	}
77	if err := ioutil.WriteFile("table.go", dst, 0644); err != nil {
78		panic(err)
79	}
80}