2. Template anlegen

In einem Template beschreibt man VideLibri, wie die Internetseite einer Bücherei aufgebaut ist. Diese Beschreibung ist im Grunde eine Liste aller Webseiten des Bibliotheks-Katalog, sortiert nach Aktionen wie "Aktualisieren" oder "Verlängern". Für jede Seite kann man ein Pattern angeben, das markiert welche Daten auf der Seite relevant sind, z.B.: Mediendaten oder der Link zur nächsten Seite.

Um ein Template zu erstellen, muss man ein Verzeichnis namens libraries\templates\xxxxx anlegen, wobei xxxxx der Name des Templates ist. Unter Windows kann man es entweder im Anwendungsverzeichnis unter data erstellen, oder in den Lokalen Anwendungsdateien. Unter Linux geht es unter /usr/share/videlibri/data und ~/.config/VideLibri/. Unter gerooten Android-Geräten ist es /data/data/de.benibela.videlibri/files/.
Dort erstellt man dann wiederum eine XML-Datei namens template mit dieser Struktur:

<actions>

<action id="connect">
  <page url="...die Adresse einer Seite..." >
    <post name="post variable name"> Daten, die zur Seite gesendet werden sollen </post>
    ...
    <pattern>Einzelseiten-Pattern mit den relevanten Teil des Bibliotheks-OPAC (siehe Patterns)  </pattern>
  </page>
  
  ...
  
</action>

<action id="update-all">
 
  ...

</action>

<action id="update-single">
 
  ...

</action>

<action id="renew-(all|list|single)"> 
</action>

...

<action id="search">
</action>

<action id="search-next-page">
</action>

<action id="search-details">
</action>


</actions>

Ein solches actions-Template besteht aus einer Liste von <action> Aktionen, die jeweils beschreiben, welche Seiten aufzurufen sind. VideLibri unterstützt die folgenden Aktionen, wobei es nicht nötig ist, alle anzugeben:

Für ein einfaches Anzeigen aller ausgeliehenen Bücher, muss man nur update-all definieren.

update-single ist insbesondere nicht nötig, wenn update-all bereits genügend Information über alle Bücher ermitteln kann. (aber viele Büchereien zeigen auf der Gesamtübersicht nicht an, ob ein Buch verlängerbar ist.)
renew-all, renew-list, renew-single werden nur benötigt, wenn die Bücher tatsächlich verlängert werden sollen. Es ist dabei nicht nötig, alle anzugeben. Wenn es zum Beispiel renew-list nicht gibt, und mehrere Bücher verlängert werden sollen, ruft VideLibri automatisch renew-single für jedes dieser Bücher einzeln auf. Gibt es auch renew-single nicht, wird in diesem Fall renew-all aufgerufen.
search, search-next-page, search-details werden nur für die Suche im Katalog benötigt, und für die Anzeige der Ausleihen ignoriert.

Für jede Aktion gibt man dann an, welche Seiten des Katalogs betroffen sind, indem man für jede Seite ein <page>-Element schreibt. Die Seiten aller page-Elemente werden der Reihe nach aufgerufen werden.
Das Attribut url gibt jeweils die Adresse der Seite an.
Mittels <post name="..Name.." value="..Wert.."/> können HTTP-Postvariablen definiert werden, die beim Seitenaufruf übertragen werden sollen. (Hinweis: ältere Versionen haben stattdessen <post name="..Name..">..Wert..</post> verwendet, was in Zukunft nicht mehr unterstützt werden wird.). Gibt es keine <post>-Elemente wird ein GET-Request gesendet. Außerdem werden Sonderzeichen in name und value im URL-Format kodiert, es sei denn es ist kein name-Attribut angegeben (was nützlich ist, um mehrere Werte anzugeben).
Für jede dieser Seiten kann ein Seiten-Pattern angelegt werden, um die auf der Seite enthaltenden Informationen, wie Bücherlisten oder die nächsten URLs, auszulesen. Dazu erstellt man ein <pattern>-Element, welches den Inhalt des Patterns direkt enthält oder mit einem href Attribute zum Pattern in einer Extradatei verlinkt.
Es gibt auch ein test-Attribut, das eine Bedingung für diese Seite angibt. Diese Bedingung ist ein XPath/XQuery-Ausdruck, und die Seite wird nur verarbeitet, wenn die Bedingung erfüllt ist.

