Files
golifehk/datasources/cjlookup/maps.go
2026-02-20 12:50:36 +08:00

173 lines
3.0 KiB
Go

package cjlookup
import (
"bufio"
"encoding/csv"
utils "github.com/tgckpg/golifehk/utils"
"io"
"log"
"os"
"path/filepath"
"strconv"
"strings"
)
var TXT_CANGJIE_KEYS string = filepath.Join(utils.STATIC_DIR, "cangjie.keys.txt")
var YAML_CANGJIE5_DICT string = filepath.Join(utils.STATIC_DIR, "cangjie5.dict.yaml")
var YAML_JYUTPING_CHARS string = filepath.Join(utils.STATIC_DIR, "jyut6ping3.chars.dict.yaml")
func ReadCangJieKeys() (*strings.Replacer, error) {
f, err := os.Open(TXT_CANGJIE_KEYS)
if err != nil {
log.Fatal(err)
}
defer f.Close()
r := csv.NewReader(f)
r.Comma = '\t'
r.FieldsPerRecord = -1
cjKeymap := []string{}
for {
record, err := r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
cjKeymap = append(cjKeymap, record[0])
cjKeymap = append(cjKeymap, record[1])
}
return strings.NewReplacer(cjKeymap...), nil
}
func ReadCangJieTable(charMap map[string]*CChar, repl *strings.Replacer) error {
f, err := os.Open(YAML_CANGJIE5_DICT)
if err != nil {
log.Fatal(err)
}
defer f.Close()
br := bufio.NewReader(f)
// Skip until YAML document end
for {
line, err := br.ReadString('\n')
if err != nil {
return err
}
if strings.TrimSpace(line) == "..." {
break
}
}
r := csv.NewReader(br)
r.Comma = '\t'
r.FieldsPerRecord = -1
for {
record, err := r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
face := record[0]
if c, ok := charMap[face]; ok {
c.Face = face
c.CangJie = repl.Replace(record[1])
} else {
c := CChar{}
c.Face = face
c.CangJie = repl.Replace(record[1])
charMap[face] = &c
}
}
return nil
}
func ReadJyutPingTable(charMap map[string]*CChar) (map[string]*[]*CChar, error) {
f, err := os.Open(YAML_JYUTPING_CHARS)
if err != nil {
log.Fatal(err)
}
defer f.Close()
br := bufio.NewReader(f)
// Skip until YAML document end
for {
line, err := br.ReadString('\n')
if err != nil {
return nil, err
}
if strings.TrimSpace(line) == "..." {
break
}
}
r := csv.NewReader(br)
r.Comma = '\t'
r.FieldsPerRecord = -1
JyutPingMap := map[string]*[]*CChar{}
for {
record, err := r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
face := record[0]
jyutping := record[1]
var c *CChar
c, ok := charMap[face]
if ok {
if len(record) == 2 {
c.JyutPing = record[1]
} else if len(record) == 3 {
s := record[2]
if strings.HasSuffix(s, "%") {
_, err := strconv.Atoi(s[:len(s)-1])
if err != nil {
return nil, err
}
}
yList := c.YiDukJam
if yList == nil {
yList = &[]string{}
}
*yList = append(*yList, record[1])
c.YiDukJam = yList
}
} else {
c = &CChar{}
c.Face = face
c.JyutPing = jyutping
charMap[face] = c
}
pListPtr, ok := JyutPingMap[jyutping]
if !ok {
pList := []*CChar{}
pListPtr = &pList
JyutPingMap[jyutping] = pListPtr
}
*pListPtr = append(*pListPtr, c)
c.TungJamZi = pListPtr
}
return JyutPingMap, nil
}