Difference between revisions of "Module:NUMBEROFSECTIONS"

From blackwiki
Jump to navigation Jump to search
blackwiki>Fred Gandt
(a few simple comments and preparedness for expansion)
blackwiki>Fred Gandt
(making possible to feed "sections" a list of pages)
Line 18: Line 18:
 
end
 
end
  
-- Function accepting a page name and section level numbers
+
-- Function accepting any number of page names and section level numbers
 
function p.sections(frame)
 
function p.sections(frame)
 +
local index = 1
 +
local total = 0
 +
local page = ""
 +
local pages = {}
 
local needles = {}
 
local needles = {}
local levels = frame.args[2]
+
local haystack = ""
local title = mw.title.new(frame.args[1])
+
-- Iterate through the args to find the page names and section levels
-- For every section level number
+
for key, value in pairs(frame.args) do
for level in mw.text.gsplit(levels, "") do
+
-- If the param specifies the section levels required
if level ~= " " then
+
if key == 'level' then
-- add the needle to our table of needles
+
-- for every section level number
needles[#needles + 1] = "\n" ..
+
for level in mw.text.gsplit(value, "") do
string.rep("=", tonumber(level)) .. "[^=]"
+
if level ~= " " then
 +
-- add the needle to our table of needles
 +
needles[#needles + 1] = "\n" ..
 +
string.rep("=", tonumber(level)) .. "[^=]"
 +
end
 +
end
 +
-- Otherwise, add the page name to our table
 +
else
 +
pages[#pages + 1] = value
 
end
 
end
 
end
 
end
-- then return how many needles are in our haystack
+
-- For each page name in our table
return count(title:getContent(), needles)
+
page = pages[index]
 +
while page do
 +
-- get the raw markup
 +
haystack = mw.title.new(page)
 +
-- count the sections and add to the total
 +
total = total + count(haystack:getContent(), needles)
 +
index = index + 1
 +
page = pages[index]
 +
end
 +
--[[ then return how many sections of the required level
 +
are in all the pages passed ]]
 +
return total
 
end
 
end
  
 
return p
 
return p

Revision as of 05:38, 25 March 2016

Usage

sections
{{ #invoke:NUMBEROFSECTIONS|main| page name [ # page name [ # ... ] ] | level = section level number(s) }}
  1. Multiple page names (at least one required) are the # delimited names of any Wikipedia pages (including namespaces).
  2. section level(s) (required) is any group of numerals between 1 and 6 (inclusive) e.g. 435 or 5 3 4 equates to:
sections with a level 3 ( "===" ), 4 ( "====" ) or 5 ( "=====" ) heading.
{{#invoke:NUMBEROFSECTIONS|main|Wikipedia:Village pump (technical)|level=2}} produces Template:NUMBEROFSECTIONS
{{#invoke:NUMBEROFSECTIONS|main|Wikipedia:Village pump (technical)#Wikipedia:Village pump (proposals)|level=2}} produces Template:NUMBEROFSECTIONS



local p = {}

-- Counting function accepting a string haystack and table of needles
local function count(haystack, needles)
	local number = 0
	local index = 1
	local needle = needles[index]
	-- While we have needles to look for
	while needle do
		-- find them all in our haystack
		for m in string.gmatch(haystack, needle) do
			number = number + 1
		end
		index = index + 1
		needle = needles[index]
	end
	return number
end

-- Function accepting any number of page names and section level numbers
function p.sections(frame)
	local index = 1
	local total = 0
	local page = ""
	local pages = {}
	local needles = {}
	local haystack = ""
	-- Iterate through the args to find the page names and section levels
	for key, value in pairs(frame.args) do
		-- If the param specifies the section levels required
		if key == 'level' then
			-- for every section level number
			for level in mw.text.gsplit(value, "") do
				if level ~= " " then
					-- add the needle to our table of needles
					needles[#needles + 1] = "\n" ..
						string.rep("=", tonumber(level)) .. "[^=]"
				end
			end
		-- Otherwise, add the page name to our table
		else
			pages[#pages + 1] = value
		end
	end
	-- For each page name in our table
	page = pages[index]
	while page do
		-- get the raw markup
		haystack = mw.title.new(page)
		-- count the sections and add to the total
		total = total + count(haystack:getContent(), needles)
		index = index + 1
		page = pages[index]
	end
	--[[ then return how many sections of the required level
		 are in all the pages passed ]]
	return total
end

return p