diff --git a/dict/.gitignore b/dict/.gitignore index 18e00d2..30e4d8d 100644 --- a/dict/.gitignore +++ b/dict/.gitignore @@ -1,2 +1 @@ -JMdict.xml -dict.bin \ No newline at end of file +JMdict.xml \ No newline at end of file diff --git a/dict/main.go b/dict/main.go index 073ab2e..5234d26 100644 --- a/dict/main.go +++ b/dict/main.go @@ -1,7 +1,6 @@ package main import ( - "encoding/gob" "encoding/json" "fmt" "log" @@ -14,51 +13,18 @@ import ( "github.com/gorilla/mux" ) -var dict map[string]Entry +var dict jmdict.Jmdict func LoadDict() error { - // Loading from binary - const binaryFile = "dict.bin" - file, err := os.Open(binaryFile) - if err != nil { - if !os.IsNotExist(err) { - return err - } - } else { - defer file.Close() - decoder := gob.NewDecoder(file) - err = decoder.Decode(&dict) - return err - } - - // Loading from JMdict const jmdictFile = "JMdict.xml" reader, err := os.Open(jmdictFile) if err != nil { return err } - jmdict, _, err := jmdict.LoadJmdict(reader) + dict, _, err = jmdict.LoadJmdict(reader) if err != nil { return err } - dict = make(map[string]Entry) - for _, jmdictEntry := range jmdict.Entries { - entry := ParseEntry(&jmdictEntry) - dict[entry.Kanji] = entry - } - - // Encoding to binary - file, err = os.Create(binaryFile) - if err != nil { - return err - } - defer file.Close() - encoder := gob.NewEncoder(file) - err = encoder.Encode(&dict) - if err != nil { - return err - } - return nil } @@ -73,7 +39,7 @@ type Definition struct { PartOfSpeech []string } -func ParseEntry(entry *jmdict.JmdictEntry) Entry { +func ParseEntry(entry jmdict.JmdictEntry) Entry { kanji := "" if len(entry.Kanji) > 0 { kanji = entry.Kanji[0].Expression @@ -109,22 +75,26 @@ func Search(query string) queryResult { otherResults := make([]Entry, 0) truncated := false count := 0 - for kanji := range dict { + for _, jmdictEntry := range dict.Entries { exactMatch := false - entry := dict[kanji] - if kanji == query { - exactMatch = true - goto match - } - if strings.Contains(kanji, query) { - goto match + for _, kanji := range jmdictEntry.Kanji { + if kanji.Expression == query { + exactMatch = true + goto match + } + if strings.Contains(kanji.Expression, query) { + goto match + } } // TODO: Skip if query contains kanji - if strings.Contains(entry.Reading, query) { - goto match + for _, reading := range jmdictEntry.Readings { + if strings.Contains(reading.Reading, query) { + goto match + } } continue match: + entry := ParseEntry(jmdictEntry) if exactMatch { exactResults = append(exactResults, entry) } else { @@ -146,8 +116,9 @@ func Search(query string) queryResult { } func Lookup(word string) *Entry { - for kanji, entry := range dict { - if kanji == word { + for _, jmdictEntry := range dict.Entries { + entry := ParseEntry(jmdictEntry) + if entry.Kanji == word { return &entry } }