Module:Romaniser

--Big roman numberals have lines over them local function overline(s) return mw.ustring.format("%s ", s) end

-- Gets the Roman numerals for a given numeral table. local function getLetters(num, t)	local ret = {} for _, v in ipairs(t) do		local val, letter = unpack(v) while num >= val do			num = num - val table.insert(ret, letter) end end return table.concat(ret), num end

local function main(f) local args = f.args or f	if f == mw.getCurrentFrame and args[1] == nil then args = f:getParent.args else f = mw.getCurrentFrame end if args == nil or args == {} then return else if type(args[1]) == "string" then args[1] = mw.ext.ParserFunctions.expr(args[1]) end end if args[1] == nil then return end local num = tonumber(args[1]) if not num or num < 0 or num == math.huge then error('Invalid number ' .. args[1], 2) elseif num == 0 then return 'N'	end -- Return a message for numbers too big to be expressed in Roman numerals. if num >= 5000000 then return args[2] or 'N/A' end local ret = "" if num >= 4000 then local bigLetters bigLetters, num = getLetters(num, {{1000000, 'M'},											{900000, 'CM'}, {500000, 'D'}, {400000, 'CD'}, {100000, 'C'},											{90000, 'XC'}, {50000, 'L'}, {40000, 'XL'}, {10000, 'X'},											{9000, 'IX'}, {5000, 'V'}, {4000, 'IV'}}) ret = overline(bigLetters) end -- Find the Roman numerals for numbers less than the big Roman threshold. local smallLetters = getLetters(num, {{1000, 'M'},										{900, 'CM'}, {500, 'D'}, {400, 'CD'}, {100, 'C'},										{90, 'XC'}, {50, 'L'}, {40, 'XL'}, {10, 'X'},										{9, 'IX'}, {5, 'V'}, {4, 'IV'}, {1, 'I'}}) return ret .. smallLetters end

return {convert=main}