<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://meta.wikioasis.org/wiki/Module:Portal_navigation?action=history&amp;feed=atom</id>
	<title>Module:Portal navigation - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://meta.wikioasis.org/wiki/Module:Portal_navigation?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://meta.wikioasis.org/wiki/Module:Portal_navigation?action=history"/>
	<updated>2026-05-24T12:40:29Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://meta.wikioasis.org/wiki/Module:Portal_navigation?diff=1388&amp;oldid=prev</id>
		<title>WikiOasisGDPR1162b7f4ed1ab49381ec4a02900cb791: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://meta.wikioasis.org/wiki/Module:Portal_navigation?diff=1388&amp;oldid=prev"/>
		<updated>2025-04-14T03:28:47Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 03:28, 14 April 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>WikiOasisGDPR1162b7f4ed1ab49381ec4a02900cb791</name></author>
	</entry>
	<entry>
		<id>https://meta.wikioasis.org/wiki/Module:Portal_navigation?diff=1387&amp;oldid=prev</id>
		<title>Miraheze &gt;Agent Isai: Testing</title>
		<link rel="alternate" type="text/html" href="https://meta.wikioasis.org/wiki/Module:Portal_navigation?diff=1387&amp;oldid=prev"/>
		<updated>2022-04-19T06:12:25Z</updated>

		<summary type="html">&lt;p&gt;Testing&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;
