aboutsummaryrefslogtreecommitdiff
path: root/kata.go
diff options
context:
space:
mode:
Diffstat (limited to 'kata.go')
-rw-r--r--kata.go69
1 files changed, 68 insertions, 1 deletions
diff --git a/kata.go b/kata.go
index 1fb8eeb..94b23b4 100644
--- a/kata.go
+++ b/kata.go
@@ -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
}
//