Modul:Briefspielreihe: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
VolkoV (Diskussion | Beiträge) K (Schützte „Modul:Briefspielreihe“: Automatisch gesperrt. ([Verschieben=Nur Administratoren erlauben] (unbeschränkt) [Bearbeiten=Nur Administratoren erlauben] (unbeschränkt))) |
VolkoV (Diskussion | Beiträge) K (SyncBot) |
||
| Zeile 30: | Zeile 30: | ||
if ort=='' then return '' end | if ort=='' then return '' end | ||
local a=mw.smw.ask("[["..ort.."]]|mainlabel=-|?Viewbox#=") | local a=mw.smw.ask("[["..ort.."]]|mainlabel=-|?Viewbox#=") | ||
if a==nil then return "" end | |||
if a[1]==nil then return "" end | |||
if a[1][1]==nil then return "" end | if a[1][1]==nil then return "" end | ||
return a[1][1] | return a[1][1] | ||
| Zeile 213: | Zeile 215: | ||
--Statistik in die Tabelle in nicht-numerischen Key | --Statistik in die Tabelle in nicht-numerischen Key | ||
if(minzeittext==nil) then minzeittext="" end | |||
if(maxzeittext==nil) then maxzeittext="" end | |||
if(minerstellttext==nil) then minerstellttext="" end | |||
if(maxerstellttext==nil) then maxerstellttext="" end | |||
kapitel["statistik"]={} | kapitel["statistik"]={} | ||
kapitel["statistik"]["minzeit"]=minzeittext | kapitel["statistik"]["minzeit"]=minzeittext | ||
Version vom 16. März 2024, 18:39 Uhr
Dokumentation und Testfälle unter Modul:Briefspielreihe/Doku.
require("Modul:Hilfsfunktionen")
require("Modul:Text")
require("Modul:Titelblock")
local p = {}
--Hole alle Kapitel per Subobject ohne Vorgeschichte und Folgehandlung
function holeKapitel(reihe)
if reihe=='' then return '' end
local kapitel=mw.smw.ask("[[-has subobject::+]] [[Reihe ist::"..reihe.."]] [[Kapitelnummer ist::>-10]] [[Kapitelnummer ist::<510]]"
.."|mainlabel=-"
.."|?#-="
.."|?Kapitelnummer ist#="
.."|?Briefspiel-Zeitindex ist#="
.."|link=none"
.."|format=list"
.."|sort=Reihenkapitel,Briefspiel-Zeitindex ist"
.."|order=asc,asc"
.."|searchlabel="
.."|limit=500"
)
if kapitel==nil then
return {}
end
return kapitel
end
--Hole die Viewbox eines Handlungsortes oder Lehens
function holeViewbox(ort)
if ort=='' then return '' end
local a=mw.smw.ask("[["..ort.."]]|mainlabel=-|?Viewbox#=")
if a==nil then return "" end
if a[1]==nil then return "" end
if a[1][1]==nil then return "" end
return a[1][1]
end
--Errechne den Mittelpunkt der Viewbox als Koordinaten für die Kartenanzeige
function viewboxToKoordinaten(viewbox)
if viewbox=="" then return "" end
local result=""
local width=10000000
for k,token in pairs(split(viewbox,",")) do
local subtokens={}
local i=0
for k,subtoken in pairs(split(token,"%s")) do
subtokens[i]=tonumber(subtoken)
i=i+1
end
if subtokens[3] then
if subtokens[3]<width then
width=subtokens[3]
local x=subtokens[0]+subtokens[2]/2
local y=subtokens[1]+subtokens[3]/2
result=x.." "..y
end
end
end
return result
end
--Tabelle (key->anzahl) absteigend nach Häufigkeitsverteilung sortieren für Pivot
function sorted(t)
s={}
for k,v in pairs(t) do
table.insert(s,{k,v})
end
table.sort(s,function(k1,k2) return k1[2]>k2[2] end)
return s
end
--Hole weitere Details zu den einzelnen Kapiteln
--ermittle dabei statistische Daten (min/max) und zähle Orte, Jahre, Autoren, Darsteller für Pivots
function holeDetails(kapitel)
--Statistik initialisieren
local minzeitindex=1000000000
local minzeittext=""
local maxzeitindex=-1000000000
local maxzeittext=""
local minerstelltindex="3000-01-01T00:00:00"
local minerstellttext=""
local maxerstelltindex="0000-01-01T00:00:00"
local maxerstellttext=""
--Pivots initialisieren
local darsteller={}
local handlungsorte={}
local autoren={}
local jahre={}
--wenn keine Kapitel vorhanden, abbrechen
if(#kapitel==0) then
return {}
end
--sortiert durch die Kapitel gehen
local tkeys=getSortKeys(kapitel)
for _,k in ipairs(tkeys) do
--Artikelname korrigieren
kapitel[k][1]=mw.text.split(kapitel[k][1],"#",true)[1]
--Daten abfragen
local det=mw.smw.ask("[["..kapitel[k][1].."]]"
.."|mainlabel=-"
.."|?Handlungszeittext ist#="
.."|?Briefspieler#="
.."|?Kapitelname ist#="
.."|?Kurzbeschreibung#="
.."|?Hauptdarsteller ist#="
.."|?Handlungsort ist#="
.."|?Handlungsort indirekt#="
.."|?Erstellt#="
.."|?Erstellt#LOCL#TO="
.."|?Wappen ist#="
.."|?Category#="
)
--alle Daten als Tabellen, um später Mehrfach- und Einfachsetzungen gleich behandeln zu können
kapitel[k][4]=noniltable(det[1][1])
kapitel[k][5]=noniltable(det[1][2])
kapitel[k][6]=noniltable(det[1][3])
kapitel[k][7]=noniltable(det[1][4])
kapitel[k][8]=noniltable(det[1][5])
kapitel[k][9]=noniltable(det[1][6])
kapitel[k][10]=noniltable(det[1][7])
kapitel[k][11]=noniltable(det[1][8])
kapitel[k][12]=noniltable(det[1][9])
kapitel[k][13]=noniltable(det[1][10])
kapitel[k][14]=noniltable(det[1][11])
--Min/Max-Abfragen für die Statistik
if(kapitel[k][2]>=0)and(kapitel[k][2]<=96) then
if kapitel[k][3]<minzeitindex then
minzeitindex=kapitel[k][3]
minzeittext=kapitel[k][4][1]
end
if kapitel[k][3]>maxzeitindex then
maxzeitindex=kapitel[k][3]
maxzeittext=kapitel[k][4][1]
end
end
if kapitel[k][11][1]<minerstelltindex then
minerstelltindex=kapitel[k][11][1]
minerstellttext=kapitel[k][12][1]
end
if kapitel[k][11][1]>maxerstelltindex then
maxerstelltindex=kapitel[k][11][1]
maxerstellttext=kapitel[k][12][1]
end
--Auszählen von Werten für die Pivots
if #kapitel[k][5]>0 then
for k,v in ipairs(kapitel[k][5]) do
if autoren[v]==nil then
autoren[v]=1
else
autoren[v]=autoren[v]+1
end
end
end
if #kapitel[k][8]>0 then
for k,v in ipairs(kapitel[k][8]) do
if darsteller[v]==nil then
darsteller[v]=1
else
darsteller[v]=darsteller[v]+1
end
end
end
--zusätzlich Koordinaten für direkte Handlungsorte ermitteln
local coords={}
if #kapitel[k][9]>0 then
for k,v in ipairs(kapitel[k][9]) do
table.insert(coords,viewboxToKoordinaten(holeViewbox(v)))
if handlungsorte[v]==nil then
handlungsorte[v]=1
else
handlungsorte[v]=handlungsorte[v]+1
end
end
end
if #kapitel[k][10]>0 then
for k,v in ipairs(kapitel[k][10]) do
if handlungsorte[v]==nil then
handlungsorte[v]=1
else
handlungsorte[v]=handlungsorte[v]+1
end
end
end
if #kapitel[k][14]>0 then
for k,v in ipairs(kapitel[k][14]) do
if(v:find('^Kategorie:Geschichten ')~=nil) then
if jahre[v]==nil then
jahre[v]=1
else
jahre[v]=jahre[v]+1
end
end
end
end
kapitel[k][15]=coords
end
--Median des Zeitindex errechnen
local kanz=#kapitel
local medzeitindex=0
if (kanz%2)==0 then
--Gerade Anzahl
local m1=kapitel[kanz/2][3]
local m2=kapitel[kanz/2+1][3]
medzeitindex=(m1+m2)/2
else
--Ungerade Anzahl
medzeitindex=kapitel[math.ceil(kanz/2)][3]
end
--Statistik in die Tabelle in nicht-numerischen Key
if(minzeittext==nil) then minzeittext="" end
if(maxzeittext==nil) then maxzeittext="" end
if(minerstellttext==nil) then minerstellttext="" end
if(maxerstellttext==nil) then maxerstellttext="" end
kapitel["statistik"]={}
kapitel["statistik"]["minzeit"]=minzeittext
kapitel["statistik"]["medzeitindex"]=tostringd(medzeitindex)
kapitel["statistik"]["maxzeit"]=maxzeittext
kapitel["statistik"]["minerstellt"]=minerstellttext
kapitel["statistik"]["maxerstellt"]=maxerstellttext
kapitel["statistik"]["autoren"]=sorted(autoren)
kapitel["statistik"]["darsteller"]=sorted(darsteller)
kapitel["statistik"]["handlungsorte"]=sorted(handlungsorte)
kapitel["statistik"]["jahre"]=sorted(jahre)
return kapitel
end
--Umrechnung der angezeigten Kapitelnummern
function kapitelno(k)
local result=""
local k=tonumber(k)
if (k==nil) then return "" end
if (k>=-100)and(k<-10) then result="Vorgeschichte "..tostring(k+101) end
if (k>=-10)and(k<1) then result="Prolog "..tostring(k+11) end
if (k>=1)and(k<500) then result="Kapitel "..tostring(k) end
if (k>=501)and(k<=510) then result="Epilog "..tostring(k-500) end
if (k>=511)and(k<=520) then result="Anhang "..tostring(k-510) end
if (k>=521) then result="Folgehandlung "..tostring(k-520) end
return result
end
--Ausgabe einer Pivot-Tabelle als Text bis zu maximal Anzahl Einträgen,
--Das oberste Siebtel (aber mindestens der erste Eintrag) bestimmt, bis zu welchem Wert fettgedruckt wird
--Wenn Kategorie auf true, wird auch passend kategorisiert (bei Handlungsorten)
function outputtabelle(tabelle,anzahl,kategorie)
local s=""
local i=0
if(#tabelle==0) then
return s
end
local tkeys=getSortKeys(tabelle)
local f=tabelle[tkeys[1]][2]
for _,k in ipairs(tkeys) do
if _<(#tabelle/7) then
f=tabelle[k][2]
end
local ft=""
if tabelle[k][2]>=f then
ft="'''"
end
if kategorie<2 then
s=s..ft..outputlink(tabelle[k][1]).." ("..tabelle[k][2].."x)"..ft
if next(tabelle,_)~=nil then
s=s..", "
end
end
if kategorie>0 then
s=s..outputkategorie(tabelle[k][1])
end
i=i+1
if i>anzahl then
return s
end
end
return s
end
--Ausgabefunktion für die Kapitelreihe
function output(frame,kapitel,reihe,logo,klappe,sammlung)
local s="[[Kategorie:Briefspielreihe]]"
local kp=0
--Wenn keine Kapitel vorhanden, brich ab
if(#kapitel==0) then
return s
end
--Definition des Titelblocks mit Statistischen Daten
local z=""
local autoren=outputtabelle(kapitel['statistik']['autoren'],10000,0)
z=z..subZeilengruppe('Irdisches',
subZeile('Irdischer Zeitraum',kapitel['statistik']['minerstellt'].." '''bis''' "..kapitel['statistik']['maxerstellt'])
..subZeile('Geschrieben von',autoren)
)
z=z..subZeilengruppe('Aventurisches',
subZeile('Zeitraum der Haupthandlung',kapitel['statistik']['minzeit'].." '''bis''' "..kapitel['statistik']['maxzeit'])
..subZeile('Hauptdarsteller',outputtabelle(kapitel['statistik']['darsteller'],10000,0))
..subZeile('Handlungsorte',outputtabelle(kapitel['statistik']['handlungsorte'],10000,1))
)..outputtabelle(kapitel['statistik']['jahre'],10000,2)
local links=""
if logo~="" then
logo='Datei:'..logo
else
logo='Datei:Wappen blanko.svg'
end
if sammlung~="ja" then
sammlung="falsch"
else
sammlung="wahr"
end
links='[['..logo..'|150px|link=]]'
s=s..subTitelblock(' ',links,z,' ','<div style="text-align:justify;padding:10px;font-size:1.3em;">'..klappe..'</div>')
--Ausgabe des Inhaltsverzeichnisses als Tabelle
s=s..'\n==Inhaltsverzeichnis==\n'
..'{| class="tabellehuebsch"\n'
..'|-\n'
..'!\n'
..'!Kapitel\n'
..'!Titel\n'
..'!Inhalt\n'
..'!Zeit\n'
..'!Autor:innen\n'
local tkeys=getSortKeys(kapitel)
local map=''
for _,k in ipairs(tkeys) do
if k~="statistik" then
local ka=""
if kapitel[k][2]==0 then
kp=kp+1
ka=kapitelno(kp)
else
ka=kapitelno(kapitel[k][2])
end
s=s.."|-\n"
..'||[['..kapitel[k][13][1].."|30px|link=]]"
.."||"..ka
.."||[["..kapitel[k][1].."|"..kapitel[k][6][1].."]]"
.."||"..nonilstring(kapitel[k][7][1])
.."||"..nonilstring(kapitel[k][4][1])
.."||"
if #kapitel[k][5]>0 then
for _,v in ipairs(kapitel[k][5]) do
s=s..outputlink(v)
if next(kapitel[k][5],_)~=nil then
s=s..", "
end
end
end
s=s.."\n"
if #kapitel[k][15]>0 then
for _,v in ipairs(kapitel[k][15]) do
if v~="" then
map=map.."\nHauptdarsteller:"..kapitel[k][1]..";0!14;;"..v
end
end
end
end
end
s=s.."|}\n"
map=map..'\n'
--Aufruf der Chronik-Vorlage
s=s..frame:expandTemplate{title='Abfrage Chronik',args={reihe..' — Briefspielreihe'}}
--Ausgabe der Übersichtskarte
s=s..'\n==Übersichtskarte==\n'
s=s..'<div style="width:100%;text-align:center;">'
..frame:callParserFunction{name='#mapview',args={'LOD=7\nGws=0\nWld=0\nBrg=0\nGrz=1\nWeg=0\nOrt=0\nBau=0\nFlc=1\nsize=1\nnotload=Berge Gewaesser Waelder Wege Ortschaften Detail',map}}
..frame:callParserFunction{name='#set',args={
'Kurzbeschreibung='..klappe,
'Wappen ist='..logo,
'Handlungszeittext ist='..kapitel['statistik']['minzeit'].." '''bis''' "..kapitel['statistik']['maxzeit'],
'Briefspiel-Zeitindex ist='..kapitel['statistik']['medzeitindex'],
'Reihenautoren='..autoren,
'Sammlung='..sammlung,
'Reihe ist='..reihe
}}
..'</div>'
return s
end
--Auzurufende Funktion, erwartet diese Parameter
-- 1: Name der Briefspielreihe (Pflicht)
-- 2: Logo ohne den "Datei:"-Vorsatz
-- 3: Klappentext
function p.briefspielreihe(frame)
local reihe=robusttrim(frame.args[1])
local logo=robusttrim(frame.args[2])
local klappe=robusttrim(frame.args[3])
local sammlung=robusttrim(frame.args[4])
if(reihe=='') then return '' end
local kap=holeKapitel(reihe)
local inh=holeDetails(kap)
return output(frame,inh,reihe,logo,klappe,sammlung)
end
return p