<?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%3AHorizontal_timeline</id>
	<title>Module:Horizontal 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%3AHorizontal_timeline"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Horizontal_timeline&amp;action=history"/>
	<updated>2026-07-26T05:01:47Z</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:Horizontal_timeline&amp;diff=471914&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:Horizontal_timeline&amp;diff=471914&amp;oldid=prev"/>
		<updated>2021-07-15T22:01:25Z</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;local horizontal_timeline = {};&lt;br /&gt;
&lt;br /&gt;
local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
local builder = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
local function defaultInvokeFunc(funcName)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		args = getArgs(frame, {&lt;br /&gt;
                       trim = true,&lt;br /&gt;
                       removeBlanks = true,&lt;br /&gt;
                       parentFirst = true&lt;br /&gt;
                    })&lt;br /&gt;
&lt;br /&gt;
        local from = getNotNilValue(tonumber(args['from']))&lt;br /&gt;
        local to =  getNotNilValue(tonumber(args['to']))&lt;br /&gt;
&lt;br /&gt;
        if not from or not to or from == to then&lt;br /&gt;
            return (&amp;quot;&amp;lt;strong class='error'&amp;gt;&amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;to&amp;lt;/code&amp;gt; cannot be &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; or equal.&amp;lt;/strong&amp;gt;&amp;quot;)&lt;br /&gt;
        else&lt;br /&gt;
        	return horizontal_timeline[funcName](args)&lt;br /&gt;
        end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
horizontal_timeline.showTimeLine = defaultInvokeFunc('_showTimeLine')&lt;br /&gt;
function horizontal_timeline._showTimeLine(args)&lt;br /&gt;
    local wdth = getNotNilValue(args['width'], '100%' )&lt;br /&gt;
    local bordr = getNotNilValue(args['border'], '1px solid rgb(170, 170, 170)' )&lt;br /&gt;
    local bgCol = getNotNilValue(args['plot-color'], args['plot-colour'], 'transparent')&lt;br /&gt;
    local mrgn = getNotNilValue(args['margin'], '1em')&lt;br /&gt;
&lt;br /&gt;
    local div_root = builder&lt;br /&gt;
        :tag('div')&lt;br /&gt;
        :cssText('float:left;border:'..bordr .. ';width:'..wdth)&lt;br /&gt;
&lt;br /&gt;
    local cntnt = div_root&lt;br /&gt;
        :tag('div')&lt;br /&gt;
        :cssText('text-align:left; padding:1em; font-size:95%; margin:' ..mrgn.. '; background:'..bgCol)&lt;br /&gt;
           &lt;br /&gt;
    local rowNums = affixNums(args, 'row') -- Gets numbers for row1, row2, etc. with nil arguments removed.&lt;br /&gt;
    for _, num in ipairs(rowNums) do&lt;br /&gt;
        local rowType = args['row' .. num] -- Gets args.rowtype1, args.rowtype2, etc. with nil arguments removed.&lt;br /&gt;
        if rowType == 'scale' then&lt;br /&gt;
            cntnt:wikitext(horizontal_timeline.scaleRow(args))&lt;br /&gt;
        elseif rowType == 'note' then&lt;br /&gt;
            cntnt:wikitext(horizontal_timeline.noteRow(num, args))&lt;br /&gt;
        elseif rowType == 'timeline' then&lt;br /&gt;
            cntnt:wikitext(horizontal_timeline.timelineRow(num, args))&lt;br /&gt;
        else&lt;br /&gt;
            cntnt:wikitext(rowType)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if args.caption then&lt;br /&gt;
        cntnt:tag('div')&lt;br /&gt;
            :cssText('clear:both; text-align:center')&lt;br /&gt;
            :wikitext(args.caption)&lt;br /&gt;
            :done()&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(div_root) .. &amp;quot;&amp;lt;div style='clear:left;'&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
