classic-newspaper-cli
v0.2.0
Published
Generate print-ready classic newspaper PDFs from validated JSON.
Readme
Classic Newspaper CLI
CLI Node.js untuk menyusun edisi koran hitam-putih siap cetak dari JSON. PDF dibuat langsung dengan PDFKit tanpa Chromium.
Karakter output
- Default edisi multiartikel: A3 portrait, grid halaman dalam hingga lima kolom
- Pilihan A3, A4, Letter, atau Tabloid
- Latar putih dan tinta hitam murni
- Masthead, tagline, kota, volume, nomor edisi, harga, tanggal, dan folio
- Headline utama, deck, byline, pull quote, running header, jump line, serta sumber
- Empat preset halaman depan terkunci:
classic,photo,text, dancompact, plus pemilihanauto - Tiga preset halaman dalam terkunci:
feature,balanced, dandigest, plus pemilihanauto - Preset mengubah geometri secara nyata tanpa menerima koordinat, font, margin, atau jumlah kolom mentah dari input
- Komposisi klasik mempertahankan area utama sekitar 80%, sidebar sekitar 20%, empat kolom simetris, dan dua berita bawah pada baseline yang sama
- Validasi kepadatan lead mengikuti preset yang dipilih, bukan satu ambang global untuk semua halaman depan
- Foto dan caption opsional untuk semua layout; tanpa foto tidak ada slot atau placeholder kosong
- Image artikel
feature/briefikut mengalir di halaman dalam, dengan tinggi mengikutiimportance - Halaman dalam memakai aliran kolom koran yang seimbang, divider tipis, serta jumlah kolom akhir adaptif agar tidak menyisakan setengah halaman kosong
- Font Times dan Helvetica standar PDF, tertanam dan tidak bergantung font lokal
- Margin aman cetak dan nomor halaman konsisten
- Satu artikel maksimal dua halaman; overflow menggagalkan output agar isi tidak terpotong diam-diam
Instalasi
npm install
npm linkMembuat PDF
newspaper ./edition.json --output ./edisi.pdf
newspaper ./edition.json --page-size TABLOID -o ./edisi-tabloid.pdfTanpa npm link:
node ./bin/newspaper.js ./examples/article-4-pages.json -o ./newspaper-4-pages.pdfSample:
# Format artikel lama, A4 satu halaman
npm run generate
# Edisi koran multiartikel A3 (nama historis; jumlah halaman mengikuti isi)
npm run generate:4-pagesFormat edisi
{
"publication": "HARIAN CAKRAWALA",
"tagline": "Jernih Membaca Perubahan",
"city": "Yogyakarta",
"volume": "XVIII",
"issue": "214",
"price": "Rp 8.000",
"date": "2026-09-10",
"pageSize": "A3",
"locale": "id-ID",
"composition": {
"front": "auto",
"inside": "auto",
"pages": [
{ "page": 2, "template": "feature" },
{ "page": 3, "template": "digest" }
]
},
"articles": [
{
"layout": "lead",
"section": "Laporan Utama",
"title": "Judul Utama Edisi",
"subtitle": "Deck atau ringkasan di bawah headline.",
"author": "Nama Penulis",
"location": "Jakarta",
"pullQuote": "Kutipan penting artikel.",
"importance": 10,
"image": {
"path": "./foto-utama.jpg",
"caption": "Keterangan foto yang informatif.",
"credit": "Foto: Nama Fotografer"
},
"body": ["Paragraf pertama.", "Paragraf kedua."],
"source": {
"name": "Nama sumber",
"url": "https://example.com/artikel",
"accessedAt": "10 September 2026"
}
},
{
"layout": "brief",
"section": "Ekonomi",
"title": "Headline Berita Pendek",
"subtitle": "Ringkasan singkat.",
"body": ["Isi berita pendek."],
"source": "Desk Ekonomi"
}
]
}image opsional kecuali bila composition.front memakai photo. Jika dihilangkan, headline dan teks langsung memakai ruang halaman tanpa menyisakan kotak kosong.
Komposisi halaman
Field artikel layout tetap berarti peran editorial: lead, feature, atau brief. Template halaman dipilih terpisah melalui composition.
{
"composition": {
"front": "compact",
"inside": "balanced",
"pages": [{ "page": 2, "template": "feature" }]
}
}| Front preset | Pilih ketika |
| --- | --- |
| classic | Lead panjang dan struktur halaman depan tradisional dibutuhkan |
| photo | Lead memiliki image kuat yang harus menjadi jangkar visual |
| text | Lead panjang ingin diperlakukan sebagai halaman depan berbasis teks; image ditunda ke halaman sambungan |
| compact | Lead lebih pendek dan edisi memiliki banyak teaser |
| auto | CLI boleh memilih preset aman dari panjang lead dan ketersediaan image |
| Inside preset | Pilih ketika |
| --- | --- |
| feature | Halaman berisi laporan/analisis yang membutuhkan kolom lebar dan image lebih besar |
| balanced | Campuran artikel umum; ini default kompatibilitas |
| digest | Edisi didominasi brief dan membutuhkan grid lebih rapat |
| auto | CLI boleh memilih dari campuran editorial artikel |
composition.pages meng-override preset halaman dalam untuk nomor halaman fisik tertentu. Page wajib minimal 2 dan template hanya feature, balanced, atau digest. Override ke halaman yang tidak terbentuk menggagalkan render secara atomik.
Jika composition tidak ditulis, default tetap front: "classic" dan inside: "balanced". Agent hanya boleh memilih preset resmi; field mentah seperti columns, font, margin, x, atau y ditolak.
Batas lead A3 per preset
| Preset | Batas |
| --- | --- |
| classic | 500–5.000 kata dengan image; 700–5.000 tanpa image |
| photo | Image wajib; 400–5.000 kata |
| text | 700–5.000 kata; image tidak ditampilkan di halaman 1 |
| compact | 300–1.200 kata; image opsional |
Semua lead edisi minimal tiga paragraf. Renderer tetap menjalankan geometry preflight terhadap kolom yang diwajibkan preset.
Skala kepentingan dan foto
importance memakai bilangan bulat 0–10. Jika tidak ditulis, default-nya lead = 10, feature = 7, dan brief = 3.
Lebar kolom dan posisi image dikunci oleh preset halaman. Di dalam slot tersebut, importance mengatur tinggi relatif image: skor rendah lebih ringkas dan skor tinggi mendapat bidang lebih besar. Preset feature menambah prominensi image, sedangkan digest menguranginya.
Pada halaman depan, image lead dibatasi area utama dan tidak melintasi sidebar. Preset photo memberi bidang hero terbesar, classic memakai hero standar, compact memakai thumbnail ringkas, dan text menunda image ke halaman sambungan. Gambar artikel pendukung dapat menjadi thumbnail teaser lalu tampil lagi bersama artikel lengkap di halaman dalam. Asset contoh adalah ilustrasi geometris/placeholder, bukan foto dokumenter. Input contoh tidak dipangkas untuk mengejar jumlah halaman tertentu.
Layout artikel
| Layout | Penggunaan | Perilaku |
| --- | --- | --- |
| lead | Artikel utama edisi | Halaman depan maksimal 1–2 paragraf dan jump line bila bersambung; artikel tunggal pendek tidak dipaksa ke halaman kedua; keseluruhan artikel maksimal dua halaman |
| feature | Analisis/laporan lanjutan | Headline lebih menonjol; feature tanpa gambar dapat bergabung dalam aliran kolom seimbang, sedangkan feature bergambar memakai pita penuh; maksimal dua halaman |
| brief | Berita pendek/opini/editorial | Dapat tampil sebagai teaser halaman depan dan tetap muncul lengkap di aliran kolom halaman dalam |
layout bersifat opsional. Artikel pertama otomatis menjadi lead. Artikel berikutnya dengan isi sampai sekitar 260 kata otomatis menjadi brief; artikel yang lebih panjang menjadi feature.
Headline, deck, dan awal body dijaga tetap bersama; sisa body dapat mengalir ke kolom berikutnya supaya tidak meninggalkan lubang vertikal besar. Halaman terakhir memilih dua hingga jumlah kolom maksimum yang masih simetris dan paling padat. Artikel lead/feature yang bersambung mendapat jump line otomatis “Bersambung ke hal. …” dan “Sambungan dari hal. …”. Jika satu artikel melewati dua halaman, CLI gagal dan tidak menimpa PDF tujuan.
Format artikel tunggal versi awal (title, body, source di root) tetap didukung dan memakai A4 secara default.
Kontrak input yang dikunci tersedia di LAYOUT_SPEC.md, dengan schema struktural di schema/article.schema.json. Edisi multiartikel wajib berisi 12–100 artikel, tepat satu lead di articles[0], ID unik, headline/body dalam batas editorial, URL http/https, serta asset JPEG/PNG yang dapat dibaca. Field yang tidak dikenal juga ditolak sebelum PDF dibuat.
Validasi gagal-aman
Input edisi divalidasi sebelum renderer dijalankan. Kesalahan selalu diawali:
Input tidak sesuai spesifikasi layout: ...File image diperiksa keberadaan, ukuran maksimum 25 MB, dan signature JPEG/PNG. Aturan kepadatan lead A3 mengikuti preset front terpilih; renderer juga memastikan kolom wajib preset benar-benar terisi. Setelah validasi input, renderer masih memeriksa override halaman dan batas dua halaman per artikel. PDF tujuan hanya diganti setelah seluruh proses berhasil; input invalid, preset tidak kompatibel, override tidak terjangkau, dan overflow tidak menimpa file yang sudah ada.
Opsi CLI
-o, --output <file> Lokasi PDF output
--page-size <format> A3, A4, LETTER, atau TABLOID
-h, --help Bantuan
-v, --version Versi CLIPengaturan cetak
- Cetak dengan Actual size / 100%, bukan Fit to page.
- Gunakan ukuran kertas yang sama dengan
pageSize. - Untuk bolak-balik portrait, pilih duplex long-edge.
- Renderer belum menambahkan bleed karena desain tidak memiliki elemen full-bleed; seluruh isi berada dalam safe margin.
