Difference between revisions of "Module:Transclusion count"

From blackwiki
Jump to navigation Jump to search
test>Ahecht
(sync from sandbox)
m (10 revisions imported)
 
(4 intermediate revisions by 2 users not shown)
Line 2: Line 2:
  
 
function p.fetch(frame)
 
function p.fetch(frame)
local template = mw.ustring.gsub(mw.title.getCurrentTitle().text, "/doc$", "")
+
local template = nil
 +
local return_value = nil
 +
 
 +
-- Use demo parameter if it exists, otherswise use current template name
 +
local namespace = mw.title.getCurrentTitle().namespace
 
if frame.args["demo"] and frame.args["demo"] ~= "" then
 
if frame.args["demo"] and frame.args["demo"] ~= "" then
template = mw.ustring.gsub(frame.args["demo"], "/doc$", "")
+
template = frame.args["demo"]
 +
elseif namespace == 10 then -- Template namespace
 +
template = mw.title.getCurrentTitle().text
 +
elseif namespace == 828 then -- Module namespace
 +
template = (mw.site.namespaces[828].name .. ":" .. mw.title.getCurrentTitle().text)
 +
end
 +
 
 +
-- If in template or module namespace, look up count in /data
 +
if template ~= nil then
 +
namespace = mw.title.new(template, "Template").namespace
 +
if namespace == 10 or namespace == 828 then
 +
template =  mw.ustring.gsub(template, "/doc$", "") -- strip /doc from end
 +
local index = mw.ustring.sub(mw.title.new(template).text,1,1)
 +
local data = mw.loadData('Module:Transclusion_count/data/' .. (mw.ustring.find(index, "%a") and index or "other"))
 +
return_value = tonumber(data[mw.ustring.gsub(template, " ", "_")])
 +
end
 
end
 
end
local index = mw.ustring.upper(mw.ustring.sub(template,1,1))
 
local data = mw.loadData('Module:Transclusion_count/data/' .. (mw.ustring.find(index, "%a") and index or "other"))
 
 
local return_value = tonumber(data[mw.ustring.gsub(template, " ", "_")])
 
 
 
 
-- If database value doesn't exist, use value passed to template
 
-- If database value doesn't exist, use value passed to template
if return_value == nil then
+
if return_value == nil and frame.args[1] ~= nil then
 
local arg1=mw.ustring.match(frame.args[1], '[%d,]+')
 
local arg1=mw.ustring.match(frame.args[1], '[%d,]+')
 
return_value = tonumber(frame:callParserFunction('formatnum', arg1, 'R'))
 
return_value = tonumber(frame:callParserFunction('formatnum', arg1, 'R'))
Line 18: Line 33:
 
 
 
return return_value
 
return return_value
end
 
 
function p.num(frame, count)
 
if count == nil then count = p.fetch(frame) 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 sigfigs 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 "apprxomimately" or "+" when appropriate
 
if (frame.args[2] == "yes") or (mw.ustring.sub(frame.args[1],-1) == "+") then
 
-- Round down
 
return_value = mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) ) * (10^(f))) .. "+"
 
else
 
-- Round to nearest
 
return_value = "approximately " .. mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) + 0.5) * (10^(f)))
 
end
 
 
-- Insert percent of pages
 
if frame.args["all-pages"] and frame.args["all-pages"] ~= "" then
 
local percent = math.floor( ( (count/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 100) + 0.5)
 
return_value = return_value .. " pages, which is ≈" .. percent .. "% of all"
 
end
 
end
 
 
return return_value
 
end
 
 
function p.risk(frame)
 
local return_value = ""
 
if frame.args[1] == "risk" then
 
return_value = "risk"
 
else
 
local count = p.fetch(frame)
 
if count and count >= 100000 then return_value = "risk" end
 
end
 
return return_value
 
end
 
 
function p.text(frame)
 
local count = p.fetch(frame)
 
 
local title = mw.title.getCurrentTitle()
 
if title.subpageText == "doc" or title.subpageText == "sandbox" then
 
title = title.basePageTitle
 
end
 
 
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))
 
 
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%s ",
 
(mw.title.getCurrentTitle().namespace == 828 and "module" or "template"),
 
title.fullText, title.fullText,
 
(mw.title.getCurrentTitle().namespace == 828 and "." or ", or in your own [[Wikipedia:Subpages#How to create user subpages|user subpage]].")
 
)
 
 
if (frame.args[1] == "risk" or (count and count >= 100000) ) then
 
local info = ""
 
if frame.args["info"] and frame.args["info"] ~= "" then
 
info = "<br />" .. frame.args["info"]
 
end
 
sandbox_text = string.format(".%s<br /> To avoid large-scale disruption and unnecessary server load, any changes to it should first be tested in the %sThe tested changes can then be added to this page in a single edit.&#x20;",
 
info, sandbox_text
 
)
 
else
 
sandbox_text = string.format(", so changes to it will be widely noticed. Please test any changes in the %s",
 
sandbox_text
 
)
 
end
 
 
local discussion_text = "Please 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."
 
 
end
 
end
  
 
return p
 
return p

Latest revision as of 09:02, 5 September 2020

Fetches usage data for highly-transcluded templates. Uses bot-updated values from subpages of Module:Transclusion_count/data/ when available.

Usage

{{#invoke:Transclusion count|fetch|number of transclusions|use + notation|all-pages=|demo=}}

  • number of transclusions: is a static number of times the template has been transcluded, to use when values cannot be read from the database. This value will be ignored if transclusion data is available for the current page.
  • 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/.



local p = {}

function p.fetch(frame)
	local template = nil
	local return_value = nil

	-- Use demo parameter if it exists, otherswise use current template name
	local namespace = mw.title.getCurrentTitle().namespace
	if frame.args["demo"] and frame.args["demo"] ~= "" then
		template = frame.args["demo"]
	elseif namespace == 10 then -- Template namespace
		template = mw.title.getCurrentTitle().text
	elseif namespace == 828 then -- Module namespace
		template = (mw.site.namespaces[828].name .. ":" .. mw.title.getCurrentTitle().text)
	end

	-- If in template or module namespace, look up count in /data
	if template ~= nil then
		namespace = mw.title.new(template, "Template").namespace
		if namespace == 10 or namespace == 828 then
			template =  mw.ustring.gsub(template, "/doc$", "") -- strip /doc from end
			local index = mw.ustring.sub(mw.title.new(template).text,1,1)
			local data = mw.loadData('Module:Transclusion_count/data/' .. (mw.ustring.find(index, "%a") and index or "other"))
			return_value = tonumber(data[mw.ustring.gsub(template, " ", "_")])
		end
	end
	
	-- If database value doesn't exist, use value passed to template
	if return_value == nil and frame.args[1] ~= nil then
		local arg1=mw.ustring.match(frame.args[1], '[%d,]+')
		return_value = tonumber(frame:callParserFunction('formatnum', arg1, 'R'))
	end
	
	return return_value	
end

return p