horizontal_timeline.showOneRow = defaultInvokeFunc('_showOneRow')&lt;br /&gt;
function horizontal_timeline._showOneRow(args)&lt;br /&gt;
    local rowNums = affixNums(args, 'row') -- Gets numbers for row1, row2, etc. with nil arguments removed.&lt;br /&gt;
    for _, num in ipairs(rowNums) do&lt;br /&gt;
        local rowType = args['row' .. num] -- Gets args.rowtype1, args.rowtype2, etc. with nil arguments removed.&lt;br /&gt;
        if rowType == 'scale' then&lt;br /&gt;
            return horizontal_timeline.scaleRow(args)&lt;br /&gt;
        elseif rowType == 'note' then&lt;br /&gt;
            return horizontal_timeline.noteRow(num, args)&lt;br /&gt;
        elseif rowType == 'timeline' then&lt;br /&gt;
            return horizontal_timeline.timelineRow(num, args)&lt;br /&gt;
        else&lt;br /&gt;
            return wikitext(rowType)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;?&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function horizontal_timeline.timelineRow(num, args)&lt;br /&gt;
    local root = mw.html.create()&lt;br /&gt;
    &lt;br /&gt;
    local from = getNotNilValue(tonumber(args['from']))&lt;br /&gt;
    local to =  getNotNilValue(tonumber(args['to']))&lt;br /&gt;
    &lt;br /&gt;
    local style    = getNotNilValue(args['row' .. num .. '-style'], '')&lt;br /&gt;
    local hght     = getNotNilValue (args['row' .. num .. '-height'],&lt;br /&gt;
									 args[style .. '-height'],&lt;br /&gt;
									 '2.5em')&lt;br /&gt;
    local bordrTop = getNotNilValue (args['row' .. num .. '-bordertop'],&lt;br /&gt;
									 args[style .. '-bordertop'],&lt;br /&gt;
									 'none')&lt;br /&gt;
    local bordrBtm = getNotNilValue (args['row' .. num .. '-borderbottom'],&lt;br /&gt;
									 args[style .. '-borderbottom'],&lt;br /&gt;
									 'none')&lt;br /&gt;
    local txtTop   = getNotNilValue (args['row' .. num .. '-texttop'],&lt;br /&gt;
									 args[style .. '-texttop'],&lt;br /&gt;
									 '0em')&lt;br /&gt;
    local colr     = getNotNilValue (args['row' .. num .. '-colour'],&lt;br /&gt;
    	                             args['row' .. num .. '-color'],&lt;br /&gt;
    	                             args[style .. '-colour'],&lt;br /&gt;
    	                             args[style .. '-color'],&lt;br /&gt;
    	                             'transparent')&lt;br /&gt;
	local barborder = getNotNilValue (args['bar-border'], '1px solid #000')&lt;br /&gt;
	                             &lt;br /&gt;
    if bordrTop ~= 'none' then&lt;br /&gt;
    	bordrTop = 'border-top:' .. bordrTop .. ';'&lt;br /&gt;
    else&lt;br /&gt;
    	bordrTop = ''&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if bordrBtm ~= 'none' then&lt;br /&gt;
    	bordrBtm = 'border-bottom:' .. bordrBtm .. ';'&lt;br /&gt;
    else&lt;br /&gt;
    	bordrBtm = ''&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local p = root&lt;br /&gt;
         :tag('div')&lt;br /&gt;
            :cssText(&amp;quot;clear:both;width:100%; padding:0px; height:&amp;quot;.. hght)&lt;br /&gt;
            :cssText(bordrTop.. bordrBtm .. &amp;quot;background-color:&amp;quot;..colr)&lt;br /&gt;
&lt;br /&gt;
    local rowDat = affixNums(args, 'row'..num..'%-', '%-[a-zA-Z]*')&lt;br /&gt;
    local lastTo = from&lt;br /&gt;
    local firstNode = true&lt;br /&gt;
    for _, vals in ipairs(rowDat) do&lt;br /&gt;
&lt;br /&gt;
    	local styleL    = getNotNilValue(args['row' .. num .. '-'.. vals ..  '-style'], style)&lt;br /&gt;
