prpm-dbp 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/SKILL.md CHANGED
@@ -176,6 +176,7 @@ Ia mati secara lalai kerana ketepatannya diukur, bukan diandaikan. Diuji terhada
176
176
  | `di-` | 2,435 | 92% |
177
177
  | `se-` | 1,605 | 90% |
178
178
  | `ke-` | 976 | 88% |
179
+ | `-kan` | 3,046 | 92% |
179
180
 
180
181
  Sebahagian kegagalan itu artifak ukuran (`tamu` bukan `ta`+`mu`), jadi ketepatan sebenar lebih tinggi. Walaupun begitu, 98% tidak cukup untuk menjana ejaan secara senyap dalam alat yang seluruh tujuannya menghalang Jawi yang nampak betul tetapi salah.
181
182
 
@@ -187,7 +188,9 @@ $ npx prpm-dbp jawi nota.txt --pedoman
187
188
  dijana ikut Pedoman, BELUM disahkan DBP (1): Abadinya=اباديڽ [Pedoman DBP §15.1]
188
189
  ```
189
190
 
190
- Peraturan yang dilaksanakan: §13.5-13.7 (awalan `di-`, `se-`, `ke-`), §13.10 (tiga cara akhiran `-an`), §13.11 (tiga cara akhiran `-i`), §15.1 (kata ganti singkat `ku`, `mu`, `nya`).
191
+ Peraturan yang dilaksanakan: §13.5-13.7 (awalan `di-`, `se-`, `ke-`), §13.9 (akhiran `-kan`), §13.10 (tiga cara akhiran `-an`), §13.11 (tiga cara akhiran `-i`), §15.1 (kata ganti singkat `ku`, `mu`, `nya`).
192
+
193
+ **Awas terhadap nota panduan tidak rasmi.** Nota sekolah sering menyatakan "huruf alif ditambah semula apabila menerima imbuhan" sebagai peraturan menyeluruh. Diuji terhadap data sebenar, itu tidak benar: `suka` سوک menjadi `sukakan` سوککن dan `lukanya` لوکڽ, kedua-duanya tanpa alif. Penambahan alif berlaku bagi `-an` dan `-i` sahaja, menurut Catatan §13.10(ii) dan §13.11(i).
191
194
 
192
195
  **Kodpoint setiap imbuhan disahkan empirik daripada dataset, bukan dibaca daripada peraturan.** Hamzah dalam akhiran ialah `ء` U+0621 berdiri sendiri, manakala dalam awalan ia `أ` U+0623 di atas alif. Peraturan bertulis tidak membezakan dua itu.
193
196
 
@@ -257,6 +260,21 @@ Urutan yang disyorkan:
257
260
 
258
261
  Dengan cara ini pengguna tidak pernah menunggu PRPM, dan PRPM tidak pernah menerima trafik daripada aplikasi anda.
259
262
 
263
+ ## Pengesahan bebas kodpoint
264
+
265
+ Keputusan lipatan kodpoint disahkan terhadap sumber kedua yang bebas: *Kaedah Pembelajaran Jawi: Peringkat Asas* (Haji Azman bin Haji Ahmad, Perpustakaan Negara Malaysia, 2015), Siri Ke-2 "Huruf Gubalan Melayu".
266
+
267
+ | Huruf | Kodpoint | Keputusan pakej |
268
+ |---|---|---|
269
+ | `ڤ` p | U+06A4 | bukan `پ` U+067E |
270
+ | `ڽ` ny | U+06BD | `پ` huruf berlainan, tidak pernah dilipat |
271
+ | `ݢ` g | U+0762 | varian `ڬ` U+06AC dilipat |
272
+ | `ک` kaf Jawi | U+06A9 | `ك` Arab U+0643 dilipat |
273
+
274
+ Siri yang sama membezakan kaf Arab daripada kaf Jawi secara eksplisit, iaitu perbezaan yang menyebabkan PRPM dan KamusDBP kelihatan bercanggah.
275
+
276
+ Buku itu berhak cipta terpelihara (PNM). Ia dirujuk di sini sebagai pengesahan, bukan disalin.
277
+
260
278
  ## Rantai kepercayaan
261
279
 
262
280
  Setiap ejaan Jawi yang dikeluarkan membawa asal-usulnya. Jangan runtuhkan lapisan ini.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prpm-dbp",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "Semak ejaan Bahasa Melayu dan Jawi terhadap PRPM Dewan Bahasa dan Pustaka. CLI dan skill untuk AI agent.",
5
5
  "keywords": [
6
6
  "bahasa-melayu",
package/src/kamus.js CHANGED
@@ -184,6 +184,13 @@ export async function cariKamus(kata, { timeout = 25000 } = {}) {
184
184
  * Lipatan ini sengaja konservatif. Ta marbutah (ة) tidak dilipat ke ha (ه)
185
185
  * kerana dalam sesetengah perkataan ia benar-benar membezakan makna.
186
186
  */
187
+ // Disahkan secara bebas terhadap "Kaedah Pembelajaran Jawi: Peringkat Asas"
188
+ // (Haji Azman bin Haji Ahmad, Perpustakaan Negara Malaysia, 2015), Siri Ke-2
189
+ // "Huruf Gubalan Melayu", yang menyenaraikan enam huruf ciptaan Melayu:
190
+ // چ U+0686 c ڠ U+06A0 ng ڤ U+06A4 p
191
+ // ݢ U+0762 g ۏ U+06CF v ڽ U+06BD ny
192
+ // Siri yang sama membezakan kaf Arab ك daripada kaf Jawi ک secara eksplisit.
193
+ // Kesemuanya sepadan dengan keputusan lipatan di bawah.
187
194
  const LIPATAN = new Map([
188
195
  ['ك', 'ک'], // ك Arabic Kaf -> ک Keheh
189
196
  ['ڪ', 'ک'], // ڪ Swash Kaf -> ک Keheh
package/src/pedoman.js CHANGED
@@ -185,6 +185,21 @@ export function imbuhAkhiranI(jawiDasar, rumiDasar) {
185
185
  return { jawi: jawiDasar + YA, rujukan: 'Pedoman DBP §13.11(iii)' }
186
186
  }
187
187
 
188
+ /**
189
+ * §13.9 — Akhiran -kan ditulis kaf-nun, dilekatkan terus tanpa perubahan
190
+ * pada kata dasar.
191
+ *
192
+ * Nota panduan sekolah sering menyatakan "huruf alif ditambah semula apabila
193
+ * menerima imbuhan". Itu terlalu menyeluruh: diuji terhadap data sebenar,
194
+ * suka سوک menjadi sukakan سوککن dan lukanya لوکڽ, tanpa alif. Penambahan
195
+ * alif berlaku bagi -an dan -i sahaja, menurut Catatan §13.10(ii) dan
196
+ * §13.11(i).
197
+ */
198
+ export function imbuhAkhiranKan(jawiDasar) {
199
+ if (!jawiDasar) return null
200
+ return { jawi: jawiDasar + 'کن', rujukan: 'Pedoman DBP §13.9' }
201
+ }
202
+
188
203
  /**
189
204
  * §15.1 — Kata ganti singkat ditulis serangkai dengan kata di depannya.
190
205
  * ku -> kaf-wau mu -> mim-wau nya -> nya
package/src/tukar.js CHANGED
@@ -14,6 +14,7 @@ import { cariDataset, muatDataset } from './dataset.js'
14
14
  import { cariNama, mungkinAkronim, mungkinNamaKhas } from './nama.js'
15
15
  import {
16
16
  imbuhAkhiranAn,
17
+ imbuhAkhiranKan,
17
18
  imbuhAkhiranI,
18
19
  imbuhAwalan,
19
20
  imbuhGanti,
@@ -113,6 +114,11 @@ async function janaIkutPedoman(kata, cache, opts, gunaDataset) {
113
114
  if (hasil) return hasil
114
115
  }
115
116
 
117
+ if (kata.endsWith('kan') && kata.length > 5) {
118
+ const hasil = imbuhAkhiranKan(await ejaan(kata.slice(0, -3)))
119
+ if (hasil) return hasil
120
+ }
121
+
116
122
  if (kata.endsWith('an') && kata.length > 4) {
117
123
  const dasar = kata.slice(0, -2)
118
124
  const hasil = imbuhAkhiranAn(await ejaan(dasar), dasar)