Jump to content
Toggle menu
  • 3 articles
  • 75 files
  • 7 users
  • 37.9K edits
Neodyland Wiki
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:Ordinal: Difference between revisions

From Neodyland Wiki
m LangSwitch is now in Module:LangSwitch
eliminate need for Module:Roman
 
(5 intermediate revisions by 2 users not shown)
Line 10: Line 10:
   
   
]]
]]
local p = {}
   
   
-- =======================================
-- =======================================
-- === Dependencies ======================
-- === Dependencies ======================
-- =======================================
-- =======================================
local i18n      = require('Module:I18n/ordinal')        -- get localized translations of ordinals
local i18n      = require('Module:I18n/ordinal')        -- get localized translations of ordinals
local LangSwitch = require('Module:LangSwitch')          -- get LangSwitch function
local yesno      = require('Module:Yesno')              -- boolean value interpretation
local yesno      = require('Module:Yesno')              -- boolean value interpretation
local formatnum  = require('Module:Formatnum')          -- number formatting
local formatnum  = require('Module:Formatnum')          -- number formatting
local roman      = require('Module:Roman')              -- roman numeral conversion (primarily for French)


-- =======================================
-- =======================================
-- === Public Functions ==================
-- === Private Functions =================
-- =======================================
-- =======================================
------------------------------------------------------------------------------
-- code equivalent to https://commons.wikimedia.org/wiki/Template:LangSwitch
local function langSwitch(list,lang)
local langList = mw.language.getFallbacksFor(lang)
table.insert(langList,1,lang)
table.insert(langList,math.max(#langList,2),'default')
for i,language in ipairs(langList) do
if list[language] then
return list[language]
end
end
return nil
end


--[[
--[[
Ordinal
Helper function to generate superscripted content
This function converts an integer value into a numeral followed by ordinal indicator.  The output string might
contain HTML tags unless you set nosup=y.
Usage:
{{#invoke:Ordinal|Ordinal|1=|lang=|style=|gender=|nosup=|debug=}}
{{#invoke:Ordinal|Ordinal}} - 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 )
local function Superscript( str, superscript, nosup, period )
-- if no argument provided than check parent template/module args
if superscript and (not nosup) and (str ~= '') then
local args = frame.args
return period .. '<sup>' .. str .. '</sup>'
if args[1]==nil then
else
args = frame:getParent().args
return str
end
end
end
--[[
This function returns a string containing the input value formatted as a Roman numeral. 
It works for values between 0 and 3999.
]]
local function Roman(value)
local d0, d1, d2, d3, i0, i1, i2, i3
d0 = { [0] = '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' }
    d1 = { [0] = '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC' }
    d2 = { [0] = '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM' }
    d3 = { [0] = '', 'M', 'MM', 'MMM'}
local result = ''
--  if we don't have a specified language, attempt to use the user's language
if ((value >= 0) and (value < 4000)) then
local lang = args.lang
i3 = math.floor(value / 1e3) 
if not lang or lang == '' or not mw.language.isValidCode( lang ) then
i2 = math.floor(value / 1e2) % 10
lang = frame:preprocess('{{int:lang}}')
i1 = math.floor(value / 1e1) % 10
i0 = math.floor(value / 1e0) % 10
result = d3[i3] .. d2[i2] .. d1[i1] .. d0[i0]
end
end
local nosup = yesno(args["nosup"] or '', false) -- nosup can be true or false
return result
local debugging = yesno(args["debug"], false) -- debugging can be nil, true, or false
end
 
-- also enable debugging if debug is unspecified, and "nosup" is false
debugging = debugging or ((debugging == nil) and not nosup)
local output = p._Ordinal(
args[1],  -- positive integer number
lang, -- language
args["style"], -- allows to set presentation style
args["gender"], -- allows to specify gender (m, f, or n)
nosup, -- set nosup to "y" to suppress superscripts
debugging -- Set debug=y to output error messages
)
-- Add maintenance category
--[[
if (i18n.SchemeFromLang[lang] == nil) and debugging then
Helper function to call Formatnum.
output = output_cat(output, 'Pages with calls to Module Ordinal using an unsupported language')
]]
local function FormatNum( value, lang )
if lang == 'roman' then
return Roman(value)
else
return formatnum.formatNum(value, lang)
end
end
end
return output
--[[
Helper function to add append a category to a message.
]]
local function output_cat( message, category )
    return message .. '[[Category:' .. category .. ']]'
end
end


--[[
--[[
This function will add the appropriate ordinal suffix to a given integer.
Helper function to handle error messages.
 
Parameters
input: Numeral as a positive integer or string.
lang: Language code as a string (e.g. 'en', 'de', etc.).
style: Presentation style as a string (e.g. 'd', 'roman', etc.).
gender: Gender as a string ('m', 'f', 'n').  Use empty string '' to leave gender unspecified.
nosup: Boolean, set to true to force the ordinals to display without superscript.
debug: Boolean, set to true to output error messages.
 
Error Handling:
  Unless debug is true, any error results in value being echoed to the output.
]]
]]
function p._Ordinal( input, lang, style, gender, nosup, debugging )
local function output_error( error_str, value )
local output = input
error_str = '<strong class="error"><span title="Error: ' .. error_str .. '">' .. value .. '</span></strong>'
    return output_cat(error_str, 'Errors reported by Module Ordinal');
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 == 'roman year' then
style = 'roman'
end
-- Normalize gender parameter
gender = string.lower(gender or '')
if (gender ~= 'm') and (gender ~= 'f') and (gender ~= 'n') then
gender = ''
end
-- if no language is specified, default to english (caller might want to get user's language)
if not lang or lang == '' 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 output
end
end
-- =======================================
-- === Private Functions =================
-- =======================================


--[[
--[[
This function is the core functionality for adding the appropriate ordinal suffix to a given integer.
This function is the core functionality for adding the appropriate ordinal suffix to a given integer.
]]
]]
function OrdinalCore( value, lang, style, gender, nosup )
local function OrdinalCore( value, lang, style, gender, nosup )
-- Just in case someone breaks the internationalization code, fix the english scheme
-- Just in case someone breaks the internationalization code, fix the english scheme
if i18n.SchemeFromLang['en'] == nil then
if i18n.SchemeFromLang['en'] == nil then
Line 164: Line 119:
-- which scheme should we use to format the ordinal value?  
-- which scheme should we use to format the ordinal value?  
-- Use Fallback module to handle languages groups that map to a supported language
-- Use Fallback module to handle languages groups that map to a supported language
local schemeSpecifier = LangSwitch._langSwitch(i18n.SchemeFromLang, lang)
local schemeSpecifier = langSwitch(i18n.SchemeFromLang, lang)
-- Look up scheme based on scheme specifier (and possibly style)
-- Look up scheme based on scheme specifier (and possibly style)
Line 252: Line 207:
end
end


-- =======================================
-- === Public Functions ==================
-- =======================================


local p = {}
--[[
--[[
Helper function to generate superscripted content
Ordinal
This function converts an integer value into a numeral followed by ordinal indicator.  The output string might
contain HTML tags unless you set nosup=y.
Usage:
{{#invoke:Ordinal|Ordinal|1=|lang=|style=|gender=|nosup=|debug=}}
{{#invoke:Ordinal|Ordinal}} - 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 Superscript( str, superscript, nosup, period )
function p.Ordinal( frame )
if superscript and (not nosup) and (str ~= '') then
-- if no argument provided than check parent template/module args
return period .. '<sup>' .. str .. '</sup>'
local args = frame.args
else
if args[1]==nil then
return str
args = frame:getParent().args
end
--  if we don't have a specified language, attempt to use the user's language
local lang = args.lang
if not lang or lang == '' or not mw.language.isValidCode( lang ) then
lang = frame:preprocess('{{int:lang}}')
end
end
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 not nosup)
local output = p._Ordinal(
args[1],  -- positive integer number
lang, -- language
args["style"], -- allows to set presentation style
args["gender"], -- allows to specify gender (m, f, or n)
nosup, -- set nosup to "y" to suppress superscripts
debugging -- Set debug=y to output error messages
)
--[[
-- Add maintenance category
Helper function to call Formatnum.
if (i18n.SchemeFromLang[lang] == nil) and debugging then  
]]
output = output_cat(output, 'Pages with calls to Module Ordinal using an unsupported language')
function FormatNum( value, lang )
if lang == 'roman' then
return roman._Numeral(value)
else
return formatnum.formatNum(value, lang)
end
end
return output
end
end
 


--[[
--[[
Helper function to handle error messages.
This function will add the appropriate ordinal suffix to a given integer.  
]]
function output_error( error_str, value )
error_str = '<strong class="error"><span title="Error: ' .. error_str .. '">' .. value .. '</span></strong>'
    return output_cat(error_str, 'Errors reported by Module Ordinal');
end


Parameters
input: Numeral as a positive integer or string.
lang: Language code as a string (e.g. 'en', 'de', etc.).
style: Presentation style as a string (e.g. 'd', 'roman', etc.).
gender: Gender as a string ('m', 'f', 'n').  Use empty string '' to leave gender unspecified.
nosup: Boolean, set to true to force the ordinals to display without superscript.
debug: Boolean, set to true to output error messages.


--[[
Error Handling:
Helper function to add append a category to a message.
  Unless debug is true, any error results in value being echoed to the output.
]]
]]
function output_cat( message, category )
function p._Ordinal( input, lang, style, gender, nosup, debugging )
    return message .. '[[Category:' .. category .. ']]'
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 == 'roman year' then
style = 'roman'
end
-- Normalize gender parameter
gender = string.lower(gender or '')
if (gender ~= 'm') and (gender ~= 'f') and (gender ~= 'n') then
gender = ''
end
-- if no language is specified, default to english (caller might want to get user's language)
if not lang or lang == '' 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 output
end
end


return p
return p
Cookies help us deliver our services. By using our services, you agree to our use of cookies.