Module:Portal maintenance status/sandbox: Difference between revisions

From wikiNonStop
(allow for subtemplates within tempate parameters)
 
m (1 revision imported: initial setup)
 
(No difference)

Latest revision as of 15:53, 25 August 2024

Module documentation

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}}

Template:Portal maintenance status


If the portal contains {{Portal maintenance status|date=November 2024|nonstandard=yes}}

Template:Portal maintenance status


If the portal contains {{Portal maintenance status|date=November 2024|incomplete=yes}}

Template:Portal maintenance status


If the portal contains {{Portal maintenance status|date=November 2024|subpages=single}}

Template:Portal maintenance status


If the portal contains {{Portal maintenance status|date=November 2024|subpages=checked}}

Template:Portal maintenance status


If the portal contains {{Portal maintenance status|date=November 2024|note=This is an example.}}

Template:Portal maintenance status


If the portal contains {{Portal maintenance status|date=November 2024|manual=yes|nonstandard=yes|subpages=single|incomplete=yes|note=Lorem ipsum dolor sit amet.}}

Template:Portal maintenance status


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