diff options
Diffstat (limited to 'kata.go')
| -rw-r--r-- | kata.go | 69 |
1 files changed, 68 insertions, 1 deletions
@@ -4,7 +4,18 @@ package kbbi -import "golang.org/x/net/html" +import ( + "bytes" + + "golang.org/x/net/html" +) + +// +// Err return an error from retrieving definition. +// +func (kata *Kata) Err() error { + return kata.err +} // // Kata store the single root word and its definitions. @@ -12,6 +23,62 @@ import "golang.org/x/net/html" type Kata struct { Dasar string `json:"dasar"` Definisi []*DefinisiKata `json:"definisi"` + err error +} + +// +// parseHTMLEntri parse HTML body from "/entri/<kata>" page to find the +// definition of the word. +// +func (kata *Kata) parseHTMLEntri(htmlBody []byte) (err error) { + node, err := html.Parse(bytes.NewReader(htmlBody)) + if err != nil { + return err + } + + var prev *html.Node + + for { + switch { + case node.FirstChild != nil && node.FirstChild != prev && + node.LastChild != prev: + node = node.FirstChild + case node.NextSibling != nil: + node = node.NextSibling + default: + prev = node + node = node.Parent + } + if node == nil { + break + } + + if node.Type != html.ElementNode { + continue + } + + switch node.Data { + case tagNameHeader2: + kata.parseKataDasar(node) + + case tagNameOrderedList, tagNameUnorderedList: + li := getFirstChild(node) + for li != nil { + defKata := parseDefinisiKata(li) + if defKata == nil { + break + } + kata.Definisi = append(kata.Definisi, defKata) + li = getNextSibling(li) + } + node = node.NextSibling + + default: + continue + } + } + + return nil } // |
