# Penghitung Kata & Keterbacaan

Web tool untuk menghitung statistik teks (kata, karakter, kalimat, paragraf) dan
menampilkan skor keterbacaan Flesch, langsung di browser tanpa mengirim data ke server.

## Cara menjalankan

Tidak perlu instalasi. Dari root repo:

```bash
python3 -m http.server 8000
# lalu buka http://localhost:8000/apps/kata-hitung/
```

Atau buka `index.html` langsung di browser (file://).

## Cara kerja

Ketik atau tempel teks di kolom input — statistik dihitung ulang secara langsung
(debounce ±150 ms) tanpa tombol. "Salin hasil" menyalin ringkasan ke clipboard;
"Hapus" mengosongkan kolom dan mereset hasil.

## Statistik yang dihitung

| Metrik | Definisi |
| --- | --- |
| Kata | Rangkaian karakter non-whitespace, dipisah whitespace (`/\s+/`). |
| Karakter (dengan spasi) | Panjang string apa adanya. |
| Karakter (tanpa spasi) | Panjang string setelah semua whitespace dihapus. |
| Kalimat | Diakhiri `.` `!` `?` yang diikuti spasi atau akhir teks. Bila tidak ada tanda akhir, teks diperlakukan sebagai 1 kalimat (lihat batasan). |
| Paragraf | Blok teks yang dipisah satu baris kosong atau lebih. |
| Rata-rata kata/kalimat | `kata ÷ kalimat`, dibulatkan 1 desimal. |
| Estimasi waktu baca | `kata ÷ 200 menit` (asumsi **200 kata/menit** — angka umum, bukan fakta terukur untuk Bahasa Indonesia, dinyatakan eksplisit di UI). |

## Skor keterbacaan

> **Penting:** kedua rumus di bawah dirancang untuk **Bahasa Inggris** dan di sini
> dipakai sebagai **estimasi adaptasi untuk Bahasa Indonesia**. Hasilnya bukan
> pengukuran keterbacaan yang tervalidasi untuk Bahasa Indonesia — gunakan sebagai
> panduan kasar, bukan standar absolut.

### Flesch Reading Ease (Flesch, 1948)

```
FRE = 206,835 − 1,015 × (kata ÷ kalimat) − 84,6 × (suku kata ÷ kata)
```

Skala 0–100; makin tinggi makin mudah dibaca.

| Skor | Label |
| --- | --- |
| 90–100 | Sangat Mudah |
| 80–89 | Mudah |
| 70–79 | Cukup Mudah |
| 60–69 | Standar |
| 50–59 | Cukup Sulit |
| 30–49 | Sulit |
| 0–29 | Sangat Sulit |

### Flesch-Kincaid Grade Level (Kincaid dkk., US Navy, 1975)

```
FKGL = 0,39 × (kata ÷ kalimat) + 11,8 × (suku kata ÷ kata) − 15,59
```

Hasilnya jenjang kelas sekolah AS (mis. 8,0 ≈ kelas 8). Angka ini dilaporkan
apa adanya sebagai "setara kelas AS" dan **tidak diklaim** sebagai jenjang
sekolah Indonesia.

### Heuristik suku kata (adaptasi Bahasa Indonesia)

Suku kata dihitung per kata dengan heuristik kelompok vokal:

1. Tiap gugus huruf vokal berurutan (`a, e, i, o, u`) dalam satu kata dihitung
   satu suku kata.
2. Diftong umum Indonesia (`ai`, `au`, `oi`, `ia`, `ua`, `ui`, `iu`) dihitung
   satu gugus vokal (satu suku kata), bukan dua.
3. Kata tanpa vokal (mis. singkatan, angka) = 1 suku kata.
4. Minimum 1 suku kata per kata.

Contoh:
- "kucing" → ku·cing → 2 gugus vokal (`u`, `i`) → **2 suku kata** ✓
- "tikar" → ti·kar → 2 gugus vokal (`i`, `a`) → **2 suku kata** ✓
- "menyenangkan" → me·nye·nang·kan → 3 gugus (`e`, `e`, `a`) → **3 suku kata**
  (heuristik; hitungan fonetis sesungguhnya bisa berbeda)
- "air" → air → diftong `ai` = 1 gugus + `r` → **1 suku kata**

**Alasan heuristik ini:** suku kata Bahasa Indonesia sebagian besar bersifat
fonetis sehingga pendekatan kelompok vokal cukup mendekati untuk estimasi — tetapi
ini tetap estimasi, bukan hitungan kamus. Untuk teks pendek, hasil bisa menyimpang
jauh dari skor "sesungguhnya".

## Verifikasi fungsi murni (teks uji; tasks.md #15)

### Teks uji 1: `"Kucing itu tidur di atas tikar."`

| Metrik | Hitungan tangan | Kode |
| --- | --- | --- |
| Kata | 6 | 6 |
| Karakter (dg spasi) | 31 | 31 |
| Karakter (tanpa spasi) | 26 | 26 |
| Kalimat | 1 | 1 |
| Suku kata | ku(2)+itu(2)+tidur(2)+di(1)+atas(2)+tikar.(2) = **11** | 11 |
| FRE | 206,835 − 1,015×(6/1) − 84,6×(11/6) = 206,835 − 6,09 − 155,1 = **45,6** | 45,6 |
| FKGL | 0,39×(6/1) + 11,8×(11/6) − 15,59 = 2,34 + 21,633 − 15,59 = **8,4** | 8,4 |

*Catatan FRE rendah (45,6 → "Sulit") meskipun kalimat sederhana: ini ekspektasi
yang wajar karena heuristik suku kata Indonesia menghasilkan rasio suku kata/kata
lebih tinggi dari teks Inggris yang setara, mendorong skor ke bawah. Ini tercatat
sebagai batasan adaptasi.*

### Teks uji 2 (3 kalimat)

Teks: `"Hari ini cerah. Burung berkicau. Angin sepoi."`

| Metrik | Hitungan tangan | Kode |
| --- | --- | --- |
| Kata | 7 | 7 |
| Kalimat | 3 | 3 |
| Suku kata (est.) | hari(2)+ini(2)+cerah.(2)+burung(2)+berkicau.(3)+angin(2)+sepoi.(2) = **15** | 15 |
| FRE | 206,835 − 1,015×(7/3) − 84,6×(15/7) ≈ 206,835 − 2,368 − 181,286 = **23,2** | 23,2 |
| FKGL | 0,39×(7/3) + 11,8×(15/7) − 15,59 ≈ 0,91 + 25,286 − 15,59 = **10,6** | 10,6 |

## Batasan yang diketahui

- **Singkatan dan elipsis:** "Dr. Smith" dihitung dua kalimat (titik setelah "Dr"
  terbaca sebagai akhir kalimat). Ini dicatat sebagai batasan, bukan bug.
- **Teks tanpa tanda baca:** diperlakukan sebagai 1 kalimat. Cocok untuk daftar
  poin pendek; tidak cocok untuk prosa panjang tanpa titik.
- **Angka dan kode:** angka seperti "2024" atau kode seperti "HTTP" dihitung
  1 suku kata per kata oleh heuristik vokal.
- **Skor pada teks pendek:** FRE dan FKGL bisa menghasilkan nilai di luar rentang
  normal (negatif atau > 100) untuk teks sangat pendek. Nilai mentah tetap dihitung;
  tampilan dijepit ke 0 untuk FKGL.
- **Validasi rumus:** nilai harapan di tabel "Verifikasi" di atas dihitung tangan
  dan dicocokkan dengan keluaran kode. Bila hasil berbeda, kode diperbaiki — nilai
  harapan tidak diubah diam-diam.
