Module:High-use: Difference between revisions

From AusMetal Guide
Jump to navigation Jump to search
m (1 revision imported)
(Fix fetch=no and no-percent=yes)
Line 1: Line 1:
local p = {}
local p = {}
local getArgs = require('Module:Arguments').getArgs


-- _fetch looks at the "demo" argument.
-- _fetch looks at the "demo" argument.
local _fetch = require('Module:Transclusion_count').fetch
local _fetch = require('Module:Transclusion_count')._fetch
local yesno = require('Module:Yesno')
local yesno = require('Module:Yesno')


function p.num(frame, count)
function p._num(args, count, no_percent)
if count == nil then
if count == nil then
if yesno(frame.args['fetch']) == false then
if yesno(args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
if (args[1] or '') ~= '' then count = tonumber(args[1]) end
else
else
count = _fetch(frame)
count = _fetch(args)
end
end
end
end
Line 17: Line 18:
local return_value = ""
local return_value = ""
if count == nil then
if count == nil then
if frame.args[1] == "risk" then
if args[1] == "risk" then
return_value = "a very large number of"
return "a very large number of"
else
else
return_value = "many"
return "many"
end
end
else
else
Line 33: Line 34:
-- Round and insert "approximately" or "+" when appropriate
-- Round and insert "approximately" or "+" when appropriate
if (frame.args[2] == "yes") or (mw.ustring.sub(frame.args[1],-1) == "+") then
if (args[2] == "yes") or (type(args[1]) == 'string' and (mw.ustring.sub(args[1],-1) == "+")) then
-- Round down
-- Round down
return_value = string.format("%s+", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) ) * (10^(f))) )
return_value = string.format("%s+", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) ) * (10^(f))) )
Line 42: Line 43:


-- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
-- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
if count and count > 250000 and not yesno (frame:getParent().args['no-percent']) then
no_percent = no_percent or args['no-percent']
local percent = math.floor( ( (count/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 100) + 0.5)
if count and count > 250000 and not yesno (no_percent) then
local numpages = mw.getCurrentFrame():callParserFunction('NUMBEROFPAGES', 'R')
local percent = math.floor( ( ( count/numpages ) * 100) + 0.5)
if percent >= 1 then
if percent >= 1 then
return_value = string.format("%s pages, or roughly %s%% of all", return_value, percent)
return_value = string.format("%s pages, or roughly %s%% of all", return_value, percent)
Line 52: Line 55:
return return_value
return return_value
end
end
function p.num(frame, count)
return p._num(getArgs(frame), count)
end
-- Actions if there is a large (greater than or equal to 100,000) transclusion count
-- Actions if there is a large (greater than or equal to 100,000) transclusion count
function p.risk(frame)
function p._risk(args)
local return_value = ""
if args[1] == "risk" then
if frame.args[1] == "risk" then
return "risk"
return_value = "risk"
else
else
local count = _fetch(frame)
local count = _fetch(args)
if count and count >= 100000 then return_value = "risk" end
if count and count >= 100000 then
return "risk"
end
end
end
return return_value
return ""
end
 
function p.risk(frame)
return p._risk(getArgs(frame))
end
end


function p.text(frame, count)
function p._text(args, count)
-- Only show the information about how this template gets updated if someone
-- Only show the information about how this template gets updated if someone
-- is actually editing the page and maybe trying to update the count.
-- is actually editing the page and maybe trying to update the count.
local bot_text = (frame:preprocess("{{REVISIONID}}") == "") and "\n\n----\n'''Preview message''': Transclusion count updated automatically ([[Template:High-use/doc#Technical details|see documentation]])." or ''
local bot_text = (mw.getCurrentFrame():preprocess("{{REVISIONID}}") == "") and "\n\n----\n'''Preview message''': Transclusion count updated automatically ([[Template:High-use/doc#Technical details|see documentation]])." or ''
if count == nil then
if count == nil then
if yesno(frame.args['fetch']) == false then
if yesno(args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
if (args[1] or '') ~= '' then count = tonumber(args[1]) end
else
else
count = _fetch(frame)
count = _fetch(args)
end
end
end
end
local title = mw.title.getCurrentTitle()
local title = mw.title.getCurrentTitle()
if ( (args.demo or '' ~= '') and mw.title.new(args.demo, 10) ) then
title = mw.title.new(args.demo, 10)
end
if title.subpageText == "doc" or title.subpageText == "sandbox" then
if title.subpageText == "doc" or title.subpageText == "sandbox" then
title = title.basePageTitle
title = title.basePageTitle
end
end
local systemMessages = frame.args['system']
local systemMessages = (args['system'] or '') ~= ''
if frame.args['system'] == '' then
systemMessages = nil
end
-- This retrieves the project URL automatically to simplify localiation.
-- This retrieves the project URL automatically to simplify localization.
local templateCount = ('on [https://linkcount.toolforge.org/index.php?project=%s&page=%s %s pages]'):format(
local templateCount = ('on [https://linkcount.toolforge.org/?project=%s&page=%s#transclusions %s pages]'):format(
mw.title.getCurrentTitle():fullUrl():gsub('//(.-)/.*', '%1'),
title:fullUrl():gsub('//(.-)/.*', '%1'),
mw.uri.encode(title.fullText), p.num(frame, count))
mw.uri.encode(title.fullText), p._num(args, count))
local used_on_text = "'''This " .. (mw.title.getCurrentTitle().namespace == 828 and "Lua module" or "template") .. ' is used ';
local used_on_text = "'''This " .. (title.namespace == 828 and "Lua module" or "template") .. ' is used ';
if systemMessages then
if systemMessages then
used_on_text = used_on_text .. systemMessages ..
used_on_text = used_on_text .. args['system'] ..
((count and count > 2000) and (",''' and " .. templateCount) or ("'''"))
((count and count > 2000) and ("''', and " .. templateCount) or ("'''"))
else
else
used_on_text = used_on_text .. templateCount .. "'''"
used_on_text = used_on_text .. templateCount .. "'''"
Line 100: Line 114:
local sandbox_text =  ("%s's [[%s/sandbox|/sandbox]] or [[%s/testcases|/testcases]] subpages, or in your own [[%s]]. "):format(
local sandbox_text =  ("%s's [[%s/sandbox|/sandbox]] or [[%s/testcases|/testcases]] subpages, or in your own [[%s]]. "):format(
(mw.title.getCurrentTitle().namespace == 828 and "module" or "template"),
(title.namespace == 828 and "module" or "template"),
title.fullText, title.fullText,
title.fullText, title.fullText,
mw.title.getCurrentTitle().namespace == 828 and "Module:Sandbox|module sandbox" or "Wikipedia:User pages#SUB|user subpage"
title.namespace == 828 and "Module:Sandbox|module sandbox" or "Wikipedia:User pages#SUB|user subpage"
)
)
local infoArg = frame.args["info"] ~= "" and frame.args["info"]
local infoArg = args["info"] ~= "" and args["info"]
if (systemMessages or frame.args[1] == "risk" or (count and count >= 100000) ) then
if (systemMessages or args[1] == "risk" or (count and count >= 100000) ) then
local info = systemMessages and '.<br/>Changes to it can cause immediate changes to the Wikipedia user interface.' or '.'
local info = systemMessages and '.<br/>Changes to it can cause immediate changes to the Wikipedia user interface.' or '.'
if infoArg then
if infoArg then
Line 122: Line 136:
local discussion_text = systemMessages and 'Please discuss changes ' or 'Consider discussing changes '
local discussion_text = systemMessages and 'Please discuss changes ' or 'Consider discussing changes '
if frame.args["2"] and frame.args["2"] ~= "" and frame.args["2"] ~= "yes" then
if args["2"] and args["2"] ~= "" and args["2"] ~= "yes" then
discussion_text = string.format("%sat [[%s]]", discussion_text, frame.args["2"])
discussion_text = string.format("%sat [[%s]]", discussion_text, args["2"])
else
else
discussion_text = string.format("%son the [[%s|talk page]]", discussion_text, title.talkPageTitle.fullText )
discussion_text = string.format("%son the [[%s|talk page]]", discussion_text, title.talkPageTitle.fullText )
Line 131: Line 145:
end
end


function p.main(frame)
function p.text(frame, count)
return p._text(getArgs(frame), count)
end
 
function p._main(args, nocat)
local count = nil
local count = nil
if yesno(frame.args['fetch']) == false then
if yesno(args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
if (args[1] or '') ~= '' then count = tonumber(args[1]) end
else
else
count = _fetch(frame)
count = _fetch(args)
end
end
local image = "[[File:Ambox warning yellow.svg|40px|alt=Warning|link=]]"
local image = "[[File:Ambox warning yellow.svg|40px|alt=Warning|link=]]"
local type_param = "style"
local type_param = "style"
local epilogue = ''
local epilogue = ''
if frame.args['system'] and frame.args['system'] ~= '' then
if args['system'] and args['system'] ~= '' then
image = "[[File:Ambox important.svg|40px|alt=Warning|link=]]"
image = "[[File:Ambox important.svg|40px|alt=Warning|link=]]"
type_param = "content"
type_param = "content"
local nocat = frame:getParent().args['nocat'] or frame.args['nocat']
nocat = nocat or args['nocat']
local categorise = (nocat == '' or not yesno(nocat))
local categorise = (nocat == '' or not yesno(nocat))
if categorise then
if categorise and not mw.title.getCurrentTitle().isRedirect then
epilogue = frame:preprocess('{{Sandbox other||{{#switch:{{#invoke:Effective protection level|{{#switch:{{NAMESPACE}}|File=upload|#default=edit}}|{{FULLPAGENAME}}}}|sysop|templateeditor|interfaceadmin=|#default=[[Category:Pages used in system messages needing protection]]}}}}')
epilogue = mw.getCurrentFrame():preprocess('{{Sandbox other||{{#switch:{{#invoke:Effective protection level|{{#switch:{{NAMESPACE}}|File=upload|#default=edit}}|{{FULLPAGENAME}}}}|sysop|templateeditor|interfaceadmin=|#default=[[Category:Pages used in system messages needing protection]]}}}}')
end
end
elseif (frame.args[1] == "risk" or (count and count >= 100000)) then
elseif (args[1] == "risk" or (count and count >= 100000)) then
image = "[[File:Ambox warning orange.svg|40px|alt=Warning|link=]]"
image = "[[File:Ambox warning orange.svg|40px|alt=Warning|link=]]"
type_param = "content"
type_param = "content"
end
end
if frame.args["form"] == "editnotice" then
if args["form"] == "editnotice" then
return frame:expandTemplate{
return mw.getCurrentFrame():expandTemplate{
title = 'editnotice',
title = 'editnotice',
args = {
args = {
["image"] = image,
["image"] = image,
["text"] = p.text(frame, count),
["text"] = p._text(args, count),
["expiry"] = (frame.args["expiry"] or "")
["expiry"] = (args["expiry"] or "")
}
}
} .. epilogue
} .. epilogue
Line 167: Line 185:
type = type_param,
type = type_param,
image = image,
image = image,
text = p.text(frame, count),
text = p._text(args, count),
expiry = (frame.args["expiry"] or "")
expiry = (args["expiry"] or "")
}) .. epilogue
}) .. epilogue
end
end
end
end


