<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ATimeline</id>
	<title>Module:Timeline - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ATimeline"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Timeline&amp;action=history"/>
	<updated>2026-06-19T08:30:27Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Timeline&amp;diff=479763&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Timeline&amp;diff=479763&amp;oldid=prev"/>
		<updated>2021-07-16T07:37:04Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require('Module:No globals')&lt;br /&gt;
&lt;br /&gt;
local yesno = require('Module:Yesno')&lt;br /&gt;
local navbox = require('Module:Navbox')._navbox&lt;br /&gt;
local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Add a blank table cell&lt;br /&gt;
local function addBlank(args, row, prev, current)&lt;br /&gt;
	if row and prev &amp;lt; current then&lt;br /&gt;
		if yesno(args.decades) == false then&lt;br /&gt;
			row:tag('td')&lt;br /&gt;
				:addClass('timeline-blank')&lt;br /&gt;
				:cssText(args.blankstyle)&lt;br /&gt;
				:attr('colspan', current - prev)&lt;br /&gt;
		-- Divide the cell up every decade if showing decades at the top&lt;br /&gt;
		else&lt;br /&gt;
			local year = prev&lt;br /&gt;
			&lt;br /&gt;
			while year &amp;lt; current do&lt;br /&gt;
				local dur = math.min(10 - year % 10, current - year)&lt;br /&gt;
				&lt;br /&gt;
				row:tag('td')&lt;br /&gt;
					:addClass('timeline-blank')&lt;br /&gt;
					:cssText(args.blankstyle)&lt;br /&gt;
					:attr('colspan', dur)&lt;br /&gt;
				&lt;br /&gt;
				year = year + dur&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get timeline entries, start years, and end years&lt;br /&gt;
