Handle multiple entries with same kanji

main
Elnu 2 years ago
parent 3965b59893
commit 395318b7f6

@ -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 {

@ -1,7 +1,7 @@
{{ define "entry" }} {{ define "entry" }}
<div class="box"> <div class="box">
<h3 lang="ja"> <h3 lang="ja">
<a href="/word/{{ .Kanji }}"> <a href="/word/{{ .Key }}">
{{- range .Furigana -}} {{- range .Furigana -}}
{{- if .Furigana -}} {{- if .Furigana -}}
<ruby>{{- .Kanji -}}<rp>(</rp><rt>{{- .Furigana -}}</rt><rp>)</rp></ruby> <ruby>{{- .Kanji -}}<rp>(</rp><rt>{{- .Furigana -}}</rt><rp>)</rp></ruby>