Die Dokumentation von Ophelia enthält ein kleines Anwendungsbeispiel, das auf dieser Site installiert ist und im folgenden erläutert wird.
Das Beispiel besteht im wesentlichen aus folgenden Verzeichnissen und Dateien:
- static/
- example.css
- foo/
- baz.html
- ophelia_pages/
- __init__
- index.html
- foo/
- __init__
- index.html
- bar.html
Bei entsprechender Konfiguration des Servers (siehe die Installationshinweise) stellt es folgende Ressourcen zur Verfügung:
- /
- /foo/
- /foo/bar.html
- /foo/baz.html
- /example.css
Dateien unter static/
werden so ausgeliefert, wie sie
sind:
static/foo/baz.html
<html> <head> <title>baz</title> </head> <body> <p> This page was not built by Ophelia. </p> </body> </html>
/foo/baz.html
Die Ressource /
wird dagegen aus Templates zusammengesetzt.
Dazu führt Ophelia zuerst das Python-Skript
in ophelia_pages/__init__
aus und verwendet das Template in der
gleichen Datei als Grundlage für die ausgelieferte Seite. Skript und
Template werden durch die Zeile <?xml?>
voneinander
getrennt:
ophelia_pages/__init__
site = __request__.site <?xml?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <link rel="stylesheet" type="text/css" href="" tal:attributes="href string:${site}example.css"/> <title tal:content="title" /> </head> <body> <h1 tal:content="title" /> <div tal:replace="structure innerslot" /> </body> </html>
Da diese Datei als Grundlage für jede aus Templates erstellte Seite des
Beispiels dient, setzt das enthaltene Python-Skript nur eine
Kontextvariable, die in jeder Seite benötigt wird: die Basis-URL des
Beispiels. Die Kontextvariable title
muß in einem anderen
Python-Skript gesetzt werden. Den Inhalt von innerslot
erstellt
Ophelia selbst aus den weiteren verwendeten Templates.
Da die URL /
keine weiteren Pfadanteile enthält, wird als
nächstes bereits die Datei ausgewertet, die den eigentlichen Inhalt der
Seite beschreibt: ophelia_pages/index.html
. Das Python-Skript
in dieser Datei muß nun den Titel der Seite setzen, und das Template darf
keinen weiteren innerslot
enthalten.
ophelia_pages/index.html
title = "Ophelia example site" <?xml?> <p> This is the index page of the <a href="http://www.thomas-lotze.de/software/ophelia/">Ophelia</a> example site located at <a href="http://www.thomas-lotze.de/software/ophelia/example/"> http://www.thomas-lotze.de/software/ophelia/example/</a>. </p> <p> Take a look at the <a href="foo/">foo</a>, <a href="foo/bar.html">foo/bar</a>, and <a href="foo/baz.html">foo/baz</a> pages. </p>
/
Um die Ressource /foo/
aufzubauen, muß Ophelia wiederum alle
auf dem Pfad liegenden Dateien mit Namen __init__
auswerten:
zuerst die bereits besprochene Datei ophelia_pages/__init__
,
und anschließend ophelia_pages/foo/__init__
:
ophelia_pages/foo/__init__
<div class="boxed" tal:content="structure innerslot" />
Diese Datei enthält nur ein Template, das als innerslot
in das
Haupttemplate eingesetzt wird. Andererseits fügt dieses Template selbst
einen innerslot
ein, der aus der nächsten behandelten Datei
befüllt wird. Die Wirkung des Templates
in ophelia_pages/foo/__init__
besteht darin, den Inhalt aller
unterhalb von /foo/
liegenden Seiten in
ein <div>
-Element zu fassen, das per CSS einen Rahmen
erhält.
Die letzte Datei, die zur Ressource /foo/
beiträgt,
ist ophelia_pages/foo/index.html
. Sie enthält wiederum ein
Python-Skript, das den Titel der Seite als Kontextvariable setzt, und ein
Template ohne innerslot
:
ophelia_pages/foo/index.html
title = "index page" <?xml?> <p> This is the index page of the foo folder. </p>
/foo/
Für die Ressource /foo/bar.html
wertet Ophelia
dieselben __init__
-Dateien aus wie für /foo/
, da
dieselben Verzeichnisse auf dem Pfad liegen. Lediglich die letzte
betrachtete Datei ist eine andere:
ophelia_pages/foo/bar.html
import datetime title = "bar page" now = datetime.datetime.now() <?xml?> <p> This is the bar page of the foo folder. The current date and time is <span tal:replace="now" />. </p>
/foo/bar.html
Vergleicht man ophelia_pages/foo/index.html
mit ophelia_pages/foo/bar.html
, so sieht man, daß mit Ophelia
wirklich nur nicht-wiederkehrender Code geschrieben werden muß. Alle
Gemeinsamkeiten zwischen /foo/
und /foo/bar.html
wurden genau einmal in einer der __init__
-Dateien festgehalten.