Module:High-use: Difference between revisions
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'). | local _fetch = require('Module:Transclusion_count')._fetch | ||
local yesno = require('Module:Yesno') | local yesno = require('Module:Yesno') | ||
function p. | function p._num(args, count, no_percent) | ||
if count == nil then | if count == nil then | ||
if yesno( | if yesno(args['fetch']) == false then | ||
if ( | if (args[1] or '') ~= '' then count = tonumber(args[1]) end | ||
else | else | ||
count = _fetch( | 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 | if args[1] == "risk" then | ||
return "a very large number of" | |||
else | else | ||
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 ( | 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 ( | no_percent = no_percent or args['no-percent'] | ||
local | 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. | function p._risk(args) | ||
if args[1] == "risk" then | |||
if | return "risk" | ||
else | else | ||
local count = _fetch( | local count = _fetch(args) | ||
if count and count >= 100000 then | if count and count >= 100000 then | ||
return "risk" | |||
end | |||
end | end | ||
return | return "" | ||
end | |||
function p.risk(frame) | |||
return p._risk(getArgs(frame)) | |||
end | end | ||
function p. | 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 = ( | 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( | if yesno(args['fetch']) == false then | ||
if ( | if (args[1] or '') ~= '' then count = tonumber(args[1]) end | ||
else | else | ||
count = _fetch( | 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 = | local systemMessages = (args['system'] or '') ~= '' | ||
-- This retrieves the project URL automatically to simplify | -- This retrieves the project URL automatically to simplify localization. | ||
local templateCount = ('on [https://linkcount.toolforge.org/ | 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. | mw.uri.encode(title.fullText), p._num(args, count)) | ||
local used_on_text = "'''This " .. ( | 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 .. | used_on_text = used_on_text .. args['system'] .. | ||
((count and count > 2000) and (" | ((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( | ||
( | (title.namespace == 828 and "module" or "template"), | ||
title.fullText, title.fullText, | title.fullText, title.fullText, | ||
title.namespace == 828 and "Module:Sandbox|module sandbox" or "Wikipedia:User pages#SUB|user subpage" | |||
) | ) | ||
local infoArg = | local infoArg = args["info"] ~= "" and args["info"] | ||
if (systemMessages or | 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 | if args["2"] and args["2"] ~= "" and args["2"] ~= "yes" then | ||
discussion_text = string.format("%sat [[%s]]", discussion_text, | 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. | 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( | if yesno(args['fetch']) == false then | ||
if ( | if (args[1] or '') ~= '' then count = tonumber(args[1]) end | ||
else | else | ||
count = _fetch( | 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 | 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" | ||
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 = | 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 ( | 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 | if args["form"] == "editnotice" then | ||
return | return mw.getCurrentFrame():expandTemplate{ | ||
title = 'editnotice', | title = 'editnotice', | ||
args = { | args = { | ||
["image"] = image, | ["image"] = image, | ||
["text"] = p. | ["text"] = p._text(args, count), | ||
["expiry"] = ( | ["expiry"] = (args["expiry"] or "") | ||
} | } | ||
} .. epilogue | } .. epilogue | ||
Line 167: | Line 185: | ||
type = type_param, | type = type_param, | ||
image = image, | image = image, | ||
text = p. | text = p._text(args, count), | ||
expiry = ( | 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
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This Lua module is used on many pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
![]() | This module depends on the following other modules: |
Implements {{High-use}}. Uses bot-updated values from subpages of Module:Transclusion_count/data/ when available.
Usage
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 %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 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