Zum Inhalt springen

Modul:Versionsschutz

Aus Wikonia


Beschreibung

Dieses Modul erzeugt automatisch eine Anzeige des aktiven Seitenschutzes – bestehend aus:

  • einem Padlock-Icon (oben rechts auf der Seite),
  • einer Hinweisbox im Seiteninhalt,
  • sowie einer zugehörigen Kategorie.

Es funktioniert vollständig ohne manuelle Parameter und ermittelt Schutzstufe, Ablaufdatum und Benutzergruppe aus der aktuellen Seite. Optional kann ein Grund übergeben werden.

Aufbau

Das Modul besteht aus einem Hauptmodul und mehreren Submodulen, es nutzt zudem weitere allgemeine Hilfsmodule:

Submodule

Modul Funktion
Modul:Versionsschutz Hauptmodul, erzeugt Padlock, Box und Kategorie
Modul:Versionsschutz/Konfig Konfigurationsdaten (Icons, Texte, Farben, Kategorien)
Modul:Versionsschutz/Level Ermittelt aktivste Schutzstufe (nach Priorität)
Modul:Versionsschutz/Ablauf Ermittelt das Ablaufdatum eines Schutzes (falls gesetzt)

Hilfsmodule

Modul Funktion
Modul:Dateilink Gibt formatierte Dateilinks mit Titel, Größe etc. zurück
Modul:DateFormat Gibt ISO-Zeitstempel im lesbaren Format aus

Verwendung

Einbindung per Vorlage

Empfohlen über die Wrapper-Vorlage {{Versionsschutz}}, z. B.:

{{Versionsschutz|Vandalismus}}

Siehe auch


Direktaufruf per #invoke (nicht empfohlen)

