Module:Subject bar/sandbox
Appearance
![]() | This is the module sandbox page for Module:Subject bar (diff). |
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This Lua module is used on approximately 19,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.
For test cases, see {{Subject bar/testcases}}.
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.
local getPortalImage = require('Module:Portal').image
local sisterBar = require('Module:Sister project links')._main
local portalBar = require('Module:Portal bar')._main
local compressSparseArray = require('Module:TableTools').compressSparseArray
local p = {}
local trackingEnabled = true
-- Check whether to do tracking in this namespace
-- Returns true unless the page is one of the banned namespaces
local function checkTrackingNamespace()
local thisPageNS = mw.title.getCurrentTitle().namespace
if (thisPageNS == 1) -- Talk
or (thisPageNS == 2) -- User
or (thisPageNS == 3) -- User talk
or (thisPageNS == 5) -- Wikipedia talk
or (thisPageNS == 7) -- File talk
or (thisPageNS == 11) -- Template talk
or (thisPageNS == 15) -- Category talk
or (thisPageNS == 101) -- Portal talk
or (thisPageNS == 118) -- Draft
or (thisPageNS == 119) -- Draft talk
or (thisPageNS == 829) -- Module talk
then
return false
end
return true
end
-- Check whether to do tracking on this pagename
-- Returns false if the page title matches one of the banned strings
-- Otherwise returns true
local function checkTrackingPagename()
local thisPage = mw.title.getCurrentTitle()
local thisPageLC = mw.ustring.lower(thisPage.text)
if (string.match(thisPageLC, "/archive") ~= nil)
or (string.match(thisPageLC, "/doc") ~= nil)
or (string.match(thisPageLC, "/test") ~= nil) then
return false
end
return true
end
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)
-- Tracking is on by default.
-- It is disabled if any of the following is true
-- 1/ the parameter "tracking" is set to 'no, 'n', or 'false'
-- 2/ the current page fails the namespace tests in checkTrackingNamespace()
-- 3/ the current page fails the pagename tests in checkTrackingPagename()
if (args.tracking == 'no') or (args.tracking == 'n') or (args.tracking == 'false')
or (checkTrackingNamespace() == false) or (checkTrackingPagename() == false) then
trackingEnabled = false
end
local result = ""
local hasPortal = false
for key, _ in pairs(args) do
if mw.ustring.sub(key,1,6) == 'portal' then
hasPortal = true
break
end
end
if hasPortal then
local portalList = findNumericArgs("portal",args)
result = portalBar(portalList, {tracking=trackingEnabled})
end
local hasSister = false
for _, sister in ipairs(sisters) do
if args[sister] ~= nil then
hasSister = true
break
end
end
if hasSister then
local sisterArgs = {auto=1, bar=1, tracking=trackingEnabled}
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 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 mw.text.trim(frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Subject bar/styles.css'}
} .. p._main(args))
end
return p