<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://wiki.tokusatsus.com/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3APortal</id>
	<title>Módulo:Portal - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tokusatsus.com/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3APortal"/>
	<link rel="alternate" type="text/html" href="https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Portal&amp;action=history"/>
	<updated>2026-09-06T22:36:51Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Portal&amp;diff=6357&amp;oldid=prev</id>
		<title>Tavoraadmin: Importando predefinição/módulo da Wikipédia em português para manter layout</title>
		<link rel="alternate" type="text/html" href="https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Portal&amp;diff=6357&amp;oldid=prev"/>
		<updated>2026-09-06T05:46:32Z</updated>

		<summary type="html">&lt;p&gt;Importando predefinição/módulo da Wikipédia em português para manter layout&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- determine whether we&amp;#039;re being called from a sandbox&lt;br /&gt;
local isSandbox = mw.getCurrentFrame():getTitle():find(&amp;#039;sandbox&amp;#039;, 1, true)&lt;br /&gt;
local sandbox = isSandbox and &amp;#039;/sandbox&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
local function sandboxVersion(s)&lt;br /&gt;
    return isSandbox and s..&amp;#039;-sand&amp;#039; or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local templatestyles = &amp;#039;Module:Portal&amp;#039;..sandbox..&amp;#039;/styles.css&amp;#039;&lt;br /&gt;
&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- List of non-talk namespaces which should not be tracked (Talk pages are never tracked)&lt;br /&gt;
local badNamespaces = {&amp;#039;user&amp;#039;,&amp;#039;template&amp;#039;,&amp;#039;wikipedia&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
-- Check whether to do tracking in this namespace&lt;br /&gt;
-- Returns true unless the page is one of the banned namespaces&lt;br /&gt;
local function checkTracking(title)&lt;br /&gt;
    local thisPage = title or mw.title.getCurrentTitle()&lt;br /&gt;
    if thisPage.isTalkPage then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    local ns = thisPage.nsText:lower()&lt;br /&gt;
    for _, v in ipairs(badNamespaces) do&lt;br /&gt;
        if ns == v then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchImagePage(s)&lt;br /&gt;
    -- Finds the appropriate image subpage given a lower-case&lt;br /&gt;
    -- portal name plus the first letter of that portal name.&lt;br /&gt;
    if type(s) ~= &amp;#039;string&amp;#039; or #s &amp;lt; 1 then return end&lt;br /&gt;
    local firstLetter = mw.ustring.sub(s, 1, 1)&lt;br /&gt;
    local imagePage, banners&lt;br /&gt;
    if mw.ustring.find(firstLetter, &amp;#039;^[a-z]&amp;#039;) then&lt;br /&gt;
        imagePage = &amp;#039;Module:Portal/images/&amp;#039; .. firstLetter .. sandbox&lt;br /&gt;
    else&lt;br /&gt;
        imagePage = &amp;#039;Module:Portal/images/other&amp;#039; .. sandbox&lt;br /&gt;
    end&lt;br /&gt;
    local banners = mw.loadData ( imagePage )&lt;br /&gt;
        if type(banners[s]) == &amp;#039;string&amp;#039; or #s &amp;lt; 1 then&lt;br /&gt;
       return -- not found&lt;br /&gt;
        end&lt;br /&gt;
    return banners [s]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getAlias(s)&lt;br /&gt;
    -- Gets an alias from the image alias data page.&lt;br /&gt;
    local aliasData = mw.loadData(&amp;#039;Module:Portal/images/aliases&amp;#039; .. sandbox)&lt;br /&gt;
    for portal, aliases in pairs(aliasData) do&lt;br /&gt;
        for _, alias in ipairs(aliases) do&lt;br /&gt;
            if alias == s then&lt;br /&gt;
                return portal&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getImageName(s)&lt;br /&gt;
    -- Gets the image name for a given string.&lt;br /&gt;
    local default = {}&lt;br /&gt;
    default[&amp;#039;imagem&amp;#039;] = &amp;#039;Portal-puzzle.svg|link=|alt=&amp;#039;&lt;br /&gt;
        default[&amp;#039;link&amp;#039;] = &amp;#039;Wikipédia&amp;#039;&lt;br /&gt;
        default[&amp;#039;nome&amp;#039;] = &amp;#039;Portal da Wikipédia&amp;#039;&lt;br /&gt;
    if type(s) ~= &amp;#039;string&amp;#039; or #s &amp;lt; 1 then&lt;br /&gt;
        return default&lt;br /&gt;
    end&lt;br /&gt;
    s = mw.ustring.lower(s)&lt;br /&gt;
    return matchImagePage(s) or matchImagePage(getAlias(s)) or default&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
 -- Function to check argument portals for errors, generate tracking categories if needed&lt;br /&gt;
 --     Function first checks for too few/many portals provided&lt;br /&gt;
 --     Then checks the portal list to purge any portals that don&amp;#039;t exist&lt;br /&gt;
 -- Arguments:&lt;br /&gt;
 --   portals: raw list of portals&lt;br /&gt;
 --   args.tracking: is tracking requested? (will not track on bad titles or namespaces)&lt;br /&gt;
 --   args.redlinks: should redlinks be displayed?&lt;br /&gt;
 --   args.minPortals: minimum number of portal arguments&lt;br /&gt;
 --   args.maxPortals: maximum number of portal arguments&lt;br /&gt;
 -- Returns:&lt;br /&gt;
 --   portals = list of portals, with redlinks purged (if args.redlinks=false)&lt;br /&gt;
 --   trackingCat = possible tracking category&lt;br /&gt;
 --   errorMsg = error message&lt;br /&gt;
function p._checkPortals(portals, args)&lt;br /&gt;
    local trackingCat = &amp;#039;&amp;#039;&lt;br /&gt;
    local errMsg = nil&lt;br /&gt;
    &lt;br /&gt;
    -- Tracking is on by default.&lt;br /&gt;
    -- It is disabled if any of the following is true&lt;br /&gt;
    -- 1/ the parameter &amp;quot;tracking&amp;quot; is set to &amp;#039;no, &amp;#039;n&amp;#039;, or &amp;#039;false&amp;#039;&lt;br /&gt;
    -- 2/ the current page fails the namespace or pagename tests&lt;br /&gt;
    local trackingEnabled = args.tracking and checkTracking()&lt;br /&gt;
    &lt;br /&gt;
    args.minPortals = args.minPortals or 1&lt;br /&gt;
    args.maxPortals = args.maxPortals or -1&lt;br /&gt;
    -- check for too few portals&lt;br /&gt;
    if #portals &amp;lt; args.minPortals then&lt;br /&gt;
        errMsg = &amp;#039;por favor informe pelo menos &amp;#039;..args.minPortals..&amp;#039; porta&amp;#039;..(args.minPortals &amp;gt; 1 and &amp;#039;is&amp;#039; or &amp;#039;l&amp;#039;)&lt;br /&gt;
        trackingCat = (trackingEnabled and &amp;#039;[[Categoria:!Erros na predefinição portal]]&amp;#039; or &amp;#039;&amp;#039;)&lt;br /&gt;
        return portals, trackingCat, errMsg&lt;br /&gt;
    end&lt;br /&gt;
    -- check for too many portals&lt;br /&gt;
    if args.maxPortals &amp;gt;= 0 and #portals &amp;gt; args.maxPortals then&lt;br /&gt;
        errMsg = &amp;#039; demasiados portais (máximo = &amp;#039;..args.maxPortals..&amp;#039;)&amp;#039;&lt;br /&gt;
        trackingCat = (trackingEnabled and &amp;#039;[[Categoria:!Erros na predefinição portal]]&amp;#039; or &amp;#039;&amp;#039;)&lt;br /&gt;
        return portals, trackingCat, errMsg&lt;br /&gt;
    end&lt;br /&gt;
    if not args.redlinks or trackingEnabled then&lt;br /&gt;
        -- make new list of portals that exist&lt;br /&gt;
        local existingPortals = {}&lt;br /&gt;
        for _, portal in ipairs(portals) do&lt;br /&gt;
            local portalTitle = mw.title.new(portal,&amp;quot;Portal&amp;quot;)&lt;br /&gt;
            -- if portal exists, put it into list&lt;br /&gt;
            if portalTitle and portalTitle.exists then&lt;br /&gt;
                table.insert(existingPortals,portal)&lt;br /&gt;
            -- otherwise set tracking cat&lt;br /&gt;
            elseif trackingEnabled then&lt;br /&gt;
                trackingCat = &amp;quot;[[Categoria:!Erros na predefinição portal]]&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        -- If redlinks is off, use portal list purged of redlinks&lt;br /&gt;
        portals = args.redlinks and portals or existingPortals&lt;br /&gt;
        -- if nothing left after purge, set tracking cat&lt;br /&gt;
        if #portals == 0 and trackingEnabled then&lt;br /&gt;
            trackingCat = trackingCat..&amp;quot;[[Categoria:!Erros na predefinição portal]]&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return portals, trackingCat, errMsg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._portal(portals, args)&lt;br /&gt;
    -- This function builds the portal box used by the {{portal}} template.&lt;br /&gt;
    &lt;br /&gt;
    -- Normalize all arguments&lt;br /&gt;
    if args.redlinks == &amp;#039;include&amp;#039; then args.redlinks = true end&lt;br /&gt;
    args.addBreak = args[&amp;#039;break&amp;#039;]&lt;br /&gt;
    for key, default in pairs({left=false,tracking=true,nominimum=false,&lt;br /&gt;
                               redlinks=false,addBreak=false,border=true}) do&lt;br /&gt;
        if args[key] == nil then args[key] = default end&lt;br /&gt;
        args[key] = yesno(args[key], default)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local root = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
        :attr(&amp;#039;role&amp;#039;, &amp;#039;navigation&amp;#039;)&lt;br /&gt;
        :attr(&amp;#039;aria-label&amp;#039;, &amp;#039;Portals&amp;#039;)&lt;br /&gt;
        :addClass(&amp;#039;noprint plainlist&amp;#039;)&lt;br /&gt;
        :addClass(sandboxVersion(&amp;#039;portalbox&amp;#039;))&lt;br /&gt;
        :addClass(args.border and sandboxVersion(&amp;#039;portalborder&amp;#039;) or &amp;#039;&amp;#039;)&lt;br /&gt;
        :addClass(args.left and &amp;#039;tleft&amp;#039; or &amp;#039;tright&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;margin&amp;#039;, args.margin or nil)&lt;br /&gt;
        :newline()&lt;br /&gt;
&lt;br /&gt;
    local trackingCat = &amp;#039;&amp;#039;&lt;br /&gt;
    local errMsg = nil&lt;br /&gt;
    args.minPortals = args.nominimum and 0 or 1&lt;br /&gt;
    args.maxPortals = -1&lt;br /&gt;
    portals, trackingCat, errMsg = p._checkPortals(portals, args)&lt;br /&gt;
    root:wikitext(trackingCat)&lt;br /&gt;
    -- if error message, put it in the box and return&lt;br /&gt;
    if errMsg then&lt;br /&gt;
        if args.border then -- suppress error message when border=no&lt;br /&gt;
            local errTag = root:tag(&amp;#039;strong&amp;#039;)&lt;br /&gt;
            errTag:addClass(&amp;#039;error&amp;#039;)&lt;br /&gt;
            errTag:css(&amp;#039;padding&amp;#039;,&amp;#039;0.2em&amp;#039;)&lt;br /&gt;
            errTag:wikitext(&amp;#039;Erro: &amp;#039;..errMsg)&lt;br /&gt;
        end&lt;br /&gt;
        return tostring(root)&lt;br /&gt;
    end&lt;br /&gt;
    -- if no portals (and no error), just return tracking category&lt;br /&gt;
    if #portals == 0 then&lt;br /&gt;
        return trackingCat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Start the list. This corresponds to the start of the wikitext table in the old [[Template:Portal]].&lt;br /&gt;
    local listroot = root:tag(&amp;#039;ul&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;width&amp;#039;, (tonumber(args.boxsize) or 0) &amp;gt; 0 and (args.boxsize .. &amp;#039;px&amp;#039;) or args.boxsize)&lt;br /&gt;
&lt;br /&gt;
    -- Display the portals specified in the positional arguments.&lt;br /&gt;
    for _, portal in ipairs(portals) do&lt;br /&gt;
        local banners = getImageName(portal)&lt;br /&gt;
             local image = banners[&amp;#039;imagem&amp;#039;]&lt;br /&gt;
               local link = banners[&amp;#039;link&amp;#039;]&lt;br /&gt;
               local name = banners[&amp;#039;nome&amp;#039;]&lt;br /&gt;
        -- Generate the html for the image and the portal name.&lt;br /&gt;
        listroot&lt;br /&gt;
            :newline()&lt;br /&gt;
            :tag(&amp;#039;li&amp;#039;)&lt;br /&gt;
                :tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
                    :wikitext(string.format(&amp;#039;[[File:%s|32x28px|class=noviewer]]&amp;#039;, image))&lt;br /&gt;
                    :done()&lt;br /&gt;
                :tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
                    :wikitext(string.format(&amp;#039;[[Portal:%s|%s]]&amp;#039;, link, name, args[&amp;#039;break&amp;#039;] and &amp;#039;&amp;lt;br /&amp;gt;&amp;#039; or &amp;#039; &amp;#039;))&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._image(portals)&lt;br /&gt;
    -- Wrapper function to allow getImageName() to be accessed through #invoke.&lt;br /&gt;
    local name = getImageName(portals[1])&lt;br /&gt;
    local image = name[ &amp;#039;imagem&amp;#039; ]&lt;br /&gt;
    return image:match(&amp;#039;^(.-)|&amp;#039;) or image -- FIXME: use a more elegant way to separate borders etc. from the image name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getAllImageTables()&lt;br /&gt;
    -- Returns an array containing all image subpages (minus aliases) as loaded by mw.loadData.&lt;br /&gt;
    local images = {}&lt;br /&gt;
    for i, subpage in ipairs{&amp;#039;a&amp;#039;, &amp;#039;b&amp;#039;, &amp;#039;c&amp;#039;, &amp;#039;d&amp;#039;, &amp;#039;e&amp;#039;, &amp;#039;f&amp;#039;, &amp;#039;g&amp;#039;, &amp;#039;h&amp;#039;, &amp;#039;i&amp;#039;, &amp;#039;j&amp;#039;, &amp;#039;k&amp;#039;, &amp;#039;l&amp;#039;, &amp;#039;m&amp;#039;, &amp;#039;n&amp;#039;, &amp;#039;o&amp;#039;, &amp;#039;p&amp;#039;, &amp;#039;q&amp;#039;, &amp;#039;r&amp;#039;, &amp;#039;s&amp;#039;, &amp;#039;t&amp;#039;, &amp;#039;u&amp;#039;, &amp;#039;v&amp;#039;, &amp;#039;w&amp;#039;, &amp;#039;x&amp;#039;, &amp;#039;y&amp;#039;, &amp;#039;z&amp;#039;, &amp;#039;other&amp;#039;} do&lt;br /&gt;
        images[i] = mw.loadData(&amp;#039;Module:Portal/images/&amp;#039; .. subpage .. sandbox)&lt;br /&gt;
    end&lt;br /&gt;
    return images&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._displayAll(portals, args)&lt;br /&gt;
    -- This function displays all portals that have portal images. This function is for maintenance purposes and should not be used in&lt;br /&gt;
    -- articles, for two reasons: 1) there are over 1500 portals with portal images, and 2) the module doesn&amp;#039;t record how the portal&lt;br /&gt;
    -- names are capitalized, so the portal links may be broken.&lt;br /&gt;
    local lang = mw.language.getContentLanguage()&lt;br /&gt;
    local count = 1&lt;br /&gt;
    for _, imageTable in ipairs(getAllImageTables()) do&lt;br /&gt;
        for portal in pairs(imageTable) do&lt;br /&gt;
            portals[count] = lang:ucfirst(portal)&lt;br /&gt;
            count = count + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return p._portal(portals, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._imageDupes()&lt;br /&gt;
    -- This function searches the image subpages to find duplicate images. If duplicate images exist, it is not necessarily a bad thing,&lt;br /&gt;
    -- as different portals might just happen to choose the same image. However, this function is helpful in identifying images that&lt;br /&gt;
    -- should be moved to a portal alias for ease of maintenance.&lt;br /&gt;
    local exists, dupes = {}, {}&lt;br /&gt;
    for _, imageTable in ipairs(getAllImageTables()) do&lt;br /&gt;
        for portal, image in pairs(imageTable) do&lt;br /&gt;
                local imagem = image[ &amp;#039;imagem&amp;#039; ].imagem&lt;br /&gt;
            if not exists[image] then&lt;br /&gt;
                exists[image] = portal&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(dupes, string.format(&amp;#039;A imagem &amp;quot;[[:File:%s|%s]]&amp;quot; é utilizada em ambos portais &amp;quot;%s&amp;quot; e &amp;quot;%s&amp;quot;.&amp;#039;, imagem, imagem, exists.image[&amp;#039;imagem&amp;#039;], portal))&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if #dupes &amp;lt; 1 then&lt;br /&gt;
        return &amp;#039;Sem imagens duplicadas encontradas.&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;As seguintes imagens foram encontradas:\n* &amp;#039; .. table.concat(dupes, &amp;#039;\n* &amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function processPortalArgs(args)&lt;br /&gt;
    -- This function processes a table of arguments and returns two tables: an array of portal names for processing by ipairs, and a table of&lt;br /&gt;
    -- the named arguments that specify style options, etc. We need to use ipairs because we want to list all the portals in the order&lt;br /&gt;
    -- they were passed to the template, but we also want to be able to deal with positional arguments passed explicitly, for example&lt;br /&gt;
    -- {{portal|2=Politics}}. The behaviour of ipairs is undefined if nil values are present, so we need to make sure they are all removed.&lt;br /&gt;
    args = type(args) == &amp;#039;table&amp;#039; and args or {}&lt;br /&gt;
    local portals = {}&lt;br /&gt;
    local namedArgs = {}&lt;br /&gt;
    for k, v in pairs(args) do&lt;br /&gt;
        if type(k) == &amp;#039;number&amp;#039; and type(v) == &amp;#039;string&amp;#039; then -- Make sure we have no non-string portal names.&lt;br /&gt;
            table.insert(portals, k)&lt;br /&gt;
        elseif type(k) ~= &amp;#039;number&amp;#039; then&lt;br /&gt;
            namedArgs[k] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    table.sort(portals)&lt;br /&gt;
    for i, v in ipairs(portals) do&lt;br /&gt;
        portals[i] = args[v]&lt;br /&gt;
    end&lt;br /&gt;
    return portals, namedArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Entry point for sorting portals from other named arguments&lt;br /&gt;
function p._processPortalArgs(args)&lt;br /&gt;
    return processPortalArgs(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeWrapper(funcName)&lt;br /&gt;
    -- Processes external arguments and sends them to the other functions.&lt;br /&gt;
    return function (frame)&lt;br /&gt;
        -- If called via #invoke, use the args passed into the invoking&lt;br /&gt;
        -- template, or the args passed to #invoke if any exist. Otherwise&lt;br /&gt;
        -- assume args are being passed directly in from the debug console&lt;br /&gt;
        -- or from another Lua module.&lt;br /&gt;
        -- Also: trim whitespace and remove blank arguments&lt;br /&gt;
        local origArgs = getArgs(frame)&lt;br /&gt;
        -- create two tables to pass to func: an array of portal names, and a table of named arguments.&lt;br /&gt;
        local portals, args = processPortalArgs(origArgs)&lt;br /&gt;
        local results = &amp;#039;&amp;#039;&lt;br /&gt;
        if funcName == &amp;#039;_portal&amp;#039; or funcName == &amp;#039;_displayAll&amp;#039; then&lt;br /&gt;
            results = frame:extensionTag{ name = &amp;#039;templatestyles&amp;#039;, args = { src = templatestyles} }&lt;br /&gt;
        end&lt;br /&gt;
        return results .. p[funcName](portals, args)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for _, funcName in ipairs{&amp;#039;portal&amp;#039;, &amp;#039;image&amp;#039;, &amp;#039;imageDupes&amp;#039;, &amp;#039;displayAll&amp;#039;} do&lt;br /&gt;
    p[funcName] = makeWrapper(&amp;#039;_&amp;#039; .. funcName)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Tavoraadmin</name></author>
	</entry>
</feed>