{{#invoke:Versionsschutz|main}}

Parameter

Nur ein Parameter ist vorgesehen (optional):

Grund=
Gibt einen individuellen Hinweistext zum Schutzgrund an (wird als Text unterhalb der Hinweisbox angezeigt).

Funktionsweise

  1. Das Modul ruft alle bekannten Schutzarten (z. B. edit, move, upload) über PROTECTIONLEVEL ab.
  2. Die aktivste Schutzstufe wird aus einer vordefinierten Prioritätenliste ermittelt.
  3. Ist ein Schutz aktiv, wird abhängig von der Konfiguration:
    1. das passende Icon gewählt (inkl. Unterscheidung bei temporären Schutzarten),
    2. das Ablaufdatum formatiert,
    3. ein Tooltip generiert,
    4. eine Hinweisbox mit erklärendem Text eingeblendet,
    5. eine Kategorie zugewiesen.

Temporäre Schutzarten

Das Modul erkennt temporäre Schutzarten anhand des Ablaufdatums (`expiry ≠ infinity`) In diesem Fall werden spezielle Icons mit Uhrsymbol genutzt (z. B. Protection-temp-sysop.svg).

Icons

Das Modul unterstützt differenzierte Icons für:

  • Aktionen: edit, move, create, upload
  • Schutzstufen: sysop, autoconfirmed, confirmed, templateprotection, policyprotection
  • temporäre Varianten: eigene Icons mit -temp- im Dateinamen

Kategorisierung

Wird automatisch gesetzt auf Basis der Konfiguration. Beispiele:

  • [[Kategorie:Bearbeitungsgeschützte Inhalte]]
  • [[Kategorie:Vorlagengeschützte Inhalte]]

Einschränkungen

  • Es wird immer nur eine Schutzstufe pro Seite angezeigt – die mit der höchsten Priorität.
  • Kaskadierende Schutzstufen (cascade) werden derzeit nicht ausgewertet.
  • Der Schutzgrund kann nicht automatisch ausgelesen werden – nur manuell übergeben.

To-Do / Ausblick

  • Automatische Integration per Hook (statt manuelle Einbindung)
  • Kaskadenerkennung für eingebundene Seiten
  • Mehrsprachigkeit über zentrale JSON-Datei
  • Konfigurierbare Textbausteine

Siehe auch



-- Modul:Versionsschutz – Wikonia, vollständige Eigenentwicklung
-- Erzeugt automatisch Padlock + Box inkl. Kategorie, ohne UIBox/mbox.

local p = {}

-- Imports
local config = require('Modul:Versionsschutz/Konfig')
local fileLink = require('Modul:Dateilink')
local getLevel = require('Modul:Versionsschutz/Level')._main
local getExpiry = require('Modul:Versionsschutz/Ablauf')._main
local dateformat = require('Modul:DateFormat')

-- Hauptfunktion
function p.main(frame)
	-- Ausgabemodus festlegen
	local args = frame and frame.args or {}
	local mode = args.mode or args[1] or "both"

    -- Schutzstufen für relevante Aktionen abrufen
    local levelEdit = getLevel("edit", title)
    local levelMove = getLevel("move", title)
    local levelUpload = getLevel("upload", title)

    local function getHigherLevel(a, b)
        local index = {}
        for i, v in ipairs(config.priority or {}) do
            index[v] = i
        end
        return (index[a] or 999) < (index[b] or 999) and a or b
    end

    local level, action, expiry

    if levelEdit and levelMove then
        -- Fullschutz erkannt
        action = "full"
        level = getHigherLevel(levelEdit, levelMove)
        expiry = getExpiry("edit", title)
    elseif levelEdit then
        action = "edit"
        level = levelEdit
        expiry = getExpiry("edit", title)
    elseif levelMove then
        action = "move"
        level = levelMove
        expiry = getExpiry("move", title)
    elseif levelUpload then
        action = "upload"
        level = levelUpload
        expiry = getExpiry("upload", title)
    end

    -- Falls kein Schutz aktiv: nichts anzeigen
    if not (action and level) then
        return ""
    end

    -- Temporären Schutz erkennen
	local function isValidTimestamp(s)
	    return s and s:match("^%d%d%d%d%-%d%d%-%d%dT%d%d:%d%d") ~= nil
	end
	
	if isValidTimestamp(expiry) then
	    expiryStr = " (bis " .. dateformat.formatDate({ args = { expiry } }) .. ")"
	else
	    expiryStr = ""
	end

    -- Iconnamen aufbauen (entsprechend Iconstruktur)
    local iconKey = isTemp and ("temp-" .. level)
                or (action == "full" and "full-" .. level)
                or (action .. "-" .. level)

    -- Passendes Icon aus config
    local icon = config.icons[action] and config.icons[action][level]
              or config.icons.general and config.icons.general[level]
              or config.icons["temp"] and isTemp and config.icons["temp"][level]
              or "Transparent.gif"

    -- Daten aus Konfig holen
    local category = config.categories[level] or ""
    local texts = config.texts[level] or {}
    local usergroup = config.usergroups[level] or level
    local color = config.colors[level]
    local helplink = config.helplinks[level]

    -- Ablaufdatum formatiert (kann leer sein)
    local expiryStr = ""
    if expiry and expiry ~= "" and expiry ~= "infinity" then
        expiryStr = " (Bis " ..  dateformat.formatDate({ args = { expiry } }) .. ")"
    end
    
    -- Grund formatiert
	local reason = frame.args.reason or ""
	local reasonStr = ""
	
	if reason ~= "" then
	    reasonStr = "<small>Grund: " .. reason .. "</small>"
	end
    
    -- Tooltip/Padlock-Text
    local tooltip = (texts.tooltip or "")
        :gsub("%%EXPIRY%%", expiryStr)
        :gsub("%%USERLEVEL%%", usergroup)

    -- Box-Text
    local boxtext = (texts.box or "")
        :gsub("%%EXPIRY%%", expiryStr)
        :gsub("%%USERLEVEL%%", usergroup)

    -- Padlock (Indicator), 32px
	local padlock = '<div class="versionsschutz-padlock">' ..
	  fileLink._main{
	      file = icon,
	      size = "32px",
	      alt = "Seite geschützt",
	      link = helplink,
	      title = tooltip,
	      class = "noviewer"
	  } .. '</div>'

    -- Box-Inhalt vorbereiten (Grund + Link kombiniert)
    local extraText = frame:preprocess(reasonStr or "")
    if helplink then
        extraText = extraText .. '<br />[[' .. helplink .. '|Informationen zum Versionsschutz]]'
    end
    
	 -- Hinweisbox (Wikitext), bleibt leer, wenn texts.box nicht existiert.
	local box = ""
	if texts.box and texts.box ~= "" then
    local box = string.format(
        '<div class="versionsschutz-box">' ..
        '<div class="versionsschutz-icon">%s</div>' ..
        '<div class="versionsschutz-body">' ..
        '<div class="versionsschutz-title">%s</div>' ..
        '<div class="versionsschutz-text">%s</div>' ..
        '</div></div>',
        fileLink._main{
            file = icon,
            size = "48px",
            alt = "Seite geschützt",
            link = helplink,
            title = tooltip,
            class = "noviewer"
        },
        texts.box and texts.box:gsub("%%EXPIRY%%", expiryStr):gsub("%%USERLEVEL%%", usergroup) or "",
        extraText
    )
	end


    -- Kategorie-String
    local cat = category ~= "" and ("[[Kategorie:" .. category .. "]]") or ""

    -- Ausgabe (nach Parameter )
	if mode == "padlock" then
	    return padlock .. "\n" .. cat
	elseif mode == "box" then
	    return box .. "\n" .. cat
	else
	    return padlock .. "\n" .. box .. "\n" .. cat
	end

end

return p