Difference between revisions of "Module:NUMBEROFSECTIONS"
Jump to navigation
Jump to search
blackwiki>Johnuniq (merge code for Template:NUMBEROF from Module:Wikipedia stats by GreenC, see Template talk:NUMBEROF#Overhead) |
blackwiki>Johnuniq (replace p.numberof for Template:NUMBEROF with new code that loads data once per page from Module:NUMBEROF/data, see Template talk:NUMBEROF#Overhead) |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
-- Credit: http://lua-users.org/wiki/FormattingNumbers | -- Credit: http://lua-users.org/wiki/FormattingNumbers | ||
| − | local function | + | local function commaValue(amount) |
local formatted = amount | local formatted = amount | ||
while true do | while true do | ||
local k | local k | ||
| − | formatted, k = string.gsub(formatted, | + | formatted, k = string.gsub(formatted, '^(-?%d+)(%d%d%d)', '%1,%2') |
if k == 0 then | if k == 0 then | ||
break | break | ||
| Line 26: | Line 12: | ||
end | end | ||
return formatted | return formatted | ||
| + | end | ||
| + | |||
| + | local function trimArg(arg, i) | ||
| + | arg = mw.text.trim(arg or '') | ||
| + | if arg == '' then | ||
| + | if i then | ||
| + | error('Parameter ' .. i .. ' is missing. See [[Template:NUMBEROF]] documentation') | ||
| + | end | ||
| + | return nil | ||
| + | end | ||
| + | return mw.ustring.lower(arg) | ||
end | end | ||
function p.numberof(frame) | function p.numberof(frame) | ||
| − | local | + | local args = frame:getParent().args |
| − | + | local action = trimArg(args[1], 1) -- ACTIVEUSERS, ADMINS, ARTICLES, EDITS, FILES, PAGES, USERS | |
| − | local | + | local site = trimArg(args[2], 2) -- "en" or "en.wikipedia" or "en.wikiquote" etc. |
| − | + | if not site:find('.', 1, true) then | |
| − | + | site = site .. '.wikipedia' | |
| − | |||
| − | local | ||
| − | if not | ||
| − | |||
end | end | ||
| − | local | + | local data = mw.loadData('Module:NUMBEROF/data') |
| − | if | + | local map = data.map |
| − | + | data = data.data | |
| + | local wantComma = trimArg(args[3]) -- nil for no commas in output; "N" or anything nonblank inserts commas | ||
| + | local result = data[site] | ||
| + | if result then | ||
| + | result = result[map[action]] | ||
end | end | ||
| − | + | if result then | |
| − | if | + | result = tostring(result) |
| − | + | if wantComma then | |
| − | + | result = commaValue(result) | |
| − | |||
| − | |||
| − | |||
| − | if | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
end | end | ||
| + | return result | ||
end | end | ||
| − | + | return '-1' | |
| − | |||
| − | |||
| − | |||
end | end | ||
Revision as of 10:51, 4 May 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 = {}
-- Credit: http://lua-users.org/wiki/FormattingNumbers
local function commaValue(amount)
local formatted = amount
while true do
local k
formatted, k = string.gsub(formatted, '^(-?%d+)(%d%d%d)', '%1,%2')
if k == 0 then
break
end
end
return formatted
end
local function trimArg(arg, i)
arg = mw.text.trim(arg or '')
if arg == '' then
if i then
error('Parameter ' .. i .. ' is missing. See [[Template:NUMBEROF]] documentation')
end
return nil
end
return mw.ustring.lower(arg)
end
function p.numberof(frame)
local args = frame:getParent().args
local action = trimArg(args[1], 1) -- ACTIVEUSERS, ADMINS, ARTICLES, EDITS, FILES, PAGES, USERS
local site = trimArg(args[2], 2) -- "en" or "en.wikipedia" or "en.wikiquote" etc.
if not site:find('.', 1, true) then
site = site .. '.wikipedia'
end
local data = mw.loadData('Module:NUMBEROF/data')
local map = data.map
data = data.data
local wantComma = trimArg(args[3]) -- nil for no commas in output; "N" or anything nonblank inserts commas
local result = data[site]
if result then
result = result[map[action]]
end
if result then
result = tostring(result)
if wantComma then
result = commaValue(result)
end
return result
end
return '-1'
end
-- 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.sections(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