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 | -- 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 | ||
-- Add automatically generated DPL exclusions | |||
for i, exclusion in ipairs(exclusions) do | |||
dplArgs['not' .. i] = substituteGroup(notFormat, exclusion) | |||
end | end | ||
return dplArgs | return dplArgs | ||
end | end | ||
-- Expand Navbox DPL | -- 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 hasContent(list) then | |||
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 | ||
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 | ||