Module:Portal maintenance status
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
This module searches a Portal_talk: page's portal page, and returns an appropriate message based if {{Portal maintenance status}} is found in the page's wikitext, and which parameters are used.
An error is reported if this module is used outside of the Portal_talk namespace. It can be demonstrated, in any namespace, with the |demo=
and |demo2=
parameters, which take the name of templates to "find" (instead of actually searching a page).
Usage
{{#invoke:Portal maintenance status|main}}
- Looks for {{Portal maintenance status}} on a Portal_talk: page's related portal page.
- Returns an appropriate message string if found or an empty string if not found, or an error if used in the wrong namespace.
{{#invoke:Portal maintenance status|historical}}
- Looks for {{Historical}} on a Wikipedia_talk: page's related project page.
- Returns yes if found or an empty string if not found, or an error if used in the wrong namespace.
{{#invoke:Portal maintenance status|featured}}
- Looks for {{Featured portal}} on a Wikipedia_talk: page's related project page.
- Returns yes if found or an empty string if not found, or an error if used in the wrong namespace.
Examples
If the portal contains {{Portal maintenance status|date=November 2024|manual=yes}}
- This portal is manually maintained.
- This portal's subpages should be checked. Subpages that are no longer needed should be reported here.
If the portal contains {{Portal maintenance status|date=November 2024|nonstandard=yes}}
- This portal has a non-standard layout.
- This portal's subpages should be checked. Subpages that are no longer needed should be reported here.
If the portal contains {{Portal maintenance status|date=November 2024|incomplete=yes}}
- This portal is under construction or incomplete.
- This portal's subpages should be checked. Subpages that are no longer needed should be reported here.
If the portal contains {{Portal maintenance status|date=November 2024|subpages=single}}
- This portal has a single page layout. It is possible that any subpages may no longer be needed.
If the portal contains {{Portal maintenance status|date=November 2024|subpages=checked}}
- This portal's subpages have been checked by an editor, and are needed.
If the portal contains {{Portal maintenance status|date=November 2024|note=This is an example.}}
- This portal's subpages should be checked. Subpages that are no longer needed should be reported here.
- Additional notes: This is an example.
If the portal contains {{Portal maintenance status|date=November 2024|manual=yes|nonstandard=yes|subpages=single|incomplete=yes|note=Lorem ipsum dolor sit amet.}}
- This portal is manually maintained.
- This portal has a non-standard layout.
- This portal is under construction or incomplete.
- This portal has a single page layout. It is possible that any subpages may no longer be needed.
- Additional notes: Lorem ipsum dolor sit amet.
If the portal does not contain the template, there should be no output
If used in the wrong namespace, an error should be reported
Lua error: Wrong namespace.
See also
local p = {}
function cleanupArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
cleanArgs[key] = val
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
local content = {}
function makeTemplatePattern(template)
local first = string.sub(template, 1, 1)
local rest = string.sub(template, 2)
local pattern = mw.ustring.format('%s[%s%s]%s%s', '%{%{%s*', mw.ustring.upper(first), mw.ustring.lower(first), rest, '%s*|?[^%}]*%}%}')
return pattern
end
function makeParameterPattern(parameter)
return mw.ustring.format('%s%s%s%s', '|%s*', parameter, '%s*=%s*', '([^|%}]*)', '%s*[|%}]')
end
function getMatchingTemplateWikitext(content, template, leadOnly)
if leadOnly then
content = mw.ustring.gsub(content, "%c%s*==.*","") -- remove first ==Heading== and everything after it
end
for templateWikitext in mw.ustring.gmatch(content, '%b{}') do
local isCorrectTemplate = mw.ustring.match(templateWikitext, makeTemplatePattern(template))
if isCorrectTemplate then
return templateWikitext
end
end
return false
end
function getSubjectPageContent(contentNamespaceNumber)
local namespace = mw.site.namespaces[contentNamespaceNumber] ["name"]
local talkTitle = mw.title.getCurrentTitle()
if talkTitle.namespace ~= contentNamespaceNumber + 1 then
return error('Wrong namespace', 0)
end
local subjectTitle = mw.title.new(namespace .. ":" .. talkTitle.text)
return subjectTitle:getContent()
end
-- historical function
-- Looks for {{Historical}} on a Wikipedia_talk: page's related project page.
-- Returns 'yes' if found or '' (empty string) if not found, or an error if used in the wrong namespace.
p.historical = function(frame)
local parent = frame.getParent(frame)
local args = cleanupArgs(frame.args)
local demo = args.demo and true or false
local content
if demo then
local demoText = mw.ustring.gsub(args.demo, '%{%{%!%}%}', '|')
content = '{{' .. demoText .. '}}'
if args.demo2 then
local demo2Text = mw.ustring.gsub(args.demo2, '%{%{%!%}%}', '|')
content= portalContent .. '{{' .. demo2Text .. '}}'
end
else
content = getSubjectPageContent(4)
end
content = mw.ustring.gsub(content, "<!%-%-.-%-%->","") -- remove HTML comments
content = mw.ustring.gsub(content, "%c%s*==.*","") -- remove first ==Heading== and everything after it
content = mw.ustring.gsub(content, "<noinclude>.-</noinclude>", "") -- remove noinclude bits
local isHistorical = mw.ustring.match(content, makeTemplatePattern('Historical')) and true or false
return isHistorical and 'yes' or ''
end
-- featured function
-- Looks for {{Featured portal}} on a Portal_talk: page's related portal page.
-- Returns 'yes' if found or '' (empty string) if not found, or an error if used in the wrong namespace.
p.featured = function(frame)
local parent = frame.getParent(frame)
local args = cleanupArgs(frame.args)
local demo = args.demo and true or false
local content
if demo then
local demoText = mw.ustring.gsub(args.demo, '%{%{%!%}%}', '|')
content = '{{' .. demoText .. '}}'
if args.demo2 then
local demo2Text = mw.ustring.gsub(args.demo2, '%{%{%!%}%}', '|')
content= portalContent .. '{{' .. demo2Text .. '}}'
end
else
content = getSubjectPageContent(100)
end
content = mw.ustring.gsub(content, "<!%-%-.-%-%->","") -- remove HTML comments
content = mw.ustring.gsub(content, "<noinclude>.-</noinclude>", "") -- remove noinclude bits
local isFeatured = mw.ustring.match(content, makeTemplatePattern('Featured portal')) and true or false
return isFeatured and 'yes' or ''
end
-- main function
-- Looks for {{Portal maintenance status}} (or earlier deprecated templates) on a Portal_talk: page's related portal page.
-- Returns an appropriate message string if found or '' (empty string) if not found, or an error if used in the wrong namespace.
p.main = function(frame)
local parent = frame.getParent(frame)
local args = cleanupArgs(frame.args)
local demo = args.demo and true or false
local portalContent
if demo then
local demoText = mw.ustring.gsub(args.demo, '%{%{%!%}%}', '|')
portalContent = '{{' .. demoText .. '}}'
if args.demo2 then
local demo2Text = mw.ustring.gsub(args.demo2, '%{%{%!%}%}', '|')
portalContent = portalContent .. '{{' .. demo2Text .. '}}'
end
else
portalContent = getSubjectPageContent(100)
end
local status = getMatchingTemplateWikitext(portalContent, 'Portal maintenance status') or getMatchingTemplateWikitext(portalContent, 'Portal flag')
if not status then
return ''
end
local output = mw.ustring.sub(status, 0, -3) .. '|embed=yes}}'
return frame:preprocess(output)
end
return p