Module:Portal bar and Module:Portal bar/sandbox: Difference between pages
Appearance
(Difference between pages)
Content deleted Content added
better implementation of nbsp |
No edit summary |
||
Line 1: | Line 1: | ||
-- This module implements {{portal bar}}. |
-- This module implements {{portal bar}}. |
||
require(' |
require('') |
||
local p = {} |
|||
-- 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 |
local = require('Module:Portal') |
||
local getImageName = portalModule._image |
|||
local checkPortals = portalModule._checkPortals |
|||
local processPortalArgs = portalModule._processPortalArgs |
|||
local yesno = require( 'Module:Yesno' ) |
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}}. |
-- Builds the portal bar used by {{portal bar}}. |
||
function p._main( portals, args ) |
function p._main( portals, args ) |
||
if #portals < 1 then return '' end -- Don't display a blank navbox if no portals were specified. |
|||
-- 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' ) |
local nav = mw.html.create( 'div' ) |
||
:addClass( |
:addClass('') |
||
:addClass( 'noprint metadata noviewer' ) |
|||
:attr( 'role', 'navigation' ) |
:attr( 'role', 'navigation' ) |
||
:attr( 'aria-label' , 'Portals' ) |
:attr( 'aria-label' , 'Portals' ) |
||
:css( 'text-align', 'center' ) |
|||
:addClass(sandboxVersion(args.border and 'portal-bar-bordered' or 'portal-bar-unbordered')) |
|||
:css( 'font-size', '88%' ) |
|||
:css( 'font-weight', 'bold' ) |
|||
local trackingCat = '' |
|||
if yesno( args.border ) == false then |
|||
-- Allow any number of portals |
|||
nav |
|||
args.minPortals = 0 |
|||
:css( 'padding', '0.1em 1.7em' ) |
|||
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 |
else |
||
nav |
|||
local header = nav:tag('span') |
|||
:css( 'margin-top', '1em' ) |
|||
header:addClass(sandboxVersion('portal-bar-header')) |
|||
:css( 'border', '1px solid #aaa' ) |
|||
header:wikitext('[[Wikipedia:Contents/Portals|Portal]]') |
|||
:css( 'padding', '0.4em 2em' ) |
|||
if #portals > 1 then |
|||
:css( 'background', '#fdfdfd' ) |
|||
header:wikitext('s') |
|||
end |
|||
header:wikitext(':') |
|||
end |
end |
||
local container = nav:tag('ul') |
|||
local list = mw.html.create( 'ul' ) |
|||
container:addClass(sandboxVersion('portal-bar-content')) |
|||
:css( 'margin', '0' ) |
|||
if related then |
|||
container:addClass(sandboxVersion('portal-bar-content-related')) |
|||
end |
|||
local size = related and '27x25px' or '21x19px' |
|||
for _, portal in ipairs( portals ) do |
for _, portal in ipairs( portals ) do |
||
list |
|||
container |
|||
:tag( 'li' ) |
:tag( 'li' ) |
||
:css( 'display', 'inline' ) |
|||
:addClass(sandboxVersion('portal-bar-item')) |
|||
:css( 'white-space', 'nowrap' ) |
|||
:wikitext( string.format('<span class="nowrap">[[File:%s|%s]] </span>[[Portal:%s|%s]]', |
|||
:tag( 'span' ) |
|||
getImageName(portal,true), size, portal, portal)) |
|||
:css( 'margin', 'auto 0.5em' ) |
|||
:wikitext( string.format( '[[File:%s|24x21px]]', getImageName{ portal } ) ) |
|||
:done() |
|||
:wikitext( string.format( '[[Portal:%s|%s portal]]', portal, portal ) ) |
|||
end |
end |
||
nav |
|||
local styleFile = 'Module:Portal bar'..sandbox..'/styles.css' |
|||
:node( list ) |
|||
return mw.getCurrentFrame():extensionTag{ |
|||
name = 'templatestyles', args = { src = styleFile } |
|||
tostring( nav ) |
|||
end |
end |
||
-- Processes external arguments and sends them to the other functions. |
-- Processes external arguments and sends them to the other functions. |
||
function p.main( frame ) |
function p.main( frame ) |
||
-- If called via #invoke, use the args passed into the invoking |
|||
local origArgs = getArgs(frame) |
|||
-- template, or the args passed to #invoke if any exist. Otherwise |
|||
local portals, args = processPortalArgs(origArgs) |
|||
-- 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 |
|||
-- Process the args to make an array of portal names that can be used with ipairs. 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. |
|||
local portals, args = {}, {} |
|||
for k, v in pairs( origArgs ) do |
|||
if type( k ) == 'number' and type( v ) == 'string' then -- Make sure we have no non-string portal names. |
|||
if mw.ustring.find( v, '%S' ) then -- Remove blank values. |
|||
table.insert( portals, k ) |
|||
end |
|||
elseif type( k ) ~= 'number' then -- Separate named arguments from portals. |
|||
if type( v ) == 'string' then |
|||
v = mw.text.trim( v ) |
|||
end |
|||
args[ k ] = v |
|||
end |
|||
end |
|||
table.sort( portals ) |
|||
for i, v in ipairs( portals ) do |
|||
portals[ i ] = mw.text.trim( origArgs[ v ] ) -- Swap keys with values, trimming whitespace. |
|||
end |
|||
return p._main( portals, args ) |
return p._main( portals, args ) |
||
end |
end |