Difference between revisions of "Module:Team appearances list/show/sandbox"
Jump to navigation
Jump to search
blackwiki>Johnuniq (create (empty) so can list all modules and their sandboxes) |
m (2 revisions imported) |
||
| (One intermediate revision by one other user not shown) | |||
| Line 1: | Line 1: | ||
| − | -- For testing [[Module:Team appearances list/ | + | -- For testing, show results using data from [[Module:Team appearances list/data]]. |
| + | |||
| + | local Collection = {} | ||
| + | Collection.__index = Collection | ||
| + | do | ||
| + | function Collection:add(item) | ||
| + | if item ~= nil then | ||
| + | self.n = self.n + 1 | ||
| + | self[self.n] = item | ||
| + | end | ||
| + | end | ||
| + | function Collection:join(sep) | ||
| + | return table.concat(self, sep) | ||
| + | end | ||
| + | function Collection:sort(comp) | ||
| + | table.sort(self, comp) | ||
| + | end | ||
| + | function Collection.new() | ||
| + | return setmetatable({n = 0}, Collection) | ||
| + | end | ||
| + | end | ||
| + | |||
| + | local function get_page_content(page_title) | ||
| + | local t = mw.title.new(page_title) | ||
| + | if t then | ||
| + | local content = t:getContent() | ||
| + | if content then | ||
| + | if content:sub(-1) ~= '\n' then | ||
| + | content = content .. '\n' | ||
| + | end | ||
| + | return content | ||
| + | end | ||
| + | end | ||
| + | error('Could not read wikitext from "[[' .. page_title .. ']]".', 0) | ||
| + | end | ||
| + | |||
| + | local function make_data(modname) | ||
| + | -- Return a list of tables for each competition/team in the order used in | ||
| + | -- the data module, based on a hope that the data module is consistently | ||
| + | -- indented with one tab before competitions and two or more before teams, | ||
| + | -- and quotes (") are used for strings (not apostrophes). | ||
| + | local content = get_page_content(modname) | ||
| + | local lnum = 0 | ||
| + | local current_games | ||
| + | local items = Collection.new() | ||
| + | for line in string.gmatch(content, '(.-)\n') do | ||
| + | lnum = lnum + 1 | ||
| + | local indent, title = line:match('^(\t+)%["(.-)"%]') | ||
| + | if indent then | ||
| + | if indent == '\t' then | ||
| + | current_games = title | ||
| + | else | ||
| + | items:add({ | ||
| + | competition = current_games, | ||
| + | team = title, | ||
| + | line = lnum, | ||
| + | }) | ||
| + | end | ||
| + | end | ||
| + | end | ||
| + | return items | ||
| + | end | ||
| + | |||
| + | local function main(frame) | ||
| + | local title = frame.args[1] | ||
| + | if title == nil or title == '' then | ||
| + | return 'Error: Parameter 1 must specify name of data module' | ||
| + | end | ||
| + | local sandbox = title:find('sandbox', 1, true) and '/sandbox' or '' | ||
| + | local lister = require('Module:Team appearances list' .. sandbox)._main | ||
| + | local lines = Collection.new() | ||
| + | local current_games | ||
| + | for _, item in ipairs(make_data(title)) do | ||
| + | if current_games ~= item.competition then | ||
| + | current_games = item.competition | ||
| + | lines:add('==' .. current_games .. '==') | ||
| + | end | ||
| + | lines:add(item.team .. ' (line ' .. item.line .. ') ' .. lister(item)) | ||
| + | end | ||
| + | return lines:join('\n') | ||
| + | end | ||
| + | |||
| + | return { main = main } | ||
Latest revision as of 17:17, 29 September 2020
Documentation for this module may be created at Module:Team appearances list/show/sandbox/doc
-- For testing, show results using data from [[Module:Team appearances list/data]].
local Collection = {}
Collection.__index = Collection
do
function Collection:add(item)
if item ~= nil then
self.n = self.n + 1
self[self.n] = item
end
end
function Collection:join(sep)
return table.concat(self, sep)
end
function Collection:sort(comp)
table.sort(self, comp)
end
function Collection.new()
return setmetatable({n = 0}, Collection)
end
end
local function get_page_content(page_title)
local t = mw.title.new(page_title)
if t then
local content = t:getContent()
if content then
if content:sub(-1) ~= '\n' then
content = content .. '\n'
end
return content
end
end
error('Could not read wikitext from "[[' .. page_title .. ']]".', 0)
end
local function make_data(modname)
-- Return a list of tables for each competition/team in the order used in
-- the data module, based on a hope that the data module is consistently
-- indented with one tab before competitions and two or more before teams,
-- and quotes (") are used for strings (not apostrophes).
local content = get_page_content(modname)
local lnum = 0
local current_games
local items = Collection.new()
for line in string.gmatch(content, '(.-)\n') do
lnum = lnum + 1
local indent, title = line:match('^(\t+)%["(.-)"%]')
if indent then
if indent == '\t' then
current_games = title
else
items:add({
competition = current_games,
team = title,
line = lnum,
})
end
end
end
return items
end
local function main(frame)
local title = frame.args[1]
if title == nil or title == '' then
return 'Error: Parameter 1 must specify name of data module'
end
local sandbox = title:find('sandbox', 1, true) and '/sandbox' or ''
local lister = require('Module:Team appearances list' .. sandbox)._main
local lines = Collection.new()
local current_games
for _, item in ipairs(make_data(title)) do
if current_games ~= item.competition then
current_games = item.competition
lines:add('==' .. current_games .. '==')
end
lines:add(item.team .. ' (line ' .. item.line .. ') ' .. lister(item))
end
return lines:join('\n')
end
return { main = main }