2025-07-01 19:37:07 +02:00

141 lines
2.6 KiB
Go

//go:build ignore
package main
import (
"bufio"
"fmt"
"log"
"os"
"regexp"
"strings"
"text/template"
"time"
)
const Directory = "/usr/share/dict"
var nonAlphanumericRegex = regexp.MustCompile(`[^a-zA-Z0-9 ]+`)
var dictionaryTemplate = template.Must(template.New("").Parse(`// Code generated by go generate; DO NOT EDIT.
// This file was generated by robots at
// {{ .Timestamp }}
// using data from
// {{ .Path }}
package dictionary
import (
"gitea.elara.ws/Hazel/go-words/internal"
)
var {{ .VarName }} = internal.Dictionary{
{{- range .Words }}
{{ printf "%q" . }},
{{- end }}
}
`))
type dictionaryTemplateData struct {
Timestamp time.Time
Path string
Words []string
VarName string
}
var exportTemplate = template.Must(template.New("").Parse(`// Code generated by go generate; DO NOT EDIT.
// This file was generated by robots at
// {{ .Timestamp }}
// It exports the Dictionaries for easy use
package words
import (
"gitea.elara.ws/Hazel/go-words/internal/dictionary"
)
//go:generate go run internal/gen.go
{{range $VarName := .VarNames }}
var {{ $VarName }} = dictionary.{{ $VarName }}
{{- end }}
`))
type exportTemplateData struct {
Timestamp time.Time
VarNames []string
}
var isAlphaNumeric = regexp.MustCompile(`^[a-zA-Z0-9]*$`)
func generateFile(name string) string {
fmt.Println("generating file for dictionary " + name)
lowerName := strings.ToLower(name)
words := []string{}
Path := Directory + "/" + lowerName
file, err := os.Open(Path)
if err != nil {
die(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
w := strings.TrimSpace(scanner.Text())
if isAlphaNumeric.MatchString(w) {
words = append(words, w)
}
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
f, err := os.Create("internal/dictionary/" + lowerName + ".go")
die(err)
defer f.Close()
varName := nonAlphanumericRegex.ReplaceAllString(strings.Title(name), "")
dictionaryTemplate.Execute(f, dictionaryTemplateData{
Timestamp: time.Now(),
Path: Path,
Words: words,
VarName: varName,
})
return varName
}
func main() {
fmt.Println("Generate")
entries, err := os.ReadDir(Directory)
if err != nil {
die(err)
}
varNames := make([]string, 0)
for _, e := range entries {
if !strings.Contains(e.Name(), ".") {
varNames = append(varNames, generateFile(e.Name()))
}
}
f, err := os.Create("main.go")
die(err)
defer f.Close()
exportTemplate.Execute(f, exportTemplateData{
Timestamp: time.Now(),
VarNames: varNames,
})
}
func die(err error) {
if err != nil {
log.Fatal(err)
}
}