&lt;br /&gt;
        --These vars should be initialized every iteration. Do not move outside of loop&lt;br /&gt;
        local bar_to = tonumber(getNotNilValue(args['row' .. num .. '-'.. vals .. '-to'],&lt;br /&gt;
                                        args[styleL .. '-to'],&lt;br /&gt;
                                        args[style.. '-'.. vals .. '-to'], to  ) )&lt;br /&gt;
        local bar_fontsize =getNotNilValue(args['row' .. num .. '-'.. vals .. '-fontsize'],&lt;br /&gt;
        								args[styleL .. '-fontsize'],&lt;br /&gt;
                                        args[style..'-'.. vals .. '-fontsize'], '0.9em' )&lt;br /&gt;
        local bar_bordr= getNotNilValue(args['row' .. num .. '-'.. vals .. '-border'],&lt;br /&gt;
        								args[styleL .. '-border'],&lt;br /&gt;
                                        args[style..'-'.. vals .. '-border'],&lt;br /&gt;
                                        'none')&lt;br /&gt;
        local bar_txtTop= getNotNilValue(args['row' .. num .. '-'.. vals .. '-texttop'],&lt;br /&gt;
        								args[styleL .. '-texttop'],&lt;br /&gt;
                                        args[style..'-'.. vals .. '-texttop'], txtTop )&lt;br /&gt;
        local bar_text = getNotNilValue(args['row' .. num .. '-'.. vals .. '-text'],&lt;br /&gt;
        								args[styleL .. '-text'],&lt;br /&gt;
                                        args[style..'-'.. vals .. '-text'], '')&lt;br /&gt;
        local bar_colour = getNotNilValue(args['row' .. num .. '-'.. vals .. '-colour'],&lt;br /&gt;
                                        args['row' .. num .. '-'.. vals .. '-color'],&lt;br /&gt;
                                        args[styleL .. '-boxcolour'],&lt;br /&gt;
                                        args[styleL .. '-boxcolor'],&lt;br /&gt;
                                        args[style..'-'.. vals .. '-colour'],&lt;br /&gt;
                                        args[style..'-'.. vals .. '-color'],&lt;br /&gt;
                                        'transparent' )&lt;br /&gt;
                                        &lt;br /&gt;
        if from &amp;lt; to then&lt;br /&gt;
            if bar_to &amp;gt; to then bar_to = to end&lt;br /&gt;
            if lastTo &amp;lt; from then lastTo = from end&lt;br /&gt;
        else&lt;br /&gt;
            if bar_to &amp;lt; to then bar_to = to end&lt;br /&gt;
            if lastTo &amp;gt; from then lastTo = from end&lt;br /&gt;
    	end&lt;br /&gt;
&lt;br /&gt;
        local width =( (bar_to-lastTo)*100 / (to-from) ) --math.abs&lt;br /&gt;
&lt;br /&gt;
        if width &amp;gt; 0 and width &amp;lt;= 100 then&lt;br /&gt;
            if bar_bordr == 'none' then&lt;br /&gt;
                if firstNode then -- for first box both left and right border needed&lt;br /&gt;
                    bar_bordr = barborder .. &amp;quot;; border-left:&amp;quot; .. barborder&lt;br /&gt;
                    firstNode = false&lt;br /&gt;
                else&lt;br /&gt;
                    bar_bordr = barborder&lt;br /&gt;
    	        end&lt;br /&gt;
		    end&lt;br /&gt;
            p:tag('div')&lt;br /&gt;
                :cssText(&amp;quot;float:left; height:100%; text-align:center; overflow: hidden; background-color:&amp;quot;..bar_colour)&lt;br /&gt;
                :cssText(&amp;quot;width:&amp;quot;..width ..&amp;quot;%&amp;quot;)&lt;br /&gt;
                    :tag('div')&lt;br /&gt;
                    :cssText(&amp;quot;-moz-box-sizing: border-box; -webkit-box-sizing: border-box;box-sizing: border-box;&amp;quot;)&lt;br /&gt;
                    :cssText(&amp;quot;float:right; height:100%; width:100%; border-right:&amp;quot;..bar_bordr)&lt;br /&gt;
                        :tag('div')&lt;br /&gt;
                            :cssText('position: relative; top:'..bar_txtTop .. '; font-size:'.. bar_fontsize)&lt;br /&gt;
                            :wikitext(bar_text)&lt;br /&gt;
                        :done()&lt;br /&gt;
                    :done()&lt;br /&gt;
                :done()&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        lastTo = bar_to&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function horizontal_timeline.noteRow(num, args)&lt;br /&gt;
    local root = mw.html.create()&lt;br /&gt;
    &lt;br /&gt;
    local from = getNotNilValue(tonumber(args['from']))&lt;br /&gt;
    local to =  getNotNilValue(tonumber(args['to']))&lt;br /&gt;
    &lt;br /&gt;
    local hght = getNotNilValue(args['row' .. num .. '-height'], '2.5em')&lt;br /&gt;
