Modul:Pendirian
Module:Pendirian adalah modul mesin backend berbasis Lua yang menangani kalkulasi tanggal, waktu relatif, tahun kabisat, serta penyesuaian selisih waktu dinamis (Tahun, Bulan, Hari) untuk {{Pendirian}}.
Modul ini dibuat mandiri (standalone) tanpa ketergantungan pada modul eksternal seperti `Module:Arguments`, sehingga performanya sangat cepat, ringan, dan minim risiko bentrok pustaka.
Fungsi
sunting`p.utama(frame)`
suntingFungsi utama yang dipanggil oleh wikitext melalui "#invoke:Pendirian".
Fungsi ini menjalankan alur kerja berikut: 1. Parsing Argumen: Membaca parameter dari `frame` pemanggil atau `getParent()` (termasuk trimming otomatis untuk menghilangkan spasi berlebih). 2. Parsing Tanggal: Mendukung format input ISO (`YYYY-MM-DD`), format garis miring (`YYYY/MM/DD`), format tahun saja (`YYYY`), parameter terpisah berurutan (`YYYY|MM|DD`), maupun parameter nama (`tahun=`, `bulan=`, `hari=`). 3. Kalkulasi Selisih Waktu:
- Menghitung selisih tahun, bulan, dan hari secara presisi.
- Memeriksa dan memperhitungkan jumlah hari pada setiap bulan (28–31 hari).
- Memperhitungkan tahun kabisat (pembagi 4, 100, dan 400).
- Mengidentifikasi apakah tanggal yang dimasukkan berada di masa depan (rencana peluncuran) atau masa lalu.
4. Pengformatan Mode Output: Menyesuaikan hasil tampilan sesuai nilai parameter `mode`:
- `otomatis` / `smart` (default): Menyesuaikan unit dominan secara otomatis.
- `detail` / `presisi`: Menampilkan `X tahun, Y bulan, Z hari`.
- `ringkas` / `sederhana`: Menampilkan unit tertinggi saja.
- `hanya_usia`: Menampilkan teks usia tanpa menyertakan string tanggal pendirian.
5. Kategorisasi Otomatis: Menambahkan kategori wiki otomatis jika parameter `kategori=ya` diaktifkan.
Parameter Yang Didukung
sunting| Parameter | Tipe | Deskripsi |
|---|---|---|
| `1`, `tanggal`, `date` | String / Angka | Input tanggal pendirian. Contoh: `2020-05-15`, `2020/05/15`, atau `2020`. |
| `2`, `bulan` | Angka | Bulan pendirian (jika menggunakan parameter terpisah). Contoh: `5`. |
| `3`, `hari` | Angka | Hari pendirian (jika menggunakan parameter terpisah). Contoh: `15`. |
| `mode`, `format`, `opsi` | String | Mengatur gaya tampilan output (`otomatis`, `detail`, `ringkas`, `hanya_usia`). |
| `tampilkan_tanggal`, `show_date` | String | Mengontrol tampilan tanggal awal (`ya` / `tidak`). |
| `kurung` | String | Memberikan pembungkus tanda kurung pada teks selisih waktu (`ya` / `tidak`). |
| `kategori`, `cat` | String | Mengaktifkan Kategori otomatis berdasarkan tahun pendirian (`ya` / `tidak`). |
| `tipe`, `jenis` | String | Jenis entitas untuk penentuan nama kategori (`organisasi`, `perusahaan`, `produk`, `papan`). |
| `ref_tahun`, `ref_bulan`, `ref_hari` | Angka | Parameter pengujian/overriding untuk mengubah tanggal acuan "saat ini" (default: server time UTC). |
Penggunaan dari Modul Lua Lain
suntingJika Anda ingin memanggil logika modul ini langsung dari modul Lua lainnya, Anda dapat meng-import modul dan memanggil fungsi `utama` dengan mengirimkan objek `frame` buatan:
local pendirian = require("Module:Pendirian")
-- Contoh simulasi panggilan frame
local res = pendirian.utama({
getParent = function()
return {
args = {
[1] = "2020-05-15",
mode = "detail"
}
}
end,
args = {}
})Struktur File Modul
sunting- Module:Pendirian — Kode utama modul Lua.
- Template:Pendirian — Template wikitext tingkat pengguna.
- Template:Pendirian/doc — Dokumentasi panduan pengguna template.
local p = {}
-- Nama bulan dalam bahasa Indonesia
local monthsName = {
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
}
-- Fungsi untuk menghitung selisih tahun secara presisi
local function calculateYears(bYear, bMonth, bDay)
local today = os.date("*t")
local years = today.year - bYear
if today.month < bMonth or (today.month == bMonth and today.day < bDay) then
years = years - 1
end
return years
end
function p.main(frame)
local args = frame:getParent().args
local year, month, day
-- Cek jika input menggunakan format YYYY-MM-DD atau YYYY/MM/DD
local inputStr = args[1] or ""
if inputStr:find("^%d%d%d%d%-%d%d%-%d%d$") or inputStr:find("^%d%d%d%d/%d%d/%d%d$") then
year, month, day = inputStr:match("(%d%d%d%d)[%-/](%d%d)[%-/](%d%d)")
year = tonumber(year)
month = tonumber(month)
day = tonumber(day)
else
year = tonumber(args[1] or args.year)
month = tonumber(args[2] or args.month)
day = tonumber(args[3] or args.day)
end
-- Validasi Tanggal
if not year or not month or not day or month < 1 or month > 12 or day < 1 or day > 31 then
return '<span style="color:red; font-weight:bold;">[Format Tanggal Salah]</span>'
end
local years = calculateYears(year, month, day)
local monthName = monthsName[month] or ""
-- Teks durasi
local durationStr = string.format('%d tahun yang lalu', years)
-- Format Output Rapi:
-- Baris 1: 29 November 1899
-- Baris 2: (126 tahun yang lalu) -> Tegak normal, tidak miring, ukuran 80%
return string.format('%d %s %d<br /><small style="font-size: 80%%;">(%s)</small>', day, monthName, year, durationStr)
end
return p