Zum Inhalt springen

Modul:KategorieInfo

Aus Wikonia

Kategorie-Metadaten (strukturierte Darstellung)[Quelltext bearbeiten]

Diese Seite dokumentiert den Aufbau und die Verwendung von Kategorie-Metadaten im Wikonia-System. Die Informationen basieren auf einer zentralen JSON-Datei, die über ein Lua-Modul verarbeitet und auf Kategorieseiten angezeigt wird.

Ziel[Quelltext bearbeiten]

Kategorien sollen mit einer konsistenten Infobox versehen werden, die Beschreibung, Zugehörigkeit und verwandte Themen enthält. Die Daten werden zentral gepflegt, um Redundanz und manuelle Formatierungen zu vermeiden.

Bestandteile[Quelltext bearbeiten]

Modul:KategorieDaten.json[Quelltext bearbeiten]

Diese Datei enthält alle Kategoriedaten in strukturierter, maschinenlesbarer Form.

Pflichtfelder
  • description_de: Beschreibung der Kategorie auf Deutsch
  • description_en: Beschreibung der Kategorie auf Englisch
Optionale Felder
  • icon: Dateiname eines Icons, z. B. Wrench.svg
  • parent: Name einer übergeordneten Kategorie
  • related: Liste verwandter Kategorien (als Array)
  • namespace: Zugehöriger Namensraum (z. B. Help) oder false
  • status: Status der Kategorie, z. B. active, deprecated, draft
  • visible: Sichtbarkeit für Benutzer (Standard: true)
  • note_de: Redaktioneller Hinweis (Deutsch)
  • note_en: Redaktioneller Hinweis (Englisch)

Modul:KategorieInfo[Quelltext bearbeiten]

Das Lua-Modul erzeugt automatisch eine Infobox auf Basis der obigen JSON-Daten.

Funktionen:

  • Erkennt die aktuelle Kategorieseite automatisch
  • Ermittelt die Sprache des Benutzers (oder nutzt die Seiteninhaltssprache)
  • Lädt die passenden Texte aus der JSON-Datei
  • Erzeugt eine formatierte Box mit:
    • Titel (inkl. Icon)
    • Beschreibung
    • Übergeordnete Kategorie (falls definiert)
    • Verwandte Kategorien (falls vorhanden)
    • Hinweise (optional)

Einbindung[Quelltext bearbeiten]

Auf Kategorieseiten reicht folgende Zeile ganz oben:

{{#invoke:KategorieInfo|show}}

Pflege[Quelltext bearbeiten]

  • Die Datei Modul:KategorieDaten.json darf nur gültiges JSON enthalten.
  • Änderungen an der Datei wirken sofort auf alle betroffenen Kategorieseiten.
  • Die Bearbeitung ist nur für Administratoren (bzw. Interface-Admins) erlaubt.
  • Das Modul ist bewusst so gestaltet, dass fehlende Felder toleriert werden.

Erweiterungsmöglichkeiten[Quelltext bearbeiten]

  • Lokalisierung weiterer Felder (z. B. status_de, status_en)
  • Redaktionelles Gadget zum Editieren der JSON über ein Formular
  • Spezialseite mit tabellarischer Übersicht aller Kategorien
  • Visuelle Icons oder Farbcodes je nach Status

local jsonLoader = require('Modul:JsonLoader')
local p = {}

function p.show(frame)
	-- JSON laden
	local data, err = jsonLoader.load('Modul:KategorieDaten.json')
	if not data then
		return '<div class="kategoriebox fehler">' .. err .. '</div>'
	end

	-- aktuelle Seite ermitteln
	local title = mw.title.getCurrentTitle()
	local name = title.text

	-- Sprachwahl
	local lang = mw.language.getContentLanguage().code
	local userLang = frame:callParserFunction("int", "lang") or lang

	-- passenden Datensatz holen
	local info = data[name]
	if not info then
		local fallbackMessage = {
			de = "⚠️ Diese Kategorie ist derzeit nicht im zentralen Kategoriedaten-Modul ([[Modul:KategorieDaten.json]]) erfasst.<br>Bitte ergänze sie, um hier eine Beschreibung anzeigen zu lassen.",
			en = "⚠️ This category is not yet listed in the central category metadata module ([[Module:KategorieDaten.json]]).<br>Please add it to display information here."
		}
		local msg = fallbackMessage[userLang] or fallbackMessage[lang] or fallbackMessage["en"]
		return '<div class="kategoriebox fehler">' .. msg .. '</div>'
	end

	-- Hilfsfunktion für Sprachfelder
	local function getField(key)
		return info[key .. "_" .. userLang] or info[key .. "_" .. lang] or info[key .. "_en"] or ""
	end

	-- Darstellung vorbereiten
	local icon = info.icon and string.format('[[File:%s|32px|class=icon]] ', info.icon) or ""
	local description = getField("description")
	local note = getField("note")
	local parent = info.parent and ("→ [[:Kategorie:" .. info.parent .. "|" .. info.parent .. "]]") or ""
	local related = ""

	if info.related and type(info.related) == "table" then
		local links = {}
		for _, r in ipairs(info.related) do
			table.insert(links, "[[" .. r .. "]]")
		end
		related = "<div class='kategorie-verwandt'><b>See also:</b> " .. table.concat(links, ", ") .. "</div>"
	end

	-- HTML-Box zusammenbauen
	local box = "<div class='kategoriebox'>"
	box = box .. "<div class='kategorie-title'>" .. icon .. "'''" .. name .. "'''</div>"
	box = box .. "<div class='kategorie-desc'>" .. description .. "</div>"
	if parent ~= "" then
		box = box .. "<div class='kategorie-parent'>" .. parent .. "</div>"
	end
	if related ~= "" then
		box = box .. related
	end
	if note ~= "" then
		box = box .. "<div class='kategorie-hinweis'>" .. note .. "</div>"
	end
	box = box .. "</div>"

	return box
end

return p