Difference between revisions of "Module:Team appearances list/show/sandbox"

From blackwiki
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/show]]
+
-- 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 }