diff options
Diffstat (limited to 'client.go')
| -rw-r--r-- | client.go | 108 |
1 files changed, 33 insertions, 75 deletions
@@ -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 { |
