Module:High-use: Difference between revisions

From TEPwiki, Urth's Encyclopedia
Jump to navigation Jump to search
Content added Content deleted
(Stripped some of the formality and unnecessary verbiage that only takes space, decreasing the likelihood banners will actually be read)
m (1 revision imported from wikipedia:Module:High-use)
 
(45 intermediate revisions by 23 users not shown)
Line 1:
local p = {}
 
-- _fetch looks at the "demo" argument.
local _fetch = require('Module:Transclusion_count').fetch
local yesno = require('Module:Yesno')
 
function p.num(frame, count)
if count == nil then count = _fetch(frame) end
if yesno(frame.args['fetch']) == false then
if count(frame.args[1] =or '') ~= nil'' then count = _fetchtonumber(frame.args[1]) end
else
count = _fetch(frame)
end
end
-- Build output string
Line 15 ⟶ 23:
end
else
-- Use 2 sigfigssignificant figures for smaller numbers and 3 for larger ones
local sigfig = 2
if count >= 100000 then
Line 24 ⟶ 32:
local f = math.floor(math.log10(count)) - sigfig + 1
-- Round and insert "apprxomimatelyapproximately" or "+" when appropriate
if (frame.args[2] == "yes") or (mw.ustring.sub(frame.args[1],-1) == "+") then
-- Round down
Line 32 ⟶ 40:
return_value = string.format("approximately %s", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) + 0.5) * (10^(f))) )
end
 
-- Insert percentpercentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
if frame.args["all-pages"]count and count > 250000 and not yesno (frame:getParent().args["all'no-pages"percent'] ~= "") then
local percent = math.floor( ( (count/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 100) + 0.5)
if percent >= 1 then
return_value = string.format("%s pages, or roughly %s%% of all", return_value, percent)
}end
end
end
Line 43 ⟶ 53:
end
 
-- Actions if there is a large (greater than or equal to 100,000) transclusion count
function p.risk(frame)
local return_value = ""
Line 55 ⟶ 66:
 
function p.text(frame, count)
-- Only show the information about how this template gets updated if someone
if count == nil then count = _fetch(frame) end
-- is actually editing the page and maybe trying to update the count.
local return_value = {}
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 ''
if count == nil then
if yesno(frame.args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
end
local title = mw.title.getCurrentTitle()
if title.subpageText == "doc" or title.subpageText == "sandbox" then
Line 63 ⟶ 82:
end
local systemMessages = frame.args['system']
local templatecount = string.format("https://tools.wmflabs.org/templatecount/index.php?lang=en&namespace=%s&name=%s",mw.title.getCurrentTitle().namespace,mw.uri.encode(title.text))
if frame.args['system'] == '' then
systemMessages = nil
end
-- This retrieves the project URL automatically to simplify localiation.
local templateCount = ('on [https://linkcount.toolforge.org/index.php?project=%s&page=%s %s pages]'):format(
mw.title.getCurrentTitle():fullUrl():gsub('//(.-)/.*', '%1'),
mw.uri.encode(title.fullText), p.num(frame, count))
local used_on_text = "'''This " .. (mw.title.getCurrentTitle().namespace == 828 and "Lua module" or "template"), .. ' is used ';
if systemMessages then
used_on_text = used_on_text .. systemMessages ..
((count and count > 2000) and ("''', and " .. templateCount) or ("'''"))
else
used_on_text = used_on_text .. templateCount .. "'''"
end
local used_on_text = string.format("'''This %s is used on [%s %s pages]'''",
(mw.title.getCurrentTitle().namespace == 828 and "Lua module" or "template"),
templatecount,
p.num(frame, count)
)
local sandbox_text = string.format("%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.fullText, title.fullText,
(mw.title.getCurrentTitle().namespace == 828 and ".Module:Sandbox|module sandbox" or ", or in your own [[Wikipedia:SubpagesUser pages#How to create user subpagesSUB|user subpage]].")
)
iflocal infoArg = (frame.args[1"info"] =~= "risk" or (count and count >= 100000) ) thenframe.args["info"]
if (systemMessages or frame.args[1] == "risk" or (count and count >= 100000) ) then
local info = ""
local info = systemMessages and '.<br/>Changes to it can cause immediate changes to the Wikipedia user interface.' or '.'
if frame.args["info"] and frame.args["info"] ~= "" then
if infoArg then
info = info .. "<br />" .. frame.args["info"]infoArg
end
sandbox_text = stringinfo .format(".%s '<br /> To avoid major disruption' and server load, any changes should be tested in the %sThe tested changes can be added to this page in a single edit.&#x20;",.
(count and count >= 100000 and ' and server load' or '') ..
info, sandbox_text
', 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 = string.format("infoArg and changes('.<br may/>' be.. widelyinfoArg noticed.. Test' changesC') inor the' %s",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 frame.args["2"] and frame.args["2"] ~= "" and frame.args["2"] ~= "yes" then
discussion_text = string.format("%sat [[%s]]", discussion_text, frame.args["2"])
Line 98 ⟶ 129:
end
return table.concat({used_on_text, .. sandbox_text, .. discussion_text, .. " before implementing them."}) .. bot_text
end
 
function p.main(frame)
local count = _fetch(frame)nil
if yesno(frame.args['fetch']) == false then
local return_value = ""
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
local image = "[[File:Ambox warning yellow.svg|40px|alt=Warning|link=]]"
local type_param = "style"
local return_valueepilogue = {}''
if (frame.args[1] == "risk" or (count and count >= 100000) ) then
if frame.args["info"'system'] and frame.args["info"'system'] ~= ""'' then
image = "[[File:Ambox important.svg|40px|alt=Warning|link=]]"
type_param = "content"
local nocat = frame:getParent().args['nocat'] or frame.args['nocat']
local categorise = (nocat == '' or not yesno(nocat))
if categorise 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]]}}}}')
end
elseif (frame.args[1] == "risk" or (count and count >= 100000)) then
image = "[[File:Ambox warning orange.svg|40px|alt=Warning|link=]]"
type_param = "content"
Line 112 ⟶ 156:
if frame.args["form"] == "editnotice" then
return_value =return frame:expandTemplate{
title = 'editnotice',
args = {
Line 119 ⟶ 163:
["expiry"] = (frame.args["expiry"] or "")
}
} .. epilogue
}
else
return require('Module:Message box').main('ombox', {
return_value = frame:expandTemplate{
titletype = 'ombox'type_param,
argsimage = {image,
text = p.numtext(frame, count),
["type"] = type_param,
expiry = (frame.args["imageexpiry"] =or image,"")
}) .. epilogue
["text"] = p.text(frame, count),
["expiry"] = (frame.args["expiry"] or "")
}
}
end
return return_value
end
 

