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 }