Added cj & jyutping lookup
This commit is contained in:
172
datasources/cjlookup/maps.go
Normal file
172
datasources/cjlookup/maps.go
Normal file
@@ -0,0 +1,172 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user