Module:Category main article
From Soyjak Wiki, the free ensoyclopedia
Jump to navigationJump to search
| This module is rated as beta. It is considered ready for widespread use, but should be monitored to ensure results are as expected. |
-- This module implements {{Category main article}}.
-- Tweaked by User:Rickert
local mHatnote = require('Module:Hatnote')
local mFormatLink = require('Module:Format link')
local yesno = require('Module:Yesno')
local mTableTools -- lazily initialise
local mArguments -- lazily initialise
local p = {}
-- Helper: true if the page is in Template: or Module: namespace
local function isTemplateOrModule(title)
local t = (type(title) == 'string' and title) or (title and title.prefixedText) or ''
if t == '' then return false end
local ok, tt = pcall(mw.title.new, t)
if not ok or not tt then return false end
local ns = tt.namespace
return ns == 10 or ns == 828
end
function p.catMain(frame)
mTableTools = require('Module:TableTools')
mArguments = require('Module:Arguments')
-- Grab args
local args = mArguments.getArgs(frame, { wrappers = 'Template:Category main article' })
local pages = mTableTools.compressSparseArray(args)
local options = {
article = args.article,
selfref = args.selfref,
}
-- Determine the outer page (the page using the template)
local thisTitle = mw.title.getCurrentTitle()
local text = p._catMain(options, thisTitle, unpack(pages))
if isTemplateOrModule(thisTitle.prefixedText) then return text end
if thisTitle.namespace ~= 14 then text = text .. '\n[[Category:Pages misusing Category main article]]' end
return text
end
function p._catMain(options, thisTitle, ...)
options = options or {}
local pages = { ... }
thisTitle = thisTitle or mw.title.getCurrentTitle()
local fullTitle = thisTitle and thisTitle.prefixedText or ''
local thisText = thisTitle and thisTitle.text or (pages[1] or '')
local isTemplate = isTemplateOrModule(fullTitle)
-- Red link detection
local rawLinks = mFormatLink.formatPages({
categorizeMissing = not isTemplate and 'Categories with hatnote templates targeting a non-existent page' or nil,
}, pages)
-- Convert to plain strings
local links = {}
for i, link in ipairs(rawLinks or {}) do
links[i] = tostring(link)
end
-- Auto-fill if empty
local firstOutputLink = nil
local usedAutoFill = false
if not links[1] or links[1] == '' then
local title = mw.title.new(thisText)
if title and title.isRedirect then title = title.redirectTarget end
firstOutputLink = title and title.text or thisText
usedAutoFill = true
links[1] = tostring(mFormatLink._formatLink {
link = firstOutputLink,
categorizeMissing = not isTemplate and 'Categories with hatnote templates targeting a non-existent page'
or nil,
})
pages = { firstOutputLink }
else
local visible = links[1]
visible = visible:gsub("^'''", ''):gsub("'''$", '')
visible = visible:gsub('%[%[', ''):gsub('%]%]', '')
visible = visible:gsub('|.*$', '')
visible = visible:gsub('#.*$', '')
firstOutputLink = visible
usedAutoFill = false
end
-- Bold links
for i, link in ipairs(links) do
links[i] = string.format("'''%s'''", link)
end
-- Determine pagetype
local pagetype
if options.article ~= nil then
pagetype = yesno(options.article) ~= false and 'article' or 'page'
elseif pages and pages[1] then
local page = pages[1]:gsub('|.*', '')
local tt = mw.title.new(page)
pagetype = tt and tt.namespace == 0 and 'article' or 'page'
else
pagetype = 'article'
end
-- Work out whether we need to be singular or plural
local stringToFormat
if #links > 1 then
stringToFormat = 'The main %ss for this category are %s.'
else
stringToFormat = 'The main %s for this category is %s.'
end
-- Build hatnote text
local text = string.format(stringToFormat, pagetype, mw.text.listToText(links))
-- Pass through Module:Hatnote
local hnOptions = { selfref = yesno(options.selfref) == true }
text = mHatnote._hatnote(text, hnOptions)
return text, firstOutputLink, usedAutoFill
end
return p