first commit
This commit is contained in:
148
pkg/common/pinyin/pinyin.go
Normal file
148
pkg/common/pinyin/pinyin.go
Normal file
@ -0,0 +1,148 @@
|
||||
package pinyin
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
type vowel int32
|
||||
|
||||
var (
|
||||
ys = []vowel{'ā', 'ē', 'ī', 'ō', 'ū', 'ǖ', 'Ā', 'Ē', 'Ī', 'Ō', 'Ū', 'Ǖ'} // 单韵母 一声
|
||||
es = []vowel{'á', 'é', 'í', 'ó', 'ú', 'ǘ', 'Á', 'É', 'Í', 'Ó', 'Ú', 'Ǘ'} // 单韵母 二声
|
||||
ss = []vowel{'ǎ', 'ě', 'ǐ', 'ǒ', 'ǔ', 'ǚ', 'Ǎ', 'Ě', 'Ǐ', 'Ǒ', 'Ǔ', 'Ǚ'} // 单韵母 三声
|
||||
fs = []vowel{'à', 'è', 'ì', 'ò', 'ù', 'ǜ', 'À', 'È', 'Ì', 'Ò', 'Ù', 'Ǜ'} // 单韵母 四声
|
||||
ws = []vowel{'a', 'e', 'i', 'o', 'u', 'v', 'A', 'E', 'I', 'O', 'U', 'V'} // 单韵母 无声调
|
||||
)
|
||||
|
||||
var (
|
||||
pinyinTemp map[vowel]interface{}
|
||||
toneTemp map[vowel]vowel
|
||||
)
|
||||
|
||||
const (
|
||||
Tone string = "带声调的拼音" // 带声调的拼音 例如:Cào
|
||||
InitialsInCapitals string = "首字母大写不带声调" // 首字母大写不带声调 例如:Cao
|
||||
None string = "" //如果匹配不到汉字,就靠大家维护下 【匹配失败,手动添加代码到pinyin.txt】
|
||||
)
|
||||
|
||||
func LoadingPYFile(filename string) {
|
||||
f, err := os.Open(filename)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
pinyinTemp = make(map[vowel]interface{}, 0)
|
||||
toneTemp = make(map[vowel]vowel)
|
||||
for i, t := range ys {
|
||||
toneTemp[t] = ws[i]
|
||||
}
|
||||
for i, t := range es {
|
||||
toneTemp[t] = ws[i]
|
||||
}
|
||||
for i, t := range ss {
|
||||
toneTemp[t] = ws[i]
|
||||
}
|
||||
for i, t := range fs {
|
||||
toneTemp[t] = ws[i]
|
||||
}
|
||||
defer func() {
|
||||
_ = f.Close()
|
||||
}()
|
||||
scanner := bufio.NewScanner(f)
|
||||
for scanner.Scan() {
|
||||
//单行分割取出拼音
|
||||
str := strings.Split(scanner.Text(), "=>")
|
||||
if len(str) < 2 {
|
||||
continue
|
||||
}
|
||||
i, err := strconv.ParseInt(str[0], 16, 32)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
pinyinTemp[vowel(i)] = str[1]
|
||||
//fmt.Println(pinyinTemp[vowel(i)])
|
||||
}
|
||||
}
|
||||
|
||||
func PY(source string) (string, error) {
|
||||
return PYSplit(source, "", "")
|
||||
}
|
||||
|
||||
func PYSplit(source string, split string, types string) (string, error) {
|
||||
hz := []vowel(source)
|
||||
words := make([]string, 0)
|
||||
for _, s := range hz {
|
||||
word, err := _vowel(s, types)
|
||||
if err != nil {
|
||||
return None, err
|
||||
}
|
||||
if len(word) > 0 {
|
||||
words = append(words, word)
|
||||
}
|
||||
}
|
||||
return strings.Join(words, split), nil
|
||||
}
|
||||
|
||||
func _vowel(source vowel, types string) (string, error) {
|
||||
switch types {
|
||||
case Tone:
|
||||
return getTone(source), nil
|
||||
case InitialsInCapitals:
|
||||
return getInitialsInCapitals(source), nil
|
||||
default:
|
||||
return getDefault(source), nil
|
||||
}
|
||||
}
|
||||
|
||||
func getTone(source vowel) string {
|
||||
if pinyinTemp[source] != nil {
|
||||
return pinyinTemp[source].(string)
|
||||
}
|
||||
return string(source)
|
||||
}
|
||||
|
||||
func getInitialsInCapitals(source vowel) string {
|
||||
def := getDefault(source)
|
||||
var result string
|
||||
if def == "" {
|
||||
return def
|
||||
}
|
||||
str := []vowel(def)
|
||||
if str[0] > 32 {
|
||||
str[0] = str[0] - 32
|
||||
}
|
||||
for _, v := range str {
|
||||
result += string(v)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func getDefault(source vowel) string {
|
||||
tone := getTone(source)
|
||||
var result string
|
||||
if tone == "" {
|
||||
return None
|
||||
}
|
||||
resultLen := make([]vowel, utf8.RuneCountInString(tone))
|
||||
count := 0
|
||||
for _, t := range tone {
|
||||
changes, ok := toneTemp[vowel(t)]
|
||||
if ok {
|
||||
resultLen[count] = changes
|
||||
} else {
|
||||
resultLen[count] = vowel(t)
|
||||
}
|
||||
count++
|
||||
}
|
||||
for _, v := range resultLen {
|
||||
result += string(v)
|
||||
}
|
||||
return result
|
||||
}
|
||||
Reference in New Issue
Block a user