local function timelineInfo(args)&lt;br /&gt;
	local info = {&lt;br /&gt;
		startYear = math.huge,&lt;br /&gt;
		startYears = {},&lt;br /&gt;
		endYear = 0,&lt;br /&gt;
		endYears = {},&lt;br /&gt;
		entries = {}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for k, _ in pairs(args) do&lt;br /&gt;
		if type(k) == 'string' then&lt;br /&gt;
			local num = k:match('^%a+(%d+)$')&lt;br /&gt;
&lt;br /&gt;
			if num then&lt;br /&gt;
				table.insert(info.entries, tonumber(num))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.sort(info.entries)&lt;br /&gt;
	&lt;br /&gt;
	for i, num in ipairs(info.entries) do &lt;br /&gt;
		if args['item' .. i] then&lt;br /&gt;
			if not args['date' .. i] then&lt;br /&gt;
				error('item' .. i .. ' requires a corresponding ' .. 'date' .. i, 0)&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			local dates = mw.text.split(args['date' .. i], '-', true)&lt;br /&gt;
			local startYear = tonumber(dates[1])&lt;br /&gt;
			local endYear = tonumber(dates[2]) or tonumber(os.date('%Y')) + 1&lt;br /&gt;
			&lt;br /&gt;
			if not startYear then&lt;br /&gt;
				error('date' .. i .. ' contains an invalid timerange', 0)&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			info.startYear = math.min(info.startYear, startYear)&lt;br /&gt;
			info.endYear = math.max(info.endYear, endYear)&lt;br /&gt;
			info.startYears[i] = startYear&lt;br /&gt;
			info.endYears[i] = endYear&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.startoffset then&lt;br /&gt;
		info.startYear = info.startYear - tonumber(args.startoffset)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.startyear then&lt;br /&gt;
		info.startYear = math.min(info.startYear, tonumber(args.startyear))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.endoffset then&lt;br /&gt;
		info.endYear = info.endYear + tonumber(args.endoffset)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.endyear then&lt;br /&gt;
		info.endYear = math.max(info.endYear, tonumber(args.endyear))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return info&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Render the date rows&lt;br /&gt;
local function renderDates(args, tbl, info)&lt;br /&gt;
	local showDecades = yesno(args.decades)&lt;br /&gt;
	local labelRow = nil&lt;br /&gt;
	&lt;br /&gt;
	if args.label then&lt;br /&gt;
		labelRow = mw.html.create('th')&lt;br /&gt;
			:attr('scope', 'col')&lt;br /&gt;
			:addClass('navbox-group timeline-label')&lt;br /&gt;
			:cssText(args.labelstyle)&lt;br /&gt;
			:attr('rowspan', showDecades ~= false and '2' or '1')&lt;br /&gt;
			:wikitext(args.label or '')&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Render the decades row&lt;br /&gt;
	if showDecades ~= false then&lt;br /&gt;
		local decadeRow = tbl:tag('tr')&lt;br /&gt;
		local year = info.startYear&lt;br /&gt;
		&lt;br /&gt;
		decadeRow:node(labelRow)&lt;br /&gt;
		&lt;br /&gt;
		while year &amp;lt; info.endYear do&lt;br /&gt;
			local dur = math.min(10 - year % 10, info.endYear - year)&lt;br /&gt;
			&lt;br /&gt;
			decadeRow:tag('th')&lt;br /&gt;
				:attr('scope', 'col')&lt;br /&gt;
				:addClass('timeline-decade')&lt;br /&gt;
				:cssText(args.datestyle)&lt;br /&gt;
				:cssText(args.decadestyle)&lt;br /&gt;
				:attr('colspan', dur)&lt;br /&gt;
				:wikitext(math.floor(year / 10) .. '0s')&lt;br /&gt;
			&lt;br /&gt;
			year = year + dur&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the years row&lt;br /&gt;
	local yearRow = tbl:tag('tr')&lt;br /&gt;
	local width = 100 / (info.endYear - info.startYear)&lt;br /&gt;
	&lt;br /&gt;
	if showDecades == false then&lt;br /&gt;
		yearRow:node(labelRow)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i = info.startYear, info.endYear - 1 do&lt;br /&gt;
		&lt;br /&gt;
		yearRow:tag('th')&lt;br /&gt;
			:attr('scope', 'col')&lt;br /&gt;
			:addClass('timeline-year')&lt;br /&gt;
			:cssText(args.datestyle)&lt;br /&gt;
			:cssText(args.yearstyle)&lt;br /&gt;
			:cssText('width:' .. width .. '%')&lt;br /&gt;
			:wikitext(showDecades == false and i or i % 10)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Render the timeline itself&lt;br /&gt;
local function renderTimeline(args, tbl, info)&lt;br /&gt;
	local row = nil&lt;br /&gt;
	local prev = info.startYear&lt;br /&gt;
	local prevItem = nil&lt;br /&gt;
	local prevLabel = nil&lt;br /&gt;
	local labelSpan = 0&lt;br /&gt;
	&lt;br /&gt;
	for i, num in ipairs(info.entries) do&lt;br /&gt;
		if args['row' .. i] or row == nil then&lt;br /&gt;
			addBlank(args, row, prev, info.endYear)&lt;br /&gt;
			&lt;br /&gt;
			row = tbl:tag('tr')&lt;br /&gt;
			prev = info.startYear&lt;br /&gt;
			&lt;br /&gt;
			if labelSpan &amp;lt;= 0 and args.label then&lt;br /&gt;
				labelSpan = tonumber(args['span' .. i]) or 1&lt;br /&gt;
				&lt;br /&gt;
				prevLabel = row:tag('th')&lt;br /&gt;
					:attr('scope', 'row')&lt;br /&gt;
					:attr('rowspan', labelSpan)&lt;br /&gt;
					:addClass('navbox-group timeline-label')&lt;br /&gt;
					:cssText(args.labelstyle)&lt;br /&gt;
					:cssText(args['labelstyle' .. i] or '')&lt;br /&gt;
					:wikitext(args['row' .. i])&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			labelSpan = labelSpan - 1&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if args['item' .. i] then&lt;br /&gt;
			local content = args['item' .. i] &lt;br /&gt;
			local startYear = info.startYears[i]&lt;br /&gt;
			local endYear = info.endYears[i]&lt;br /&gt;
			&lt;br /&gt;
			addBlank(args, row, prev, startYear)&lt;br /&gt;
			&lt;br /&gt;
			-- Shrink previous item so new item can start at the start year&lt;br /&gt;
			if prevItem and prev &amp;gt; startYear then&lt;br /&gt;
				prevItem:attr('colspan', prevItem:getAttr('colspan') - prev + startYear);&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			prevItem = row:tag('td')&lt;br /&gt;
				:addClass('timeline-item')&lt;br /&gt;
				:cssText(args.itemstyle)&lt;br /&gt;
				:cssText(args['style' .. i] or '')&lt;br /&gt;
				:attr('colspan', endYear - startYear)&lt;br /&gt;
				:wikitext(content)&lt;br /&gt;
			&lt;br /&gt;
			prev = endYear&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Remove any extra rowspan from the label&lt;br /&gt;
	if prevLabel and labelSpan &amp;gt; 0 then&lt;br /&gt;
		prevLabel:attr('rowspan', prevLabel:getAttr('rowspan') - labelSpan);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	addBlank(args, row, prev, info.endYear)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame, {&lt;br /&gt;
		removeBlanks = false,&lt;br /&gt;
		wrappers = 'Template:Timeline'&lt;br /&gt;
	})&lt;br /&gt;
	local targs = {&lt;br /&gt;
		listpadding = '0'&lt;br /&gt;
	}&lt;br /&gt;
	-- Arguments to passthrough to navbox&lt;br /&gt;
	local passthrough = {&lt;br /&gt;
		'name', 'title', 'above', 'below', 'state', 'navbar', 'border', 1,&lt;br /&gt;
		'image', 'imageleft', 'style', 'bodystyle', 'style', 'bodystyle',&lt;br /&gt;
		'basestyle', 'titlestyle', 'abovestyle', 'belowstyle', 'imagestyle',&lt;br /&gt;
		'imageleftstyle', 'titleclass', 'aboveclass', 'bodyclass',&lt;br /&gt;
		'belowclass', 'imageclass'&lt;br /&gt;
	}&lt;br /&gt;
	local info = timelineInfo(args)&lt;br /&gt;
	local tbl = mw.html.create('table'):addClass('timeline-table')&lt;br /&gt;
	&lt;br /&gt;
	renderDates(args, tbl, info)&lt;br /&gt;
	renderTimeline(args, tbl, info)&lt;br /&gt;
	&lt;br /&gt;
	if yesno(args.footer) then&lt;br /&gt;
		renderDates(args, tbl, info)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, name in ipairs(passthrough) do &lt;br /&gt;
		targs[name] = args[name]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	targs.list1 = frame:extensionTag{&lt;br /&gt;
		name = 'templatestyles',&lt;br /&gt;
		args = {&lt;br /&gt;
			src = 'Template:Timeline/style.css'&lt;br /&gt;
		}&lt;br /&gt;
	} .. tostring(tbl)&lt;br /&gt;
	&lt;br /&gt;
	return navbox(targs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>