UWAGA
Strona jest ponownie oddana do uzytku po zabiegach konfiguracyjnych. Jeśli zobaczą Państwo na niej jakieś błedy techniczne, prosimy o ich zgłoszenie.

Większość artykułów w portalu to nasze własne teksty z kluczowych dziedzin związanych z naszą misją. Spora część materiałów pochodzi też z polskiej wersji Wikipedii, gdzie były odrzucone ze względu na politykę redaktorów (przeczytaj o krytyce Wikipedii). Są też i takie, które zostały przeniesione na nasze strony, gdyż stanowią istotne uzupełnienie merytorycznej treści naszego serwisu. Wszystkie artykuły podlegają edycji przez naszych Użytkowników, dlatego ich wersje mogą się różnić od prezentowanych na innych witrynach.

Moduł:Portal

Z Wedapedia
Przejdź do nawigacji Przejdź do wyszukiwania

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Portal/opis

--[==[ 
Zobacz też [[Moduł:Portal/grafika]]
]==]
 
local p = {}
 
local function matchImagePage(s)
	-- Finds the appropriate image subpage given a lower-case
	-- portal name plus the first letter of that portal name.
	if type(s) ~= 'string' or #s < 1 then return end
	local firstLetter = mw.ustring.sub(s, 1, 1)
	local imagePage
	imagePage = 'Module:Portal/grafika'
	return mw.loadData(imagePage)[s]
end
 
local function getImageName(s)
	-- Gets the image name for a given string.
	if type(s) ~= 'string' or #s < 1 then
		return 'OpenEye icon.svg'
	end
	s = mw.ustring.lower(s)
	return matchImagePage(s) or 'OpenEye icon.svg'
end
 
function p._portal(portals, args)
	-- This function builds the portal box used by the {{portal}} template.
	local root = mw.html.create('table')
		:addClass('infobox noprint plainlinks')
		:attr('cellpadding', 4)
		:newline()
 
	-- If no portals have been specified, display an error and add the page to a tracking category.
	if not portals[1] then
		root:tag('tr')
			:tag('td')
				:attr('colspan', '2')
				:css('font-size', '90%')
				:wikitext('<strong class="error">Nie podano żadnego portalu: proszę podać chociaż jeden portal</strong>[[Kategoria:Szablony portali z błędami]]')
			:done()
		:done()
		:newline()
	end
 
	-- Display the portals specified in the positional arguments.
	for _, portal in ipairs(portals) do
		local image = getImageName(portal)
 
		-- Generate the html for the image and the portal name.
		root:tag('tr')
			:tag('td')
				:css('vertical-align', 'middle')
				:css('text-align', 'center')
				:css('width', '30px')
				:wikitext(string.format('[[Plik:%s|32x28px|alt=Ikona portalu|class=noviewer]]', image))
			:done()
			:tag('td')
				:css('vertical-align', 'middle')
				:css('text-align', 'center')
				:css('line-height', 'normal') 
				:wikitext(string.format('[[Portal:Portale|Portal]]: \'\'\'[[Portal:%s|%s]]\'\'\'', portal, portal))
			:done()
		:done()
		:newline()
	end
	return tostring(root)
end
 
function p._image(portals)
 
	-- Wrapper function to allow getImageName() to be accessed through #invoke.
	return getImageName(portals[1])
end
 
local function getAllImageTables()
	local images = {}
	images[i] = mw.loadData('Module:Portal/grafika')
	return images
end
 
function p._displayAll(portals, args)
	-- This function displays all portals that have portal images. This function is for maintenance purposes and should not be used in
	-- articles, for two reasons: 1) there are over 1500 portals with portal images, and 2) the module doesn't record how the portal
	-- names are capitalized, so the portal links may be broken.
	local lang = mw.language.getContentLanguage()
	local count = 1
	for _, imageTable in ipairs(getAllImageTables()) do
		for portal in pairs(imageTable) do
			portals[count] = lang:ucfirst(portal)
			count = count + 1
		end
	end
	return p._portal(portals, args)
end
 
function p._imageDupes()
	-- This function searches the image subpages to find duplicate images. If duplicate images exist, it is not necessarily a bad thing,
	-- as different portals might just happen to choose the same image.
	local exists, dupes = {}, {}
	for _, imageTable in ipairs(getAllImageTables()) do
		for portal, image in pairs(imageTable) do
			if not exists[image] then
				exists[image] = portal
			else
				table.insert(dupes, string.format('The image "[[:File:%s|%s]]" is used for both portals "%s" and "%s".', image, image, exists[image], portal))
			end
		end
	end
	if #dupes < 1 then
		return 'No duplicate images found.'
	else
		return 'The following duplicate images were found:\n* ' .. table.concat(dupes, '\n* ')
	end
end
 
local function processPortalArgs(args)
	-- This function processes a table of arguments and returns two tables: an array of portal names for processing by ipairs, and a table of
	-- the named arguments that specify style options, etc. We need to use ipairs because we want to list all the portals in the order
	-- they were passed to the template, but we also want to be able to deal with positional arguments passed explicitly, for example
	-- {{portal|2=Politics}}. The behaviour of ipairs is undefined if nil values are present, so we need to make sure they are all removed.
	args = type(args) == 'table' and args or {}
	local portals = {}
	local namedArgs = {}
	for k, v in pairs(args) do
		if type(k) == 'number' and type(v) == 'string' then -- Make sure we have no non-string portal names.
			table.insert(portals, k)
		elseif type(k) ~= 'number' then
			namedArgs[k] = v
		end
	end
	table.sort(portals)
	for i, v in ipairs(portals) do
		portals[i] = args[v]
	end
	return portals, namedArgs
end
 
local function makeWrapper(funcName)
	-- Processes external arguments and sends them to the other functions.
	return function (frame)
		-- If called via #invoke, use the args passed into the invoking
		-- template, or the args passed to #invoke if any exist. Otherwise
		-- assume args are being passed directly in from the debug console
		-- or from another Lua module.
		local origArgs
		if type(frame.getParent) == 'function' then
			origArgs = frame:getParent().args
			for k, v in pairs(frame.args) do
				origArgs = frame.args
				break
			end
		else
			origArgs = frame
		end
		-- Trim whitespace and remove blank arguments.
		local args = {}
		for k, v in pairs(origArgs) do
			if type(v) == 'string' then
				v = mw.text.trim(v)
			end
			if v ~= '' then
				args[k] = v
			end
		end
		return p[funcName](processPortalArgs(args)) -- passes two tables to func: an array of portal names, and a table of named arguments.
	end
end
 
for _, funcName in ipairs{'portal', 'image', 'imageDupes', 'displayAll'} do
	p[funcName] = makeWrapper('_' .. funcName)
end
 
return p