Modul:Participation: Unterschied zwischen den Versionen

This is [[MediaWiki:Tagline]]. Set to <code>display:none</code> by chameleon skin.
Wechseln zu:Navigation, Suche
 
(30 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
local config = {
 
local config = {
 +
playPlayerDelimiter = ',',
 +
signalAbsent = '[[File:X mark.png|13px|alt=Abwesend|Abwesend]]',
 +
signalPresent = '[[File:Yes check.png|13px|alt=Anwesend|Anwesend]]',
 
validNamespace = 'Spielteilnahme',
 
validNamespace = 'Spielteilnahme',
 
validTargetPageCategory = 'Figuren'
 
validTargetPageCategory = 'Figuren'
Zeile 7: Zeile 10:
 
local smw = mw.smw
 
local smw = mw.smw
 
local tt = require( 'Module:TableTools' )
 
local tt = require( 'Module:TableTools' )
 
local currentTitle = nil
 
  
 
function assertCorrectNamespace( title, namespace )
 
function assertCorrectNamespace( title, namespace )
Zeile 14: Zeile 15:
 
end
 
end
  
function assesPrerequisites()
+
function assessPrerequisites( currentTitle )
if not assertCorrectNamespace(
+
if not assertCorrectNamespace( currentTitle, config.validNamespace ) then
getCurrentTitle(),
 
config.validNamespace
 
) then
 
 
return false, 'Diese Vorlage darf nur im Namensraum \'\''
 
return false, 'Diese Vorlage darf nur im Namensraum \'\''
 
.. config.validNamespace
 
.. config.validNamespace
.. '\'\' verwendet werden!'
+
.. '\'\' verwendet werden, nicht in ' .. currentTitle.nsText .. '!'
 
end
 
end
if not assertTargetIsValid(
+
if not assertTargetIsValid( currentTitle.text, config.validTargetPageCategory ) then
getCurrentTitle().text,
 
config.validTargetPageCategory
 
) then
 
 
return false, 'Die Seite mit dem Namen \'\''
 
return false, 'Die Seite mit dem Namen \'\''
.. getCurrentTitle().text
+
.. currentTitle.text
.. '\'\' existiert nicht oder ist keine Figur!'
+
.. '\'\' existiert nicht oder ist keine Figur! '
 +
.. 'Solltest Du die \'\'\'Figur gerade angelegt haben\'\'\', ist es nötig, '
 +
.. 'diese Seite einmal \'\'\'' .. buildPurgeLink( currentTitle, 'Neu zu laden' )
 +
.. '\'\'\'!'
 
end
 
end
 
return true
 
return true
Zeile 47: Zeile 45:
 
}
 
}
 
local res = smw.ask ( query )
 
local res = smw.ask ( query )
if not res[1] or not res[1].pageCategories then
+
if not res or not res[1] or not res[1].pageCategories then
 
return false
 
return false
 
end
 
end
return tt.inTable( res[1].pageCategories, 'Kategorie:' .. validCategory )
+
if type( res[1].pageCategories ) == 'table' then
 +
return tt.inTable( res[1].pageCategories, 'Kategorie:' .. validCategory )
 +
else
 +
return res[1].pageCategories == 'Kategorie:' .. validCategory
 +
end
 
end
 
end
  
Zeile 59: Zeile 61:
 
end
 
end
  
function getCurrentTitle()
+
function buildControlStatusAndButton( characters, character, targetPage )
if currentTitle ~= nil then
+
local frame = mw.getCurrentFrame()
return currentTitle
+
local participating = tt.inTable( characters, character )
end
+
local status = participating and config.signalPresent or config.signalAbsent
currentTitle = mw.title.getCurrentTitle()
+
local newCast = {}
return currentTitle
+
if participating then
end
+
for k, v in pairs( characters ) do
 
+
if v ~= character then
function getPlayData()
+
table.insert( newCast, v )
local query = {
 
'[[Category:Spiele]]',
 
'?#=play',
 
'?Has number#=number',
 
'?Has character participating#=characters',
 
'?Has display name#=displayName',
 
'?Has title#=title',
 
'?Is held in#=place',
 
'?Is held at#=time',
 
'mainlabel=-'
 
}
 
res = smw.ask( query )
 
if not res then
 
return {}
 
end
 
local playData = {}
 
for k, row in pairs(res) do
 
if row and row.number and row.title then
 
if not row.characters then
 
row.characters = {}
 
 
end
 
end
if type( row.characters ) ~= 'table' then
 
row.characters = { row.characters }
 
end
 
playData[row.number] = row
 
 
end
 
end
 +
else
 +
newCast = characters
 +
table.insert( newCast, character )
 
end
 
end
return playData
+
local button = frame:callParserFunction{ name = '#autoedit', args={
 +
form='Spiel',
 +
target=targetPage,
 +
'link text=' .. ( participating and 'Abmelden!' or 'Anmelden!'),
 +
summary='Figur ' .. character .. ' wurde ' .. ( participating and 'ausgetragen' or 'eingetragen' ),
 +
tooltip='Durch Klicken, die Figur ' .. character .. ( participating and ' ausgetragen' or ' eingetragen' ),
 +
'query string=play[cast]=' .. table.concat( newCast, config.playPlayerDelimiter ),
 +
'reload'
 +
}
 +
}
 +
button = '<div class="btn btn-' .. ( participating and 'danger' or 'success' ) .. '">' .. button .. '</div>'
 +
return status, button
 
end
 
end
  
function buildControlStatusButton( characters, character )
+
function buildControlTableHeader()
return 'Teilnehner: \'\'' .. mw.text.listToText( characters ) .. '\'\' bedeutet ' .. character .. ' ist \'\'\''
 
.. ( tt.inTable( characters, character ) and 'dabei' or 'nicht dabei' ) .. '\'\'\'!'
 
end
 
 
 
function buildControlTableBody( playData, character )
 
-- nach oben schieben
 
local html = mw.html.create()
 
 
local header = mw.html.create( 'tr' )
 
local header = mw.html.create( 'tr' )
 
header:tag('th')
 
header:tag('th')
Zeile 122: Zeile 107:
 
:wikitext('Status')
 
:wikitext('Status')
 
:done()
 
:done()
local body = mw.html.create('tbody')
+
:tag('th')
 +
:wikitext('Aktion')
 +
:done()
 +
return header
 +
end
 +
 
 +
function buildControlTableBody( playData, character )
 +
local body = mw.html.create( '' )
 
for num, play in pairs( playData ) do
 
for num, play in pairs( playData ) do
 +
local status, button = buildControlStatusAndButton( play.characters, character, play.play )
 
local tr = mw.html.create('tr')
 
local tr = mw.html.create('tr')
 
tr:tag( 'td' )
 
tr:tag( 'td' )
:wikitext( play.play  )
+
:wikitext( play.number )
 
:done()
 
:done()
 
tr:tag( 'td' )
 
tr:tag( 'td' )
:wikitext( play.title )
+
:wikitext( '[[' .. play.play .. '|' .. play.title .. ']]' )
 
:done()
 
:done()
 
tr:tag( 'td' )
 
tr:tag( 'td' )
:wikitext( play.place and play.place or 'unbekannt' )
+
:wikitext( play.place and play.place or 'unbekannt' )
 
:done()
 
:done()
 
tr:tag( 'td' )
 
tr:tag( 'td' )
:wikitext( play.time and play.time or 'unbekannt' )
+
:wikitext( play.time and play.time or 'unbekannt' )
 
:done()
 
:done()
 
tr:tag( 'td' )
 
tr:tag( 'td' )
:wikitext(
+
:wikitext( status )
buildControlStatusButton( play.characters, character )
 
)
 
 
:done()
 
:done()
 +
tr:tag( 'td' )
 +
:wikitext( button )
 +
:done()
 +
body:node(tr)
 +
end
 +
return body
 +
end
 +
 +
function buildPurgeLink( currentTitle, linkText )
 +
return '<span class="plainlinks">['
 +
.. tostring( mw.uri.fullUrl( currentTitle.fullText, {action = 'purge'} ) )
 +
.. ' ' .. linkText .. ']</span>'
 +
end
 +
 +
 +
function getPlayData()
 +
local query = {
 +
'[[Category:Spiele]]',
 +
'?#=play',
 +
'?Has number#=number',
 +
'?Has character participating#=characters',
 +
'?Has display name#=displayName',
 +
'?Has title#=title',
 +
'?Is held in#=place',
 +
'?Is held at#-F[Y]=time',
 +
'mainlabel=-'
 +
}
 +
res = smw.ask( query )
 +
if not res then
 +
return {}
 
end
 
end
html:node( header )
+
local playData = {}
:node( body )
+
for k, row in pairs(res) do
return html
+
if row and row.number and row.title then
 +
if not row.characters then
 +
row.characters = {}
 +
end
 +
if type( row.characters ) ~= 'table' then
 +
row.characters = { row.characters }
 +
end
 +
playData[row.number] = row
 +
end
 +
end
 +
return playData
 
end
 
end
  
function printParticipationControl( playData, character )
+
function printParticipationControl( currentTitle, playData )
local ret = '== Spielteilnahmen für ' .. character .. ' ==\n'
+
local character = currentTitle.text
ret = ret .. 'Diese Seite zeigt Dir eine Übersicht der Spielteilnahmen für die Figur \'\''
+
local text = '== Spielteilnahmen für ' .. character .. ' ==\n'
.. character .. [[
+
text = text .. 'Diese Seite zeigt Dir eine Übersicht der Spielteilnahmen für die Figur \'\''
\'\ und erlaubt es Dir, sie für Spiele einzutragen oder aus Spielen wieder auszutragen. Bitte beachte, dass
+
.. character .. '\'\' und erlaubt es Dir, sie für Spiele einzutragen oder aus Spielen '
jeder Vorgang das neu Laden der Seite nach sich zieht und daher etwas dauern kann. ]]
+
.. 'wieder auszutragen.\n'
 +
.. '<div class="alert alert-warning"><strong>Wichtig!</strong> Nach einer Aktion sind die '
 +
.. 'angezeigten Daten sehr wahrscheinlich nicht korrekt. Zum Aktualisieren bitte einmal '
 +
.. 'diese Seite \'\'\'' .. buildPurgeLink( currentTitle, 'Neu laden' ) .. '\'\'\'!</div>\n'
 +
.. 'Und ein letzter Hinweis: Da es sich hier um ein Wiki handelt, kann jede/r diese Seite '
 +
.. 'benutzen. Daher die Bitte: Handele nach bestem Wissen und Gewissen oder überlasse '
 +
.. 'der Spielerin/dem Spieler der Figur das Ein- und Austragen.\n'
  
 
local t = mw.html.create('table')
 
local t = mw.html.create('table')
t:addClass( 'mwtable' )
+
t:addClass( 'table table-striped table-bordered sortable' )
t:node( buildControlTableBody( playData, character ) )
+
:node( buildControlTableHeader() )
 
+
:node( buildControlTableBody( playData, character ) )
return ret .. tostring(t)
+
return text .. tostring(t)
--[[
 
return '== ' .. character .. ' ==\n'
 
.. '<pre>\n'
 
.. tt.printTable( playData )
 
.. '</pre>\n'
 
--]]
 
 
end
 
end
  
 
function p.main( frame )
 
function p.main( frame )
local assesmentResult, assesmentMessage = assesPrerequisites()
+
local currentTitle = mw.title.getCurrentTitle()
if not assesmentResult then
+
local assessmentResult, assesmentMessage = assessPrerequisites( currentTitle )
 +
if not assessmentResult then
 
return alertBox( assesmentMessage )
 
return alertBox( assesmentMessage )
 
end
 
end
-- all is well
+
-- all is well, show the control table
 
local playData = getPlayData()
 
local playData = getPlayData()
return printParticipationControl(
+
return printParticipationControl( currentTitle, playData )
playData,
 
getCurrentTitle().text
 
) . frame:getTitle().text
 
 
end
 
end
 
-- pt = require('Module:TableTools').printTable
 
  
 
return p
 
return p

Aktuelle Version vom 19. Juli 2019, 08:43 Uhr

Documentation icon Module documentation[view] [edit] [history] [purge]

Dieses Modul kommt direkt auf Seiten im Namensraum "Spielteilnahme" zum Einsatz. Es prüft, ob es eine Spielfigur mit dem gleichen Namen wie die aktuelle Seite hat gibt und zeigt dann für die entsprechende Figur eine Übersicht aller Spiele und den Teilnahmestatus an. Zusätzlich gibt es für jedes Spiel eine Möglichkeit, sich direkt An- oder abzumelden.

Usage[Quelltext bearbeiten]

{{#invoke:Participation|main}}

Example[Quelltext bearbeiten]

See Spielteilnahme:Caspar.

local config = {
	playPlayerDelimiter = ',',
	signalAbsent = '[[File:X mark.png|13px|alt=Abwesend|Abwesend]]',
	signalPresent = '[[File:Yes check.png|13px|alt=Anwesend|Anwesend]]',
	validNamespace = 'Spielteilnahme',
	validTargetPageCategory = 'Figuren'
}

local p = {}
local smw = mw.smw
local tt = require( 'Module:TableTools' )

function assertCorrectNamespace( title, namespace )
	return title.nsText == namespace
end

function assessPrerequisites( currentTitle )
	if not assertCorrectNamespace( currentTitle, config.validNamespace ) then
		return false, 'Diese Vorlage darf nur im Namensraum \'\''
			.. config.validNamespace
			.. '\'\' verwendet werden, nicht in ' .. currentTitle.nsText .. '!'
	end
	if not assertTargetIsValid( currentTitle.text, config.validTargetPageCategory ) then
		return false, 'Die Seite mit dem Namen \'\''
			.. currentTitle.text
			.. '\'\' existiert nicht oder ist keine Figur! '
			.. 'Solltest Du die \'\'\'Figur gerade angelegt haben\'\'\', ist es nötig, '
			.. 'diese Seite einmal \'\'\'' .. buildPurgeLink( currentTitle, 'Neu zu laden' )
			.. '\'\'\'!'
	end
	return true
end

function assertTargetIsValid( targetPageName, validCategory )
	--[=[
	-- ssc's '?Category:' .. validCategory handling seems broken atm
	local query = {
		'[[' .. targetPageName .. ']]',
		'?Category:' .. validCategory
	}
	--]=]
	local query = {
		'[[' .. targetPageName .. ']]',
		'?Category#=pageCategories'
	}
	local res = smw.ask ( query )
	if not res or not res[1] or not res[1].pageCategories then
		return false
	end
	if type( res[1].pageCategories ) == 'table' then
		return tt.inTable( res[1].pageCategories, 'Kategorie:' .. validCategory )
	else
		return res[1].pageCategories == 'Kategorie:' .. validCategory
	end
end

function alertBox( text )
	return '<div class="alert alert-danger" role="alert">'
		.. '<strong>Achtung:</strong> ' .. text
		.. '</div>'
end

function buildControlStatusAndButton( characters, character, targetPage )
	local frame = mw.getCurrentFrame()
	local participating = tt.inTable( characters, character )
	local status = participating and config.signalPresent or config.signalAbsent
	local newCast = {}
	if participating then
		for k, v in pairs( characters ) do
			if v ~= character then
				table.insert( newCast, v )
			end
		end
	else
		newCast = characters
		table.insert( newCast, character )
	end
	local button = frame:callParserFunction{ name = '#autoedit', args={
		form='Spiel',
		target=targetPage,
		'link text=' .. ( participating and 'Abmelden!' or 'Anmelden!'),
		summary='Figur ' .. character .. ' wurde ' .. ( participating and 'ausgetragen' or 'eingetragen' ),
		tooltip='Durch Klicken, die Figur ' .. character .. ( participating and ' ausgetragen' or ' eingetragen' ),
		'query string=play[cast]=' .. table.concat( newCast, config.playPlayerDelimiter ),
		'reload'
		}
	}
	button = '<div class="btn btn-' .. ( participating and 'danger' or 'success' ) .. '">' .. button .. '</div>'
	return status, button
end

function buildControlTableHeader()
	local header = mw.html.create( 'tr' )
	header:tag('th')
		:wikitext('Spiel')
		:done()
		:tag('th')
		:wikitext('Titel')
		:done()
		:tag('th')
		:wikitext('Ort')
		:done()
		:tag('th')
		:wikitext('Jahr')
		:done()
		:tag('th')
		:wikitext('Status')
		:done()
		:tag('th')
		:wikitext('Aktion')
		:done()
	return header
end

function buildControlTableBody( playData, character )
	local body = mw.html.create( '' )
	for num, play in pairs( playData ) do
		local status, button = buildControlStatusAndButton( play.characters, character, play.play )
		local tr = mw.html.create('tr')
		tr:tag( 'td' )
			:wikitext( play.number )
			:done()
		tr:tag( 'td' )
			:wikitext( '[[' .. play.play .. '|' .. play.title .. ']]' )
			:done()
		tr:tag( 'td' )
			:wikitext( play.place and play.place or 'unbekannt' )
			:done()
		tr:tag( 'td' )
			:wikitext( play.time and play.time or 'unbekannt' )
			:done()
		tr:tag( 'td' )
			:wikitext( status )
			:done()
		tr:tag( 'td' )
			:wikitext( button )
			:done()
		body:node(tr)
	end
	return body
end

function buildPurgeLink( currentTitle, linkText )
	return '<span class="plainlinks">['
		.. tostring( mw.uri.fullUrl( currentTitle.fullText, {action = 'purge'} ) )
		.. ' ' .. linkText .. ']</span>'
end


function getPlayData()
	local query = {
		'[[Category:Spiele]]',
		'?#=play',
		'?Has number#=number',
		'?Has character participating#=characters',
		'?Has display name#=displayName',
		'?Has title#=title',
		'?Is held in#=place',
		'?Is held at#-F[Y]=time',
		'mainlabel=-'
	}
	res = smw.ask( query )
	if not res then
		return {}
	end
	local playData = {}
	for k, row in pairs(res) do
		if row and row.number and row.title then
			if not row.characters then
				row.characters = {}
			end
			if type( row.characters ) ~= 'table' then
				row.characters = { row.characters }
			end
			playData[row.number] = row
		end
	end
	return playData
end

function printParticipationControl( currentTitle, playData )
	local character = currentTitle.text
	local text = '== Spielteilnahmen für ' .. character .. ' ==\n'
	text = text .. 'Diese Seite zeigt Dir eine Übersicht der Spielteilnahmen für die Figur \'\''
		.. character .. '\'\' und erlaubt es Dir, sie für Spiele einzutragen oder aus Spielen '
		.. 'wieder auszutragen.\n'
		.. '<div class="alert alert-warning"><strong>Wichtig!</strong> Nach einer Aktion sind die '
		.. 'angezeigten Daten sehr wahrscheinlich nicht korrekt. Zum Aktualisieren bitte einmal '
		.. 'diese Seite \'\'\'' .. buildPurgeLink( currentTitle, 'Neu laden' ) .. '\'\'\'!</div>\n'
		.. 'Und ein letzter Hinweis: Da es sich hier um ein Wiki handelt, kann jede/r diese Seite '
		.. 'benutzen. Daher die Bitte: Handele nach bestem Wissen und Gewissen oder überlasse '
		.. 'der Spielerin/dem Spieler der Figur das Ein- und Austragen.\n'

	local t = mw.html.create('table')
	t:addClass( 'table table-striped table-bordered sortable' )
		:node( buildControlTableHeader() )
		:node( buildControlTableBody( playData, character ) )
	return text .. tostring(t)
end

function p.main( frame )
	local currentTitle = mw.title.getCurrentTitle()
	local assessmentResult, assesmentMessage = assessPrerequisites( currentTitle )
	if not assessmentResult then
		return alertBox( assesmentMessage )
	end
	-- all is well, show the control table
	local playData = getPlayData()
	return printParticipationControl( currentTitle, playData )
end

return p