&lt;br /&gt;
    local p = root&lt;br /&gt;
         :tag('div')&lt;br /&gt;
            :cssText(&amp;quot;width:100%; position:relative; left:-0.2em; top:0.8em; clear:both; height:&amp;quot;.. hght)&lt;br /&gt;
&lt;br /&gt;
    local rowDat = affixNums(args, 'row'..num..'%-', '%-at')&lt;br /&gt;
    if not rowDat then&lt;br /&gt;
        return (&amp;quot;&amp;lt;strong class='error'&amp;gt;Please specify location for note at &amp;lt;code&amp;gt;&amp;quot;..'row' .. num .. '-'.. vals .. '-at'..&amp;quot;&amp;lt;/code&amp;gt; parameter.&amp;lt;/strong&amp;gt;&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    for _, vals in ipairs(rowDat) do&lt;br /&gt;
        local note_at   =args['row' .. num .. '-'.. vals .. '-at'] --will never be nil as it is what is used to receive rowDat&lt;br /&gt;
        local note_text =getNotNilValue(args['row' .. num .. '-'.. vals .. '-text'], '' )&lt;br /&gt;
        local note_shift=getNotNilValue(args['row' .. num .. '-'.. vals .. '-shift'], '0em' )&lt;br /&gt;
        local note_lift =getNotNilValue(args['row' .. num .. '-'.. vals .. '-lift'], '0em' )&lt;br /&gt;
        local note_arrow=getNotNilValue(args['row' .. num .. '-'.. vals .. '-arrow'], '↓' )&lt;br /&gt;
&lt;br /&gt;
		local note_sft = 100*(note_at - from) / (to-from)&lt;br /&gt;
        &lt;br /&gt;
        p:tag('div')&lt;br /&gt;
            :cssText(&amp;quot;position:absolute; top:0px; width:100%&amp;quot;)&lt;br /&gt;
                :tag('div')&lt;br /&gt;
                    :cssText(&amp;quot;margin-left:&amp;quot;.. note_sft ..&amp;quot;%; margin-top:0; position:relative&amp;quot;)&lt;br /&gt;
                    :tag('span')&lt;br /&gt;
                        :cssText(&amp;quot;position:relative; top:0.25em; left:-1.5px&amp;quot;)&lt;br /&gt;
                        :wikitext(note_arrow)&lt;br /&gt;
                        :done()&lt;br /&gt;
                    :tag('span')&lt;br /&gt;
                        :cssText(&amp;quot;font-size:smaller; position:relative; line-height:3px; overflow:visible&amp;quot;)&lt;br /&gt;
                        :cssText(&amp;quot;left:&amp;quot;..note_shift..&amp;quot;; top:&amp;quot;..note_lift..&amp;quot;; z-index:&amp;quot;.. (1000- tonumber(num)))&lt;br /&gt;
                        :wikitext(note_text)&lt;br /&gt;
                        :done()&lt;br /&gt;
                    :done()&lt;br /&gt;
                :done()&lt;br /&gt;
            :done()&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function horizontal_timeline.scaleRow(args)&lt;br /&gt;
	local from = getNotNilValue(tonumber(args['from']))&lt;br /&gt;
    local to =  getNotNilValue(tonumber(args['to']))&lt;br /&gt;
    local inc = getNotNilValue( tonumber(args['inc']), (math.floor( (from - to) / 5 ) * -1) )&lt;br /&gt;
    local negativeFmt = getNotNilValue(args['axis-negativeFmt'], '−%s')&lt;br /&gt;
    local positiveFmt = getNotNilValue(args['axis-positiveFmt'], '%s')&lt;br /&gt;
    local zeroFmt     = getNotNilValue(args['axis-zeroFmt'], '%s')&lt;br /&gt;
    local nudge       = getNotNilValue(args['axis-nudge'], '-1.8em')&lt;br /&gt;
&lt;br /&gt;
    local wdth = math.abs ( (100 * inc) / (from - to) )&lt;br /&gt;
    local root = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
    local p = root&lt;br /&gt;
        :wikitext(&amp;quot;&amp;lt;div name='line' style='clear:both;width:100%;max-width:100%;border-top:0.1em solid black;height:1em;'&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;)&lt;br /&gt;
        :tag('div')&lt;br /&gt;
            :attr('id', 'Scale')&lt;br /&gt;
            :cssText('clear:both;position:relative;top:-1.4em;left:-0.2em;width:100%;padding:0;height:2.5em')&lt;br /&gt;
            &lt;br /&gt;
    for var=from, to, inc do&lt;br /&gt;
        if from &amp;lt; to then&lt;br /&gt;
            if var+inc &amp;gt; to then wdth = 0 end&lt;br /&gt;
        else&lt;br /&gt;
            if var+inc &amp;lt; to then wdth = 0 end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        local lbl&lt;br /&gt;
        if var &amp;lt; 0 then&lt;br /&gt;
            lbl = string.format( negativeFmt, math.abs(var) )&lt;br /&gt;
        elseif var &amp;gt; 0 then&lt;br /&gt;
            lbl = string.format( positiveFmt, math.abs(var) )&lt;br /&gt;
        else&lt;br /&gt;
            lbl = string.format( zeroFmt, math.abs(var) )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local markr = getNotNilValue(args['axis-marker-'..lbl], '│') &lt;br /&gt;
		lbl = getNotNilValue(args['axis-'..lbl], lbl)&lt;br /&gt;
		&lt;br /&gt;
        p:tag('div')&lt;br /&gt;
            :cssText('float:left;overflow:visible;width:'.. wdth .. '%')&lt;br /&gt;
            :wikitext(markr)&lt;br /&gt;
            :tag('div')&lt;br /&gt;
                :cssText('font-size:86%; position:relative; left:'..nudge..'; overflow:visible; white-space:nowrap')&lt;br /&gt;
                :wikitext(lbl)&lt;br /&gt;
                :done()&lt;br /&gt;
        :done()&lt;br /&gt;
    end&lt;br /&gt;
    p:done()&lt;br /&gt;
    return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Returns the first non nil value from the list of parameters.&lt;br /&gt;
function getNotNilValue(...)&lt;br /&gt;
    for _,v in pairs(arg) do --Do not use ipairs. Will stop at first nil&lt;br /&gt;
        if v then return v end&lt;br /&gt;
    end&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function affixNums(t, prefix, suffix)&lt;br /&gt;
    prefix = prefix or ''&lt;br /&gt;
    suffix = suffix or ''&lt;br /&gt;
    &lt;br /&gt;
    local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'&lt;br /&gt;
    local nums = {}&lt;br /&gt;
    for k, v in pairs(t) do&lt;br /&gt;
        if type(k) == 'string' then            &lt;br /&gt;
            local num = mw.ustring.match(k, pattern)&lt;br /&gt;
            if num then&lt;br /&gt;
                nums[#nums + 1] = tonumber(num)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    table.sort(nums)&lt;br /&gt;
    return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return horizontal_timeline&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>