Module:Highlighted date list

-- This module takes a list of dates and adds a marker highlighting the closest -- date in the future.

local p = {} local lang = mw.language.getContentLanguage

local function normalizeDate(timestamp) local success, date = pcall(lang.formatDate, lang, 'Y-m-d', timestamp) return success and date end

local function makeData(args) local data, unsorted = {}, {} for k, v in pairs(args) do		if type(k) == 'string' then local datakey, num = k:match('^(.-)([1-9][0-9]*)$') if datakey == 'item' or datakey == 'date' then num = tonumber(num) unsorted[num] = unsorted[num] or {} unsorted[num][datakey] = v			elseif datakey then error(string.format("invalid parameter '%s' detected", k), 3) end end end for num, t in pairs(unsorted) do		if t.item and t.date then local date = normalizeDate(t.date) if not date then error(string.format( "invalid date '%s' in parameter 'date%d'", t.date, num ), 3)			end t.date = date table.insert(data, t)		elseif t.item then error(string.format( "parameter 'item%d' was specified but parameter 'date%d' is missing", num, num ), 3)		else error(string.format( "parameter 'date%d' was specified but parameter 'item%d' is missing", num, num ), 3)		end end table.sort(data, function (t1, t2)		return t1.date < t2.date	end) return data end

local function makeComparisonDate(gracePeriod) local timestamp if gracePeriod then timestamp = 'now - ' .. gracePeriod else timestamp = 'now' end local date = normalizeDate(timestamp) if date then return date else error(string.format("invalid grace period '%s'", gracePeriod), 3) end end

local function makeHighlighter(color) color = color or '#FC6' local highlighter = mw.html.create('span') highlighter :css('background-color', color) :wikitext(lang:getArrow('forwards')) return tostring(highlighter) end

function p._main(args) local data = makeData(args) local comparisonDate = makeComparisonDate(args.graceperiod) local highlighter = args.highlighter or makeHighlighter(args.highlightercolor) local root = mw.html.create('ul') root :addClass(args.class) :cssText(args.style) local doneHighlight = false for i, t in ipairs(data) do		local item if not doneHighlight and t.date >= comparisonDate then doneHighlight = true item = highlighter .. ' ' .. t.item else item = t.item end root :newline :tag('li') :wikitext(item) end root:newline return tostring(root) end

function p.main(frame) local args = require('Module:Arguments').getArgs(frame, {		wrappers = 'Template:Highlighted date list'	}) return p._main(args) end

return p