aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/kbbi/main.go4
-rw-r--r--definisi_kata.go24
-rw-r--r--direct_client.go2
-rw-r--r--kamus_cache.go10
-rw-r--r--kata.go10
-rw-r--r--kata_test.go9
-rw-r--r--telegram_bot.go5
-rw-r--r--testdata/entri.html58
-rw-r--r--testdata/entri_analisa.html342
9 files changed, 431 insertions, 33 deletions
diff --git a/cmd/kbbi/main.go b/cmd/kbbi/main.go
index ac9298c..adba621 100644
--- a/cmd/kbbi/main.go
+++ b/cmd/kbbi/main.go
@@ -85,6 +85,10 @@ func main() {
}
fmt.Println("===", k)
+ if len(kata.Pesan) != 0 {
+ fmt.Println(" " + kata.Pesan)
+ continue
+ }
if len(kata.Dasar) > 0 {
fmt.Printf(" Kata dasar: %s\n", kata.Dasar)
}
diff --git a/definisi_kata.go b/definisi_kata.go
index 0060a97..8d812f8 100644
--- a/definisi_kata.go
+++ b/definisi_kata.go
@@ -5,6 +5,7 @@
package kbbi
import (
+ "fmt"
"strings"
"github.com/shuLhan/share/lib/net/html"
@@ -21,14 +22,14 @@ type DefinisiKata struct {
Contoh []string `json:"contoh,omitempty"`
}
-func parseDefinisiKata(li *html.Node) (defKata *DefinisiKata) {
+func parseDefinisiKata(in string, li *html.Node) (defKata *DefinisiKata, err error) {
elFont := li.GetFirstChild()
if elFont == nil || elFont.Data != tagNameFont {
- return nil
+ return nil, nil
}
elItalic := elFont.GetFirstChild()
if elItalic == nil || elItalic.Data != tagNameItalic {
- return nil
+ return nil, nil
}
defKata = &DefinisiKata{}
@@ -44,13 +45,24 @@ func parseDefinisiKata(li *html.Node) (defKata *DefinisiKata) {
el := elFont.GetNextSibling()
if el == nil {
- return defKata
+ return defKata, nil
}
defKata.Isi = strings.TrimSpace(libstrings.SingleSpace(el.Data))
+ if defKata.Isi == "→" {
+ defKata.Isi = ""
+ el = el.GetNextSibling()
+ if el == nil || el.Data != tagNameAnchor {
+ return nil, nil
+ }
+ el = el.GetFirstChild()
+ return nil, fmt.Errorf(`%q adalah bentuk tidak baku dari %q`,
+ in, el.Data)
+ }
+
if defKata.Isi[len(defKata.Isi)-1] != ':' {
- return defKata
+ return defKata, nil
}
defKata.Isi = defKata.Isi[:len(defKata.Isi)-1]
@@ -78,5 +90,5 @@ func parseDefinisiKata(li *html.Node) (defKata *DefinisiKata) {
el = el.GetNextSibling()
}
- return defKata
+ return defKata, nil
}
diff --git a/direct_client.go b/direct_client.go
index b4bcf98..963a118 100644
--- a/direct_client.go
+++ b/direct_client.go
@@ -102,7 +102,7 @@ func (cl *directClient) CariDefinisi(ins []string) (
fmt.Printf(">>> HTML body for %s:\n%s", entriURL, body)
}
- err = kata.parseHTMLEntri(body)
+ err = kata.parseHTMLEntri(in, body)
if err != nil {
kata.err = err
}
diff --git a/kamus_cache.go b/kamus_cache.go
index ffcf4db..124fdc1 100644
--- a/kamus_cache.go
+++ b/kamus_cache.go
@@ -95,6 +95,16 @@ func (kamus *kamusCache) load() (err error) {
return err
}
+ // Clean up. Remove all word that contain "→" as definition.
+ for k, kata := range kamus.cache {
+ for _, def := range kata.Definisi {
+ if def.Isi == "→" {
+ delete(kamus.cache, k)
+ break
+ }
+ }
+ }
+
kamus.lastSize = len(kamus.cache)
return nil
diff --git a/kata.go b/kata.go
index dfadf61..85ecb82 100644
--- a/kata.go
+++ b/kata.go
@@ -23,6 +23,7 @@ func (kata *Kata) Err() error {
type Kata struct {
Dasar string `json:"dasar"`
Definisi []*DefinisiKata `json:"definisi"`
+ Pesan string `json:"pesan"`
err error
}
@@ -30,7 +31,7 @@ type Kata struct {
// parseHTMLEntri parse HTML body from "/entri/<kata>" page to find the
// definition of the word.
//
-func (kata *Kata) parseHTMLEntri(htmlBody []byte) (err error) {
+func (kata *Kata) parseHTMLEntri(in string, htmlBody []byte) (err error) {
iter, err := html.Parse(bytes.NewReader(htmlBody))
if err != nil {
return err
@@ -48,7 +49,12 @@ func (kata *Kata) parseHTMLEntri(htmlBody []byte) (err error) {
case tagNameOrderedList, tagNameUnorderedList:
li := node.GetFirstChild()
for li != nil {
- defKata := parseDefinisiKata(li)
+ defKata, err := parseDefinisiKata(in, li)
+ if err != nil {
+ kata.Pesan = err.Error()
+ err = nil
+ break
+ }
if defKata == nil {
break
}
diff --git a/kata_test.go b/kata_test.go
index 83e9177..7f9c4a5 100644
--- a/kata_test.go
+++ b/kata_test.go
@@ -34,10 +34,17 @@ func TestKata_parseHTMLEntri(t *testing.T) {
},
}},
},
+ }, {
+ infile: "testdata/entri_analisa.html",
+ exp: &Kata{
+ Definisi: []*DefinisiKata{{
+ Isi: `Bentuk tidak baku dari "analisis"`,
+ }},
+ },
}}
for _, c := range cases {
- htmlBody, err := ioutil.ReadFile("testdata/entri.html")
+ htmlBody, err := ioutil.ReadFile(c.infile)
if err != nil {
t.Fatal(err)
}
diff --git a/telegram_bot.go b/telegram_bot.go
index cf023ab..1304972 100644
--- a/telegram_bot.go
+++ b/telegram_bot.go
@@ -128,6 +128,11 @@ func formatText(definisiKata DefinisiResponse) string {
for k, kata := range definisiKata {
fmt.Fprintf(buf, "<b>%s</b>\n", k)
+ if len(kata.Pesan) > 0 {
+ fmt.Fprintln(buf, " "+kata.Pesan)
+ fmt.Fprintln(buf, "")
+ continue
+ }
if len(kata.Dasar) > 0 {
fmt.Fprintf(buf, " Kata dasar: <i>%s</i>\n\n",
kata.Dasar)
diff --git a/testdata/entri.html b/testdata/entri.html
index 9c53f07..1899950 100644
--- a/testdata/entri.html
+++ b/testdata/entri.html
@@ -19,10 +19,10 @@
<script src="/bundles/modernizr?v=inCVuEFe6J4Q07A0AcRsbJic_UE5MwpRMNGcOtk94TE1"></script>
</head>
- <body style="font-family:Verdana, Geneva, Tahoma, sans-serif">
+ <body style="font-family: Verdana, Geneva, Tahoma, sans-serif;">
<div
class="navbar navbar-inverse navbar-fixed-top"
- style="background-color:#110063;border-color:gold"
+ style="background-color: #110063; border-color: gold;"
>
<div class="container">
<div class="navbar-header">
@@ -30,14 +30,14 @@
src="/Content/Images/Logo-Tut-Wuri-Handayani-blue.png"
height="40px;"
width="40px;"
- style="margin:5px;"
+ style="margin: 5px;"
/>
<button
type="button"
class="navbar-toggle"
data-toggle="collapse"
data-target=".navbar-collapse"
- style="background-color:#110063;border-color:gold;"
+ style="background-color: #110063; border-color: gold;"
>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
@@ -45,18 +45,30 @@
</button>
<a
href="/Beranda"
- style="color:gold;text-decoration:none;margin-left:5px;margin-right:5px;font-size:larger"
+ style="
+ color: gold;
+ text-decoration: none;
+ margin-left: 5px;
+ margin-right: 5px;
+ font-size: larger;
+ "
>KBBI Daring</a
>
</div>
<div
class="navbar-collapse collapse"
- style="background-color:#110063;color:gold;border-top-color:gold"
+ style="
+ background-color: #110063;
+ color: gold;
+ border-top-color: gold;
+ "
>
<ul class="nav navbar-nav">
- <li><a href="/" style="color:gold">Cari</a></li>
+ <li><a href="/" style="color: gold;">Cari</a></li>
<li>
- <a href="/Beranda/SeputarLaman" style="color:gold"
+ <a
+ href="/Beranda/SeputarLaman"
+ style="color: gold;"
>Seputar Laman</a
>
</li>
@@ -76,7 +88,7 @@
<li>
<a
href="/Manage"
- style="color:gold"
+ style="color: gold;"
title="Lakukan Manajemen Akun"
>Halo Shulhan!</a
>
@@ -84,7 +96,7 @@
<li>
<a
href="javascript:document.getElementById('logoutForm').submit()"
- style="color:gold"
+ style="color: gold;"
>Keluar</a
>
</li>
@@ -96,12 +108,12 @@
<div class="container body-content">
<script src="/bundles/jquery?v=2u0aRenDpYxArEyILB59ETSCA2cfQkSMlxb6jbMBqf81"></script>
<script>
- $(function() {
+ $(function () {
$(".entrisButton").hover(
- function() {
+ function () {
$(this).fadeTo(1, 1)
},
- function() {
+ function () {
$(this).fadeTo(1, 0.18)
},
)
@@ -145,7 +157,7 @@
value="informasi"
type="text"
class="form-control form-control-max"
- style="margin-top:1px;"
+ style="margin-top: 1px;"
placeholder="Pencarian..."
/>
<span class="input-group-btn">
@@ -159,7 +171,7 @@
</div>
<h3 id="errorMessageDiv"></h3>
<script>
- String.prototype.contains = function(it) {
+ String.prototype.contains = function (it) {
return this.indexOf(it) != -1
}
function searchText(ev) {
@@ -188,7 +200,7 @@
</form>
<hr />
- <h2 style="margin-bottom:3px">
+ <h2 style="margin-bottom: 3px;">
in.for.ma.si
<small
><span class="entrisButton"
@@ -201,7 +213,7 @@
><span
title="Usulkan entri baru berdasarkan entri ini"
class="glyphicon glyphicon-duplicate"
- style="color:darkcyan"
+ style="color: darkcyan;"
></span></a
><a href="../DataDasarEntri/Details?eid=31762"
><span
@@ -211,7 +223,7 @@
><span
title="Sejarah redaksi - entri ini tidak memiliki sejarah redaksi"
class="glyphicon glyphicon-book"
- style="color:lightgrey"
+ style="color: lightgrey;"
></span
><a href="https://www.google.com/#q=informasi"
><span
@@ -262,7 +274,7 @@
>
</li>
</ol>
- <h4 style="padding-top:6px;">Kata Turunan</h4>
+ <h4 style="padding-top: 6px;">Kata Turunan</h4>
<ul style="list -style: none;" class="adjusted-par">
<li>
<a href="../../entri/menginformasikan"
@@ -270,7 +282,7 @@
>
</li>
</ul>
- <h4 style="padding-top:6px;">Gabungan Kata</h4>
+ <h4 style="padding-top: 6px;">Gabungan Kata</h4>
<ul style="list -style: none;" class="adjusted-par">
<li>
<a href="../../entri/informasi%20elektronik"
@@ -373,16 +385,16 @@
setSelectionRange(input, pos, pos)
}
- $(document).ready(function() {
+ $(document).ready(function () {
// Catch all events related to changes http://stackoverflow.com/questions/21215049/disable-text-entry-in-input-type-number
- $(".number-input").on("change keyup", function() {
+ $(".number-input").on("change keyup", function () {
var sanitized = $(this)
.val()
.replace(/[^0-9]/g, "") // Remove invalid characters
$(this).val(sanitized) // Update value
})
- $(function() {
+ $(function () {
var tb = document.getElementById("textBoxSearch")
if (tb) {
var val = $("#textBoxSearch").val()
diff --git a/testdata/entri_analisa.html b/testdata/entri_analisa.html
new file mode 100644
index 0000000..9ba807d
--- /dev/null
+++ b/testdata/entri_analisa.html
@@ -0,0 +1,342 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta
+ name="viewport"
+ content="width=device-width, initial-scale=1.0"
+ />
+ <meta
+ name="keywords"
+ content="kbbi, kbbi online, kbbi daring, kbbi dalam jaringan, kbbi 5, kbbi V, kbbi online terbaru, kbbi terbaru, kbbi resmi, Kamus Besar Bahasa Indonesia, Badan Bahasa, Pusat Bahasa, kamus bahasa Indonesia, kamus daring, kamus indonesia,"
+ />
+ <link rel="icon" href="/kbbi-daring-3.ico" />
+ <title>Hasil Pencarian - KBBI Daring</title>
+ <link
+ href="/Content/css?v=oq5T2FgFNthYPMx1RHccxOAHAzzHSva0HzZ7iXO7RRY1"
+ rel="stylesheet"
+ />
+
+ <script src="/bundles/modernizr?v=inCVuEFe6J4Q07A0AcRsbJic_UE5MwpRMNGcOtk94TE1"></script>
+ </head>
+ <body style="font-family: Verdana, Geneva, Tahoma, sans-serif;">
+ <div
+ class="navbar navbar-inverse navbar-fixed-top"
+ style="background-color: #110063; border-color: gold;"
+ >
+ <div class="container">
+ <div class="navbar-header">
+ <img
+ src="/Content/Images/Logo-Tut-Wuri-Handayani-blue.png"
+ height="40px;"
+ width="40px;"
+ style="margin: 5px;"
+ />
+ <button
+ type="button"
+ class="navbar-toggle"
+ data-toggle="collapse"
+ data-target=".navbar-collapse"
+ style="background-color: #110063; border-color: gold;"
+ >
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a
+ href="/Beranda"
+ style="
+ color: gold;
+ text-decoration: none;
+ margin-left: 5px;
+ margin-right: 5px;
+ font-size: larger;
+ "
+ >KBBI Daring</a
+ >
+ </div>
+ <div
+ class="navbar-collapse collapse"
+ style="
+ background-color: #110063;
+ color: gold;
+ border-top-color: gold;
+ "
+ >
+ <ul class="nav navbar-nav">
+ <li><a href="/" style="color: gold;">Cari</a></li>
+ <li>
+ <a
+ href="/Beranda/SeputarLaman"
+ style="color: gold;"
+ >Seputar Laman</a
+ >
+ </li>
+ </ul>
+ <form
+ action="/Account/LogOff"
+ class="navbar-right"
+ id="logoutForm"
+ method="post"
+ >
+ <input
+ name="__RequestVerificationToken"
+ type="hidden"
+ value="S1pOnzWTQn0qbprhG9bMrC2fYckZS9BO8NZO4CE0mS8LRyW7GKyg303gEDWLZpzf0RURhBcZNfNnjlL05N_xcLvnVBWcVeTYn6pgoTQpnmCxicWd01JnnJs-RKDi9e1P6VZPEajoFg2DjZlS91a4Bw2"
+ />
+ <ul class="nav navbar-nav navbar-right">
+ <li>
+ <a
+ href="/Manage"
+ style="color: gold;"
+ title="Lakukan Manajemen Akun"
+ >Halo Shulhan!</a
+ >
+ </li>
+ <li>
+ <a
+ href="javascript:document.getElementById('logoutForm').submit()"
+ style="color: gold;"
+ >Keluar</a
+ >
+ </li>
+ </ul>
+ </form>
+ </div>
+ </div>
+ </div>
+ <div class="container body-content">
+ <script src="/bundles/jquery?v=2u0aRenDpYxArEyILB59ETSCA2cfQkSMlxb6jbMBqf81"></script>
+ <script>
+ $(function () {
+ $(".entrisButton").hover(
+ function () {
+ $(this).fadeTo(1, 1)
+ },
+ function () {
+ $(this).fadeTo(1, 0.18)
+ },
+ )
+ })
+ </script>
+ <br />
+
+ <div>
+ <h4 class="text-center">
+ <span
+ class="glyphicon glyphicon-info-sign text-primary"
+ ></span>
+ <b>Halo Shulhan!</b>
+ Sudahkah Anda mengecek
+ <a href="/Manage">halaman manajemen akun Anda</a>? Anda
+ dapat melihat cara membukanya
+ <a href="/Beranda/Bantuan#pertanyaan-1">di sini</a>. Jika
+ Anda pernah mengajukan
+ <a href="/Manage/ProposalDibuat">usulan-usulan</a>,
+ mungkin usulan-usulan tersebut telah diproses oleh redaksi
+ kami.
+ </h4>
+ <br />
+ </div>
+
+ <form
+ action="/entri/nul"
+ class="form-horizontal"
+ id="searchForm"
+ method="post"
+ onsubmit="searchText(event)"
+ role="form"
+ >
+ <div class="form-group">
+ <div class="col-md-2"></div>
+ <div class="col-md-8">
+ <div class="input-group form-control-max">
+ <input
+ id="textBoxSearch"
+ name="frasa"
+ value="analisa"
+ type="text"
+ class="form-control form-control-max"
+ style="margin-top: 1px;"
+ placeholder="Pencarian..."
+ />
+ <span class="input-group-btn">
+ <span
+ class="btn btn-primary glyphicon glyphicon-search"
+ onclick="searchText(event)"
+ ></span>
+ </span>
+ </div>
+ </div>
+ </div>
+ <h3 id="errorMessageDiv"></h3>
+ <script>
+ String.prototype.contains = function (it) {
+ return this.indexOf(it) != -1
+ }
+ function searchText(ev) {
+ var val = $("#textBoxSearch").val()
+ ev.preventDefault()
+ if (!val) {
+ $("#errorMessageDiv").replaceWith(
+ '<h3 id="errorMessageDiv"><font color="red"><p class="text-center add-margin-top-5"><i>Kotak pencarian tidak boleh kosong</i></p></font></h3>',
+ )
+ } else {
+ if (
+ val.contains(".") ||
+ val.contains("?") ||
+ val.toLowerCase() == "nul" ||
+ val.toLowerCase() == "bin"
+ ) {
+ //for non-dependent respond
+ window.location.href =
+ "/" + "Cari/Hasil?frasa=" + val
+ } else {
+ window.location.href = "/" + "entri/" + val
+ }
+ }
+ }
+ </script>
+ </form>
+
+ <hr />
+ <h2 style="margin-bottom: 3px;">
+ ana.li.sa
+ <small
+ ><span class="entrisButton"
+ ><a href="../DataDasarEntri/Edit?eid=3476"
+ ><span
+ title="Ubah"
+ class="glyphicon glyphicon-edit text-success"
+ ></span></a
+ ><a href="../DataDasarEntri/Copy?eid=3476"
+ ><span
+ title="Usulkan entri baru berdasarkan entri ini"
+ class="glyphicon glyphicon-duplicate"
+ style="color: darkcyan;"
+ ></span></a
+ ><a href="../DataDasarEntri/Details?eid=3476"
+ ><span
+ title="Detail"
+ class="glyphicon glyphicon-list-alt text-info"
+ ></span></a
+ ><span
+ title="Sejarah redaksi - entri ini tidak memiliki sejarah redaksi"
+ class="glyphicon glyphicon-book"
+ style="color: lightgrey;"
+ ></span
+ ><a href="https://www.google.com/#q=analisa"
+ ><span
+ title="Cari di Google"
+ class="glyphicon glyphicon-search text-primary"
+ ></span></a></span
+ ></small>
+ </h2>
+ <p>
+ <a href="http://tesaurus.kemdikbud.go.id/tematis/lema/analisa"
+ >&#x21E2; Tesaurus</a
+ >
+ </p>
+ <ul style="list-style: none;" class="adjusted-par">
+ <li>
+ <font color="red"><i> </i></font>&rarr;
+ <a href="../../entri/analisis">analisis</a>
+ </li>
+ </ul>
+ <br /><br />
+ <h4>
+ <a href="/DataDasarEntri/Create" class="entrisButton"
+ ><span
+ title="Usulkan entri baru"
+ class="glyphicon glyphicon-plus-sign text-success"
+ ></span
+ >Usulkan entri baru</a
+ >
+ </h4>
+ <hr />
+ <footer>
+ <p>
+ &copy; 2016
+ <a href="http://badanbahasa.kemdikbud.go.id/"
+ >Badan Pengembangan dan Pembinaan Bahasa</a
+ >, Kementerian Pendidikan dan Kebudayaan Republik
+ Indonesia
+ </p>
+ <p>
+ Versi luring:
+ <a
+ class="btn btn-primary"
+ href="https://play.google.com/store/apps/details?id=yuku.kbbi5&hl=in"
+ >Android</a
+ >
+ |
+ <a
+ class="btn btn-primary"
+ href="https://itunes.apple.com/app/kamus-besar-bahasa-indonesia/id1173573777"
+ >iOS</a
+ >
+ ||
+ <span title="by: Ian K"
+ >Versi daring: 3.0.0.0-20200410085735</span
+ >
+ </p>
+ </footer>
+ </div>
+ <script src="/bundles/jquery?v=2u0aRenDpYxArEyILB59ETSCA2cfQkSMlxb6jbMBqf81"></script>
+
+ <script src="/bundles/bootstrap?v=7k-mK_Lw6GRA4MkvIrgrWipUHc3KUDohIwN2DDpspCI1"></script>
+
+ <!-- Global site tag (gtag.js) - Google Analytics -->
+ <script
+ async
+ src="https://www.googletagmanager.com/gtag/js?id=UA-128199158-1"
+ ></script>
+ <script>
+ window.dataLayer = window.dataLayer || []
+ function gtag() {
+ dataLayer.push(arguments)
+ }
+ gtag("js", new Date())
+
+ gtag("config", "UA-128199158-1")
+ </script>
+
+ <script>
+ function setSelectionRange(input, selectionStart, selectionEnd) {
+ if (input.setSelectionRange) {
+ input.focus()
+ input.setSelectionRange(selectionStart, selectionEnd)
+ } else if (input.createTextRange) {
+ var range = input.createTextRange()
+ range.collapse(true)
+ range.moveEnd("character", selectionEnd)
+ range.moveStart("character", selectionStart)
+ range.select()
+ }
+ }
+
+ function setCaretToPos(input, pos) {
+ setSelectionRange(input, pos, pos)
+ }
+
+ $(document).ready(function () {
+ // Catch all events related to changes http://stackoverflow.com/questions/21215049/disable-text-entry-in-input-type-number
+ $(".number-input").on("change keyup", function () {
+ var sanitized = $(this)
+ .val()
+ .replace(/[^0-9]/g, "") // Remove invalid characters
+ $(this).val(sanitized) // Update value
+ })
+
+ $(function () {
+ var tb = document.getElementById("textBoxSearch")
+ if (tb) {
+ var val = $("#textBoxSearch").val()
+ var caretPos = val.length
+ setCaretToPos(tb, caretPos)
+ }
+ })
+ })
+ </script>
+ </body>
+</html>