Modul:Participation: Unterschied zwischen den Versionen
This is [[MediaWiki:Tagline]]. Set to <code>display:none</code> by chameleon skin.
Tobi (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Tobi (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(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' ) | ||
function assertCorrectNamespace( title, namespace ) | function assertCorrectNamespace( title, namespace ) | ||
Zeile 14: | Zeile 15: | ||
end | end | ||
function | function assessPrerequisites( currentTitle ) | ||
if not assertCorrectNamespace( | if not assertCorrectNamespace( currentTitle, 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 | ||
return false, 'Die Seite mit dem Namen \'\'' | return false, 'Die Seite mit dem Namen \'\'' | ||
.. | .. 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 | 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 ) | |||
local | |||
local | |||
for k, | |||
if | |||
end | end | ||
end | end | ||
else | |||
newCast = characters | |||
table.insert( newCast, character ) | |||
end | end | ||
return | 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 | function buildControlTableHeader() | ||
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(' | :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. | :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 ) | ||
: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 | ||
local playData = {} | |||
for k, row in pairs(res) do | |||
return | 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 | function printParticipationControl( currentTitle, playData ) | ||
local | local character = currentTitle.text | ||
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. | .. 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') | local t = mw.html.create('table') | ||
t:addClass( ' | t:addClass( 'table table-striped table-bordered sortable' ) | ||
:node( buildControlTableHeader() ) | |||
:node( buildControlTableBody( playData, character ) ) | |||
return | return text .. tostring(t) | ||
end | end | ||
function p.main( frame ) | function p.main( frame ) | ||
local | local currentTitle = mw.title.getCurrentTitle() | ||
if not | 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 ) | ||
end | end | ||
return p | return p |
Aktuelle Version vom 19. Juli 2019, 07:43 Uhr
This module is rated as ready for general use. It has reached a mature form and is thought to be bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
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
{{#invoke:Participation|main}}
Example
The above documentation is transcluded from Modul:Participation/doc. (edit | history) Subpages of this module. |
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