prpm-dbp 0.12.0 → 0.13.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
@@ -275,6 +275,29 @@ Siri yang sama membezakan kaf Arab daripada kaf Jawi secara eksplisit, iaitu per
275
275
 
276
276
  Buku itu berhak cipta terpelihara (PNM). Ia dirujuk di sini sebagai pengesahan, bukan disalin.
277
277
 
278
+ ## Homograf
279
+
280
+ Ejaan Jawi menggunakan empat huruf vokal berbanding enam dalam Rumi, jadi perkataan berbeza kerap berkongsi ejaan. Diukur pada 64,251 ejaan Jawi dalam data: **2,009 (3%) ialah homograf**.
281
+
282
+ Panduan DBP membahagikannya kepada dua:
283
+
284
+ | Jenis | Layanan | Contoh |
285
+ |---|---|---|
286
+ | **Hakiki** | **dibenarkan kekal**, tidak dibezakan | `biru`/`biro` بيرو, `burung`/`borong` بوروڠ, `satu`/`sato` ساتو |
287
+ | **Tidak hakiki** | dibezakan dengan alif | `kampung` کامڤوڠ / `kempung` کمڤوڠ |
288
+
289
+ Jenis kedua ialah Pedoman §8.17 (juga Klinik Jawi Siri ke-35): alif melambangkan [a] di suku kata tertutup untuk membezakannya daripada pepet yang tidak dilambangkan. **Ejaan DBP sudah mengandungi peraturan ini**, jadi pakej tidak perlu menjananya. Sembilan pasangan rujukan diuji, kesemuanya dibezakan dengan betul.
290
+
291
+ Jenis pertama pula tidak boleh diselesaikan oleh mana-mana peraturan. Itulah sebab `rumi` melaporkan semua calon dan enggan memilih: bagi homograf hakiki, DBP sendiri menyatakan kekaburan itu dibenarkan dan hanya konteks ayat boleh menyelesaikannya.
292
+
293
+ `--homograf` menandakan perkataan yang ejaan Jawinya dikongsi, supaya penulis tahu sebelum menghantar bahawa pembaca akan bergantung pada konteks:
294
+
295
+ ```
296
+ $ npx prpm-dbp jawi nota.txt --homograf
297
+ اݢام ايت ساتو دان بوروڠ تربڠ.
298
+ homograf, ejaan Jawi dikongsi (3): اݢام=agama/igama, ساتو=satu/sato, بوروڠ=burung/borong
299
+ ```
300
+
278
301
  ## Rantai kepercayaan
279
302
 
280
303
  Setiap ejaan Jawi yang dikeluarkan membawa asal-usulnya. Jangan runtuhkan lapisan ini.
package/bin/cli.js CHANGED
@@ -36,6 +36,7 @@ const BANTUAN = `prpm-dbp — semak Bahasa Melayu dan Jawi terhadap PRPM DBP
36
36
  Pilihan: --refresh --had <n> --delay <ms> --json --cepat
37
37
  --pedoman jana imbuhan ikut peraturan DBP (88-98% tepat, hasil ditanda)
38
38
  --luar-talian jangan sentuh rangkaian langsung (wajib untuk laluan permintaan app)
39
+ --homograf tandakan perkataan yang ejaan Jawinya dikongsi perkataan lain
39
40
 
40
41
  Cache: ${CACHE_PATH}
41
42
  `
@@ -51,6 +52,7 @@ function huraiArgs(argv) {
51
52
  else if (a === '--cepat') pilihan.cepat = true
52
53
  else if (a === '--pedoman') pilihan.pedoman = true
53
54
  else if (a === '--luar-talian') pilihan.luarTalian = true
55
+ else if (a === '--homograf') pilihan.homograf = true
54
56
  else if (a === '--jenis') pilihan.jenis = argv[++i]
55
57
  else if (a === '--had') pilihan.had = Number(argv[++i])
56
58
  else if (a === '--delay') pilihan.delay = Number(argv[++i])
@@ -164,6 +166,7 @@ async function main() {
164
166
  ...opts,
165
167
  cubaDasar: !pilihan.cepat,
166
168
  janaImbuhan: pilihan.pedoman,
169
+ semakHomograf: pilihan.homograf,
167
170
  })
