Anonymous

Module:Navbox: Difference between revisions

From Zelda Wiki, the Zelda encyclopedia
no edit summary
No edit summary
No edit summary
 
(35 intermediate revisions by 2 users not shown)
Line 3: Line 3:


local utilsArg = require("Module:UtilsArg")
local utilsArg = require("Module:UtilsArg")
local utilsPage = require("Module:UtilsPage")


local CATEGORY_INVALID_ARGS = "[[Category:"..require("Module:Constants/category/invalidArgs").."]]"
local CATEGORY_INVALID_ARGS = "[[Category:"..require("Module:Constants/category/invalidArgs").."]]"
local CATEGORY_NAVBOXES_ATTENTION = "Navigation Templates Needing Attention"
local CATEGORY_NAVBOXES_ATTENTION = "Navigation templates needing attention"
local CATEGORY_NAVBOXES_OTHER = "[[Category:Navboxes with Other]]"
local CATEGORY_NAVBOXES_BIG_GROUPS = "[[Category:Navboxes with big groups]]"
local CATEGORY_NAVBOX_TEMPLATES = "Navbox Templates"
local CATEGORY_NAVBOXES_OTHER = "[[Category:Navboxes with other]]"
 
local CATEGORY_NAVBOX_TEMPLATES = "Navbox templates"
local CLASS_PIXEL_ART = require("Module:Constants/class/pixelArt")


local TITLE_IMG_SIZE = "28x28px"
local DEFAULT_IMG_SIZE = "150x150px"
local DEFAULT_IMG_SIZE = "150x150px"
local MAX_RECOMMENDED_PARTITION_SIZE = require("Module:Constants/number/maxNavboxPartitionSize")
local MAX_RECOMMENDED_PARTITION_SIZE = require("Module:Constants/number/maxNavboxPartitionSize")
local title = mw.title.getCurrentTitle()
local isTemplate = title.nsText == "Template"
local isNavboxPage = isTemplate and title.rootText ~= "Navbox" and title.baseText ~= "Categories" and title.text ~= "Categories/Navbox/Documentation"
local isManualNavboxPage = isNavboxPage and title.baseText ~= "Categories/Navbox" -- to distinguish manually curated navboxes from automated ones


function p.Main(frame)
function p.Main(frame)
Line 24: Line 20:
if not args.title then
if not args.title then
if isManualNavboxPage then
if h.isManualNavboxPage() then
return "", errCategories.."[[Category:"..CATEGORY_NAVBOX_TEMPLATES.."Navbox Templates]]"
return "", errCategories.."[[Category:"..CATEGORY_NAVBOX_TEMPLATES.."]]"
elseif isTemplate then
elseif h.isTemplate() then
return "", errCategories
return "", errCategories
else
else
Line 32: Line 28:
end
end
end
end
h.storeArgs(args)
local navbox, categories = h.printNavbox(args)
local navbox, categories = h.printNavbox(args)
categories = categories..errCategories
categories = categories..errCategories


