Difference between revisions of "Module:NUMBEROFSECTIONS"
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 | ||
| − | |||
| − | |||
| − | |||
-- 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. | + | function p.main(frame) |
local total = 0 | local total = 0 | ||
local needles = {} | local needles = {} | ||
| − | local | + | 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 | ||
| − | + | -- create a haystack to search from the page content | |
| − | -- | + | haystack = mw.title.new(page):getContent() |
| − | if | + | -- 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( | + | total = total + count('\n' .. haystack, needles) |
end | end | ||
end | end | ||
Latest revision as of 08:03, 27 September 2020
| This module is rated as alpha. It is ready for third-party input, and may be used on a few pages to see if problems arise, but should be watched. Suggestions for new features or changes in their input and output mechanisms are welcome. |
Usage
| This module is invoked by {{NUMBEROFSECTIONS}} |
sections{{ #invoke:NUMBEROFSECTIONS|main| page name [ # page name [ # ... ] ] | level = section level number(s) }}- Multiple page names (at least one required) are the
#delimited names of any Wikipedia pages (including namespaces). - section level(s) (required) is any group of numerals between 1 and 6 (inclusive) e.g.
435or5 3 4equates to:
- sections with a level
3( "===" ),4( "====" ) or5( "=====" ) heading.
- sections with a level
- Multiple page names (at least one required) are the
{{#invoke:NUMBEROFSECTIONS|main|Wikipedia:Village pump (technical)|level=2}}producesTemplate:NUMBEROFSECTIONS{{#invoke:NUMBEROFSECTIONS|main|Wikipedia:Village pump (technical)#Wikipedia:Village pump (proposals)|level=2}}producesTemplate: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