Module:Portal maintenance status

From Stiles Wiki
Jump to navigation Jump to search

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 Stiles.casa Wiki_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 Stiles.casa Wiki_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}}

Please take care when editing, especially if using automated editing software, and seek consensus before making major changes. Learn how to update the maintenance information here. (November 2024)

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.
Please take care when editing, especially if using automated editing software. Learn how to update the maintenance information here. (November 2024)

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.
Please take care when editing, especially if using automated editing software. Learn how to update the maintenance information here. (November 2024)

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.
Please take care when editing, especially if using automated editing software. Learn how to update the maintenance information here. (November 2024)

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.
Please take care when editing, especially if using automated editing software. Learn how to update the maintenance information here. (November 2024)

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.
Please take care when editing, especially if using automated editing software. Learn how to update the maintenance information here. (November 2024)

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.
Please take care when editing, especially if using automated editing software, and seek consensus before making major changes. Learn how to update the maintenance information here. (November 2024)

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 Stiles.casa Wiki_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