if isManualNavboxPage then
if h.isManualNavboxPage() then
return navbox, categories.."[[Category:"..CATEGORY_NAVBOX_TEMPLATES.."Navbox Templates]]", h.printReport()
return navbox, categories.."[[Category:"..CATEGORY_NAVBOX_TEMPLATES.."]]", h.printReport()
elseif isNavboxPage then
elseif h.isNavboxPage() then
-- apply the styles that would be applied when this template is actually used
navbox = tostring(mw.html.create("div")
:addClass("zw-categories__navboxes-category-list")
:wikitext(navbox)
:done()
)
local styles = frame:extensionTag({
name = "templatestyles",
args = { src = "Template:Categories/Styles.css" }
})
navbox = styles..navbox
return navbox, categories, h.printReport()
return navbox, categories, h.printReport()
elseif isTemplate then
elseif h.isTemplate() then
return navbox, categories
return navbox, categories
else
else
Line 49: Line 57:
function h.printNavbox(args)
function h.printNavbox(args)
local categories = ""
local categories = ""
-- [[MediaWiki:Gadget-Site.js]] automatically removes the "mw-collapsed" when there is only one navbox on the page.
-- [[MediaWiki:Gadget-Navbox.js]] automatically removes the "mw-collapsed" when there is only one navbox on the page.
local navbox = mw.html.create("div")
local navbox = mw.html.create("div")
-- MediaWiki (Timeless?) automatically removes elements with class "navbox" on mobile
-- we _want_ to show navboxes on mobile since we've made them mobile friendly, so we use a different class name
:addClass("zw-navbox mw-collapsible mw-collapsed")
:addClass("zw-navbox mw-collapsible mw-collapsed")
local id = args.id and "navbox-"..string.gsub(string.lower(args.id), " ", "-") -- to kebab case which is the standard for IDs
local id = args.id or args.title
id = id and "navbox-"..string.gsub(string.lower(id), " ", "-") -- to kebab case which is the standard for IDs
if id then
if id then
navbox:attr("id", id)
navbox:attr("id", id)
end
local titleImages = args.titleImages or {}
local navboxTitle = mw.html.create("div")
:addClass("zw-navbox__title")
if #titleImages > 0 then
local leftImage = string.format("[[%s|%s|link=]]", titleImages[1], TITLE_IMG_SIZE)
navboxTitle:tag("span")
:addClass("zw-navbox__title-image")
:wikitext(leftImage)
end
navboxTitle:tag("span")
:addClass("zw-navbox__title-text")
:wikitext(args.title)
if #titleImages > 0 then
local rightImage = string.format("[[%s|%s|link=]]", titleImages[2] or titleImages[1], TITLE_IMG_SIZE)
navboxTitle:tag("span")
:addClass("zw-navbox__title-image")
:wikitext(rightImage)
end
end
Line 69: Line 95:
:tag("span")
:tag("span")
:addClass("zw-navbox__title")
:addClass("zw-navbox__title")
:wikitext(args.title)
:node(navboxTitle)
:done()
:done()
:tag("span")
:tag("span")
Line 94: Line 120:
name = row.group or "Row "..i,  
name = row.group or "Row "..i,  
size = #(row.links or {}),
size = #(row.links or {}),
maxGroupSize = row.group.maxGroupSize or MAX_RECOMMENDED_PARTITION_SIZE
maxGroupSize = row.maxGroupSize or MAX_RECOMMENDED_PARTITION_SIZE
})
})
if row.group then
if row.group then
rows:tag("div")
rows:tag("div")
:addClass("zw-navbox__row-header")
:addClass("zw-navbox__row-header")
:wikitext(row.group)
:tag("span")
:addClass("zw-navbox__row-header-text")
:wikitext(row.group)
:done()
:done()
:done()
elseif i ~= 1 or #args.rows > 1 then
local utilsError = require("Module:UtilsError")
utilsError.warn(string.format("<code>group%d</code> parameter is required when there is more than one group.", i))
categories = categories..CATEGORY_INVALID_ARGS
end
end
Line 114: Line 139:


local evenOdd = (i % 2 == 0) and "even" or "odd"
local evenOdd = (i % 2 == 0) and "even" or "odd"
local rowModifiers = " zw-navbox__row-links--"..evenOdd
if #args.rows == 1 and not args.rows[1].group then
rowModifiers = rowModifiers.." zw-navbox__row-links--nogroups"
end
local links = table.concat(links, "&nbsp;• ")
local links = table.concat(links, "&nbsp;• ")
rows:tag("div")
rows:tag("div")
:addClass("zw-navbox__row-links"..rowModifiers)
:addClass("zw-navbox__row-links zw-navbox__row-links--"..evenOdd)
:addClass(not row.group and "zw-navbox__row-links--nogroups" or nil)
:tag("div")
:tag("div")
:addClass("zw-navbox__row-links-content")
:addClass("zw-navbox__row-links-content")
:addClass(not row.group and "zw-navbox__row-links-content--nogroups" or nil)
:wikitext(links)
:wikitext(links)
:done()
:done()
Line 136: Line 159:
local thumbnail = string.format("[[%s|%s]]", filename, DEFAULT_IMG_SIZE)
local thumbnail = string.format("[[%s|%s]]", filename, DEFAULT_IMG_SIZE)
body:tag("div")
body:tag("div")
:addClass("zw-navbox__image "..CLASS_PIXEL_ART)
:addClass("zw-navbox__image")
:wikitext(thumbnail)
:wikitext(thumbnail)
end
end
Line 156: Line 179:
end
end
function h._link(link)
function h._link(link)
if string.find(link, "^%[%[Category:") or string.find(link, "^%[%[File:") then
return link
end
local linkParts = string.gsub(link, "^%[%[:?", "")
local linkParts = string.gsub(link, "^%[%[:?", "")
linkParts = string.gsub(linkParts, "%]%]$", "")
linkParts = string.gsub(linkParts, "%]%]$", "")
Line 162: Line 188:
page = string.gsub(page, "&#44;", ",") -- unescape any commas that were escaped in input due to splitting by ,
page = string.gsub(page, "&#44;", ",") -- unescape any commas that were escaped in input due to splitting by ,
page = string.gsub(page, "#.*", "")
page = string.gsub(page, "#.*", "")
page = string.gsub(page, "%s*$", "") -- trim trailing whitespace
h.storePage(page)
h.storePage(page)


