Zum Inhalt springen

Modul:HilfeNavigation

Aus Wikonia
Dokumentation ansehenbearbeitenVersionsverlaufCache leeren
Seite geschützt
Vorlagenschleife entdeckt: Modul:HilfeNavigation/Doku


Dieses Modul erzeugt die Navigationsstruktur für den Hilfebereich. Es rendert eine mehrstufige, einklappbare Seitenleiste auf Basis einer externen JSON-Datenquelle.

Die Ausgabe ist bewusst frei von Überschriftenelementen (h2–h6), um eine Beeinflussung des Seiten-Inhaltsverzeichnisses (TOC) zu vermeiden. Die Ein- und Ausklapp-Logik wird über JavaScript und CSS gesteuert.

Zweck[Quelltext bearbeiten]

Das Modul dient ausschließlich der Darstellung einer konsistenten Navigationsstruktur für Hilfeseiten. Es trifft keine inhaltlichen Entscheidungen und filtert keine Daten.

  • Struktur und Reihenfolge werden vollständig durch die JSON-Datei vorgegeben
  • Darstellung und Interaktion erfolgen über CSS und JavaScript
  • Das Modul selbst erzeugt ausschließlich sauberes HTML

Datenquelle[Quelltext bearbeiten]

Die Navigationsstruktur wird aus folgender Seite geladen:

Die Datei enthält eine Liste von Hauptgruppen, jeweils mit zugehörigen Seiten und optionalen Untergruppen.

Datenstruktur[Quelltext bearbeiten]

Hauptgruppen[Quelltext bearbeiten]

Eine Hauptgruppe besteht aus einem Gruppentitel und einer Seitenliste:

{
  "group": "Seitenbearbeitung",
  "pages": [ ... ]
}

Seiten[Quelltext bearbeiten]

Eine Seite wird als einfacher Link definiert:

{
  "link": "Hilfe:Bearbeiten",
  "label": "Seiten bearbeiten"
}

Untergruppen[Quelltext bearbeiten]

Untergruppen erlauben eine weitere Hierarchieebene:

{
  "group": "Vorlagenprogrammierung",
  "pages": [
    {
      "link": "Hilfe:Vorlagenprogrammierung",
      "label": "Einstieg"
    }
  ]
}

Untergruppen können beliebig verschachtelt werden.

HTML-Struktur[Quelltext bearbeiten]

Das Modul erzeugt eine strikt vorhersehbare DOM-Struktur:

  • Gruppenüberschriften werden als <div class="help-sidebar-header"> ausgegeben
  • Die zugehörige Liste folgt jeweils direkt als <ul>
  • Untergruppen befinden sich innerhalb eines <li>

Diese Struktur ist Voraussetzung für das zugehörige CSS- und JavaScript-Verhalten.

Interaktion[Quelltext bearbeiten]

Das Modul selbst implementiert keine Interaktionslogik.

  • Das Ein- und Ausklappen erfolgt über JavaScript
  • Der Zustand wird über das Attribut aria-expanded am Header gesteuert
  • Die Darstellung (Pfeile, Abstände, Animationen) erfolgt vollständig per CSS

Barrierefreiheit[Quelltext bearbeiten]

Die klickbaren Gruppenüberschriften erhalten das Attribut: role="button"

Der aktuelle Zustand wird über aria-expanded abgebildet. Die Navigation ist damit für Screenreader nachvollziehbar.

Einschränkungen[Quelltext bearbeiten]

  • Das Modul validiert die Daten nicht inhaltlich
  • Leere oder fehlerhafte Einträge in der JSON-Datei werden ungefiltert gerendert
  • Die Darstellung ist abhängig von den begleitenden UI-Styles

Wartung[Quelltext bearbeiten]

Änderungen an der Navigationsstruktur erfolgen ausschließlich in der JSON-Datei. Anpassungen an Optik oder Verhalten sind im jeweiligen UI-Gadget bzw. Stylesheet vorzunehmen.

Das Modul selbst sollte nur bei strukturellen Änderungen angepasst werden.

Abhängigkeiten
Für dieses Modul bestehen Abhängigkeiten, zu den folgenden Inhalten:

Siehe auch


local p = {}
local JsonLoader = require("Modul:JsonLoader")

function p.render(frame)
  local currentTitle = mw.title.getCurrentTitle().prefixedText
  local data, err = JsonLoader.load("Modul:HilfeNavigation/data.json")
  if not data then
    return "Fehler beim Laden: " .. (err or "unbekannt")
  end

  -- WICHTIG: KEIN äußerer Wrapper hier! Der kommt aus der Vorlage.
  local html = mw.html.create()

  -- Rekursive Funktion für Seiten & Untergruppen
  local function render_list_items(parent_html_node, page_list)
    local ul = parent_html_node:tag("ul")

    for _, item in ipairs(page_list) do
      local li = ul:tag("li")

      -- Fall 1: normaler Link
      if item.link and item.label then
        if item.link == currentTitle then
          li:addClass("active")
        end
        li:wikitext(string.format("[[%s|%s]]", item.link, item.label))

      -- Fall 2: Untergruppe
      elseif item.group and item.pages then
        li:addClass("help-sidebar-subgroup")

        -- klickbarer Header (TOC-safe)
        li:tag("div")
          :addClass("help-sidebar-header")
          :attr("role", "button")
          :attr("aria-expanded", "false")
          :wikitext(item.group)

        -- rekursiv: Unterliste direkt danach
        render_list_items(li, item.pages)
      end
    end
  end

  -- Hauptgruppen (Ebene 0)
  for _, groupData in ipairs(data) do
    html:tag("div")
      :addClass("help-sidebar-header")
      :attr("role", "button")
      :attr("aria-expanded", "false")
      :wikitext(groupData.group)

    render_list_items(html, groupData.pages)
  end

  return tostring(html)
end

return p