<?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%3APortal_navigation</id>
	<title>Module:Portal navigation - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3APortal_navigation"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Portal_navigation&amp;action=history"/>
	<updated>2026-06-05T12:02:54Z</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:Portal_navigation&amp;diff=479015&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:Portal_navigation&amp;diff=479015&amp;oldid=prev"/>
		<updated>2021-07-16T05:24:19Z</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 p = {}&lt;br /&gt;
local yesno = require(&amp;quot;Module:Yesno&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
function get_portalicon(portalicon)&lt;br /&gt;
	if portalicon == nil then&lt;br /&gt;
		return ''&lt;br /&gt;
	end&lt;br /&gt;
	return '&amp;lt;span style=&amp;quot;padding:0.3em; display:inline-block;margin-right:0.5em;&amp;quot;&amp;gt;' .. portalicon .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function converttolinearrgb(c)&lt;br /&gt;
	c = tonumber(c, 16)&lt;br /&gt;
	c = c / 255.0&lt;br /&gt;
	if c &amp;lt;= 0.03928 then&lt;br /&gt;
		c = c/12.92&lt;br /&gt;
	else&lt;br /&gt;
		c = ((c+0.055)/1.055) ^ 2.4&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return c&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render(frame)&lt;br /&gt;
	-- Default values&lt;br /&gt;
	portalname = 'Portal'&lt;br /&gt;
	tabs = {}&lt;br /&gt;
	subtabs = {}&lt;br /&gt;
	wrc = 0&lt;br /&gt;
&lt;br /&gt;
	-- Default values (customizations)&lt;br /&gt;
	themecolor = '#54595d'&lt;br /&gt;
	headerstyle = ''&lt;br /&gt;
	tabsicons = {}&lt;br /&gt;
	wrcadditional = nil&lt;br /&gt;
	&lt;br /&gt;
	-- Populating variables&lt;br /&gt;
	for key, value in pairs(frame:getParent().args) do&lt;br /&gt;
		if key == 'portalname' then&lt;br /&gt;
			portalname = value&lt;br /&gt;
		elseif key == 'portalicon' then&lt;br /&gt;
			portalicon = value&lt;br /&gt;
		elseif key == 'active' then&lt;br /&gt;
			active = tonumber(value)&lt;br /&gt;
		elseif key == 'wrc' then&lt;br /&gt;
			wrc = value&lt;br /&gt;
		elseif key == 'themecolor' then&lt;br /&gt;
			themecolor = value&lt;br /&gt;
		elseif key == 'headerstyle' then&lt;br /&gt;
			headerstyle = value&lt;br /&gt;
		elseif key == 'hidenav' then&lt;br /&gt;
			hidenav = yesno(value)&lt;br /&gt;
		elseif key == 'hidesubnav' then&lt;br /&gt;
			hidesubnav = yesno(value)&lt;br /&gt;
		elseif key == 'wrcadditional' then&lt;br /&gt;
			wrcadditional = value&lt;br /&gt;
		elseif string.find(key, 'tab') ~= nil&lt;br /&gt;
		and string.find(key, 'subtab') == nil then  -- matches tab1, tab2, ...&lt;br /&gt;
    		id = string.gsub(key, 'tab', '')&lt;br /&gt;
    		id = tonumber(id)&lt;br /&gt;
    		tabs[id] = value&lt;br /&gt;
    	elseif string.find(key, 'icon') ~= nil then -- matches icon1, icon2, etc.&lt;br /&gt;
    		id = string.gsub(key, 'icon', '')&lt;br /&gt;
    		id = tonumber(id)&lt;br /&gt;
    		tabsicons[id] = value&lt;br /&gt;
    	elseif string.find(key, 'subtab') ~= nil then -- matches subtab1-1, etc.&lt;br /&gt;
    		id = string.gsub(key, 'subtab', '')&lt;br /&gt;
    		-- Subtab params take the form [prime tab]-[sub tab]&lt;br /&gt;
    		id = mw.text.split(id, '-')&lt;br /&gt;
    		primetab = tonumber(id[1])&lt;br /&gt;
    		subtab = tonumber(id[2])&lt;br /&gt;
    		if subtabs[primetab] == nil then&lt;br /&gt;
    			subtabs[primetab] = {}&lt;br /&gt;
    		end&lt;br /&gt;
    		subtabs[primetab][subtab] = value&lt;br /&gt;
    	end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Constructing header&lt;br /&gt;
	-- Relevant variables: portalname, wrc, themecolor, headerstyle&lt;br /&gt;
	&lt;br /&gt;
	-- The text color in the header is automatically chosen based on the best contrast&lt;br /&gt;
	-- https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color&lt;br /&gt;
	headertextcolor = '#fff'&lt;br /&gt;
	&lt;br /&gt;
	rgb = string.gsub(themecolor, '#', '')&lt;br /&gt;
	rgb = mw.text.split(rgb, '')&lt;br /&gt;
	if #rgb == 6 then&lt;br /&gt;
		r = rgb[1] .. rgb[2]&lt;br /&gt;
		g = rgb[3] .. rgb[4]&lt;br /&gt;
		b = rgb[5] .. rgb[6]&lt;br /&gt;
	elseif #rgb == 3 then&lt;br /&gt;
		r = rgb[1] .. rgb[1]&lt;br /&gt;
		g = rgb[2] .. rgb[2]&lt;br /&gt;
		b = rgb[3] .. rgb[3]&lt;br /&gt;
	end&lt;br /&gt;
	r = converttolinearrgb(r)&lt;br /&gt;
	g = converttolinearrgb(g)&lt;br /&gt;
	b = converttolinearrgb(b)&lt;br /&gt;
	&lt;br /&gt;
	luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b&lt;br /&gt;
	&lt;br /&gt;
	if luminance &amp;gt; 0.179 then&lt;br /&gt;
		headertextcolor = '#000'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Applying customizations to headerstyle&lt;br /&gt;
	if headerstyle ~= '' then&lt;br /&gt;
		headerstyle = ' ' .. headerstyle&lt;br /&gt;
	end&lt;br /&gt;
	headerstyle = 'font-size:1.6875em; border-radius:2px; font-weight:bold;'&lt;br /&gt;
		.. 'background:' .. themecolor .. '; color:' .. headertextcolor&lt;br /&gt;
		.. '; padding:0.25em;'.. headerstyle&lt;br /&gt;
	&lt;br /&gt;
	header = '&amp;lt;div style=&amp;quot;' .. headerstyle .. '&amp;quot;&amp;gt;'&lt;br /&gt;
	header = header .. portalname .. get_portalicon(portalicon) .. '&amp;lt;/div&amp;gt;'&lt;br /&gt;
	&lt;br /&gt;
	if wrc == '1' or wrc == 1 or wrc == 'true' or wrc == true or wrc == 'yes' then&lt;br /&gt;
		badgeargs = {}&lt;br /&gt;
		if wrcadditional ~= nil then&lt;br /&gt;
			badgeargs['additional'] = wrcadditional&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		header = frame:expandTemplate{&lt;br /&gt;
			title = 'Wikimedia Resource Center badge',&lt;br /&gt;
			args = badgeargs }&lt;br /&gt;
			.. '\n\n' .. header&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Constructing the rest&lt;br /&gt;
	-- Relevant variables: themecolor tabs tabsicons active subtabs&lt;br /&gt;
&lt;br /&gt;
	body = ''&lt;br /&gt;
&lt;br /&gt;
	if hidenav ~= true then&lt;br /&gt;
		body = body .. '&amp;lt;div style=&amp;quot;font-size:1.125em; margin-bottom:1.125em;&amp;gt;'&lt;br /&gt;
		&lt;br /&gt;
		for index, pagelink in ipairs(tabs) do&lt;br /&gt;
			-- Open TOC entry container&lt;br /&gt;
			containerstyle = 'display:inline-block; position:relative; vertical-align:top;'&lt;br /&gt;
			body = body .. '&amp;lt;div style=&amp;quot;' .. containerstyle .. '&amp;quot;&amp;gt;'&lt;br /&gt;
			&lt;br /&gt;
			-- Create the tab itself&lt;br /&gt;
			entrystyle = 'display:inline-block; margin:1em; padding-bottom:0.5em; font-weight:bold;'&lt;br /&gt;
			if index == active then&lt;br /&gt;
				if subtabs[index] == nil or hidesubnav == true then&lt;br /&gt;
					entrystyle = entrystyle .. ' border-bottom:0.3em solid ' .. themecolor .. ';'&lt;br /&gt;
				else&lt;br /&gt;
					entrystyle = entrystyle .. ' margin-bottom:0;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				entrystyle = entrystyle .. '  border-bottom:0.3em solid #c8ccd1;'&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			icon = ''&lt;br /&gt;
			if tabsicons[index] ~= nil then&lt;br /&gt;
				icon = '&amp;lt;span style=&amp;quot;margin-right:0.75em;&amp;quot;&amp;gt;'&lt;br /&gt;
				icon = icon .. tabsicons[index] .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			body = body&lt;br /&gt;
				.. '&amp;lt;span style=&amp;quot;' .. entrystyle .. '&amp;quot;&amp;gt;'&lt;br /&gt;
				.. icon .. pagelink&lt;br /&gt;
				.. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
			&lt;br /&gt;
			-- If the tab is active, show the subnav if there is any&lt;br /&gt;
			&lt;br /&gt;
			if index == active and subtabs[index] ~= nil and hidesubnav ~= true then&lt;br /&gt;
				body = body .. '&amp;lt;div style=&amp;quot;font-size:95%; margin-left:1em; margin-right:1em; padding-top:1.125em; padding-bottom:1.125em; border-top:0.35em solid ' .. themecolor .. '; border-bottom:0.35em solid' .. themecolor .. ';&amp;quot;&amp;gt;'&lt;br /&gt;
				&lt;br /&gt;
				for subindex, subpagelink in ipairs(subtabs[index]) do&lt;br /&gt;
					body = body .. subpagelink&lt;br /&gt;
					if subindex ~= #subtabs[index] then&lt;br /&gt;
						body = body .. '&amp;lt;br /&amp;gt;'&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				body = body .. '&amp;lt;/div&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			-- Close TOC entry container&lt;br /&gt;
			body = body .. '&amp;lt;/div&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
		body = body .. '&amp;lt;/div&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return '&amp;lt;div&amp;gt;' .. header .. body .. '&amp;lt;/div&amp;gt;&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>