Module:Portal

-- This module implements

local p = {} local HtmlBuilder = require('Module:HtmlBuilder')

local function _portal(args) local root = HtmlBuilder.create('div') root .addClass('noprint') .addClass((args.left == 'yes' and 'tleft') or 'tright') .addClass('portal') .css('border', 'solid #aaa 1px') .css('margin', args.margin or (args.left == 'yes' and '0.5em 1em 0.5em 0') or '0.5em 0 0.5em 1em') .newline

-- Start the table. This corresponds to the start of the wikitext table -- in the old Template:Portal. local tableroot = root.tag('table') .css('background', '#f9f9f9') .css('font-size', '85%') .css('line-height', '110%') .css('max-width', '175px') .css('width', args.boxsize and (args.boxsize .. 'px')) -- If no portals have been specified, display an error and add the page to a tracking category. if not args[1] then tableroot.wikitext( ' No portals specified: please specify at least one portal ' ) end

-- Display the portals specified in the positional arguments. for i,v in ipairs(args) do       v = mw.text.trim(v) -- Get the image name. local imageData = mw.loadData( 'Module:Portal/images' ) local images = imageData.images local aliases = imageData.aliases local vLower = mw.ustring.lower(v) local image = images[vLower] if not image then local imageParam = aliases[vLower] image = imageParam and images[imageParam] image = image or 'Portal-puzzle.svg' end -- Generate the html for the image and the portal name. tableroot .newline .tag('tr') .attr('valign', 'middle') .tag('td') .css('text-align', 'center') .wikitext(mw.ustring.format('', image)) .done .tag('td') .css('padding', '0 0.2em') .css('vertical-align', 'middle') .css('font-style', 'italic') .css('font-weight', 'bold') .wikitext(mw.ustring.format('%s%sportal', v, v, args['break'] == 'yes' and ' ' or ' ')) end return tostring(root) end

function p.portal(frame) local orig_args if frame == mw.getCurrentFrame then -- We're being called via #invoke. If the invoking template passed any arguments, -- use them. Otherwise, use the arguments that were passed into the template. orig_args = frame:getParent.args for k, v in pairs(frame.args) do           orig_args = frame.args break end else -- We're being called from another module or from the debug console, so assume -- the arguments are passed in directly. orig_args = frame end -- We want to list all the portals in the order they were passed to the template. -- We also want to be able to deal with positional arguments passed explicitly, -- for example. However, pairs doesn't guarantee the correct -- order, and ipairs will stop after the first nil value. To get around this, we    -- create a new table of arguments where nil values have been removed, so that we     -- can traverse the numerical arguments using ipairs. We also remove values which -- only consist of whitespace. ParserFunctions considers these to be false, and by   -- removing them Lua will consider them false too. local args = {} local name_args = {} -- Temporary table for named arguments. for k, v in pairs(orig_args) do       if mw.ustring.match(v, '%S') then -- Remove values that are only whitespace. if type(k) == 'number' then table.insert(args, k)           else -- Put named argument values in their own table while we sort the positional arguments, -- so that we don't have to cycle through all the original arguments again. name_args[k] = v            end end end table.sort(args) for i,v in ipairs(args) do       args[i] = orig_args[v] end for k,v in pairs(name_args) do       args[k] = v    end

return _portal(args) end

return p