Styles für Namespaces im Dokuwiki
Dokuwiki ist ein tolles Open Source Tool um es firmenintern einzusetzen. Mir erscheint es von Look & Feel allerdings nicht gerade sehr schick. Ich würde sagen, für diese Aufgabe ist es OK. In Zeiten von css kann das Dokuwiki natürlich an die eigenen Bedürfnisse angepasst werden. Dafür gibt es die Möglichkeit, User-Stylesheets anzulegen. Für das User-Stylesheet kann im Dokuwikiverzeichnis unter conf/userstyle.css ein User-Stylesheet angelegt werden.
Wenn man das Dokuwiki allerdings schon einige Jahre im Einsatz hat, sollten wohl eher keine globalen Änderungen vorgenommen werden, weil Mitarbeiter ihre Seiten schon im Hinblick auf das Erscheinungsbild erstellt haben. Der Ausweg aus dieser Lage wird mit den Namespaces eröffnet, denn die eigenen Styles können mit geringem Aufwand auf Namespaces beschränkt werden. Der Namespace wird in den meisten Themes als Klasse im Body-Tag eingetragen
<body class="namespace-beispiel">
Damit ist es möglich, ein auf den Namespace "beispiel" beschränktes Stylesheet anzulegen.
body.namespace-beispiel #dokuwiki__content {
font-size: 18px;
line-height: 170%;
}
Leider funktioniert das nicht mit dem Standard-Theme "dokuwiki", denn in diesem Theme wird das class-Attribut nicht gesetzt. Ein sehr einfacher Hack ermöglicht es aber dieses Problem zu umschiffen. Dazu muss eine Kleinigkeit im PHP-Code des Themes angepasst werden. Unter
/var/www/dokuwiki/lib/tpl/dokuwiki
ist das Standard-Theme "dokuwiki" zu finden. Hier muss eine Kleinigkeit in der Datei main.php geändert werden. Dort sucht man das <body>-Tag und ersetzt es durch:
<body class="namespace-<?php echo hsc($INFO['namespace']); ?>">
Diese Lösung ist einfach und schnell zu machen. Sie hat allerdings den Nachteil, dass sie beim nächsten Updates des Dokuwikis wahrscheinlich entfernt wird. Diese Lösung ist also nicht robust gegen Updates. Ich habe deswegen, ein minimales Plugin erstellt, dass diese Änderung automatisch vornimmt. Damit ist die Lösung dann auch bei Updates sicher:
Im Dokuwiki-Verzeichnis muss unter lib/plugins ein Verzeichnis (z.B. bodynamespace) für das Plugin angelegt werden. Dort muss eine Datei action.php mit dem Plugin-Code angelegt werden:
<?php
if (!defined('DOKU_INC')) die();
class action_plugin_bodynamespace extends DokuWiki_Action_Plugin {
public function register(Doku_Event_Handler $controller) {
$controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'add_namespace_body_class');
}
public function add_namespace_body_class(Doku_Event $event, $param) {
global $INFO;
if (!empty($INFO['namespace'])) {
$nsclass = 'namespace-' . preg_replace('/[^a-zA-Z0-9\-_]/', '-', $INFO['namespace']);
$event->data['body'][] = ['class' => $nsclass];
}
}
}
?>
Dieser Plugin-Code fügt das class-Attribut an das body-Tag an, so wie wir es oben manuell gemacht haben. Damit diese Plugin auch im Dokuwiki angezeigt und genutzt werden kann, muss noch eine weitere Definitionsdatei plugin.info.txt im gleichen Verzeichnis erstellt werden:
base bodynamespace
author <eigener Name>
email <eigene Mail-Adresse>
date 2025-07-11
name Body Namespace Class
desc Fügt dem Body-Tag automatisch eine Klasse namespace-XYZ hinzu
url <eigener Dokumentationslink>
Wer also nach einem Update sicher sein will, dass die Änderung noch enthalten ist und die Lösung weiterhin funktioniert, sollte diesen kleine Plugin-Code bevorzugen. Natürlich kann auch die oben beschriebene Änderung nach einem Update manuell nachgezogen werden. Nachdem der Code erfasst worden ist, darf man nicht vergessen, das plugin auch in den Einstellungen zu aktivieren.
Referenzen