local display = pipe and string.sub(linkParts, pipe + 1) or page
local display = pipe and string.sub(linkParts, pipe + 1) or page
if page == title.fullText then
if page == mw.title.getCurrentTitle().fullText then
return "<b>"..display.."</b>"
return "<b>"..display.."</b>"
else
else
local url = mw.site.server.."/"..mw.uri.encode(page, "WIKI")
local url = mw.site.server.."/wiki/"..mw.uri.encode(page, "WIKI")
return string.format('<span class="plainlinks">[%s %s]</span>', url, display)
return string.format('<span class="plainlinks">[%s %s]</span>', url, display)
end
end
Line 175: Line 202:


-- Store data for the report function below
-- Store data for the report function below
local VAR_ARGS = "navbox_args"
local VAR_PAGES = "navbox_pages"
local VAR_PAGES = "navbox_pages"
local VAR_GROUP_SIZES = "navbox_group_size"
local VAR_GROUP_SIZES = "navbox_group_size"
function h.storePage(page)
function h.storePage(page)
if isNavboxPage then
if h.isNavboxPage() then
local utilsVar = require("Module:UtilsVar")
local utilsVar = require("Module:UtilsVar")
utilsVar.add(VAR_PAGES, page)
utilsVar.add(VAR_PAGES, page)
Line 184: Line 212:
end
end
function h.storeGroupSize(group)
function h.storeGroupSize(group)
if isNavboxPage then
if h.isNavboxPage() then
local utilsVar = require("Module:UtilsVar")
local utilsVar = require("Module:UtilsVar")
utilsVar.add(VAR_GROUP_SIZES, group)
utilsVar.add(VAR_GROUP_SIZES, group)
end
end
function h.storeArgs(args)
if h.isNavboxPage() then
local utilsVar = require("Module:UtilsVar")
utilsVar.set(VAR_ARGS, args)
end
end
end
end
Line 197: Line 231:
local utilsLayout = require("Module:UtilsLayout")
local utilsLayout = require("Module:UtilsLayout")
local utilsMarkup = require("Module:UtilsMarkup")
local utilsMarkup = require("Module:UtilsMarkup")
local utilsPage = require("Module:UtilsPage")
local utilsTable = require("Module:UtilsTable")
local utilsTable = require("Module:UtilsTable")
local utilsVar = require("Module:UtilsVar")
local utilsVar = require("Module:UtilsVar")
local args = utilsVar.get(VAR_ARGS) or {}
local pagesInNav = utilsVar.get(VAR_PAGES) or {}
local pagesInNav = utilsVar.get(VAR_PAGES) or {}
local groupSizes = utilsVar.get(VAR_GROUP_SIZES) or {}
local groupSizes = utilsVar.get(VAR_GROUP_SIZES) or {}
local templatePage = title.text
if string.find("/Documentation$", templatePage) then
templatePage = title.baseText
end
local pagesUsingNav = utilsPage.dpl({
local pagesUsingNav = utilsPage.dpl({
uses = "Template:"..templatePage,
uses = "Template:"..h.templatePage(),
notnamespace = "User"
notnamespace = {"User", "Category"},
nottitlematch = {
"%/Documentation",
mw.title.getCurrentTitle().prefixedText ~= "Template:Guidelines Nav" and "Categories" or nil  -- To avoid counting examples at [[Template:Categories]] as uses (but we do want to count [[Template:Guidelines Nav]])
},
})
})
local usingCategoryNavbox = utilsPage.dpl({
uses = "Template:Categories/Navbox",
skipthispage = "no",
titlematch = templatePage,
})
local isUsingCategoryNavbox = #usingCategoryNavbox > 0


