Ophelia: Anwendungsbeispiel


English version

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:

Bei entsprechender Konfiguration des Servers (siehe die Installationshinweise) stellt es folgende Ressourcen zur Verfügung:

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.


02.10.2015