function p.main(frame)
return p._main(getArgs(frame))
end
return p
return p

Revision as of 19:28, 17 December 2024

Implements {{High-use}}. Uses bot-updated values from subpages of Module:Transclusion_count/data/ when available.

Usage

Template:Mlx

  • number of transclusions: The first parameter is either a static number of times the template has been transcluded, or the word "risk" (without quotes) to display "a very large number of" instead of the actual value. This value will be ignored if transclusion data is available for the current page.
  • discussion page, or use + notation: The second parameter is overloaded. It will cause the number of transclusions to display as "#,###+" instead of "approximately #,###" when set equal to "yes" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, 2=WP:VPT will insert a link to WP:VPT),
  • |all-pages=yes: Will also output what percentage of all pages use the template. This should only be used for very highly transcluded templates, and the percentage will only display if its greater than 1%.
  • |info=extra information: When set to non-blank, will insert extra information into the template text if the template has more than 10,000 transclusions or parameter 1 is set to "risk".
  • |demo=Template_name: Will use the transclusion count for the template at Template:Template_name instead of detecting what template it is being used on. Capitalization must exactly match the value used in Special:PrefixIndex/Module:Transclusion_count/data/.
  • |form=: When set to "editnotice", will display the message using {{editnotice}} instead of {{ombox}}.
  • |expiry=: Sets the |expiry= parameter for {{editnotice}}.
  • |system=in system messages: if set, this module looks like {{Used in system}}. Use that template directly as it performs some checks.
  • |fetch=: if set to false, the module will not attempt to fetch transclusion counts using Module:Transclusion count