local missingPages = utilsTable.difference(pagesUsingNav, pagesInNav)
local missingLinks = utilsTable.difference(pagesUsingNav, pagesInNav)
local missingUses = utilsTable.difference(pagesInNav, pagesUsingNav)
local missingUses = utilsTable.difference(pagesInNav, pagesUsingNav)
local redirects = h.reportRedirects(pagesInNav)
missingLinks = utilsTable.difference(missingLinks, redirects)
missingUses = utilsTable.difference(missingUses, redirects)
local wantedPages = utilsTable.filter(pagesInNav, function(page)
local wantedPages = utilsTable.filter(pagesInNav, function(page)
return not utilsPage.exists(page)
return not utilsPage.exists(page)
end)
local redirects = utilsTable.filter(pagesInNav, function(page)
-- mw.title is more reliable than utilsPage for checking redirects
-- but mw.title uses an expensive parser function while utilsPage does not
-- we cannot "afford" the expensive parser function when there are too many pages in the nav
if #pagesInNav > 90 then
return utilsPage.isRedirect(page)
else
return mw.title.new(page).isRedirect
end
end)
end)
local bigGroups = utilsTable.filter(groupSizes, function(group)
local bigGroups = utilsTable.filter(groupSizes, function(group)
return group.size > group.maxGroupSize
return group.size > group.maxGroupSize
end)
end)
local categoryName, missingPages, extraPages = h.reportCategoryMismatches(pagesInNav)
local issues = ""
local issues = ""
if categoryName and args.title and categoryName ~= args.title then
issues = issues
.."\n====Title Mismatch====\n"
..string.format("<p>The navbox title should be <code>%s</code> rather than <code>%s</code>.</p>", categoryName, args.title)
.."<p>For navboxes added by [[Template:Categories]], the navbox title must match the category name, as navboxes are listed alphabetically by category name.</p>"
end
if #wantedPages > 0 then
if #wantedPages > 0 then
issues = issues.."\n====Red Links====\n"
issues = issues.."\n====Red Links====\n"
Line 248: Line 277:
issues = issues.."\n====Redirect Links====\n"
issues = issues.."\n====Redirect Links====\n"
redirects = utilsTable.map(redirects, utilsMarkup.link)
redirects = utilsTable.map(redirects, utilsMarkup.link)
issues = issues.."The above navbox contains links to redirects. Please update these links to refer to the redirect targets:"
issues = issues.."The above navbox contains links to redirects. Please create an article to replace the redirect, or update the link to refer to the redirect target."
issues = issues..utilsMarkup.bulletList(redirects)  
issues = issues..utilsMarkup.bulletList(redirects)  
end
end
if #missingPages > 0 then
if #missingLinks > 0 then
issues = issues.."\n====Missing Links====\n"
issues = issues.."\n====Missing Links====\n"
missingPages = utilsTable.map(missingPages, utilsMarkup.link)
missingLinks = utilsTable.map(missingLinks, utilsMarkup.link)
issues = issues.."<p>The above navbox is missing the following links to articles that use it. Please add these articles to the navbox to ensure that the navigation does not have dead ends.</p>"
issues = issues.."<p>The above navbox is missing the following links to articles that use it. Please add these articles to the navbox to ensure that the navigation does not have dead ends.</p>"
issues = issues..utilsMarkup.bulletList(missingPages)
issues = issues..utilsMarkup.bulletList(missingLinks)
end
end
if #missingUses > 0 and isManualNavboxPage then -- missing uses is impossible for navboxes added by [[Template:Category]]
if #missingUses > 0 and h.isManualNavboxPage() then -- missing uses is impossible if it's a category-based navbox and [[Template:Category]] is used everywhere
issues = issues.."\n====Missing Uses====\n"
issues = issues.."\n====Missing Uses====\n"
missingUses = utilsTable.map(missingUses, utilsMarkup.link)
missingUses = utilsTable.map(missingUses, utilsMarkup.link)
issues = issues.."The above navbox is missing from the following articles. Please add <code><nowiki>{{"..title.baseText.."}}</nowiki></code> to these articles to ensure that the navigation does not have dead ends."
issues = issues.."The above navbox is missing from the following articles. Please add <code><nowiki>{{"..h.templatePage().."}}</nowiki></code> to these articles to ensure that the navigation does not have dead ends."
issues = issues..utilsMarkup.bulletList(missingUses)
issues = issues..utilsMarkup.bulletList(missingUses)
end
end
Line 276: Line 305:
issues = issues.."If you are certain that a row should not be subdivided despite its size, you can increase the <code>maxGroupSize</code> of the row. See [[Template:Categories/Navbox]] for more information."
issues = issues.."If you are certain that a row should not be subdivided despite its size, you can increase the <code>maxGroupSize</code> of the row. See [[Template:Categories/Navbox]] for more information."
end
end
if not isManualNavboxPage and not isUsingCategoryNavbox then
if #extraPages > 0 or #missingPages > 0 then
issues = issues.."\n====[[Template:Categories/Navbox]] Required====\n"
issues = issues.."\n====Category Mismatch====\n"
issues = issues.."<p>This template does not appear to be using {{Template|Categories/Navbox}}. Please use this template to ensure that all pages in the category are represented in the navbox.</p><p>If the correct template is in fact being used, {{Purge|purge this page}} to remove the issue from the report.</p>"
if #missingPages > 0 then
missingPages = utilsTable.map(missingPages, utilsMarkup.link)
issues = issues
.."This navbox is missing entries from [[:Category:"..categoryName.."]]:"
..utilsMarkup.bulletList(missingPages)
end
if #extraPages > 0 then
extraPages = utilsTable.map(extraPages, utilsMarkup.link)
issues = issues
.."This navbox contains links to pages that are not in [[:Category:"..categoryName.."]]:"
..utilsMarkup.bulletList(extraPages)
end
issues = issues.."Usually {{Template|Categories/Navbox}} should be used instead of {{Template|Navbox}} for category-based navboxes."
end
end
local report = "\n==Report==\n"
local report = "\n==Report==\n"
if issues ~= "" then
if issues ~= "" then
report = "<p>{{TOC}}</p>"..report -- fixes the lack of space between the navbox and the toc beneath it
report = report
report = report
.."\n===Issues===\n"
.."\n===Issues===\n"
..issues
..issues
.."[[Category:"..CATEGORY_NAVBOXES_ATTENTION.."]]"
-- Special subcategory for big groups as it is by far the most common issue but also the least urgent,
-- so it helps to keep it separate to avoid burying other more important issues
if #bigGroups > 0 then
report = report..CATEGORY_NAVBOXES_BIG_GROUPS
else
report = report.."[[Category:"..CATEGORY_NAVBOXES_ATTENTION.."]]"
end
else
else
report = report.."<p>[[File:TFH Green Link ok.png|32px|link=]] No issues have been detected in this navbox.</p>"
report = report.."<p>[[File:TFH Green Link ok.png|32px|link=]] No issues have been detected in this navbox.</p>"
Line 294: Line 341:
return mw.getCurrentFrame():preprocess(report)
return mw.getCurrentFrame():preprocess(report)
end
end
function h.reportRedirects(pagesInNav)
local utilsTable = require("Module:UtilsTable")
return utilsTable.filter(pagesInNav, function(page)
-- mw.title is more reliable than utilsPage for checking redirects
-- but mw.title uses an expensive parser function while utilsPage does not
-- we cannot "afford" the expensive parser function when there are too many pages in the nav
if #pagesInNav > 90 then
return utilsPage.isRedirect(page)
else
return mw.title.new(page).isRedirect
end
end)
end
function h.reportCategoryMismatches(pagesInNav)
local utilsTable = require("Module:UtilsTable")
if h.isManualNavboxPage() then
return nil, {}, {}
end
local usingCategoryNavbox = utilsPage.dpl({
uses = "Template:Categories/Navbox",
skipthispage = "no",
titlematch = h.templatePage(),
})
if #usingCategoryNavbox > 0 then
return nil, {}, {}
end
local title = mw.title.getCurrentTitle()
local category = title.subpageText
if title.subpageText == "Documentation" then
category = title.basePageTitle.subpageText
end
local pagesInCategory = utilsPage.dpl({ category = category, namespace = "" })
local missingPages = utilsTable.difference(pagesInCategory, pagesInNav)
local extraPages = utilsTable.difference(pagesInNav, pagesInCategory)
return category, missingPages, extraPages
end
local title = mw.title.getCurrentTitle()
function h.isTemplate()
return title.nsText == "Template"
end
function h.isNavboxPage()
return h.isTemplate() and title.rootText ~= "Navbox" and title.baseText ~= "Categories" and title.text ~= "Categories/Navbox/Documentation" and not h.isCurrentPageInNavbox() -- to prevent false positives on template pages that use navboxes, e.g. [[Template:Term]] for {{Guidelines Nav}}}
end
function h.isCurrentPageInNavbox()
local utilsTable = require("Module:UtilsTable")
local utilsVar = require("Module:UtilsVar")
local pagesInNav = utilsVar.get(VAR_PAGES) or {}
return utilsTable.includes(pagesInNav, title.basePageTitle.fullText)
end
function h.isManualNavboxPage() -- to distinguish manually curated navboxes from automated ones
return h.isNavboxPage() and title.baseText ~= "Categories/Navbox"
end
function h.templatePage()
local templatePage = title.text
if string.find("/Documentation$", templatePage) then
templatePage = title.baseText
end
return templatePage
end


