Difference between revisions of "Module:NUMBEROFSECTIONS"

From blackwiki
Jump to navigation Jump to search
blackwiki>Alex 21
(Return 0 for non-existent articles)
m (21 revisions imported)
 
(12 intermediate revisions by 5 users not shown)
Line 1: Line 1:
 
local p = {}
 
local p = {}
 +
 +
-- Unescape functionality grabbed from https://stackoverflow.com/a/14899740/1832568
 +
local function unescape(str)
 +
str = string.gsub(str, '&#(%d+);', string.char)
 +
str = string.gsub(str, '&#x(%d+);', function(n) return string.char(tonumber(n, 16)) end)
 +
return str
 +
end
  
 
-- Counting function accepting a string haystack and table of needles
 
-- Counting function accepting a string haystack and table of needles
 
local function count(haystack, needles)
 
local function count(haystack, needles)
 
local number = 0
 
local number = 0
if (haystack == nil) then
 
return number
 
end
 
 
-- While we have needles to look for
 
-- While we have needles to look for
 
for index, needle in ipairs(needles) do
 
for index, needle in ipairs(needles) do
Line 18: Line 22:
  
 
-- Function takes any number of # delimited page names and section level numbers
 
-- Function takes any number of # delimited page names and section level numbers
function p.sections(frame)
+
function p.main(frame)
 
local total = 0
 
local total = 0
 
local needles = {}
 
local needles = {}
local title_obj = ""
+
local haystack = ''
 
-- Separate page names from # delimited string into table
 
-- Separate page names from # delimited string into table
local pages = mw.text.split(frame.args[1], '%s?#%s?')
+
local pages = mw.text.split(unescape(frame.args[1]), '%s?#%s?')
 
-- Separate whitespace delimited section level numbers into table
 
-- Separate whitespace delimited section level numbers into table
 
local levels = mw.text.split(frame.args['level'], '%s*')
 
local levels = mw.text.split(frame.args['level'], '%s*')
Line 33: Line 37:
 
-- For each page name in pages
 
-- For each page name in pages
 
for index, page in ipairs(pages) do
 
for index, page in ipairs(pages) do
title_obj = mw.title.new(page)
+
-- create a haystack to search from the page content
-- if we've request the content of a legitimate page
+
haystack = mw.title.new(page):getContent()
if title_obj then
+
-- If we've requested the content of a legitimate page
 +
if haystack then
 
--[[ pass the raw markup and needles to count
 
--[[ pass the raw markup and needles to count
 
and add the return to total ]]
 
and add the return to total ]]
total = total + count(title_obj:getContent(), needles)
+
total = total + count('\n' .. haystack, needles)
 
end
 
end
 
end
 
end

Latest revision as of 08:03, 27 September 2020

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 = {}

-- Unescape functionality grabbed from https://stackoverflow.com/a/14899740/1832568
local function unescape(str)
	str = string.gsub(str, '&#(%d+);', string.char)
	str = string.gsub(str, '&#x(%d+);', function(n) return string.char(tonumber(n, 16)) end)
	return str
end

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

-- Function takes any number of # delimited page names and section level numbers
function p.main(frame)
	local total = 0
	local needles = {}
	local haystack = ''
	-- Separate page names from # delimited string into table
	local pages = mw.text.split(unescape(frame.args[1]), '%s?#%s?')
	-- Separate whitespace delimited section level numbers into table
	local levels = mw.text.split(frame.args['level'], '%s*')
	-- Iterate through levels
	for level in mw.text.gsplit(table.concat(levels), '') do
		-- and add the level needle to needles
		needles[#needles + 1] = '\n'..string.rep('=', tonumber(level))..'[^=]'
	end
	-- For each page name in pages
	for index, page in ipairs(pages) do
		-- create a haystack to search from the page content
		haystack = mw.title.new(page):getContent()
		-- If we've requested the content of a legitimate page
		if haystack then
			--[[ pass the raw markup and needles to count
				 and add the return to total ]]
			total = total + count('\n' .. haystack, needles)
		end
	end
	--[[ then return how many sections of the required level
		 are in all the pages passed ]]
	return total
end

return p