aboutsummaryrefslogtreecommitdiff
path: root/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'client.go')
-rw-r--r--client.go108
1 files changed, 33 insertions, 75 deletions
diff --git a/client.go b/client.go
index 3301ff1..d90eb4a 100644
--- a/client.go
+++ b/client.go
@@ -68,32 +68,46 @@ func New(cookies []*http.Cookie) (cl *Client, err error) {
}
//
-// CariDefinisi dari kata.
+// CariDefinisi dari daftar kata.
//
-func (cl Client) CariDefinisi(in string) (kata *Kata, err error) {
- entriURL := baseURL + entriPath + in
- res, err := cl.httpc.Get(entriURL)
- if err != nil {
- return nil, fmt.Errorf("CariDefinisi %q: %w", in, err)
- }
+func (cl Client) CariDefinisi(ins []string) (res DefinisiResponse) {
+ res = make(DefinisiResponse, len(ins))
- defer res.Body.Close()
+ for _, in := range ins {
+ _, ok := res[in]
+ if ok {
+ continue
+ }
- body, err := ioutil.ReadAll(res.Body)
- if err != nil {
- return nil, fmt.Errorf("Cari %q: %w", in, err)
- }
+ kata := &Kata{}
+ res[in] = kata
- if debug.Value >= 2 {
- fmt.Printf(">>> HTML body for %s:\n%s", entriURL, body)
- }
+ entriURL := baseURL + entriPath + in
+ httpRes, err := cl.httpc.Get(entriURL)
+ if err != nil {
+ kata.err = err
+ continue
+ }
- kata, err = parseHTMLEntri(body)
- if err != nil {
- return nil, fmt.Errorf("CariDefinisi %q: %w", in, err)
+ defer httpRes.Body.Close()
+
+ body, err := ioutil.ReadAll(httpRes.Body)
+ if err != nil {
+ kata.err = err
+ continue
+ }
+
+ if debug.Value >= 2 {
+ fmt.Printf(">>> HTML body for %s:\n%s", entriURL, body)
+ }
+
+ err = kata.parseHTMLEntri(body)
+ if err != nil {
+ kata.err = err
+ }
}
- return kata, nil
+ return res
}
//
@@ -204,62 +218,6 @@ func (cl *Client) SetCookies(cookies []*http.Cookie) {
}
}
-//
-// parseHTMLEntri parse HTML body from "/entri/<kata>" page to find the
-// definition of the word.
-//
-func parseHTMLEntri(htmlBody []byte) (kata *Kata, err error) {
- node, err := html.Parse(bytes.NewReader(htmlBody))
- if err != nil {
- return nil, err
- }
-
- kata = new(Kata)
- 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 kata, nil
-}
-
func (cl Client) parseHTMLKataDasar(htmlBody []byte) (kataDasar daftarKata, err error) {
node, err := html.Parse(bytes.NewReader(htmlBody))
if err != nil {