173 lines
3.0 KiB
Go
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.WORKDIR, "cangjie.keys.txt")
|
|
var YAML_CANGJIE5_DICT string = filepath.Join(utils.WORKDIR, "cangjie5.dict.yaml")
|
|
var YAML_JYUTPING_CHARS string = filepath.Join(utils.WORKDIR, "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
|
|
}
|