Store list of entry keys to make consistent search result order

main
Elnu 2 years ago
parent 01e6ab46e7
commit b20cdaf819

@ -16,9 +16,15 @@ import (
"github.com/gorilla/mux" "github.com/gorilla/mux"
) )
var words []string // since iterating over map isn't the same every time
var dict map[string]Entry var dict map[string]Entry
func LoadDict() error { func LoadDict() error {
type binaryData struct {
Words []string
Dict map[string]Entry
}
// Loading from binary // Loading from binary
const binaryFile = "dict.bin" const binaryFile = "dict.bin"
file, err := os.Open(binaryFile) file, err := os.Open(binaryFile)
@ -29,7 +35,10 @@ func LoadDict() error {
} else { } else {
defer file.Close() defer file.Close()
decoder := gob.NewDecoder(file) decoder := gob.NewDecoder(file)
err = decoder.Decode(&dict) var data binaryData
err = decoder.Decode(&data)
words = data.Words
dict = data.Dict
return err return err
} }
@ -56,8 +65,9 @@ func LoadDict() error {
furiganaData[params[0]] = params[2] furiganaData[params[0]] = params[2]
} }
words = make([]string, len(jmdict.Entries))
dict = make(map[string]Entry) dict = make(map[string]Entry)
for _, jmdictEntry := range jmdict.Entries { for i, jmdictEntry := range jmdict.Entries {
// お願い致します|おねがいいたします|1:ねが;3:いた // お願い致します|おねがいいたします|1:ねが;3:いた
var furiganaInfo *string var furiganaInfo *string
if len(jmdictEntry.Kanji) > 0 { if len(jmdictEntry.Kanji) > 0 {
@ -67,6 +77,7 @@ func LoadDict() error {
furiganaInfo = nil furiganaInfo = nil
} }
entry := ParseEntry(&jmdictEntry, furiganaInfo) entry := ParseEntry(&jmdictEntry, furiganaInfo)
words[i] = entry.Kanji
dict[entry.Kanji] = entry dict[entry.Kanji] = entry
} }
@ -77,7 +88,11 @@ func LoadDict() error {
} }
defer file.Close() defer file.Close()
encoder := gob.NewEncoder(file) encoder := gob.NewEncoder(file)
err = encoder.Encode(&dict) data := binaryData{
Words: words,
Dict: dict,
}
err = encoder.Encode(&data)
if err != nil { if err != nil {
return err return err
} }
@ -204,7 +219,7 @@ func Search(query string) queryResult {
otherResults := make([]Entry, 0) otherResults := make([]Entry, 0)
truncated := false truncated := false
count := 0 count := 0
for kanji := range dict { for _, kanji := range words {
exactMatch := false exactMatch := false
entry := dict[kanji] entry := dict[kanji]
if kanji == query { if kanji == query {
@ -214,6 +229,11 @@ func Search(query string) queryResult {
if strings.Contains(kanji, query) { if strings.Contains(kanji, query) {
goto match goto match
} }
for _, definition := range entry.Definitions {
if strings.Contains(strings.ToLower(definition.Definition), strings.ToLower(strings.TrimSpace(query))) {
goto match
}
}
// TODO: Skip if query contains kanji // TODO: Skip if query contains kanji
if strings.Contains(entry.Reading, query) { if strings.Contains(entry.Reading, query) {
goto match goto match