Ein einfaches Element ist <s>, welches einen beliebigen XPath/XQuery-Ausdruck berechnet. <s>$abc := 1+2+3</s> speichert 6 in der Variable $abc. <s>vl:delete-current-books()</s> löscht die aktuelle Ausleihenliste.

Zudem gibt es auch <variable>-Elemente, mit denen im Template neue Variablen definiert werden können: <variable name="foobar" value="123"/> definiert eine Variable mit Name $foobar und dem Stringwert 123. Alternativ kann eine Variable mit <variable name="foobar">123</variable> definiert werden, wodurch eine Variable mit Name $foobar und dem Integerwert 123 definiert wird. In diesem Fall kann statt 123 jeder beliebige XPath/XQuery-Ausdruck angegeben werden (z.B.: um reguläre Ausdrücke auf andere Variablen anzuwenden). Das value-Attribut definiert aber immer einen String.

Auf alle definierten Variablen, kann innerhalb von anderen XPath/XQuery-Ausdrücken mit $variablename zugegriffen werden. Außerdem wird in string-Attributen (wie url, oder value) jedes Vorkommen von {$variablename} durch den Wert der Variablen ersetzt.
VideLibri verwendet eine erweiterte XPath/XQuery-Syntax, die auch Objektvariablen unterstützt: Wenn z.B.: die Variable $book die Daten zu einem Buch enthält, kann mittels $book.title auf den Buchtitel, und mittels $book.author auf den Autor zugegriffen werden. (siehe die Dokumentation für Seiten-Template für eine Übersicht über alle Buch-Eigenschaften)
Diese Objekterweiterung wird auch in einem Spezialfall von den url-Attributen von <page> verwendet: Wenn url="{$variable}" auf eine einzige Variable verweist und diese Variable ein Objekt ist, wird die Eigenschaft $variable.url als URL für den Seitenaufruf verwendet. Desweiteren wird $variable.post für die Postdaten verwendet. Ein entsprechendes Objekt kann zum Beispiel mit der Funktion form(//form[1]) in einem XPathausdruck erstellt werden (dies würde die Daten der ersten Form auf einer Seite enthalten).
Die Variable $renew-books der renew-list-Aktion enthält eine Liste von Buchobjekten, und lässt sich am besten mit XPath-for-Ausdrücken verwenden. Z.B.: Wenn jedes Buchobject eine (benutzerdefinierte) Eigenschaft renewid hat, die auf true gesetzt werden muss, kann eine Variable für das Postrequest mit folgendem XPath-Ausdruck erzeugt werden: <variable name="book-list">string-join(for $book in $renew-books return concat($book.renewid, "=true"), "&amp;")</variable> . (siehe eine Standardreferenz über XPath für Details).

Es ist gibt auch einen <call action="name"/> Befehl, um Aktionen von anderen Aktionen aus aufzurufen. Dabei werden auch neue, benutzerdefinierte Aktionen mit anderen Namen unterstützt.

Und schließlich gibt es ein <loop>-Element mit diesen beiden Syntaxformen: <loop var="varname" list="eine Liste"/> und <loop test="Bedingung"/>.
Die erste Form wiederholt die Kindelemente von loop wie ein üblicher foreach-Ausdruck für jeden Wert in der Liste eine Liste, wobei der jeweilige Wert der Variable $varname zugewiesen wird. Die zweite Form, wiederholt solange, wie test true ist.
Sowohl list wie auch test erlauben beliebige XPath/XQuery-Ausdrücke.
(durch dieses Element ist das Template eine Turing-vollständige Programmiersprache, und die update-single und renew-single-Aktionen sind im Grunde redunant.)


Unabhängig von VideLibri können diese Templates auch mit Xidel getestet werden, und mit dem Xidelscript kann ein Template für eine einzelne Aktion automatisch durch Markieren der jeweiligen Links/Buchtitel in Firefox erstellt werden (beides auf Englisch. Und üblicherweise muss es aber noch per Hand nachgebessert werden. ).