Module:Transclusion count

From escforumwiki
Revision as of 14:59, 16 September 2019 by en>Ahecht (Copy from Module:Transclusion_count/sandbox)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Fetches usage data for highly-trandscluded 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.main(frame)
	-- Fetch from database
	local template = mw.ustring.gsub(mw.title.getCurrentTitle().text, "/doc$", "")
	if frame.args["demo"] and frame.args["demo"] ~= "" then
		template = mw.ustring.gsub(frame.args["demo"], "/doc$", "")
	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"))
	
	-- If database value doesn't exist, use value passed to template
	arg1 = tonumber(data[mw.ustring.gsub(template, " ", "_")]) or tonumber(frame.args[1]) or nil
	
	-- Build output string
	local return_value = ""
	if arg1 == 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 arg1 >= 100000 then
			sigfig = 3
		end
		
		-- Prepare to round to appropriate number of sigfigs
		local f = math.floor(math.log10(arg1)) - sigfig + 1
		
		-- Round and insert "apprxomimately" or "+" when appropriate
		if frame.args[2] == "yes" then
			-- Round down
			return_value = mw.getContentLanguage():formatNum(math.floor( (arg1 / 10^(f)) ) * (10^(f))) .. "+"
		else
			-- Round to nearest
			return_value = "approximately " .. mw.getContentLanguage():formatNum(math.floor( (arg1 / 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( ( (arg1/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 100) + 0.5)
			return_value = return_value .. " pages, which is ≈" .. percent .. "% of all"
		end	
	end
	
	return return_value
end

return p