&lt;br /&gt;
local function is_rtl(lang)&lt;br /&gt;
	lang = lang or mw.getCurrentFrame():preprocess(&amp;#039;{{int:lang}}&amp;#039;)&lt;br /&gt;
	return require(&amp;#039;Module:Is rtl&amp;#039;)[lang] == true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_portalicon(portalicon)&lt;br /&gt;
	if portalicon == nil then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;portal-navigation-portalicon&amp;quot;&amp;gt;&amp;#039; .. portalicon .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&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 = &amp;#039;Portal&amp;#039;&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 = &amp;#039;#54595d&amp;#039;&lt;br /&gt;
	headerstyle = &amp;#039;&amp;#039;&lt;br /&gt;
	tabsicons = {}&lt;br /&gt;
	ff = nil&lt;br /&gt;
	lang = nil&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 == &amp;#039;portalname&amp;#039; then&lt;br /&gt;
			portalname = value&lt;br /&gt;
		elseif key == &amp;#039;portalicon&amp;#039; then&lt;br /&gt;
			portalicon = value&lt;br /&gt;
		elseif key == &amp;#039;active&amp;#039; then&lt;br /&gt;
			active = tonumber(value)&lt;br /&gt;
		elseif key == &amp;#039;wrc&amp;#039; then&lt;br /&gt;
			wrc = value&lt;br /&gt;
		elseif key == &amp;#039;themecolor&amp;#039; then&lt;br /&gt;
			themecolor = value&lt;br /&gt;
		elseif key == &amp;#039;headerstyle&amp;#039; then&lt;br /&gt;
			headerstyle = value&lt;br /&gt;
		elseif key == &amp;#039;forceflip&amp;#039; then&lt;br /&gt;
			ff = value&lt;br /&gt;
		elseif key == &amp;#039;lang&amp;#039; then&lt;br /&gt;
			lang = value&lt;br /&gt;
		elseif key == &amp;#039;hidenav&amp;#039; then&lt;br /&gt;
			hidenav = value&lt;br /&gt;
		elseif key == &amp;#039;hidesubnav&amp;#039; then&lt;br /&gt;
			hidesubnav = value&lt;br /&gt;
		elseif key == &amp;#039;wrcadditional&amp;#039; then&lt;br /&gt;
			wrcadditional = value&lt;br /&gt;
		elseif string.find(key, &amp;#039;tab&amp;#039;) ~= nil&lt;br /&gt;
		and string.find(key, &amp;#039;subtab&amp;#039;) == nil then  -- matches tab1, tab2, ...&lt;br /&gt;
    		id = string.gsub(key, &amp;#039;tab&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
    		id = tonumber(id)&lt;br /&gt;
    		tabs[id] = value&lt;br /&gt;
    	elseif string.find(key, &amp;#039;icon&amp;#039;) ~= nil then -- matches icon1, icon2, etc.&lt;br /&gt;
    		id = string.gsub(key, &amp;#039;icon&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
    		id = tonumber(id)&lt;br /&gt;
    		tabsicons[id] = value&lt;br /&gt;
    	elseif string.find(key, &amp;#039;subtab&amp;#039;) ~= nil then -- matches subtab1-1, etc.&lt;br /&gt;
    		id = string.gsub(key, &amp;#039;subtab&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
    		-- Subtab params take the form [prime tab]-[sub tab]&lt;br /&gt;
    		id = mw.text.split(id, &amp;#039;-&amp;#039;)&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;
	if ff == &amp;#039;yes&amp;#039; or ff == &amp;#039;true&amp;#039; or ff == &amp;#039;1&amp;#039; then&lt;br /&gt;
		ff = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if hidenav == &amp;#039;yes&amp;#039; or hidenav == &amp;#039;true&amp;#039; or hidenav == &amp;#039;1&amp;#039; then&lt;br /&gt;
		hidenav = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if hidesubnav == &amp;#039;yes&amp;#039; or hidesubnav == &amp;#039;true&amp;#039; or hidesubnav == &amp;#039;1&amp;#039; then&lt;br /&gt;
		hidesubnav = true&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 = &amp;#039;#fff&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	rgb = string.gsub(themecolor, &amp;#039;#&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	rgb = mw.text.split(rgb, &amp;#039;&amp;#039;)&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 = &amp;#039;#000&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Applying customizations to headerstyle&lt;br /&gt;
	headerstyle = &amp;#039;background:&amp;#039; .. themecolor .. &amp;#039;; color:&amp;#039; .. headertextcolor .. &amp;#039;;&amp;#039;&lt;br /&gt;
		.. headerstyle&lt;br /&gt;
	&lt;br /&gt;
	header = &amp;#039;&amp;lt;div class=&amp;quot;portal-navigation-header&amp;quot; style=&amp;quot;&amp;#039; .. headerstyle .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	if ff ~= true or (ff == true and not is_rtl()) then&lt;br /&gt;
		header = header .. get_portalicon(portalicon) .. portalname .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		header = header .. portalname .. get_portalicon(portalicon) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if wrc == &amp;#039;1&amp;#039; or wrc == 1 or wrc == &amp;#039;true&amp;#039; or wrc == true or wrc == &amp;#039;yes&amp;#039; then&lt;br /&gt;
		badgeargs = {}&lt;br /&gt;
		if ff == true then&lt;br /&gt;
			badgeargs[&amp;#039;forceflip&amp;#039;] = ff&lt;br /&gt;
		end&lt;br /&gt;
		if wrcadditional ~= nil then&lt;br /&gt;
			badgeargs[&amp;#039;additional&amp;#039;] = wrcadditional&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		header = frame:expandTemplate{&lt;br /&gt;
			title = &amp;#039;Wikimedia Resource Center badge&amp;#039;,&lt;br /&gt;
			args = badgeargs }&lt;br /&gt;
			.. &amp;#039;\n\n&amp;#039; .. 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 = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	if hidenav ~= true then&lt;br /&gt;
		body = body .. &amp;#039;&amp;lt;ul class=&amp;quot;portal-navigation-body&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
		for index, pagelink in ipairs(tabs) do&lt;br /&gt;
			-- Open TOC entry container&lt;br /&gt;
			body = body .. &amp;#039;&amp;lt;li&amp;gt;&amp;#039;&lt;br /&gt;
			&lt;br /&gt;
			-- Create the tab itself&lt;br /&gt;
			local entryclass = &amp;#039;portal-navigation-entry&amp;#039;&lt;br /&gt;
			local entrystyle = &amp;#039;&amp;#039;&lt;br /&gt;
			if index == active then&lt;br /&gt;
				if subtabs[index] == nil or hidesubnav == true then&lt;br /&gt;
					entrystyle = &amp;#039; style=&amp;quot;border-bottom-color:&amp;#039; .. themecolor .. &amp;#039;;&amp;quot;&amp;#039;&lt;br /&gt;
				else&lt;br /&gt;
					entryclass = entryclass .. &amp;#039; portal-navigation-entry-has-subtabs&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			icon = &amp;#039;&amp;#039;&lt;br /&gt;
			if tabsicons[index] ~= nil then&lt;br /&gt;
				icon = &amp;#039;&amp;lt;span class=&amp;quot;portal-navigation-tabicon&amp;quot;&amp;gt;&amp;#039; .. tabsicons[index] .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			body = body&lt;br /&gt;
				.. &amp;#039;&amp;lt;span class=&amp;quot;&amp;#039; .. entryclass .. &amp;#039;&amp;quot;&amp;#039; .. entrystyle .. &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
				.. icon .. pagelink&lt;br /&gt;
				.. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&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;#039;&amp;lt;ul class=&amp;quot;portal-navigation-subtabs&amp;quot; style=&amp;quot;border-color:&amp;#039; .. activecolor or themecolor .. &amp;#039;;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
				&lt;br /&gt;
				for _, subpagelink in ipairs(subtabs[index]) do&lt;br /&gt;
					body = body .. &amp;#039;&amp;lt;li&amp;gt;&amp;#039; .. subpagelink .. &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				body = body .. &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			-- Close TOC entry container&lt;br /&gt;
			body = body .. &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
		body = body .. &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local templatestyles = frame:extensionTag(&amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, {src = &amp;#039;Module:Portal navigation/styles.css&amp;#039;})&lt;br /&gt;
&lt;br /&gt;
	local classes = &amp;#039;portal-navigation&amp;#039;&lt;br /&gt;
	local attributes = &amp;#039;&amp;#039;&lt;br /&gt;
	if lang then&lt;br /&gt;
		attributes = &amp;#039; lang=&amp;quot;&amp;#039; .. lang .. &amp;#039;&amp;quot; dir=&amp;quot;&amp;#039; .. (is_rtl(lang) and &amp;#039;rtl&amp;#039; or &amp;#039;ltr&amp;#039;) .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if ff == true then&lt;br /&gt;
		classes = classes .. &amp;#039; portal-navigation-force-&amp;#039; .. (is_rtl() and &amp;#039;rtl&amp;#039; or &amp;#039;ltr&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;#039;&amp;lt;div class=&amp;quot;&amp;#039; .. classes .. &amp;#039;&amp;quot;&amp;#039; .. attributes .. &amp;#039;&amp;gt;&amp;#039; .. templatestyles .. header .. body .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Miraheze &gt;Agent Isai</name></author>
	</entry>
</feed>