Module:Navbox Automatic Groups: Difference between revisions

ReisuDesign (talk | contribs)
No edit summary
ReisuDesign (talk | contribs)
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 3: Line 3:
local PREFIX = '__NAVBOX_AUTO_GROUPS__'
local PREFIX = '__NAVBOX_AUTO_GROUPS__'
local NOGROUP = '[nogroup]'
local NOGROUP = '[nogroup]'
local CONTROL_ARGS = { groups = true, base = true, list = true, list_type = true, start = true }
local CONTROL_ARGS = {
groups = true,
base = true,
list = true,
list_type = true,
not_format = true,
start = true
}


-- Trim a value
-- Trim a value
Line 13: Line 20:
local function splitGroups(value)
local function splitGroups(value)
local result = {}
local result = {}
for _, group in ipairs(mw.text.split(value, ';', true)) do
for _, group in ipairs(mw.text.split(value, ';', true)) do
group = trim(group)
group = trim(group)
if group ~= '' then
if group ~= '' then
result[#result + 1] = group
result[#result + 1] = group
end
end
end
end
return result
return result
end
end
Line 33: Line 43:
return group
return group
end)
end)
end
-- Link a group name if the page exists
local function linkGroup(group)
local page = mw.text.decode(group or '')
local frame = mw.getCurrentFrame()
if page ~= ''
and not page:match('[#<>%[%]{}]+')
and frame:callParserFunction('PROTECTIONEXPIRY:edit', page) ~= '' then
return '[[' .. group .. '|' .. group .. ']]'
end
return group
end
end


Line 38: Line 62:
local function getListOverrides(args)
local function getListOverrides(args)
local overrides = {}
local overrides = {}
for key, value in pairs(args) do
for key, value in pairs(args) do
local groupName = tostring(key):match('^list_(.+)$')
local groupName = tostring(key):match('^list_(.+)$')
if groupName then
if groupName then
overrides[normalizeGroupName(groupName)] = tostring(value)
overrides[normalizeGroupName(groupName)] = tostring(value)
end
end
end
end
return overrides
return overrides
end
end


-- Build DPL arguments from all non-control parameters
-- Build DPL arguments
local function getDplArgs(args, group, exclusions)
local function getDplArgs(args, group, exclusions)
local dplArgs = {}
local dplArgs = {}
local notFormat = tostring(args.not_format or '%%group%%')
for key, value in pairs(args) do
for key, value in pairs(args) do
key = tostring(key)
key = tostring(key)
if not CONTROL_ARGS[key] and not key:match('^list_.+$') then
if not CONTROL_ARGS[key] and not key:match('^list_.+$') then
if type(value) == 'string' then
if type(value) == 'string' then
Line 60: Line 90:
end
end
end
end
if #exclusions > 0 then
 
for i, exclusion in ipairs(exclusions) do
-- Add automatically generated DPL exclusions
dplArgs['not' .. i] = exclusion
for i, exclusion in ipairs(exclusions) do
end
dplArgs['not' .. i] = substituteGroup(notFormat, exclusion)
end
end
return dplArgs
return dplArgs
end
end


-- Expand Navbox DPL after placeholders and automatic exclusions are known
-- Expand Navbox DPL
local function expandDpl(frame, args, group, exclusions)
local function expandDpl(frame, args, group, exclusions)
local dplArgs = getDplArgs(args, group, exclusions)
local dplArgs = getDplArgs(args, group, exclusions)
return frame:expandTemplate{ title = 'Navbox DPL', args = dplArgs }
 
return frame:expandTemplate{
title = 'Navbox DPL',
args = dplArgs
}
end
 
-- Check whether expanded content actually contains anything
local function hasContent(value)
return mw.text.trim(tostring(value or '')) ~= ''
end
end


Line 77: Line 117:
function p.main(frame)
function p.main(frame)
local args = {}
local args = {}
-- Get arguments passed directly to the module
for key, value in pairs(frame.args) do
for key, value in pairs(frame.args) do
args[key] = value
args[key] = value
end
end


-- Get arguments passed through Template:Navbox Automatic Groups
local parent = frame:getParent()
local parent = frame:getParent()
if parent then
if parent then
for key, value in pairs(parent.args) do
for key, value in pairs(parent.args) do
Line 108: Line 152:
local exclusions = {}
local exclusions = {}


-- Build the list of named groups used for [nogroup] exclusions
for _, group in ipairs(groups) do
for _, group in ipairs(groups) do
if normalizeGroupName(group) ~= normalizeGroupName(NOGROUP) then
if normalizeGroupName(group) ~= normalizeGroupName(NOGROUP) then
Line 129: Line 174:
if list == nil then
if list == nil then
if listType == 'dpl' then
if listType == 'dpl' then
list = expandDpl(frame, args, targetGroup, isNoGroup and exclusions or {})
list = expandDpl(
frame,
args,
targetGroup,
isNoGroup and exclusions or {}
)
else
else
list = substituteGroup(defaultList, targetGroup)
list = substituteGroup(defaultList, targetGroup)
Line 139: Line 189:
end
end


local row = { list = list }
-- Do not create a row when the generated list is empty
if not isNoGroup then
if hasContent(list) then
row.group = group
local row = {
list = list
}
 
-- Link normal group names when the corresponding page exists
if not isNoGroup then
row.group = linkGroup(group)
end
 
rows[#rows + 1] = row
end
end
rows[#rows + 1] = row
end
end


return PREFIX .. mw.text.jsonEncode({ start = start, rows = rows })
return PREFIX .. mw.text.jsonEncode({
start = start,
rows = rows
})
end
end


return p
return p