prpm-dbp 0.8.0 → 0.9.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
@@ -28,7 +28,7 @@ npx prpm-dbp lookup murid sekolah
28
28
  # semak setiap perkataan Rumi dalam fail wujud dalam PRPM
29
29
  npx prpm-dbp audit nota.txt
30
30
 
31
- # semak ejaan Jawi lawan teks Rumi sejajar (token ke-N lawan token ke-N)
31
+ # semak ejaan Jawi lawan teks Rumi sejajar
32
32
  npx prpm-dbp audit-jawi rph-jawi.txt rph-rumi.txt
33
33
 
34
34
  # panaskan cache dari senarai perkataan, bayar sekali guna selamanya
@@ -205,6 +205,10 @@ nama khas 15 | belum disahkan 10
205
205
 
206
206
  Inilah sebab transliterator pola suku kata (§7 hingga §9) **tidak dilaksanakan**. Ia tidak akan menyentuh satu pun perkataan di atas. Lebih buruk lagi, istilah tajwid itu kata serapan Arab, dan §11.1 menetapkan ejaan Jawinya ialah ejaan Arab asal — peraturan pola Melayu akan menghasilkan ejaan fonetik yang salah untuk setiap satu, iaitu tepat di tempat ia paling merosakkan.
207
207
 
208
+ **`audit-jawi` menggunakan enjin penukaran yang sama dengan `jawi`.** Teks Rumi ditukar dahulu, kemudian dibandingkan. Ini penting kerana §14.1 dan §17.1 mengubah bilangan token: `Murid ke sekolah` ialah tiga perkataan Rumi tetapi dua perkataan Jawi. Perbandingan kedudukan yang naif akan melaporkan output alat ini sendiri sebagai salah.
209
+
210
+ Dengan cara ini hanya ada **satu takrif "Jawi yang betul"** dalam pakej, bukan dua yang boleh menyimpang.
211
+
208
212
  ## Rantai kepercayaan
209
213
 
210
214
  Setiap ejaan Jawi yang dikeluarkan membawa asal-usulnya. Jangan runtuhkan lapisan ini.
@@ -244,7 +248,7 @@ Bila menulis teks BM atau Jawi yang akan dihantar kepada orang:
244
248
  |---|---|---|
245
249
  | `lulus` / `padan` | ada dalam PRPM, ejaan sepadan | tiada |
246
250
  | `belumDisahkan` | tiada entri dalam PRPM | semak ejaan, atau isytihar sebagai nama khas |
247
- | `salahEjaan` | Jawi ditulis tidak sama dengan PRPM | ganti dengan medan `sepatutnya` |
251
+ | `salahEjaan` | Jawi ditulis tidak sama dengan hasil penukaran | ganti dengan medan `sepatutnya` |
248
252
  | `tiadaRujukan` | PRPM tiada ejaan Jawi untuk kata itu | kekalkan, tanda kepada pengguna |
249
253
  | `gagalSemak` | rangkaian gagal | cuba semula, jangan anggap salah |
250
254
 
package/bin/cli.js CHANGED
@@ -4,7 +4,7 @@ import process from 'node:process'
4
4
 
5
5
  import { pasangSkill } from '../src/install.js'
6
6
  import { banding, cariKamus } from '../src/kamus.js'
7
- import { keJawi, keRumi } from '../src/tukar.js'
7
+ import { keJawi, keRumi, semakJawi } from '../src/tukar.js'
8
8
  import { huraiTsv, muatDataset, simpanDataset } from '../src/dataset.js'
9
9
  import { NAMA_PATH, muatNama, tambahNama } from '../src/nama.js'
10
10
  import {
@@ -49,6 +49,7 @@ function huraiArgs(argv) {
49
49
  else if (a === '--link') pilihan.link = true
50
50
  else if (a === '--cepat') pilihan.cepat = true
51
51
  else if (a === '--pedoman') pilihan.pedoman = true
52
+ else if (a === '--jenis') pilihan.jenis = argv[++i]
52
53
  else if (a === '--had') pilihan.had = Number(argv[++i])
53
54
  else if (a === '--delay') pilihan.delay = Number(argv[++i])
54
55
  else if (a === '--buang') pilihan.buang = argv[++i]
@@ -102,11 +103,11 @@ async function main() {
102
103
  case 'audit-jawi': {
103
104
  const [failJawi, failRumi] = baki
104
105
  if (!failJawi || !failRumi) throw new Error('perlu dua fail: <jawi> <rumi>')
105
- const laporan = await auditJawi(
106
+ const laporan = await semakJawi(
106
107
  await readFile(failJawi, 'utf8'),
107
108
  await readFile(failRumi, 'utf8'),
108
109
  cache,
109
- opts,
110
+ { ...opts, cubaDasar: !pilihan.cepat, janaImbuhan: pilihan.pedoman },
110
111
  )
111
112
  await saveCache(cache)
112
113
  keluar(laporan)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prpm-dbp",
3
- "version": "0.8.0",
3
+ "version": "0.9.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
@@ -407,3 +407,42 @@ export function keRumi(teksJawi, cache, { penanda = ['«', '»'], dataset = null
407
407
  lengkap: tidakDikenali.length === 0,
408
408
  }
409
409
  }
410
+
411
+ /**
412
+ * Semak teks Jawi terhadap teks Rumi sejajar, menggunakan enjin penukaran
413
+ * yang SAMA dengan `keJawi`.
414
+ *
415
+ * Versi lama membandingkan token ke-N lawan token ke-N. Itu pecah sebaik
416
+ * sahaja Pedoman §14.1 (kata sendi bercantum) dan §17.1 (kata ulang) mula
417
+ * digunakan, kerana kedua-duanya mengubah bilangan token: `Murid ke sekolah`
418
+ * ialah tiga perkataan Rumi tetapi dua perkataan Jawi. Akibatnya alat ini
419
+ * melaporkan outputnya sendiri sebagai salah.
420
+ *
421
+ * Sekarang teks Rumi ditukar dahulu, kemudian dibandingkan token demi token
422
+ * terhadap hasil itu. Dengan cara ini hanya ada satu takrif "Jawi yang betul"
423
+ * dalam pakej.
424
+ */
425
+ export async function semakJawi(jawiTeks, rumiTeks, cache, opts = {}) {
426
+ const jangkaan = await keJawi(rumiTeks, cache, opts)
427
+ const tokJangka = [...jangkaan.teks.matchAll(new RegExp(`[${JAWI_JULAT}\u0660-\u0669]+`, 'g'))].map((m) => m[0])
428
+ const tokAda = [...jawiTeks.matchAll(new RegExp(`[${JAWI_JULAT}\u0660-\u0669]+`, 'g'))].map((m) => m[0])
429
+
430
+ const salahEjaan = []
431
+ let padan = 0
432
+ for (const [i, jangka] of tokJangka.entries()) {
433
+ const ditulis = tokAda[i] ?? null
434
+ if (ditulis && normalisasiJawi(ditulis) === normalisasiJawi(jangka)) padan++
435
+ else salahEjaan.push({ kedudukan: i, ditulis, sepatutnya: jangka })
436
+ }
437
+
438
+ return {
439
+ tokenJawi: tokAda.length,
440
+ tokenDijangka: tokJangka.length,
441
+ kiraanTakSama: tokAda.length !== tokJangka.length,
442
+ padan,
443
+ salahEjaan,
444
+ belumDisahkan: jangkaan.belumDisahkan,
445
+ namaKhas: jangkaan.namaKhas,
446
+ akronim: jangkaan.akronim,
447
+ }
448
+ }