--[[  
 
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