Module:Years generator
This module can be used to transclude a particular template for each year since a given year. It will produce a bolded year, followed by an Em dash, followed by your template, for each year from the year you specify (inclusive) up to the current year (inclusive).
Direct usage
[edit]Copy and paste the following code, substituting "start year" for the year you want to start the iteration from, and "template to transclude" with the template you want:
{{#invoke:Years generator|templateEveryYearToPresent|Start year|Template to transclude}}
This will result in the template being called for each year from Start year to the current year, with the year it's being called for as the first and only argument.
Usage in a template
[edit]Copy and paste the following code, substituting "template to transclude" with the template you want:
{{#invoke:Years generator|templateEveryYearToPresent|Template to transclude}}
The parameters that your template's users put after your template will be automatically consumed by this module, and passed on to the template that you are transcluding for each year. If you wish to consume some parameters yourself, add them to a comma-separated list in a parameter |templatedonotconsume=
. These parameters will be ignored by the module.
local p = {} --p stands for package
function p.templateEveryYearToPresent ( frame )
-- use the parent args if available, assuming this is embedded in a template
parentArgs = frame:getParent().args
argsToUse = ((parentArgs[1] and parentArgs) or frame.args)
years = yearsFromYearToPresent( argsToUse[1] )
toReturn = ""
templateArgs = {}
templateDoNotConsume = {}
-- allow transcluding templates to specify arguments they consume,
-- so we should ignore them
for arg in mw.text.gsplit( frame.args['templatedonotconsume'] or '', ',', true )
do
templateDoNotConsume[arg] = true
end
for key, arg in pairs( argsToUse ) do
-- taking everything beyond the second arg, we pass it onto the template
-- this includes named args, so we don't want to just do > 2
if (
key ~= 1
and key ~= 2
and not templateDoNotConsume[key]
)
then
numericKey = tonumber( key )
if ( numericKey )
then
-- templateArgs[1] will always be the year (lua arrays start at 1)
-- templateArgs[2] should be the first other template param
-- which is args[3], so we have here [key - 1]
templateArgs[key - 1] = arg
else
-- named params we just shove in
templateArgs[key] = arg
end
end
end
for index, year in ipairs( years ) do
templateArgs[1] = tostring( year )
toReturn = toReturn .. ( index == 0 and '' or '<br />' )
.. "<strong>" .. templateArgs[1] .. "</strong> — "
-- if parentArgs is used, then frame.args[1] will be the template,
-- as no other args are going to be in the immediate frame. if
-- there are no parentArgs, then it'll be the second param,
-- because the year will have been directly passed to the module
.. frame:expandTemplate{ title = ((parentArgs[1] and frame.args[1]) or frame.args[2]), args = templateArgs }
end
return toReturn
end
function yearsFromYearToPresent( year )
startyear = tonumber( year )
if ( startyear == nil )
then
error( "Invalid start year provided" )
end
years = {}
numyears = ( tonumber( os.date( "%Y" ) ) - startyear )
for numadded = 0, numyears do -- equiv of i = 0; i <= numyears; i++
years[numadded + 1] = startyear + numadded
end
return years
end
return p