Module:Subject bar: Difference between revisions

From The Goon Show Depository

m (1 revision imported)
No edit summary
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
require('Module:No globals')
--require('strict')


local sisterBar = nil
local portalBar = nil
local compressSparseArray = nil
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
local yesNo = require('Module:Yesno')
local yesNo = require('Module:Yesno')
-- 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 p = {}
local p = {}


local sisters = {'commons','species','voy','n','wikt','b','q','s','v','d'}
local sisters = {'commons','species','voy','n','wikt','b','q','s','v','iw','iw1','iw2','d'}


local function findNumericArgs(key, args)
local function findNumericArgs(key, args)
Line 23: Line 24:
values[1] = args[key]
values[1] = args[key]
end
end
local compressSparseArray = require('Module:TableTools').compressSparseArray
values = compressSparseArray(values)  --- squeeze out gaps/nils in values, keep ordering
values = compressSparseArray(values)  --- squeeze out gaps/nils in values, keep ordering
return values
return values
Line 36: Line 38:
break
break
end
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
end
Line 58: Line 50:
end
end


if hasPortal then
local portalList = findNumericArgs("portal",args)
for _, positional in ipairs(args) do
table.insert(portalList, positional)
end
local portalBar = require('Module:Portal bar'..sandbox)._main
result = result..portalBar(portalList, {tracking=args.tracking, qid=args.qid})
end
if hasSister then
if hasSister then
sisterBar = require('Module:Sister project links')._main
local sisterArgs = {auto=1, bar=1, trackSingle=not hasPortal}
local sisterArgs = {auto=1, bar=1}
sisterArgs[1] = args.search
sisterArgs[1] = args.search
for _, k in ipairs({'author','commonscat','cookbook','display','tracking','qid'}) do
for _, k in ipairs({'author','commonscat','cookbook','display','tracking','qid'}) do
Line 68: Line 68:
     sisterArgs[t] = args[t..'-search'] or args[t]
     sisterArgs[t] = args[t..'-search'] or args[t]
     end
     end
    local sisterBar = require('Module:Sister project links'..sandbox)._main
result = result..sisterBar(sisterArgs)
result = result..sisterBar(sisterArgs)
end
end
 
return result
return result
end
end

Latest revision as of 10:45, 14 July 2024

--require('strict')

local getArgs = require('Module:Arguments').getArgs
local yesNo = require('Module:Yesno')

-- 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 p = {}

local sisters = {'commons','species','voy','n','wikt','b','q','s','v','iw','iw1','iw2','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
	local compressSparseArray = require('Module:TableTools').compressSparseArray
	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
	
	local hasSister = yesNo(args.auto,true) or yesNo(args.author,true) or yesNo(args.cookbook,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 hasPortal then
		local portalList = findNumericArgs("portal",args)
		for _, positional in ipairs(args) do
			table.insert(portalList, positional)
		end
		local portalBar = require('Module:Portal bar'..sandbox)._main
		result = result..portalBar(portalList, {tracking=args.tracking, qid=args.qid})
	end
	
	if hasSister then
		local sisterArgs = {auto=1, bar=1, trackSingle=not hasPortal}
		sisterArgs[1] = args.search
		for _, k in ipairs({'author','commonscat','cookbook','display','tracking','qid'}) do
			sisterArgs[k] = args[k]
		end
    	for _, t in ipairs(sisters) do
    		sisterArgs[t] = args[t..'-search'] or args[t]
    	end
    	local sisterBar = require('Module:Sister project links'..sandbox)._main
		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