Zuletzt bearbeitet vor 4 Wochen
von Xineohp1506

Projekt

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"] .. " &nbsp; &nbsp;")
		end

		if args["Beteiligte"] then
			table.insert(output, helper.getIcon("users") .. "Beteiligte: " .. args["Beteiligte"] .. " &nbsp; &nbsp;")
		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