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
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
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 Template:Para. 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