The following are drop-in replacements for {{High-use/num}}, {{High-use/text}}, and {{High-use/risk}}, and take the same parameters:



local p = {}
local getArgs = require('Module:Arguments').getArgs

-- _fetch looks at the "demo" argument.
local _fetch = require('Module:Transclusion_count')._fetch
local yesno = require('Module:Yesno')

function p._num(args, count, no_percent)
	if count == nil then
		if yesno(args['fetch']) == false then
			if (args[1] or '') ~= '' then count = tonumber(args[1]) end
		else
			count = _fetch(args)
		end
	end
	
	-- Build output string
	local return_value = ""
	if count == nil then
		if args[1] == "risk" then
			return "a very large number of"
		else
			return "many"
		end
	else
		-- Use 2 significant figures for smaller numbers and 3 for larger ones
		local sigfig = 2
		if count >= 100000 then
			sigfig = 3
		end
		
		-- Prepare to round to appropriate number of sigfigs
		local f = math.floor(math.log10(count)) - sigfig + 1
		
		-- Round and insert "approximately" or "+" when appropriate
		if (args[2] == "yes") or (type(args[1]) == 'string' and (mw.ustring.sub(args[1],-1) == "+")) then
			-- Round down
			return_value = string.format("%s+", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) ) * (10^(f))) )
		else
			-- Round to nearest
			return_value = string.format("approximately&#x20;%s", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) + 0.5) * (10^(f))) )
		end

		-- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
		no_percent = no_percent or args['no-percent']
		if count and count > 250000 and not yesno (no_percent) then
			local numpages = mw.getCurrentFrame():callParserFunction('NUMBEROFPAGES', 'R')
			local percent = math.floor( ( ( count/numpages ) * 100) + 0.5)
			if percent >= 1 then
				return_value = string.format("%s&#x20;pages, or roughly %s%% of all", return_value, percent)
			end
		end	
	end
	
	return return_value
end

function p.num(frame, count)
	return p._num(getArgs(frame), count)
end

-- Actions if there is a large (greater than or equal to 100,000) transclusion count
function p._risk(args)
	if args[1] == "risk" then
		return "risk"
	else
		local count = _fetch(args)
		if count and count >= 100000 then
			return "risk"
		end
	end
	return ""
end

function p.risk(frame)
	return p._risk(getArgs(frame))
end

