Module:Ordinal
Documentation for this module may be created at Module:Ordinal/doc
local p = {}
local lang = mw.getContentLanguage()
local hc = require('Module:Paramtest').has_content
p._ordinals = {
[0] = 'th',
'st',
'nd',
'rd',
'th',
'th', --5
'th',
'th',
'th',
'th',
'th', --10
-- special exceptions
'th', --11th
'th', --12th
'th', --13th
}
p._text = {
[0] = 'zeroth',
'first',
'second',
'third',
'fourth',
'fifth',
'sixth',
'seventh',
'eighth',
'ninth',
'tenth',
'eleventh',
'twelfth',
'thirteenth',
'fourteenth',
'fifteenth',
'sixteenth',
'seventeenth',
'eighteenth',
'nineteenth',
'twentieth'
}
function p.main(frame)
local args = frame:getParent().args
return p._main(args[1], {txt = hc(args.text), caps = hc(args.caps)})
end
function p._main(ord, opts)
ord = lang:parseFormattedNumber(ord)
if not ord then
ord = 1
end
ord = math.floor(ord)
if opts.txt then
if p._text[ord] then
if opts.caps then
return lang:ucfirst(p._text[ord])
else
return p._text[ord]
end
end
-- if not txt then just do the normal number stuff
end
local suff
local ord_digit = ord % 10
if ord_digit == 1 or ord_digit == 2 or ord_digit == 3 then
suff = p._ordinals[ord % 100] or p._ordinals[ord_digit]
else
suff = p._ordinals[ord_digit]
end
if not opts.nosup then
suff = '<sup>'..suff..'</sup>'
end
if opts.nonum then
return suff
end
return lang:formatNum(ord) .. suff
end
return p