// Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main // This program generates the subdirectories of Go packages that contain []byte // versions of the TrueType font files under ./ttfs. // // Currently, "go run gen.go" needs to be run manually. This isn't done by the // usual "go generate" mechanism as there isn't any other Go code in this // directory (excluding sub-directories) to attach a "go:generate" line to. // // In any case, code generation should only need to happen when the underlying // TTF files change, which isn't expected to happen frequently. import ( "bytes" "fmt" "go/format" "io/ioutil" "log" "os" "path/filepath" "strings" ) const suffix = ".ttf" func main() { ttfs, err := os.Open("ttfs") if err != nil { log.Fatal(err) } defer ttfs.Close() infos, err := ttfs.Readdir(-1) if err != nil { log.Fatal(err) } for _, info := range infos { ttfName := info.Name() if !strings.HasSuffix(ttfName, suffix) { continue } do(ttfName) } } func do(ttfName string) { fontName := fontName(ttfName) pkgName := pkgName(ttfName) if err := os.Mkdir(pkgName, 0777); err != nil && !os.IsExist(err) { log.Fatal(err) } src, err := ioutil.ReadFile(filepath.Join("ttfs", ttfName)) if err != nil { log.Fatal(err) } desc := "a proportional-width, sans-serif" if strings.Contains(ttfName, "Mono") { desc = "a fixed-width, slab-serif" } b := new(bytes.Buffer) fmt.Fprintf(b, "// generated by go run gen.go; DO NOT EDIT\n\n") fmt.Fprintf(b, "// Package %s provides the %q TrueType font\n", pkgName, fontName) fmt.Fprintf(b, "// from the Go font family. It is %s font.\n", desc) fmt.Fprintf(b, "//\n") fmt.Fprintf(b, "// See https://blog.golang.org/go-fonts for details.\n") fmt.Fprintf(b, "package %s\n\n", pkgName) fmt.Fprintf(b, "// TTF is the data for the %q TrueType font.\n", fontName) fmt.Fprintf(b, "var TTF = []byte{") for i, x := range src { if i&15 == 0 { b.WriteByte('\n') } fmt.Fprintf(b, "%#02x,", x) } fmt.Fprintf(b, "\n}\n") dst, err := format.Source(b.Bytes()) if err != nil { log.Fatal(err) } if err := ioutil.WriteFile(filepath.Join(pkgName, "data.go"), dst, 0666); err != nil { log.Fatal(err) } } // fontName maps "Go-Regular.ttf" to "Go Regular". func fontName(ttfName string) string { s := ttfName[:len(ttfName)-len(suffix)] s = strings.Replace(s, "-", " ", -1) return s } // pkgName maps "Go-Regular.ttf" to "goregular". func pkgName(ttfName string) string { s := ttfName[:len(ttfName)-len(suffix)] s = strings.Replace(s, "-", "", -1) s = strings.ToLower(s) return s }