function p._text(args, count)
	-- Only show the information about how this template gets updated if someone
	-- is actually editing the page and maybe trying to update the count.
	local bot_text = (mw.getCurrentFrame():preprocess("{{REVISIONID}}") == "") and "\n\n----\n'''Preview message''': Transclusion count updated automatically ([[Template:High-use/doc#Technical details|see documentation]])." or ''
	
	if count == nil then
		if yesno(args['fetch']) == false then
			if (args[1] or '') ~= '' then count = tonumber(args[1]) end
		else
			count = _fetch(args)
		end
	end
	local title = mw.title.getCurrentTitle()
	if ( (args.demo or '' ~= '') and mw.title.new(args.demo, 10) ) then
		title = mw.title.new(args.demo, 10)
	end

	if title.subpageText == "doc" or title.subpageText == "sandbox" then
		title = title.basePageTitle
	end
	
	local systemMessages = (args['system'] or '') ~= ''
	
	-- This retrieves the project URL automatically to simplify localization.
	local templateCount = ('on [https://linkcount.toolforge.org/?project=%s&page=%s#transclusions %s pages]'):format(
		title:fullUrl():gsub('//(.-)/.*', '%1'),
		mw.uri.encode(title.fullText), p._num(args, count))
	local used_on_text = "'''This " .. (title.namespace == 828 and "Lua module" or "template") .. ' is used ';
	if systemMessages then
		used_on_text = used_on_text .. args['system'] ..
			((count and count > 2000) and ("''', and " .. templateCount) or ("'''"))
	else
		used_on_text = used_on_text .. templateCount .. "'''"
	end
	
	
	local sandbox_text =  ("%s's [[%s/sandbox|/sandbox]] or [[%s/testcases|/testcases]] subpages, or in your own [[%s]]. "):format(
		(title.namespace == 828 and "module" or "template"),
		title.fullText, title.fullText,
		title.namespace == 828 and "Module:Sandbox|module sandbox" or "Wikipedia:User pages#SUB|user subpage"
	)
	
	local infoArg = args["info"] ~= "" and args["info"]
	if (systemMessages or args[1] == "risk" or (count and count >= 100000) ) then
		local info = systemMessages and '.<br/>Changes to it can cause immediate changes to the Wikipedia user interface.' or '.'
		if infoArg then
			info = info .. "<br />" .. infoArg
		end
		sandbox_text = info .. '<br /> To avoid major disruption' ..
			(count and count >= 100000 and ' and server load' or '') ..
			', any changes should be tested in the ' .. sandbox_text ..
			'The tested changes can be added to this page in a single edit. '
	else
		sandbox_text = (infoArg and ('.<br />' .. infoArg .. ' C') or ' and c') ..
			'hanges may be widely noticed. Test changes in the ' .. sandbox_text
	end

	
	local discussion_text = systemMessages and 'Please discuss changes ' or 'Consider discussing changes '
	if args["2"] and args["2"] ~= "" and args["2"] ~= "yes" then
		discussion_text = string.format("%sat [[%s]]", discussion_text, args["2"])
	else
		discussion_text = string.format("%son the [[%s|talk page]]", discussion_text, title.talkPageTitle.fullText )
	end
	
	return used_on_text .. sandbox_text .. discussion_text .. " before implementing them." .. bot_text
end

function p.text(frame, count)
	return p._text(getArgs(frame), count)
end

function p._main(args, nocat)
	local count = nil
	if yesno(args['fetch']) == false then
		if (args[1] or '') ~= '' then count = tonumber(args[1]) end
	else
		count = _fetch(args)
	end
	local image = "[[File:Ambox warning yellow.svg|40px|alt=Warning|link=]]"
	local type_param = "style"
	local epilogue = ''
	if args['system'] and args['system'] ~= '' then
		image = "[[File:Ambox important.svg|40px|alt=Warning|link=]]"
		type_param = "content"
		nocat = nocat or args['nocat']
		local categorise = (nocat == '' or not yesno(nocat))
		if categorise and not mw.title.getCurrentTitle().isRedirect then
			epilogue = mw.getCurrentFrame():preprocess('{{Sandbox other||{{#switch:{{#invoke:Effective protection level|{{#switch:{{NAMESPACE}}|File=upload|#default=edit}}|{{FULLPAGENAME}}}}|sysop|templateeditor|interfaceadmin=|#default=[[Category:Pages used in system messages needing protection]]}}}}')
		end
	elseif (args[1] == "risk" or (count and count >= 100000)) then
		image = "[[File:Ambox warning orange.svg|40px|alt=Warning|link=]]"
		type_param = "content"
	end
	
	if args["form"] == "editnotice" then
		return mw.getCurrentFrame():expandTemplate{
				title = 'editnotice',
				args = {
						["image"] = image,
						["text"] = p._text(args, count),
						["expiry"] = (args["expiry"] or "")
				}
		} .. epilogue
	else
		return require('Module:Message box').main('ombox', {
			type = type_param,
			image = image,
			text = p._text(args, count),
			expiry = (args["expiry"] or "")
		}) .. epilogue
	end
end

function p.main(frame)
	return p._main(getArgs(frame))
end
return p