prpm-dbp 0.7.0 → 0.8.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
@@ -187,6 +187,24 @@ Peraturan yang dilaksanakan: §13.5-13.7 (awalan `di-`, `se-`, `ke-`), §13.10 (
187
187
 
188
188
  **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.
189
189
 
190
+ ## Apa yang sebenarnya tercicir
191
+
192
+ Diuji terhadap satu pelajaran Pendidikan Islam Tingkatan 4 sebenar (406 perkataan):
193
+
194
+ ```
195
+ disahkan DBP 223 | dari dataset 38 | kata sendi §14.1 3
196
+ nama khas 15 | belum disahkan 10
197
+ ```
198
+
199
+ **Tiada satu pun kata Melayu biasa tercicir.** Yang tinggal terbahagi kepada dua kategori sahaja:
200
+
201
+ | Kategori | Contoh | Selesaian |
202
+ |---|---|---|
203
+ | Istilah tajwid Arab | `Qasirah`, `Tawilah`, `Mukhaffaf`, `Muthaqqal`, `Sughra`, `Kubra`, `Waqaf`, `hijaiyah` | `nama` dengan `jenis: istilah`, sahkan sekali |
204
+ | Akronim | `KPM`, `DBP`, `KSSM`, `PBD`, `KBAT` | dilaporkan berasingan, kekal Rumi |
205
+
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
+
190
208
  ## Rantai kepercayaan
191
209
 
192
210
  Setiap ejaan Jawi yang dikeluarkan membawa asal-usulnya. Jangan runtuhkan lapisan ini.
package/bin/cli.js CHANGED
@@ -175,6 +175,9 @@ async function main() {
175
175
  h.dijanaPedoman.map((x) => `${x.kata}=${x.jawi} [${x.rujukan}]`).join(', '),
176
176
  )
177
177
  }
178
+ if (h.akronim.length) {
179
+ console.error(`akronim, dikekalkan Rumi (${h.akronim.length}): ${h.akronim.join(', ')}`)
180
+ }
178
181
  if (h.namaKhas.length) {
179
182
  console.error(
180
183
  `nama khas belum disahkan (${h.namaKhas.length}): ${h.namaKhas.join(', ')}\n` +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prpm-dbp",
3
- "version": "0.7.0",
3
+ "version": "0.8.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/nama.js CHANGED
@@ -55,6 +55,23 @@ export async function cariNama(kata) {
55
55
  return { ...rec, dijumpai: true, disahkanDbp: false }
56
56
  }
57
57
 
58
+ /**
59
+ * §19 — Akronim dan singkatan.
60
+ *
61
+ * Singkatan inisialisme (KPM, DBP, PDF, KSSM, PBD, KBAT) ialah kategori
62
+ * tersendiri, bukan salah eja dan bukan nama orang. Pedoman §19.3 dan §19.4
63
+ * menetapkan ia ditulis dengan huruf abjad Jawi berserta titik selepas
64
+ * setiap huruf, tetapi banyak dokumen pendidikan mengekalkannya dalam Rumi
65
+ * dengan sengaja. Alat ini tidak memutuskan bagi pihak anda: ia hanya
66
+ * mengasingkan akronim supaya keputusan itu dibuat sekali, bukan dianggap
67
+ * sebagai ejaan yang salah.
68
+ */
69
+ export function mungkinAkronim(kata) {
70
+ const k = String(kata)
71
+ // Dua huruf besar atau lebih berturut-turut, tanpa huruf kecil.
72
+ return /^[A-Z][A-Z0-9]+$/.test(k) && k.length >= 2
73
+ }
74
+
58
75
  /**
59
76
  * Teka sama ada perkataan itu nama khas.
60
77
  *
package/src/tukar.js CHANGED
@@ -11,7 +11,7 @@
11
11
  import { lookup } from './prpm.js'
12
12
  import { normalisasiJawi } from './kamus.js'
13
13
  import { cariDataset, muatDataset } from './dataset.js'
14
- import { cariNama, mungkinNamaKhas } from './nama.js'
14
+ import { cariNama, mungkinAkronim, mungkinNamaKhas } from './nama.js'
15
15
  import {
16
16
  imbuhAkhiranAn,
17
17
  imbuhAkhiranI,
@@ -194,6 +194,7 @@ export async function keJawi(teks, cache, opts = {}) {
194
194
  const namaKhas = []
195
195
  const kataUlang = []
196
196
  const dijanaPedoman = []
197
+ const akronim = []
197
198
  const bahagian = teks.split(PECAH_RUMI)
198
199
  const keluar = []
199
200
 
@@ -268,7 +269,11 @@ export async function keJawi(teks, cache, opts = {}) {
268
269
  // Nama khas yang belum disahkan bukan salah eja. Ia dilaporkan
269
270
  // berasingan supaya pengguna tahu apa yang perlu disahkan sekali, dan
270
271
  // bukan mengulang menyemak ejaan yang memang betul.
271
- if (mungkinNamaKhas(cebis, bahagian[i - 1])) namaKhas.push(cebis)
272
+ // §19: akronim ialah kategori tersendiri. Ia bukan salah eja dan bukan
273
+ // nama orang, jadi mencampurkannya dengan dua-dua itu menyembunyikan
274
+ // apa yang benar-benar perlu disemak.
275
+ if (mungkinAkronim(cebis)) akronim.push(cebis)
276
+ else if (mungkinNamaKhas(cebis, bahagian[i - 1])) namaKhas.push(cebis)
272
277
  else belumDisahkan.push(cebis)
273
278
  keluar.push(penanda[0] + cebis + penanda[1])
274
279
  }
@@ -300,6 +305,7 @@ export async function keJawi(teks, cache, opts = {}) {
300
305
  kataUlang,
301
306
  dijanaPedoman,
302
307
  namaKhas: [...new Set(namaKhas)],
308
+ akronim: [...new Set(akronim)],
303
309
  adaEntriTanpaJawi: [...new Set(adaEntriTanpaJawi)],
304
310
  belumDisahkan: [...new Set(belumDisahkan)],
305
311
  terbitanSah,