Module:High-use: Difference between revisions
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: | Line 1: | ||
local p = {} |
local p = {} |
||
-- _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') |
|||
function p.num(frame, count) |
function p.num(frame, count) |
||
if count == nil then |
if count == nil then |
||
if yesno(frame.args['fetch']) == false then |
|||
⚫ | |||
else |
|||
count = _fetch(frame) |
|||
end |
|||
end |
|||
-- Build output string |
-- Build output string |
||
Line 15: | Line 23: | ||
end |
end |
||
else |
else |
||
-- Use 2 |
-- Use 2 significant figures for smaller numbers and 3 for larger ones |
||
local sigfig = 2 |
local sigfig = 2 |
||
if count >= 100000 then |
if count >= 100000 then |
||
Line 24: | Line 32: | ||
local f = math.floor(math.log10(count)) - sigfig + 1 |
local f = math.floor(math.log10(count)) - sigfig + 1 |
||
-- Round and insert " |
-- Round and insert "approximately" or "+" when appropriate |
||
if (frame.args[2] == "yes") or (mw.ustring.sub(frame.args[1],-1) == "+") then |
if (frame.args[2] == "yes") or (mw.ustring.sub(frame.args[1],-1) == "+") then |
||
-- Round down |
-- Round down |
||
Line 32: | Line 40: | ||
return_value = string.format("approximately %s", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) + 0.5) * (10^(f))) ) |
return_value = string.format("approximately %s", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) + 0.5) * (10^(f))) ) |
||
end |
end |
||
-- Insert |
-- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes |
||
if |
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) |
local percent = math.floor( ( (count/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 100) + 0.5) |
||
if percent >= 1 then |
|||
return_value = string.format("%s pages, roughly %s%% of all", return_value, percent) |
return_value = string.format("%s pages, or roughly %s%% of all", return_value, percent) |
||
⚫ | |||
end |
end |
||
end |
end |
||
Line 43: | Line 53: | ||
end |
end |
||
-- Actions if there is a large (greater than or equal to 100,000) transclusion count |
|||
function p.risk(frame) |
function p.risk(frame) |
||
local return_value = "" |
local return_value = "" |
||
Line 55: | Line 66: | ||
function p.text(frame, count) |
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() |
local title = mw.title.getCurrentTitle() |
||
if title.subpageText == "doc" or title.subpageText == "sandbox" then |
if title.subpageText == "doc" or title.subpageText == "sandbox" then |
||
Line 63: | Line 82: | ||
end |
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)) |
|||
⚫ | |||
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]'''", |
|||
⚫ | |||
templatecount, |
|||
⚫ | |||
) |
|||
local sandbox_text = |
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"] |
|||
⚫ | |||
local info = "" |
|||
local info = systemMessages and '.<br/>Changes to it can cause immediate changes to the Wikipedia user interface.' or '.' |
|||
⚫ | |||
if infoArg then |
|||
info = "<br />" .. |
info = info .. "<br />" .. infoArg |
||
end |
end |
||
sandbox_text = |
sandbox_text = info .. '<br /> To avoid major disruption' .. |
||
(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 |
else |
||
sandbox_text = |
sandbox_text = (infoArg and ('.<br />' .. infoArg .. ' C') or ' and c') .. |
||
'hanges may be widely noticed. Test changes in the ' .. sandbox_text |
|||
) |
|||
end |
end |
||
local discussion_text = |
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 frame.args["2"] and frame.args["2"] ~= "" and frame.args["2"] ~= "yes" then |
||
discussion_text = string.format("%sat [[%s]]", discussion_text, frame.args["2"]) |
discussion_text = string.format("%sat [[%s]]", discussion_text, frame.args["2"]) |
||
Line 98: | Line 129: | ||
end |
end |
||
return |
return used_on_text .. sandbox_text .. discussion_text .. " before implementing them." .. bot_text |
||
end |
end |
||
function p.main(frame) |
function p.main(frame) |
||
local count = |
local count = 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 image = "[[File:Ambox warning yellow.svg|40px|alt=Warning|link=]]" |
||
local type_param = "style" |
local type_param = "style" |
||
⚫ | |||
⚫ | |||
⚫ | |||
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=]]" |
image = "[[File:Ambox warning orange.svg|40px|alt=Warning|link=]]" |
||
type_param = "content" |
type_param = "content" |
||
Line 112: | Line 156: | ||
if frame.args["form"] == "editnotice" then |
if frame.args["form"] == "editnotice" then |
||
return frame:expandTemplate{ |
|||
title = 'editnotice', |
title = 'editnotice', |
||
args = { |
args = { |
||
Line 119: | Line 163: | ||
["expiry"] = (frame.args["expiry"] or "") |
["expiry"] = (frame.args["expiry"] or "") |
||
} |
} |
||
} .. epilogue |
|||
} |
|||
else |
else |
||
return require('Module:Message box').main('ombox', { |
|||
return_value = frame:expandTemplate{ |
|||
type = type_param, |
|||
image = image, |
|||
⚫ | |||
["type"] = type_param, |
|||
expiry = (frame.args["expiry"] or "") |
|||
}) .. epilogue |
|||
["text"] = p.text(frame, count), |
|||
["expiry"] = (frame.args["expiry"] or "") |
|||
⚫ | |||
} |
|||
end |
end |
||
⚫ | |||
return return_value |
|||
end |
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 %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 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