Module:Subject bar
This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
This module implements the {{Subject bar}} template. Please don't use this module from an article or from another wiki page. You should use the {{Subject bar}} template instead. To use the module from another Lua module, read on.
Use from another Lua module
rættaLoad the module like this:
local subjectBar = require('Module:Subject bar')._main
Then you can use the subjectBar
function like this:
local myBar = subjectBar{
book = 'Book 1',
book2 = 'Book 2',
-- ...
portal = 'Portal 1',
portal2 = 'Portal 2',
-- ...
commons = true,
commons-search = 'Commons search string',
wikt = true,
wikt-search = 'Wiktionary search string'
-- ...
}
Please see Template:Subject bar/doc for a full list of possible parameters.
local getPortalImage = require('Module:Portal').image
local p = {}
local function getArgNums(prefix, args)
-- Returns a table containing the numbers of the arguments that exist for the specified prefix. For example, if the
-- prefix was 'data', and 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function makeHorizontalRule()
local row = mw.html.create('tr')
row
:tag('td')
:attr('colspan', '2')
:tag('hr', {selfClosing = true})
return tostring(row)
end
local function makeItem(image, text)
local root = mw.html.create('table')
root
:css('float', 'left')
:css('padding', '0px 5px')
:tag('tr')
:tag('td')
:wikitext(image)
:done()
:tag('td')
:css('width', '125px')
:css('text-align', 'left')
:wikitext(text)
return tostring(root)
end
local function makeRow(items, heading, subheading, options)
if #items < 1 then return end
local swapHeadingSize = type(options) == 'table' and options.swapHeadingSize or false
local row = mw.html.create('tr')
row
:tag('td')
:css('width', '175px')
:tag('span')
:css('font-size', swapHeadingSize and '85%' or '125%')
:wikitext(heading)
:done()
:tag('br', {selfClosing = true})
:done()
:tag('span')
:css('font-size', swapHeadingSize and '125%' or '85%')
:wikitext(subheading)
local cell = row:tag('td')
for i, item in ipairs(items) do
local image = item[1]
local text = item[2]
cell
:wikitext(makeItem(image, text))
end
return tostring(row)
end
local function makeNumberedRow(prefix, args, heading, subheading, getItemValsFunc, options)
if args[prefix] then
args[prefix .. '1'] = args[prefix]
end
local argNums = getArgNums(prefix, args)
local items = {}
for i, argNum in ipairs(argNums) do
local image, text = getItemValsFunc(args[prefix .. tostring(argNum)])
table.insert(items, {image, text})
end
return makeRow(items, heading, subheading, options)
end
function p._main(args)
local rows = {}
-- Get the book row text.
local bookHeading = "'''[[Wikipedia:Books|Books]]'''"
local bookSubheading = 'View or order collections of articles'
local function getBookItemVals(book)
local image = '[[File:Office-book.svg|30px|link=]]'
local text = mw.ustring.format("'''''[[Book:%s|%s]]'''''", book, book)
return image, text
end
local bookRow = makeNumberedRow('book', args, bookHeading, bookSubheading, getBookItemVals)
table.insert(rows, bookRow)
-- Get the portal row text
local portalHeading = "'''[[Portal:Contents/Portals|Portals]]'''"
local portalSubheading = 'Access related topics'
local function getPortalItemVals(portal)
local image = mw.ustring.format('[[File:%s|30x30px]]', getPortalImage{portal})
local text = mw.ustring.format("'''''[[Portal:%s|%s portal]]'''''", portal, portal)
return image, text
end
local portalRow = makeNumberedRow('portal', args, portalHeading, portalSubheading, getPortalItemVals)
table.insert(rows, portalRow)
-- Get the sister projects row text.
local sisters = {
{arg = 'commons', image = 'Commons-logo.svg', prefix = 'commons', display = 'Media', from = 'Commons'},
{arg = 'species', image = 'Wikispecies-logo.svg', prefix = 'wikispecies', display = 'Species directories', from = 'Wikispecies'},
{arg = 'voy', image = 'Wikivoyage-Logo-v3-icon.svg', prefix = 'voy', display = 'Travel guides', from = 'Wikivoyage'},
{arg = 'n', image = 'Wikinews-logo.svg', prefix = 'wikinews', display = 'News stories', from = 'Wikinews'},
{arg = 'wikt', image = 'Wiktionary-logo.svg', prefix = 'wiktionary', postfix = 'English', display = 'Definitions', from = 'Wiktionary'},
{arg = 'b', image = 'Wikibooks-logo.svg', prefix = 'wikibooks', display = 'Textbooks', from = 'Wikibooks'},
{arg = 'q', image = 'Wikiquote-logo.svg', prefix = 'wikiquote', display = 'Quotations', from = 'Wikiquote'},
{arg = 's', image = 'Wikisource-logo.svg', prefix = 'wikisource', display = 'Source texts', from = 'Wikisource'},
{arg = 'v', image = 'Wikiversity-logo.svg', prefix = 'wikiversity', display = 'Learning resources', from = 'Wikiversity'},
{arg = 'spoken', image = 'Sound-icon.svg', prefix = 'spoken wikipedia', display = 'Listen to this page', from = 'Spoken Wikipedia'},
}
local sisterItems = {}
for i, t in ipairs(sisters) do
if args[t.arg] then
-- Get the image value.
local image = mw.ustring.format('[[File:%s|30x30px|link=]]', t.image)
-- Get the text value.
local prefix = t.prefix
local search = args[t.arg .. '-search'] or mw.title.getCurrentTitle().text
local postfix = t.postfix
postfix = postfix and ('#' .. postfix) or ''
local display = t.display
local from = t.from
local text = mw.ustring.format(
'[[%s:Special:Search/%s%s|%s]]<br />from %s',
prefix, search, postfix, display, from
)
if t.arg == 'spoken' then
text = mw.ustring.format('%s on %s<br />[[File:%s]]',
display, from, args[t.arg]
)
end
-- Add the values to the items table.
table.insert(sisterItems, {image, text})
end
end
local sisterHeading = "Find out more on Wikipedia's"
local sisterSubheading = "'''[[Wikipedia:Wikimedia sister projects|Sister projects]]'''"
local sisterRow = makeRow(sisterItems, sisterHeading, sisterSubheading, {swapHeadingSize = true})
table.insert(rows, sisterRow)
-- Make the table.
local root = mw.html.create('table')
root
:addClass('noprint')
:addClass('navbox')
:css('background-color', '#f9f9f9')
:css('border', '1px solid #aaa')
:css('clear', 'both')
:css('margin-bottom', '0.5em')
:css('margin-top', '0.5em')
:wikitext(table.concat(rows, makeHorizontalRule()))
return tostring(root)
end
function p.main(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 frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
return p