WvdS Snippet Plugin
Snippet setzt wiederverwendbare HTML-Bausteine in eine Seite ein – über die Marke {{wk:snippet>kennung}}, unabhängig von der Einstellung htmlok. Ein Snippet wird einmal definiert und überall dort eingesetzt, wo es gebraucht wird. Gedacht ist das Paket für Autoren, die wiederkehrende Blöcke nicht abschreiben wollen, und für Verwalter, die den Bestand an Snippets pflegen.
Erste Schritte
Schnelleinstieg: Ein Snippet anlegen und einbinden – der kürzeste Weg zum ersten Ergebnis, in drei Schritten.
Snippet anlegen → Marke auf einer Seite setzen → Ergebnis prüfen
Häufige Aufgaben
| Was Sie wollen | Für wen | Wo Sie das tun | Anleitung |
|---|---|---|---|
| ein Snippet einsetzen | Autor | Marke {{wk:snippet>kennung}} | Syntax |
| ein Snippet anlegen oder ändern | Verwaltung | Administration > Snippets | Snippet-Definition |
| ein Snippet mit Werten füllen | Autor | Parameter der Marke | Beispiele |
| verstehen, warum HTML hier erlaubt ist | Verwaltung | – | Sicherheit |
| herausfinden, warum ein Snippet leer bleibt | Autor | – | Fehlerbehandlung |
| ein Snippet aus einem anderen Paket ansprechen | Entwickler | – | Integration |
| eine Einstellung ändern | Verwaltung | Konfigurationsmanager | Konfiguration |
Definition
Das wksnippet Plugin ermöglicht wiederverwendbare HTML-Bausteine (Snippets) mit zentraler Verwaltung. Es bietet eine sichere Alternative zu htmlok und erlaubt die Kombination von HTML mit mehrsprachigen Übersetzungen.
Anwendungsfälle
- Navigationsmenüs - Hauptmenü, Sidebar-Navigation zentral verwalten
- Wiederholende Elemente - Footer, Kopfzeilen, Buttons
- Lokalisierte Komponenten - HTML mit integrierter Mehrsprachigkeit
- Widget-ähnliche Blöcke - Social Media Links, Kontaktboxen
- Template-Erweiterungen - Komplexe HTML-Strukturen in Wiki-Seiten
Syntax
{{wk:snippet>key}}
Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
| key | string | Dateiname des Snippets (ohne .html Extension) |
php | Zusatz |php | optional: PHP-Code im Snippet ausführen – nur unter den Bedingungen im Abschnitt Konfiguration |
Snippet-Definition
Datei-basierte Speicherung
Jedes Snippet ist eine eigene HTML-Datei. Das Paket liest zwei Verzeichnisse:
Snippets der Site: <savedir>/wksnippet/ – hierhin schreibt der Verwaltungsbildschirm. Das Verzeichnis liegt neben data/pages, gehört damit zur selben Sicherung und übersteht jede Neuinstallation des Plugins.
Mitgelieferte Snippets: lib/plugins/wksnippet/snippets/ – Vorgaben, die mit dem Plugin kommen; nur lesend, bei jeder Installation ersetzt.
lib/plugins/wksnippet/snippets/. Das Verzeichnis ist Teil des Codes und wird bei jeder Installation oder Aktualisierung des Plugins vollständig ersetzt; ein dort abgelegtes Snippet ist danach verloren.
Dateiformat: {key}.html. Hat ein Snippet der Site denselben Schlüssel wie ein mitgeliefertes, gilt das der Site; wird es gelöscht, gilt wieder das mitgelieferte.
<savedir>/wksnippet/ ├── main_menu.html ├── contact_box.html └── footer.html lib/plugins/wksnippet/snippets/ ├── alert_box.html ├── breadcrumb_separator.html ├── go_back.html └── social_links.html
Regeln
| Regel | Beschreibung |
|---|---|
| Dateiname | Entspricht dem Snippet-Key (z.B. main_menu.html → {{wk:snippet>main_menu}}) |
| Inhalt | Vollständiger HTML-Code in der Datei |
| Mehrzeilig | Beliebig viele Zeilen möglich |
| wki18n | ... Tags werden verarbeitet |
| HTML | Vollständiges HTML erlaubt |
Erlaubte Inhalte
| Inhaltstyp | Beispiel |
|---|---|
| HTML-Tags | <div>, <nav>, <ul>, etc. |
| CSS-Klassen | class="my-class" |
| Inline-Styles | style="color: red;" |
| JavaScript | onclick="..." (mit Vorsicht) |
| Font Awesome | <i class="fa fa-home"></i> |
| wki18n Tags | Startseite |
| Inline-Übersetzungen | de:Text|en:Text |
Konfiguration
Admin-Einstellungen
Über Admin → Konfiguration → wksnippet:
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
allowPhp | An/Aus | Aus | PHP-Code in Snippets erlauben (Sicherheitsrisiko!) |
PHP-Code in einem Snippet wird nur ausgeführt, wenn drei Bedingungen zugleich erfüllt sind: Die Marke trägt den Zusatz |php ({{wk:snippet>key|php}}), allowPhp ist eingeschaltet, und die DokuWiki-Einstellung phpok ist eingeschaltet. allowPhp gibt die Ausführung für dieses Plugin frei, phpok für das ganze Wiki; keiner der beiden Schalter ersetzt den anderen. Fehlt eine Bedingung, wird der Inhalt unverändert ausgegeben und kein PHP ausgeführt.
Admin-Interface
Über Admin → Snippets können Snippets direkt verwaltet werden:
| Funktion | Beschreibung |
|---|---|
| Snippet-Liste | Alle verfügbaren Snippets mit Vorschau anzeigen |
| Snippet bearbeiten | HTML-Inhalt im geteilten Editor ändern: links der Quelltext mit HTML-Hervorhebung, rechts die gerenderte, bearbeitbare Vorschau – Baustein htmlSplitEditor() aus wkfluentui (Vertrag). Ansicht umschaltbar (Quelle | Geteilt | Vorschau) und je Benutzer gemerkt. Ohne JavaScript bleibt es eine gewöhnliche Textarea. |
| Neues Snippet | Neuen Snippet-Key erstellen |
| Snippet löschen | Snippet-Datei entfernen (mit Bestätigung) |
In der Vorschau erscheint jeder Platzhalter ({{wk:lang>…}},
{{wk:image>…}}) als unteilbarer Chip mit dem vollen Token im
Tooltip – er wird byteweise unverändert gespeichert. <style>- und
<script>-Blöcke eines Snippets wirken nur innerhalb der Vorschau
(Sandbox-iframe ohne Skriptausführung), nicht auf die Admin-Seite.
Eine Bearbeitung in der Vorschau schreibt den Quelltext neu formatiert
zurück; ein einzelnes Strg+Z im Quelltextfeld nimmt das zurück. Wer nur
links arbeitet, ändert an der Formatierung der Datei nichts.
Beispiel-Snippet (main_menu.html)
Datei: <savedir>/wksnippet/main_menu.html
<nav class="main-menu"> <ul class="menu-list"> <li class="menu-item"><a href="?id=start">Startseite</a></li> <li class="menu-item"><a href="?id=docs">Projekt-Dokumentation</a></li> <li class="menu-item"><a href="?id=contact">Kontakt</a></li> </ul> </nav>
Beispiel-Snippet (go_back.html)
Datei: lib/plugins/wksnippet/snippets/go_back.html
<div class="go-back"> <i class="fa fa-arrow-left"></i> <a href="javascript:history.back()">Zurück</a> </div>
Beispiele
Beispiel 1: Hauptmenü in Sidebar
Anforderung: Zentrales Navigationsmenü für alle Seiten.
Snippet-Datei: <savedir>/wksnippet/main_menu.html
<nav class="main-menu"> <ul> <li><a href="?id=start">Startseite</a></li> <li><a href="?id=de:docs:start">Projekt-Dokumentation</a></li> </ul> </nav>
Verwendung in sidebar.txt:
~~NOCACHE~~
{{wk:snippet>main_menu}}
Ergebnis:
- Menü erscheint auf allen Seiten
- Übersetzungen werden automatisch angewendet
- Änderungen über Admin-Interface oder direkt in der Datei
Beispiel 2: Zurück-Link mit Icon
Anforderung: Einheitlicher Zurück-Link in Unter-Namespaces.
Snippet-Datei: <savedir>/wksnippet/go_back.html (überdeckt das mitgelieferte Snippet mit demselben Schlüssel)
<div class="go-back" style="margin-bottom: 1em;"> <i class="fa fa-arrow-left" style="margin-right: 0.5em;"></i> <a href="javascript:history.back()">de:Zurück|en:Back|sl:Nazaj</a> </div>
Verwendung in sidebar1.txt:
~~NOCACHE~~
{{wk:snippet>go_back}}
{{wk:acmenu}}
Beispiel 3: Kontaktbox
Anforderung: Wiederverwendbare Kontaktinformationen.
Snippet-Datei: <savedir>/wksnippet/contact_box.html
<div class="contact-box"> <h4>de:Kontakt|en:Contact|sl:Kontakt</h4> <p> <i class="fa fa-envelope"></i> info@example.com<br> <i class="fa fa-phone"></i> +49 123 456789 </p> </div>
Verwendung:
{{wk:snippet>contact_box}}
Beispiel 4: Mehrsprachiger Footer
Anforderung: Footer mit dynamischem Jahr und lokalisierten Links.
Snippet-Datei: <savedir>/wksnippet/footer.html
<footer class="site-footer"> <div class="footer-content"> <p>© 2026 conf:title</p> <nav class="footer-links"> <a href="?id=impressum">menu_imprint</a> | <a href="?id=datenschutz">menu_privacy</a> | <a href="?id=sitemap">menu_sitemap</a> </nav> </div> </footer>
Funktionsweise
Verarbeitungs-Pipeline
1. Syntax-Erkennung
└── Findet alle {{wk:snippet>...}} Tags
2. Snippet-Lookup
└── Sucht {key}.html: zuerst <savedir>/wksnippet/,
sonst lib/plugins/wksnippet/snippets/
└── Lädt den HTML-Inhalt aus der Datei
3. Marken im Snippet
└── Ersetzt {DOKU_BASE}, {{wk:image>...}} und ...
└── Wendet aktuelle Sprache an
4. HTML-Ausgabe
└── Entfernt HTML-Kommentare des Snippets
└── Fügt den HTML-Code in die Seite ein
└── Keine zusätzliche Escaping (Raw HTML)
Verarbeitungsreihenfolge
| Priorität | Plugin | Sort-Wert |
|---|---|---|
| 1 | wki18n | 1 |
| 2 | wksnippet | 50 |
| 3 | wkimage | 319 |
wk:i18n und wk:image innerhalb eines Snippets laufen nicht durch den Seitenparser: Der Helfer von wksnippet ersetzt sie selbst, wenn er das Snippet einsetzt. Übersetzungen in Snippets funktionieren deshalb unabhängig von der Reihenfolge der Plugins.
Integration
Mit wki18n
Snippets unterstützen alle wki18n-Syntaxen:
Datei: <savedir>/wksnippet/multilingual_block.html
<div class="info"> greeting de:Hallo|en:Hello|sl:Zdravo {{wk:lang:en>english_only_text}} </div>
Mit wkacmenu
Typische Sidebar-Struktur:
~~NOCACHE~~
{{wk:snippet>go_back}}
{{wk:acmenu}}
Mit wkimage
Snippets können auch Bilder enthalten:
Datei: <savedir>/wksnippet/logo_block.html
<div class="logo"> {{wk:image>wiki:logo.png|width=100%|maxwidth=200}} </div>
Sicherheit
Vorteile gegenüber htmlok
| Aspekt | htmlok | wksnippet |
|---|---|---|
| HTML-Eingabe | Frei in jeder Seite | Nur über Admin |
| Sicherheitsrisiko | Hoch (XSS, Injection) | Niedrig (kontrolliert) |
| Audit | Schwierig (verstreut) | Einfach (zentral) |
| Benutzer-Rechte | Jeder mit Bearbeitung | Nur Administratoren |
Best Practices
- JavaScript minimal halten - Nur wenn unbedingt nötig
- Externe Links mit target=„_blank“ - Sicherheit mit
rel=„noopener“ - Keine sensiblen Daten - Keine API-Keys, Passwörter in Snippets
- Eindeutige Namen - Snippet-Namen aussagekräftig wählen
Fehlerbehandlung
Verhalten bei Fehlern
| Szenario | Verhalten |
|---|---|
| Snippet nicht gefunden | Gibt nichts aus. Der Helfer liefert den Kommentar <!– snippet 'key' not found –>, und die Ausgabe entfernt HTML-Kommentare vor der Auslieferung; im Quelltext der Seite steht er deshalb nicht. Die Seite wird weiter aufgebaut. |
| Leeres Snippet | Gibt nichts aus |
Datei ohne Endung .html | Wird nicht geladen; der Schlüssel gilt als nicht vorhanden |
| wki18n-Fehler | Gibt Key zurück (Fallback) |
Debugging
Bei Problemen prüfen:
- Ist der Snippet-Name korrekt geschrieben?
- Existiert die Datei
<savedir>/wksnippet/{key}.htmloderlib/plugins/wksnippet/snippets/{key}.html? - Hat die Datei die Erweiterung
.html? - Ist
gesetzt für dynamische Inhalte? - Funktionieren die wki18n-Tags einzeln?
Performance
Empfehlungen
| Szenario | Empfehlung |
| Statische Snippets | Cache aktiviert lassen |
| Dynamische Snippets (Sprache) | verwenden |
| Große Snippets | In kleinere aufteilen |
| Viele Snippets | Nicht mehr als 50 definieren |
Caching
am Anfang haben, damit die richtige Sprachversion angezeigt wird.
Versionshinweise
| Version | Datum | Änderungen |
|---|---|---|
| 2.1.0 | 2026-01-26 | Admin-Interface, Datei-basierte Speicherung (HTML-Dateien) |
| 2.0.0 | 2026-01-06 | Umbenennung von wvdschunk zu wksnippet |
| 1.0.0 | 2025-01-06 | Erstveröffentlichung |
Siehe auch
- WvdS Internationalization (i18n) - Mehrsprachige Übersetzungen
- AcMenu Plugin - Akkordeon-Menü
- WvdS Responsive Image Plugin - Responsive Bilder
- WvdS.DokuWiki.Flat Template - Template-Erweiterungen
Technische Referenz
Klasse: syntax_plugin_wksnippet
Datei: lib/plugins/wksnippet/syntax.php
| Methode | Beschreibung |
|---|---|
getType() | Gibt substition zurück (so schreibt der DokuWiki-Kern den Modus) |
getSort() | Gibt 50 zurück |
connectTo($mode) | Registriert Pattern \{\{wk:snippet>[a-zA-Z0-9_-]+(?:\|php)?\}\} |
handle($match, …) | Extrahiert Snippet-Namen |
render($mode, …) | Gibt HTML-Inhalt aus |
Klasse: helper_plugin_wksnippet
Datei: lib/plugins/wksnippet/helper.php
| Methode | Parameter | Rückgabe | Beschreibung |
|---|---|---|---|
getSnippets() | - | array | Lädt die Snippets aus beiden Verzeichnissen (die der Site überdecken die mitgelieferten) |
get() | $name | string | Gibt Snippet-Inhalt zurück |
Klasse: admin_plugin_wksnippet
Datei: lib/plugins/wksnippet/admin.php
| Methode | Beschreibung |
|---|---|
html() | Rendert Admin-Interface |
handle() | Verarbeitet Formular-Aktionen (speichern, löschen, erstellen) |
Dateistruktur
lib/plugins/wksnippet/
├── admin.php → Admin-Interface
├── helper.php → Snippet-Laden und -Verarbeitung
├── syntax.php → Wiki-Syntax Parser
├── conf/
│ ├── default.php → Standard-Einstellungen
│ └── metadata.php → Admin-UI Metadaten
└── snippets/ → mitgelieferte Snippets (nur lesend)
├── go_back.html
├── social_links.html
└── ...
<savedir>/wksnippet/ → Snippets der Site (hierhin schreibt der Verwaltungsbildschirm)
<wk:audit stack=„doku“ title=„wksnippet Plugin“>
<wk:include ref="code:qualitaet" critical="true">[x][x][x][x]</wk:include> <wk:include ref="stacks:dokuwiki-php">[x][x][x][x][x]</wk:include> <wk:include ref="sicherheit:kritis" critical="true">[x][x][x][-][-]</wk:include>
</wk:audit>
DISCUSSION
Paketangaben
Plugin: wksnippet
Version: 2.1.0
Namespace: lib/plugins/wksnippet/
Autor: Wolfgang van der Stille Wolfgang.van.der.Stille@gmail.com (The White Knight Labs)
Lizenz: GPL 2