p.Templates = {
p.Templates = {
Line 300: Line 413:
purpose = "Creates [[:Category:"..CATEGORY_NAVBOX_TEMPLATES.."|navbox templates]].",
purpose = "Creates [[:Category:"..CATEGORY_NAVBOX_TEMPLATES.."|navbox templates]].",
categories = {"Metatemplates"},
categories = {"Metatemplates"},
paramOrder = {"id", "title", "image", "group", "links", "maxGroupSize", "footer"},
paramOrder = {"id", "title", "titleImages", "image", "group", "links", "maxGroupSize", "footer"},
repeatedGroup = {
repeatedGroup = {
name = "rows",
name = "rows",
params = {"group", "links", "maxGroupSize"},
params = {"group", "links", "maxGroupSize"},
counts = {2, 3, 4, 5, 6, 7},
counts = {2, 3, 4, 5, 6, 7},
},
boilerplate = {
separateRequiredParams = false,
hiddenParams = {"maxGroupSize", "type"},
},
},
params = {
params = {
id = {
id = {
type = "string",
type = "string",
desc = "A unique ID for the navbox. Sets the [https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id id HTML attribute] so that the navbox can be linked to.",
desc = "A unique ID for the navbox. Sets the [https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id id HTML attribute] so that the navbox can be linked to. Defaults to the navbox title.",
suggested = true,
trim = true,
trim = true,
nilIfEmpty = true,
nilIfEmpty = true,
Line 320: Line 436:
trim = true,
trim = true,
nilIfEmpty = true,
nilIfEmpty = true,
},
titleImages = {
type = "string",
desc = "Two file names with the <code>File:</code> prefix, separated by a comma. Renders image to the left and right of the navbox title.",
trim = true,
nilIfEmpty = true,
split = true,
},
},
image = {
image = {
type = "wiki-file-name",
type = "wiki-file-name",
desc = "A file name, with the <code>File:</code> prefix.",
desc = "A file name, with the <code>File:</code> prefix. Renders an image in the navbox body.",
trim = true,
trim = true,
nilIfEmpty = true,
nilIfEmpty = true,
Line 330: Line 453:
type = "string",
type = "string",
desc = "A header for the given row in the navbox. Required if there is more than one row.",
desc = "A header for the given row in the navbox. Required if there is more than one row.",
suggested = true,
trim = true,
trim = true,
nilIfEmpty = true,
nilIfEmpty = true,
Line 345: Line 467:
type = "number",
type = "number",
nilIfEmpty = true,
nilIfEmpty = true,
suggested = false,
default = MAX_RECOMMENDED_PARTITION_SIZE,
desc = "Adds the template to [[:Category:"..CATEGORY_NAVBOXES_ATTENTION.."]] if the number of links in the group exceeds this number. In most cases this value should not be set higher than its default; navboxes with too many links per group can be difficult to read.",
desc = "Adds the template to [[:Category:"..CATEGORY_NAVBOXES_ATTENTION.."]] if the number of links in the group exceeds this number. In most cases this value should not be set higher than its default; navboxes with too many links per group can be difficult to read.",
},
},
Line 353: Line 475:
trim = true,
trim = true,
nilIfEmpty = true,
nilIfEmpty = true,
suggested = true,
}
},
},
},
},
},