Difference between revisions of "Module:NUMBEROFSECTIONS"
Jump to navigation
Jump to search
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) |
blackwiki>Johnuniq (use magic variables if want local site; if want commas, use local digits and formatting) |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
local function trimArg(arg, i) | local function trimArg(arg, i) | ||
| Line 23: | Line 10: | ||
end | end | ||
return mw.ustring.lower(arg) | return mw.ustring.lower(arg) | ||
| + | end | ||
| + | |||
| + | local function getIfLocal(site, action) | ||
| + | -- If wanted site is the local site where module is running, | ||
| + | -- return numberof result for given action, or nil. | ||
| + | -- This is faster than reading the cached table, and gives the current value. | ||
| + | local localSite = string.match(mw.site.server, '.*//(.*)%.org$') -- examples: 'en.wikipedia', 'commons.wikimedia' | ||
| + | if site == localSite then | ||
| + | if action == 'activeusers' then | ||
| + | action = 'activeUsers' | ||
| + | end | ||
| + | return mw.site.stats[action] | ||
| + | end | ||
end | end | ||
function p.numberof(frame) | function p.numberof(frame) | ||
local args = frame:getParent().args | local args = frame:getParent().args | ||
| − | local action = trimArg(args[1], 1) -- | + | 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. | local site = trimArg(args[2], 2) -- "en" or "en.wikipedia" or "en.wikiquote" etc. | ||
if not site:find('.', 1, true) then | if not site:find('.', 1, true) then | ||
site = site .. '.wikipedia' | site = site .. '.wikipedia' | ||
end | end | ||
| − | |||
| − | |||
| − | |||
local wantComma = trimArg(args[3]) -- nil for no commas in output; "N" or anything nonblank inserts commas | local wantComma = trimArg(args[3]) -- nil for no commas in output; "N" or anything nonblank inserts commas | ||
| − | local result = data[site] | + | local result = getIfLocal(site, action) |
| − | + | if not result then | |
| − | + | local data = mw.loadData('Module:NUMBEROF/data') | |
| + | local map = data.map | ||
| + | data = data.data | ||
| + | result = data[site] | ||
| + | if result then | ||
| + | result = result[map[action]] | ||
| + | end | ||
end | end | ||
if result then | if result then | ||
| − | |||
if wantComma then | if wantComma then | ||
| − | result = | + | result = mw.getContentLanguage():formatNum(result) |
end | end | ||
| − | return result | + | return result -- number or formatted string |
end | end | ||
return '-1' | return '-1' | ||
Revision as of 07:53, 5 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 = {}
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
local function getIfLocal(site, action)
-- If wanted site is the local site where module is running,
-- return numberof result for given action, or nil.
-- This is faster than reading the cached table, and gives the current value.
local localSite = string.match(mw.site.server, '.*//(.*)%.org$') -- examples: 'en.wikipedia', 'commons.wikimedia'
if site == localSite then
if action == 'activeusers' then
action = 'activeUsers'
end
return mw.site.stats[action]
end
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 wantComma = trimArg(args[3]) -- nil for no commas in output; "N" or anything nonblank inserts commas
local result = getIfLocal(site, action)
if not result then
local data = mw.loadData('Module:NUMBEROF/data')
local map = data.map
data = data.data
result = data[site]
if result then
result = result[map[action]]
end
end
if result then
if wantComma then
result = mw.getContentLanguage():formatNum(result)
end
return result -- number or formatted string
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