npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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, dan compact, plus pemilihan auto
  • Tiga preset halaman dalam terkunci: feature, balanced, dan digest, plus pemilihan auto
  • 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/brief ikut mengalir di halaman dalam, dengan tinggi mengikuti importance
  • 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 link

Membuat PDF

newspaper ./edition.json --output ./edisi.pdf
newspaper ./edition.json --page-size TABLOID -o ./edisi-tabloid.pdf

Tanpa npm link:

node ./bin/newspaper.js ./examples/article-4-pages.json -o ./newspaper-4-pages.pdf

Sample:

# Format artikel lama, A4 satu halaman
npm run generate

# Edisi koran multiartikel A3 (nama historis; jumlah halaman mengikuti isi)
npm run generate:4-pages

Format 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 CLI

Pengaturan 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.