|
|
@ -63,7 +63,8 @@ func LoadDict() error {
|
|
|
|
furiganaData := make(map[string]string)
|
|
|
|
furiganaData := make(map[string]string)
|
|
|
|
for scanner.Scan() {
|
|
|
|
for scanner.Scan() {
|
|
|
|
params := strings.Split(scanner.Text(), "|")
|
|
|
|
params := strings.Split(scanner.Text(), "|")
|
|
|
|
furiganaData[params[0]] = params[2]
|
|
|
|
// We need to include the reading as well since some words have the same kanji
|
|
|
|
|
|
|
|
furiganaData[fmt.Sprintf("%s|%s", params[0], params[1])] = params[2]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
words = make([]string, len(jmdict.Entries))
|
|
|
|
words = make([]string, len(jmdict.Entries))
|
|
|
@ -72,14 +73,32 @@ func LoadDict() error {
|
|
|
|
// お願い致します|おねがいいたします|1:ねが;3:いた
|
|
|
|
// お願い致します|おねがいいたします|1:ねが;3:いた
|
|
|
|
var furiganaInfo *string
|
|
|
|
var furiganaInfo *string
|
|
|
|
if len(jmdictEntry.Kanji) > 0 {
|
|
|
|
if len(jmdictEntry.Kanji) > 0 {
|
|
|
|
data := furiganaData[jmdictEntry.Kanji[0].Expression]
|
|
|
|
data := furiganaData[fmt.Sprintf("%s|%s", jmdictEntry.Kanji[0].Expression, jmdictEntry.Readings[0].Reading)]
|
|
|
|
furiganaInfo = &data
|
|
|
|
furiganaInfo = &data
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
furiganaInfo = nil
|
|
|
|
furiganaInfo = nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
entry := ParseEntry(&jmdictEntry, furiganaInfo)
|
|
|
|
entry := ParseEntry(&jmdictEntry, furiganaInfo)
|
|
|
|
words[i] = entry.Kanji
|
|
|
|
offset := 0
|
|
|
|
dict[entry.Kanji] = entry
|
|
|
|
getKey := func() string {
|
|
|
|
|
|
|
|
if offset == 0 {
|
|
|
|
|
|
|
|
// unique
|
|
|
|
|
|
|
|
return entry.Kanji
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
return fmt.Sprintf("%s-%d", entry.Kanji, offset)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for {
|
|
|
|
|
|
|
|
if _, ok := dict[getKey()]; ok {
|
|
|
|
|
|
|
|
offset++
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
key := getKey()
|
|
|
|
|
|
|
|
entry.Key = key
|
|
|
|
|
|
|
|
words[i] = key
|
|
|
|
|
|
|
|
dict[key] = entry
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Encoding to binary
|
|
|
|
// Encoding to binary
|
|
|
@ -107,6 +126,7 @@ type Furigana struct {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type Entry struct {
|
|
|
|
type Entry struct {
|
|
|
|
|
|
|
|
Key string
|
|
|
|
Kanji string
|
|
|
|
Kanji string
|
|
|
|
// Mapping of character index to furigana
|
|
|
|
// Mapping of character index to furigana
|
|
|
|
Furigana []Furigana
|
|
|
|
Furigana []Furigana
|
|
|
@ -227,14 +247,14 @@ func Search(query string) queryResult {
|
|
|
|
otherResults := make([]Entry, 0)
|
|
|
|
otherResults := make([]Entry, 0)
|
|
|
|
truncated := false
|
|
|
|
truncated := false
|
|
|
|
count := 0
|
|
|
|
count := 0
|
|
|
|
for _, kanji := range words {
|
|
|
|
for _, key := range words {
|
|
|
|
exactMatch := false
|
|
|
|
exactMatch := false
|
|
|
|
entry := dict[kanji]
|
|
|
|
entry := dict[key]
|
|
|
|
if kanji == query {
|
|
|
|
if entry.Kanji == query {
|
|
|
|
exactMatch = true
|
|
|
|
exactMatch = true
|
|
|
|
goto match
|
|
|
|
goto match
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if strings.Contains(kanji, query) {
|
|
|
|
if strings.Contains(entry.Kanji, query) {
|
|
|
|
goto match
|
|
|
|
goto match
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, definition := range entry.Definitions {
|
|
|
|
for _, definition := range entry.Definitions {
|
|
|
|