168
171
  await saveCache(cache)
169
172
  if (pilihan.json) { keluar(h); break }
@@ -183,6 +186,12 @@ async function main() {
183
186
  h.dijanaPedoman.map((x) => `${x.kata}=${x.jawi} [${x.rujukan}]`).join(', '),
184
187
  )
185
188
  }
189
+ if (h.homograf?.length) {
190
+ console.error(
191
+ `homograf, ejaan Jawi dikongsi (${h.homograf.length}): ` +
192
+ h.homograf.map((x) => `${x.jawi}=${x.dikongsi.join('/')}`).join(', '),
193
+ )
194
+ }
186
195
  if (h.akronim.length) {
187
196
  console.error(`akronim, dikekalkan Rumi (${h.akronim.length}): ${h.akronim.join(', ')}`)
188
197
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prpm-dbp",
3
- "version": "0.12.0",
3
+ "version": "0.13.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/tukar.js CHANGED
@@ -218,7 +218,13 @@ export function pilihCalon(masuk) {
218
218
  * Perkataan yang tidak disahkan dibalut penanda, tidak pernah direka.
219
219
  */
220
220
  export async function keJawi(teks, cache, opts = {}) {
221
- const { penanda = ['«', '»'], cubaDasar = true, gunaDataset = true, janaImbuhan = false } = opts
221
+ const {
222
+ penanda = ['«', '»'],
223
+ cubaDasar = true,
224
+ gunaDataset = true,
225
+ janaImbuhan = false,
226
+ semakHomograf = false,
227
+ } = opts
222
228
  const belumDisahkan = []
223
229
  const terbitanSah = []
224
230
  const dariDataset = []
@@ -312,6 +318,25 @@ export async function keJawi(teks, cache, opts = {}) {
312
318
  keluar.push(penanda[0] + cebis + penanda[1])
313
319
  }
314
320
 
321
+ // Amaran homograf. Ejaan Jawi yang dikongsi dua perkataan Rumi akan taksa
322
+ // apabila dibaca semula. Menurut panduan DBP, homograf HAKIKI (kongsi
323
+ // vokal wau/ya, kata Melayu lawan kata asing, bentuk berimbuhan) memang
324
+ // dibenarkan kekal dan tidak dibezakan. Jadi ini bukan ralat: ia maklumat
325
+ // supaya penulis tahu konteks ayat perlu menanggung beban perbezaan itu.
326
+ const homograf = []
327
+ if (semakHomograf) {
328
+ const songsang = petaSongsang(cache, await muatDataset())
329
+ for (const [k, cebis] of bahagian.entries()) {
330
+ if (k % 2 === 0) continue
331
+ const hasil = keluar[k]
332
+ if (!hasil || hasil.startsWith(penanda[0])) continue
333
+ const pilihan = pilihCalon(songsang.get(normalisasiJawi(hasil)))
334
+ if (pilihan && pilihan.calon.length > 1) {
335
+ homograf.push({ kata: cebis, jawi: hasil, dikongsi: pilihan.calon })
336
+ }
337
+ }
338
+ }
339
+
315
340
  // Pedoman DBP §14.1: kata sendi di dan ke bercantum dengan kata berikutnya.
316
341
  // Dibuat sebagai lulusan kedua supaya logik carian di atas kekal mudah.
317
342
  const sendiDicantum = []
@@ -337,6 +362,7 @@ export async function keJawi(teks, cache, opts = {}) {
337
362
  dariDataset,
338
363
  dariNama,
339
364
  kataUlang,
365
+ homograf,
340
366
  dijanaPedoman,
341
367
  namaKhas: [...new Set(namaKhas)],
342
368
  akronim: [...new Set(akronim)],