Latest revision as of 15:54, 1 June 2023

Documentation for this module may be created at Module:High-use/doc

local p = {}

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

function p.num(frame, count)
	if count == nil then
		if yesno(frame.args['fetch']) == false then
			if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
		else
			count = _fetch(frame)
		end
	end
	
	-- Build output string
	local return_value = ""
	if count == nil then
		if frame.args[1] == "risk" then
			return_value = "a very large number of"
		else
			return_value = "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 (frame.args[2] == "yes") or (mw.ustring.sub(frame.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
		if count and count > 250000 and not yesno (frame:getParent().args['no-percent']) then
			local percent = math.floor( ( (count/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 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

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

function p.text(frame, 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 = (frame: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(frame.args['fetch']) == false then
			if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
		else
			count = _fetch(frame)
		end
	end
	local title = mw.title.getCurrentTitle()
	if title.subpageText == "doc" or title.subpageText == "sandbox" then
		title = title.basePageTitle
	end
	
	local systemMessages = frame.args['system']
	if frame.args['system'] == '' then
		systemMessages = nil
	end
	
	-- This retrieves the project URL automatically to simplify localiation.
	local templateCount = ('on [https://linkcount.toolforge.org/index.php?project=%s&page=%s %s pages]'):format(
		mw.title.getCurrentTitle():fullUrl():gsub('//(.-)/.*', '%1'),
		mw.uri.encode(title.fullText), p.num(frame, count))
	local used_on_text = "'''This " .. (mw.title.getCurrentTitle().namespace == 828 and "Lua module" or "template") .. ' is used ';
	if systemMessages then
		used_on_text = used_on_text .. systemMessages ..
			((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(
		(mw.title.getCurrentTitle().namespace == 828 and "module" or "template"),
		title.fullText, title.fullText,
		mw.title.getCurrentTitle().namespace == 828 and "Module:Sandbox|module sandbox" or "Wikipedia:User pages#SUB|user subpage"
	)
	
	local infoArg = frame.args["info"] ~= "" and frame.args["info"]
	if (systemMessages or frame.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 frame.args["2"] and frame.args["2"] ~= "" and frame.args["2"] ~= "yes" then
		discussion_text = string.format("%sat [[%s]]", discussion_text, frame.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.main(frame)
	local count = nil
	if yesno(frame.args['fetch']) == false then
		if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
	else
		count = _fetch(frame)
	end
	local image = "[[File:Ambox warning yellow.svg|40px|alt=Warning|link=]]"
	local type_param = "style"
	local epilogue = ''
	if frame.args['system'] and frame.args['system'] ~= '' then
		image = "[[File:Ambox important.svg|40px|alt=Warning|link=]]"
		type_param = "content"
		local nocat = frame:getParent().args['nocat'] or frame.args['nocat']
		local categorise = (nocat == '' or not yesno(nocat))
		if categorise 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]]}}}}')
		end
	elseif (frame.args[1] == "risk" or (count and count >= 100000)) then
		image = "[[File:Ambox warning orange.svg|40px|alt=Warning|link=]]"
		type_param = "content"
	end
	
	if frame.args["form"] == "editnotice" then
		return frame:expandTemplate{
				title = 'editnotice',
				args = {
						["image"] = image,
						["text"] = p.text(frame, count),
						["expiry"] = (frame.args["expiry"] or "")
				}
		} .. epilogue
	else
		return require('Module:Message box').main('ombox', {
			type = type_param,
			image = image,
			text = p.text(frame, count),
			expiry = (frame.args["expiry"] or "")
		}) .. epilogue
	end
end

return p