Modul:Ordinal
--[[
Modul ini akan menambahkan akhiran ordinal yang sesuai ke bilangan bulat tertentu.
Harap jangan mengubah kode ini tanpa menerapkan perubahan terlebih dahulu di
Module:Ordinal/sandbox dan melakukan pengujian.
]]
local p = {}
local yesno = require('Modul:Yesno') -- interpretasi nilai boolean
--[[
Fungsi ini mengubah nilai bilangan bulat menjadi angka diikuti indikator ordinal.
Output string dapat berisi tag HTML.
Penggunaan:
{{#invoke:Ordinal|ordinal|1=|2=|sup=}}
{{#invoke:Ordinal|ordinal}} - menggunakan parameter pemanggil
Parameter:
1: Angka atau string apa saja.
2: Atur menjadi "d" jika modul harus menampilkan "d" alih-alih "nd" dan "rd".
sup: Atur menjadi ya/tidak untuk mengaktifkan/mematikan akhiran ordinal superskrip.
]]
function p.ordinal(frame)
local args = frame.args
if args[1] == nil then
args = frame:getParent().args
end
if args[1] == nil then
args[1] = "{{{1}}}"
end
return p._ordinal(args[1], (args[2] == 'd'), yesno(args.sup))
end
function p._ordinal(n, d, sup)
local x = tonumber(mw.ustring.match(n, "(%d*)%W*$"))
local suffix = "ke"
-- Jika tonumber(n) berhasil:
if x then
local mod10 = math.abs(x) % 10
local mod100 = math.abs(x) % 100
if mod10 == 1 and mod100 ~= 11 then
suffix = "ke-1"
elseif mod10 == 2 and mod100 ~= 12 then
if d then suffix = "ke-2" else suffix = "ke-2" end
elseif mod10 == 3 and mod100 ~= 13 then
if d then suffix = "ke-3" else suffix = "ke-3" end
else
suffix = "ke-" .. x
end
end
if sup then
suffix = "<sup>" .. suffix .. "</sup>"
end
return n .. suffix
end
return p