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:
connect
wird einmal ausgeführt, um eine Verbindung zur Bücherei herzustellen.
Die Variablen$username
und$password
enthalten die entsprechenden Benutzerdaten. Außerdem kann man auf alle in der Büchereimetadatendatei von Punkt 1 definierten Variablen zugreifen.update-all
wird jedesmal ausgeführt, um die Medienliste zu aktualisieren und ist die einzige notwendige Aktion.
Es sind dieselben Variablen, wie beim Aufrufconnect
definiert, sowie alle Variablen, die vonconnect
definiert wurden.update-single
wird direkt nachupdate-all
ausgeführt und zwar einmal für jedes Buch, welchesupdate-all
gefunden hat.
Die Variable$book
enthält das jeweilige Buch.renew-all
wird ausgeführt, wenn alle Medien verlängert werden sollen.renew-list
wird zum Verlängern von mehreren Medien ausgeführt.
Die Variable$renew-books
enthält die Liste aller zu verlängernden Bücher.renew-single
wird ausgeführt, um ein einzelnes Buch zu verlängert.
Die Variablebook
enthält das jeweilige Buch.search
wird ausgeführt, um im Katalog zu suchen.
Die Variablebook
enthält die Parameter für eine Suchanfragesearch-next-page
wird ausgeführt, um die nächste Seite der Suchergebnisse zu laden.search-details
wird ausgeführt, um die Details zu einem Suchergebnis abzufragen.
Die Variablebook
enthält das abzufragende Suchergebnis.
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"), "&")</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.