penguin/golifehk

@golifehk bot in Telegram

datasources/cjlookup/maps.go

raw ยท 3053 bytes

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
}