Die Dokumentation für dieses Modul kann unter Modul:Studio/Projekt/Doku erstellt werden
local p = {}
local helper = require('Module:Studio/Helper')
local getArgs = require('Module:Arguments').getArgs
local transcluder = require('Module:Transcluder')
-- Hauptfunktion
function p.render(frame)
local args = getArgs(frame)
local output = {}
local KategorieIntern = args["KategorieIntern"]
local cleanProjektname = helper.cleanString(args["Projekt"])
-- Kopfbereich
table.insert(output, '<div class="studio-project-header">')
if args["Titel"] then
table.insert(output, '<div class="studio-header-row">' .. helper.getIcon("film") .. "'''" .. KategorieIntern .. "'''" .. '</div>')
end
if args["Startdatum"] or args["Beteiligte"] or args["Projekt"] then
table.insert(output, '<div class="studio-header-sub">')
if args["Startdatum"] then
table.insert(output, helper.getIcon("calendar") .. "Start: " .. args["Startdatum"] .. " ")
end
if args["Beteiligte"] then
table.insert(output, helper.getIcon("users") .. "Beteiligte: " .. args["Beteiligte"] .. " ")
end
if args["Projekt"] then
table.insert(output, helper.getIcon("link") .. "Projekt: " .. " [[LetsPlayOrNot:"..cleanProjektname.."|" .. (args["Projekt"] or "-") .. "]]")
end
table.insert(output, '</div>')
end
table.insert(output, '</div>')
-- Zwei Tabs: Folgen (mit verschachteltem Tabber), Kopiervorlage
local tabberOutput = {}
-- Erster Tab: Folgen
local episodeTabs = p.renderEpisodes(frame, KategorieIntern)
table.insert(tabberOutput, "Folgen=\n" .. episodeTabs)
-- Zweiter Tab: Kopiervorlage (als <pre>)
local copyPage = "Studio:" .. KategorieIntern .. "/Kopiervorlage"
local copyRaw = transcluder.get(copyPage)
local copyText = mw.text.trim(copyRaw or "Noch keine Kopiervorlage vorhanden.")
table.insert(tabberOutput, "Kopiervorlage=\n<pre>" .. copyText .. "</pre>")
-- Zusammenfügen mit <tabber>-Syntax
local tabberText = "<tabber>\n" .. table.concat(tabberOutput, "\n|-|") .. "\n</tabber>"
table.insert(output, frame:preprocess(tabberText))
-- Optionaler Info-Block: Cheats, Notizen, Links, ToDos
local tabberTabs = {}
local subpages = {
{ name = "Cheats", icon = "code", fallback = "Noch keine Cheats vorhanden." },
{ name = "Notizen", icon = "pen", fallback = "Noch keine Notizen vorhanden." },
{ name = "ToDos", icon = "check-square", fallback = "Noch keine ToDos vorhanden." },
{ name = "Links", icon = "link", fallback = "Noch keine Links vorhanden." }
}
for _, entry in ipairs(subpages) do
local titleText = "Studio:" .. KategorieIntern .. "/" .. entry.name
local titleObj = mw.title.new(titleText)
local content
if titleObj and titleObj.exists then
content = transcluder.get(titleText)
else
content = "''" .. entry.fallback .. "'' ([[" .. titleText .. "|Seite erstellen]])"
end
table.insert(tabberTabs, entry.icon and helper.getIconRaw(entry.icon) .. " " .. entry.name .. "=\n" .. content or entry.name .. "=\n" .. content)
end
table.insert(output, '<div class="studio-project-footer">')
table.insert(output, '<div class="studio-info-box">')
table.insert(output, frame:preprocess('<tabber class="studio-footer-tabber">\n' .. table.concat(tabberTabs, '\n|-|') .. '\n</tabber>'))
table.insert(output, '</div></div>')
return table.concat(output, "\n")
end
-- Episodenübersicht via Tabber
function p.renderEpisodes(frame, KategorieIntern)
local args = frame.args
KategorieIntern = args["KategorieIntern"] or args[1] -- Entweder benannter oder erster Parameter
local cleanKategorieIntern = helper.cleanString(KategorieIntern)
if not mw.smw then
return "Semantic MediaWiki-Erweiterung nicht gefunden."
end
if not KategorieIntern or KategorieIntern == "" then
return "Kein Projekt angegeben."
end
-- Abfrage-String für Studio-Projekt
local query = string.format(
"[[STUDIO:KategorieIntern::%s]][[STUDIO:Typ::Episode]]"
.. "|?STUDIO:Nummer"
.. "|?STUDIO:Titel"
.. "|?STUDIO:Dateiname"
.. "|?STUDIO:CUTADDS",
KategorieIntern
)
local queryResult = mw.smw.getQueryResult(query)
if not queryResult or not queryResult.results then
return "Keine Episoden für dieses Projekt gefunden."
end
-- Episoden in Tabgruppen (50er Blöcke)
local tabGroups = {}
for _, result in ipairs(queryResult.results) do
local nummer = tonumber(result.printouts["STUDIO:Nummer"] and result.printouts["STUDIO:Nummer"][1]) or 0
local titel = tostring(result.printouts["STUDIO:Titel"] and result.printouts["STUDIO:Titel"][1]) or "Ohne Titel"
local dateiname = tostring(result.printouts["STUDIO:Dateiname"] and result.printouts["STUDIO:Dateiname"][1]) or "-"
local cutAdds = result.printouts["STUDIO:CUTADDS"]
local cutStatus = (cutAdds and cutAdds[1] and tostring(cutAdds[1]) ~= "") and "ja" or "nein"
local tabName = string.format("%03d–%03d", math.floor((nummer - 1) / 50) * 50 + 1, math.floor((nummer - 1) / 50) * 50 + 50)
if not tabGroups[tabName] then
tabGroups[tabName] = {}
end
-- Zielseite (z.B. Studio:PROJEKT/001)
local subPage = string.format("Studio:%s/%03d", KategorieIntern, nummer)
local episodePage = string.format("[[%s|Seite]]", subPage)
-- Echter Formular-Link
local fullPageName = string.format("Studio:%s/%03d", KategorieIntern, nummer)
local encodedPage = mw.uri.encode(fullPageName, "WIKI")
local formEditLink = string.format("[[Special:FormEdit/%s_-_Episoden/%s|Bearbeiten]]", cleanKategorieIntern, encodedPage)
table.insert(tabGroups[tabName], string.format(
"<tr><td>%03d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
nummer,
mw.text.nowiki(titel),
mw.text.nowiki(dateiname),
cutStatus,
episodePage,
formEditLink
))
end
-- TabberNeue-Nested Syntax via Parserfunktion
local innerTabs = {}
for tabName, rows in pairs(tabGroups) do
table.insert(innerTabs, string.format(
"%s=\n\n{{{!}} class='studio-tabber-episodentabelle'\n!Nr.!!Titel!!Dateiname!!CUT_ADDS!!Seite!!Bearbeiten\n%s\n{{!}}}",
tabName,
table.concat(rows, "\n")
))
end
local separator = frame:preprocess("{{!}}-{{!}}")
local fullTabber = "{{#tag:tabber|\n" .. table.concat(innerTabs, "\n" .. separator .. "\n") .. "\n}}"
return frame:preprocess(fullTabber)
end
return p