Module:Subject bar
Jump to navigation
Jump to search
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 Lua module is used on approximately 18,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
This module depends on the following other modules: |
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
Load the module like this:
local subjectBar = require('Module:Subject bar')._main
Then you can use the subjectBar
function like this:
local myBar = subjectBar{
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.
require('Module:No globals')
local sisterBar = nil
local portalBar = nil
local compressSparseArray = nil
local getArgs = require('Module:Arguments').getArgs
local yesNo = require('Module:Yesno')
local p = {}
local sisters = {'commons','species','voy','n','wikt','b','q','s','v','d'}
local function findNumericArgs(key, args)
local pattern = "^"..key.."_?(%d+)$" -- pattern to match
local values = {}
for k, v in pairs(args) do --- loop through all arguments
local ord = tonumber(mw.ustring.match(k,pattern)) --- if "foo_?%d+", extract number
if ord then
values[ord] = v
end
end
if args[key] ~= nil then
values[1] = args[key]
end
values = compressSparseArray(values) --- squeeze out gaps/nils in values, keep ordering
return values
end
function p._main(args)
local result = ""
local hasPortal = false
for key, _ in pairs(args) do
if mw.ustring.sub(key,1,6) == 'portal' or tonumber(key) then
hasPortal = true
break
end
end
if hasPortal then
portalBar = require('Module:Portal bar')._main
compressSparseArray = require('Module:TableTools').compressSparseArray
local portalList = findNumericArgs("portal",args)
for _, positional in ipairs(args) do
table.insert(portalList, positional)
end
result = portalBar(portalList, {tracking=args.tracking, qid=args.qid})
end
local hasSister = yesNo(args.auto,true)
for _, sister in ipairs(sisters) do
if hasSister then
break
end
if yesNo(args[sister],true) or yesNo(args[sister..'-search'],true) then
hasSister = true
end
end
if hasSister then
sisterBar = require('Module:Sister project links')._main
local sisterArgs = {auto=1, bar=1}
sisterArgs[1] = args.search
for _, k in ipairs({'author','commonscat','display','tracking','qid'}) do
sisterArgs[k] = args[k]
end
for _, t in ipairs(sisters) do
sisterArgs[t] = args[t..'-search'] or args[t]
end
result = result..sisterBar(sisterArgs)
end
return result
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 args = getArgs(frame)
return p._main(args)
end
return p