-- --
--
--Helper function to generate superscripted contentlocal function Superscript(str, superscript, nosup, period) if superscript and (not nosup) and (str ~= ) then return period .. '' .. str .. '' else return str endend
--Helper function to call Formatnum.local function FormatNum(value, lang) if lang
--Helper function to handle error messages.local function output_error(error_str, value) error_str = '
' .. value .. '' return output_cat(error_str, 'Errors reported by Module Ordinal');end--This function is the core functionality for adding the appropriate ordinal suffix to a given integer.local function OrdinalCore(value, lang, style, gender, nosup) -- Just in case someone breaks the internationalization code, fix the english scheme if i18n.SchemeFromLang['en']
nil then i18n.Scheme['en-scheme'] = end -- Add the default scheme (i.e. "
nil then i18n.Scheme['period-scheme'] = end -- which scheme should we use to format the ordinal value? -- Use Fallback module to handle languages groups that map to a supported language local schemeSpecifier = LangSwitch._langSwitch(i18n.SchemeFromLang, lang) -- Look up scheme based on scheme specifier (and possibly style) local scheme = i18n.Scheme[schemeSpecifier .. '/' .. style] or i18n.Scheme[schemeSpecifier] -- process scheme by applying rules identified by Scheme local output = local period = (scheme.period and '.') or local rules = scheme.rules if rules
'suffix' then output = FormatNum(value, scheme.formatlang or lang) .. Superscript(scheme.suffix or , scheme.superscript, nosup, period) elseif rules
'mod10-suffix' then local index = math.floor(math.abs(value)) % 10 local suffix = scheme['suffix_'..index] or scheme.suffix or output = FormatNum(value, scheme.formatlang or lang) .. Superscript(suffix, scheme.superscript, nosup, period) elseif rules
'gendered-suffix-one' then local suffix if value
'gendered-suffix-n' then local suffix if value <= 9 then suffix = scheme['suffix_'..value..'_'..gender] or scheme['suffix_'..value] or scheme['suffix_'..gender] or scheme.suffix or else suffix = scheme['suffix_'..gender] or scheme.suffix or end output = FormatNum(value, scheme.formatlang or lang) .. Superscript(suffix, scheme.superscript, nosup, period) elseif rules
1 then prefix = scheme['prefix_1'] or scheme.prefix or suffix = scheme['suffix_1'] or scheme.suffix or else prefix = scheme.prefix or suffix = scheme.suffix or end output = prefix .. FormatNum(value, scheme.formatlang or lang) .. Superscript(suffix, scheme.superscript, nosup, period) elseif rules
'uk-rules' then local suffix local mod100 = math.floor(math.abs(value)) % 100 local mod1000 = math.floor(math.abs(value)) % 1000 if (mod1000
40) then suffix = scheme['suffix_40_'..gender] or scheme.suffix or elseif (mod100 >= 10) and (mod100 <= 19) then suffix = scheme['suffix_'..gender] or scheme.suffix or else local mod10 = math.floor(math.abs(value)) % 10 suffix = scheme['suffix_'..mod10..'_'..gender] or scheme['suffix_'..mod10] or scheme['suffix_'..gender] or scheme.suffix or end output = FormatNum(value, scheme.formatlang or lang) .. Superscript(suffix, scheme.superscript, nosup, period) else output = FormatNum(value, lang) end return outputend
--
local p = --Ordinal|1=|lang=|style=|gender=|nosup=|debug=}} - uses the caller's parameters Parameters 1: Positive integer number. lang: language style: Presentation style. Different options for different languages. In English there is "style=d" adding -d suffixes to all numbers. gender: Gender is used in French and Polish language versions. Genders: m for male, f for female and n for neuter. nosup: Set nosup=y to display the ordinals without superscript. debug: Set debug=y to output error messages. Error Handling: Unless debug=y, any error results in parameter 1 being echoed to the output. This reproduces the behavior of the original Ordinal template.function p.Ordinal(frame) -- if no argument provided than check parent template/module args local args = frame.args if args[1]
or not mw.language.isValidCode(lang) then lang = frame:preprocess('') end local nosup = yesno(args["nosup"] or , false) -- nosup can be true or false local debugging = yesno(args["debug"], false) -- debugging can be nil, true, or false
-- also enable debugging if debug is unspecified, and "nosup" is false debugging = debugging or ((debugging
nil) and debugging then output = output_cat(output, 'Pages with calls to Module Ordinal using an unsupported language') end return outputend
--function p._Ordinal(input, lang, style, gender, nosup, debugging) local output = input if input then local value = tonumber(input) if value and (value > 0) then -- Normalize style, the style 'roman year' is an alias for 'roman' style = string.lower(style or ) if style
then lang = 'en'; end output = OrdinalCore(value, lang, style, gender, nosup) else if debugging then output = output_error("not a number", input) end end else if debugging then output = output_error("not a number", ) end end return outputend
return p