Zwischenüberschriften im XWiki verlinken.

4. Februar 2011


 

Eigentlich sollten die einzelnen Seiten im Wiki eher kurz gehalten sein, und für spezielle Erläuterungen Unterseiten angelegt werden. Soweit die Idealvorstellung, aber in der Praxis sieht es oft anders aus – manchmal auch aus guten Gründen. (Ich denke da nur an unsere FAQ-Seiten …). Wenn eine Seite erstmal lang geworden ist, dann stellen die Zwischenüberschriften oft eine gute Unterteilung dar. Nicht selten will man dann auf eine Zwischenüberschrift linken – und genau dazu gibt es in HTML Anker.

Wenn auf der Seite selber ein Inhaltsverzeichnis angegeben werden soll, geht das automatisch mit dem „Table of Contents“ Makro. Dieses Makro mit dem WYSIWYG-Editor einzufügen ist einfach, wenn man weiß, dass es so etwas gibt. (Leider fehlen zur Zeit noch Übersetzungen für die Makros.)
Wer Probleme hat, das Makro zu finden, kann in dem Drop-down die Liste der Makros auf die Kategorie „Navigation“ einschränken.

Wer lieber mit der Wiki-Syntax arbeitet, gibt im „Quelle“-Editor schnell ein {{toc /}}, oder ausführlicher mit allen Optionen: {{toc depth="4" numbered="true" scope="local" start="2"/}}

Aus dem Inhaltsverzeichnis lassen sich die Links zu Überschriften theoretisch mit Copy & Paste in den WYSIWYG-Editor herüberkopieren – leider bedarf es danach aber noch der Nachbesserung in Quellen-Editor, damit das auch wirklich funktioniert. Wenn also sowieso in der Wiki-Syntax herumgedoktort werden muss, kann es nicht schaden, zu wissen, was XWiki da eigentlich macht.

XWiki geht bei der Erstellung der Anker relativ einfach vor: Der Anker einer Überschrift besteht aus dem initialen großen ‚H‘, gefolgt von dem Text der Überschrift, wobei aber alles außer einfache Buchstaben und Ziffern weggelassen wird. (Gibt es zwei gleichbenannte Anker, wird dem zweiten eine ‚-1‘, der dritte mit ein ‚-2‘, usw. angehangen.)
Beispielsweise sieht so ein Link auf die „Macros“-Überschrift der Spielwiese aus, die in jedem Wiki vorinstalliert ist:


Mit Copy & Paste im WYSIWYG-Editor erstellte Links sehen leider so aus:


Das lässt sich dann schnell manuell reparieren zu:


Wer nicht gerne dem WYSIWYG-Editor hinterherarbeitet, kann den Anker des Links auch gleich im Quellen-editor eingeben. Lästig ist dazu nur, die Ankertext zu berechnen … aber das lässt sich auch automatisieren, am einfachsten mit dem folgenden Panel:

  • Name z.B: AnkerErzeuger
  • Eingabe: edit
  • Code: den folgenden Text:
    #panelheader("Anker erstellen")
    $xwiki.jsx.use("Panels.AnkerErzeuger")
     




     

    #panelfooter()

Dazu gehört noch etwas JavaScript – das ist nicht hier inline eingebunden, weil leider der XWiki-Parser gewisse Zeichen innerhalb des JavaScript interpretiert; insbesondere wird der benutzte reguläre Ausdruck [^a-z0-9] wegen der eckigen Klammern als ein (kaputter) Link interpretiert.

Also nach dem Anlegen des Panels und Abspeichern des Inhalt in den „Objekte“-editor gehen, und ein Objekt der Klasse „XWiki.JavaScriptExtension“ anlegen:

  • Name: z.B. „Anker anlegen“(oder leer lassen)
  • Code: den folgenden Text:
    function calculateAnchor(form) {
      var headline = form.elements.hdl.value;
      var anchor = '#H' + headline.replace(/[^a-z0-9]/gi,'');
      document.getElementById('calculatedAnchor').value = anchor;
      document.getElementById('calculatedAnchor').select()
    }
    document.observe("xwiki:dom:loaded", function(){
      document.getElementById('calculatedAnchor').onclick = function() {
        this.select();
      }
    })
  • Use this extension: „On demand“
  • Parse content: „Nein“
  • Caching policy: kann leer gelassen werden

Jetzt muss das Panel nur noch im Editor verwendung finden. Leider gibt es für die Editoransicht keinen Panel-wizard; statt dessen muss eine Kopie einer Konfigurationsdatei an den aktuellen Skin angehangen werden. Also noch etwas Magie: Zu der Seite XWiki.DefaultSkin Seite wechseln, und dort eine Datei mit dem Name editpanelsvars.vm hochladen, die z.b. für unsere Kundenwikis folgenden Inhalt haben sollte:

## Definition der Panels, die für die verschiedenen Editiereansichten verwendet werden
#set($editorPanelsWiki = "Panels.DocumentInformation,Panels.EditTranslations,Panels.SyntaxHelp,Panels.Spickzettel,Panels.AnkerErzeuger")
#set($editorPanelsWysiwyg = "Panels.DocumentInformation,Panels.EditTranslations,Panels.SyntaxHelp,Panels.Spickzettel")
#set($editorPanelsObjects = "Panels.ObjectEditorWelcome,Panels.AddObject")
#set($editorPanelsClass = "Panels.ClassEditorWelcome,Panels.AddClassProperty")
#set($editorPanelsRights = "Panels.RightsEditorWelcome,Panels.RightsHelp,Panels.RightsTips")

Wer ein selbst-gehostetes Wiki hat, findet die Vorlage auf dem Dateisystem unter /templates/editpanelsvars.vm. Das Panel wird einfach bei der Variable $editorPanelsWiki ergänzt.

Danach steht das Panel im Editor bereit. Die fragliche Überschrift muss leider noch manuell z.B. aus einem separaten Browsertab herüberkopiert werden; aber zumindest das Erraten des Ankers erledigt sich damit.