TemplateStyles' src attribute must not be empty.

TemplateStyles' src attribute must not be empty.

TemplateStyles' src attribute must not be empty.

TemplateStyles' src attribute must not be empty.

This module implements the {{portal bar}} template. It displays a horizontal bar of portals.

See here and here for testcases.

Note: in order to make the test cases work, the Sandbox CSS classes have "-sand" appended to their names. If you wish to update the CSS, copy the contents of each class from Module:Portal bar/sandbox/styles.css to Module:Portal bar/styles.css, but do not alter the class names, nor just copy-paste the entire CSS file. For the current difference in CSS between Sandbox and Main, see here.

{{#invoke:Portal bar|main|''portal 1''|''portal 2 ''|...|border=''no''}}
  • Positional parameters - the names of the portals to be displayed.
  • border - if |border= is equal to no, n, false, or 0, then the portal box will have no border.
  • redlinks - if |redlinks= is equal to yes, y, true or include, then the portal box will show redlinked portals

Examples

beccè'
  • {{#invoke:portal bar|main|Visual arts|Science|Literature}}

Produces:

Sapsop Lua: bad argument #2 to 'title.new' (unrecognized namespace name 'Portal').

  • {{#invoke:portal bar|main|Visual arts|Science|Literature|border=no}}

Produces:

Sapsop Lua: bad argument #2 to 'title.new' (unrecognized namespace name 'Portal').

For further examples, see Template:Portal bar/testcases.

Images

beccè'

This module uses Module:Portal to get portal images. To add, change, or remove images, please see the instructions at Module:Portal#Image.


-- This module implements {{portal bar}}.

require('strict')

-- determine whether we're being called from a sandbox
local isSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true)
local sandbox = isSandbox and '/sandbox' or ''

local portalModule = require('Module:Portal'..sandbox)
local getImageName = portalModule._image
local checkPortals = portalModule._checkPortals
local processPortalArgs = portalModule._processPortalArgs
local yesno = require( 'Module:Yesno' )
local getArgs = require('Module:Arguments').getArgs
local p = {}

local function sandboxVersion(s)
	return isSandbox and s.."-sand" or s
end

-- Builds the portal bar used by {{portal bar}}.
function p._main( portals, args )
	
	-- check for sensible args
	args = type(args) == "table" and args or {}
	
	-- Normalize arguments
	for key, default in pairs({border=true,redlinks=false,tracking=true}) do
		if args[key] == nil then args[key] = default end
		args[key] = yesno(args[key], default)
	end

	local nav = mw.html.create( 'div' )
		:addClass(sandboxVersion('portal-bar'))
		:addClass( 'noprint metadata noviewer' )
		:attr( 'role', 'navigation' )
		:attr( 'aria-label' , 'Portals' )
		:addClass(sandboxVersion(args.border and 'portal-bar-bordered' or 'portal-bar-unbordered'))
	
	local trackingCat = ''
	-- Allow any number of portals
	args.minPortals = 0
	args.maxPortals = -1
	-- Check to see whether there are redlinks, filter out unless args.redlink is true
	portals, trackingCat = checkPortals(portals, args)
	nav:wikitext(trackingCat)
	if #portals == 0 then
		return trackingCat
	end

	local related = yesno(args.related)
	if related then
		nav:addClass(sandboxVersion('portal-bar-related'))
	else
		local header = nav:tag('span')
		header:addClass(sandboxVersion('portal-bar-header'))
		header:wikitext('[[Wikipedia:Contents/Portals|Portal]]')
		if #portals > 1 then
			header:wikitext('s')
		end
		header:wikitext(':')
	end
	local container = nav:tag('ul')
	container:addClass(sandboxVersion('portal-bar-content'))
	if related then
		container:addClass(sandboxVersion('portal-bar-content-related'))
	end
	local size = related and '27x25px' or '21x19px'
	for _, portal in ipairs( portals ) do
		container
			:tag( 'li' )
			:addClass(sandboxVersion('portal-bar-item'))
			:wikitext( string.format('<span class="nowrap">[[File:%s|%s]] </span>[[Portal:%s|%s]]',
					getImageName(portal,true), size, portal, portal))
	end
	
	local styleFile = 'Module:Portal bar'..sandbox..'/styles.css'
	return mw.getCurrentFrame():extensionTag{
		name = 'templatestyles', args = { src = styleFile }
	} .. tostring( nav ) 
end

-- Processes external arguments and sends them to the other functions.
function p.main( frame )
	local origArgs = getArgs(frame)
	local portals, args = processPortalArgs(origArgs)
	return p._main( portals, args )
end

return p