80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
package cjlookup
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"golang.org/x/text/encoding/traditionalchinese"
|
|
)
|
|
|
|
var CUHARTS_FACE = "[%s](https://humanum.arts.cuhk.edu.hk/Lexis/lexi-can/search.php?q=%s)"
|
|
var CUHARTS_PHO = "[%s](https://humanum.arts.cuhk.edu.hk/Lexis/lexi-can/pho-rel.php?%s&classified=classified.php?st=0)"
|
|
var ZDIC_FACE = "[%s](https://www.zdic.net/hans/%s)"
|
|
var SING_MOU_S1 = []string{"b", "c", "d", "f", "g", "gw", "h", "j", "k", "kw", "l", "m", "n", "ng", "p", "s", "t", "w", "z"}
|
|
var WAN_MOU_S2 = []string{"aa", "aai", "aau", "aam", "aan", "aang", "aap", "aat", "aak", "ai", "au", "am", "an", "ang", "ap", "at", "ak", "e", "ei", "eu", "em", "eng", "ep", "ek", "i", "iu", "im", "in", "ing", "ip", "it", "ik", "o", "oi", "ou", "on", "ong", "ot", "ok", "oe", "oeng", "oek", "eoi", "eon", "eot", "u", "ui", "un", "ung", "ut", "uk", "yu", "yun", "yut", "m", "ng"}
|
|
var SING_DIU_S3 = []string{"1", "2", "3", "4", "5", "6"}
|
|
|
|
func getCUHARTSUrlForChar(c string) string {
|
|
b, err := Big5UrlParam(c)
|
|
if err != nil {
|
|
log.Print("Failed to encode:", c, err)
|
|
return fmt.Sprintf(ZDIC_FACE, c, c)
|
|
}
|
|
return fmt.Sprintf(CUHARTS_FACE, c, b)
|
|
}
|
|
|
|
func SParams(p string) string {
|
|
s1 := "-"
|
|
for _, x := range SING_MOU_S1 {
|
|
if strings.HasPrefix(p, x) {
|
|
s1 = x
|
|
break
|
|
}
|
|
}
|
|
|
|
s3 := "-"
|
|
for _, x := range SING_DIU_S3 {
|
|
if strings.HasSuffix(p, x) {
|
|
s3 = x
|
|
break
|
|
}
|
|
}
|
|
|
|
s2 := ""
|
|
bestMatch := 0
|
|
for _, x := range WAN_MOU_S2 {
|
|
if strings.HasSuffix(strings.TrimSuffix(strings.TrimPrefix(p, s1), s3), x) {
|
|
if bestMatch < len(x) {
|
|
s2 = x
|
|
bestMatch = len(x)
|
|
}
|
|
}
|
|
}
|
|
return fmt.Sprintf("s1=%s&s2=%s&s3=%s", s1, s2, s3)
|
|
}
|
|
|
|
func getCUHARTSUrlsForPronounce(p []*CJyutPing) []string {
|
|
urls := []string{}
|
|
for _, x := range p {
|
|
urls = append(urls, getCUHARTSUrlForPronounce(x.Roman))
|
|
}
|
|
return urls
|
|
}
|
|
|
|
func getCUHARTSUrlForPronounce(p string) string {
|
|
return fmt.Sprintf(CUHARTS_PHO, p, SParams(p))
|
|
}
|
|
|
|
func Big5UrlParam(input string) (string, error) {
|
|
enc := traditionalchinese.Big5.NewEncoder()
|
|
encodedBytes, err := enc.Bytes([]byte(input))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
urlEncoded := url.PathEscape(string(encodedBytes))
|
|
return urlEncoded, nil
|
|
}
|