Diese Website demonstriert die Möglichkeiten von Stacay und bietet Unterstützung bei der Installation und Nutzung dieses CMS.
Optional kann man noch saubere URL aktivieren, in dem man die Datei htaccess im Wurzelverzeichnis in .htaccess umbenennt.
Stacey speichert alle Textinformationen nicht wie sonst üblich in einer Datenbank sondern in einfachen Textdateien und Verzeichnissen. Daher ist die Installation einfach, die Einrichtung einer Datenbank entfällt ebenso wie andere Setup-Schritte. Die Installation besteht nur darin, die Dateien auf den PHP-fähigen Webspace hoch zu laden.
Um eine neue Seite (oder ein neues Projekt) zu erstellen, legt man ein neues Verzeichnis an, kopiert dort hinein alle Bestandteile (Bilder, PDF-Dateien etc) und erstellt eine .txt-Datei. Das ist die eigentliche Inhaltsdatei, die nur aus einzelnen Textabschnitten besteht.
Das Templatesystem benutzt ganz normale HTML-Anweisungen mit einem einfachen Variablensystem. Es sind keinerlei PHP-Kenntnisse erforderlich, um eine Website zu erstellen. Einige Grundkenntnisse in HTML und CSS reichen aus, um eine den eigenen Vorstellungen entsprechende Website zu erstellen. Man kann natürlich das mitgelieferte Templateset nutzen oder geringfügig den eigenen Bedürfnissen anpassen. Zur Verwaltung der Navigation sowie zum Handling der Assets werden so genannte Partials benutzt. Um nun beispielsweise die Art und Weise der Navigation zu verändern muss man sich nicht mit irgendwelchem PHP-Code herumschlagen, sondern lediglich das entsprechende Partial anpassen.
Stacey stellt direkt RSS- und Atom-Feeds bereit.
/content
(aber natürlich nicht bereits selbst erstellte Inhalte), /public
und /templates
löschen/content
, /public
und /templates
an die Stelle kopieren,
wo sich die gelöschten Verzeichnisse gleichen Namens befanden.Herunterladen kann man Templates hier http://www.staceyapp.com/download-templates/.
Stacey ist ein CMS zur Erstellung dynamischer HTML-Seiten.
Das Projekt zielt auf zwei zentrale Grundsätze ab:
Diese werden direkt in den Verzeichnissen /content
und /templates
abgelegt.
Stacey verarbeitet alle dynamischen Teile der Webseite wie
Stacey verfügt über eine einfache Templatesprache und ein Partialsystem. Mit Hilfe dieser beiden Bestandteile hat der Nutzer vollständige Kontrolle über den HTML-Code, der erzeugt wird.
Stacey stellt einige einfache Templates im Portfolio-Stil bereit, um dem Anwender einen ersten Eindruck über die Funktionsweise des Systems zu vermitteln. Stacey ist jedoch dank seiner Flexibilität in der Lage, Websites von beeindruckender Flexibilität zu erzeugen.
Da Stacey das Dateisystem zur Speicheurng und Verwaltung der Daten nutzt, ist das System innerhalb kürzester Zeit einsatzbereit. Außerdem ist PHP beim Webhosting derart weit verbreitet, dass eine auf Stacey basierende Website sehr kostensparend bei nahezu jedem Webhoster erfolgen kann.
Da das Auslesen des Dateisystems bei größeren Websites zu Performanceeinbußen führen kann, nutzt Stacey eine Kombination von dateibasiertem Caching und E-Tag-Headers. Dadurch wird sichergestellt, dass die einzelnen Seiten so schnell wie möglich geladen werden. Das Cache-Sytem so intelligent, dass der Cache nur dann erneut wird, wenn der Inhalt verändert wurde.
Der gesamt Code von Stacey umfasst etwa 600 Zeilen. Daher ist es nicht allzu schwierig, diesen Durchzuarbeiten, um die Funktionsweise des Systems zu verstehen und es an die eigenen Zwecke anzupassen.
Das Projekt wird auf http://github.com/kolber/stacey bereitgestellt. Man muss sich also nicht scheuen, den Code durchzusehen, Verbesserungen, vorzuschlagen, eigenen Varianten zu erstellen oder (vermeintliche) Fehler zu beheben.
Jeder Unterverzeichnis im Hauptverzeichnis /content
, dass eine Datei .txt enthält wird zu einer HTML-Seite. Um eine neue Seite anzulegen, muss man demzufolge nur ein neues Unterverzeichnis anlegen und dort eine .txt-Datei erstellen. Der Name dieser .txt-Datei informiert das Stacey-System darüber, welches Template zur Anzeige der Seite benutzt werden soll. Eine Inhaltsdatei index.txt nutzt also die Templatedatei index.html, content.txt benötigt content.html usw.
Die Verzeichnisse kann man mit einem Zahlen-Präfix versehen. Die Seiten werden dann in der umgekehrt numerischen Reihenfolge angezeigt, der Zahlenpräfix wird bei der URL weggelassen.
Beispiel: Ein Verzeichnis mit dem Namen 1.projekt-name-10 hat also die URL http://deinedomain.de/projekte/projekt-name-10.
Wenn SEO-freundliche URL nicht aktiviert sind lautet die URL http://deinedomain.de/?/projekte/projekt-name-10.
Wenn man den Zahlen-Präfix weglässt, wird die Seiten in Kollektionen nicht angezeigt. Sie ist aber trotzdem über die URL direkt erreichbar.
Bei der Namensvergabe für Verzeichniss sollte man an Stelle des Unterstrichs (_) den Bindestrich (-) verwenden, wenn man Worte trennt.
Stacey unterstützt eine unbegrenzte Zahl von Verschachtelungsebenen.
Stacey fügt alle Bilder, die sich in einem Verzeichnis befinden, automatisch in die HTML-Seite ein. Ebenso wie die Seiten werden sie in umgekehrt numerischer Reihenfolge angezeigt.
Hier ein Bild
Bilder werden so eingefügt, wie sie sind. Das heißt, dass man sie sinnvollerweise vorher zurechtschneidet. Das Standardtemplate geht von einer maximalen Breite von 560 Pixel aus.
Bilder werden in einem Partial mit dem Namen :image gesammelt, das an einer beliebigen Stelle in einem Template eingefügt werden kann.
Video- und Flash-Dateien werden auf die gleiche Art eingefügt wie Bilder. Die entsprechenden Partials sind :video und :swf. Der Inhalt einer HTML-Datei wird dort eingefügt, wo sich das Partial :html befindet. Die kann nützlich sein, um YOUTUBE-Videos in eine Seite einzufügen.
Videos müssen mit den Abmessungen des Videos benannt werden, also zum Beispiel 1.800x600.mp4.
Außerdem erkennt Stacey alle anderen Assets innerhalb eines Verzeichnisses.
Jede Seite kann ein eigenes Vorschaubild haben. Man fügt dabei einfach eine Datei mit dem Namen thumb in das Verzeichnis ein (Erweiterung: .jpg, .png oder .gif).
In den Standardtemplates werden diese Vorschaubilder durch eine CSS-Anweisung versteckt. Um sie anzuzeigen, muss die entsprechende CSS-Datei (/public/docs/css/screen.css) angepasst werden. Dort befindet sich recht weit am Ende der Datei.
Hier ein Bild
img.project-thumb { ... display: none; }
Das muss geändert werden zu
img.project-thumb { ... display: inline; }
Diese Vorschaubilder können jede erdenkliche Größe haben. Im Standardtemplate ist für Thumbnails eine relativ kleine Größe vorgesehen.
Innerhalb des Verzeichnisses /content
gibt es eine Datei _shared.txt
. Wenn man diese Datei ( im Stacey-Download-Paket) mit einem Texteditor öffnet, findet man den folgenden Inhalt vor:
name: Name - profession: Graphic Designer - email: hi@yourdomain.com
Diese Angaben kann man mit den eigenen ersetzten. Man kann hier jedoch auch vollkommen neue Werte definieren. Sie sind dann überall verwendbar.
Alle Textdateien müssen mit dem UTF-8-Zeichensatz codiert werden. Dadurch können auch Zeichen verwendet werden, die nicht zum Standard-ASCII-Vorrat gehören. Das ist natürlich für deutschsprachige Webseiten besonders wichtig.
Die meisten Editoren können mit dem UTF-8-Zeichenssatz umgehen. Bereits der Windows-Standard-Editor kann bei richtiger Zeichensatzwahl die entsprechnden Dateiene erzeugen. wesentlich mehr Komfort bietet aber ein Editor wie Notepad++.
Mehr zum Thema text files & UTF-8 encoding on Wikipedia.
Jedes Verzeichniss, dass als Seite angezeigt werden soll muss eine .txt-Datei enthalten. Diese Datei kann durchaus leer sein. Der Name dieser .txt-Datei muss mit einem Dateinamen im Verzeichnis /templates
übereinstimmen, damit Stacey weiß, wie es die Inhalte der .txt-Datei darstellen soll.
Hier Beispielbild
Dieser Prozess kann mit der folgenden, beispielhaften Schrittfolge beschrieben werden:
http://yourdomain.com/?/about/
aufgerufen./content/3.about/content.txt
@title
und zu @content
extrahiert.title: About Title - content: Lorem ipsum.
/templates/content.html
.<div id="main"> <h1>@title</h1> @content </div>
der HTML-Code
<div id="main"> <h1>About Title</h1> <p>Lorem ipsum.</p> </div>
Die Inhaltsdateien weisen alle das gleiche Muster auf. Jedem Schlüssel (key) folgt ein Doppelpunkt (:), dann kommt der Wert und schließlich ein Bindestrich. Letzterer beendet den Wert, also
schluessel: wert -
Die Schlüsselwerte entsprechen den Platzhaltern in der Templatedatei die mit dem Wert des INahltes (der .txt-datei) ersetzt werden. Man kann soviele schluessel:wert
-Paare erzeugen, wie man benötigt.
Schlüssel dürfen nur diese Zeichen enthalten
abcdefghijklmnopqrstuvwxyz0123456789_
also kleingeschriebene alphanumerische Zeichen und den Unterschrich, also auf keinen Fall deutsche Sonderzeichen (äöüß).
Eine Standardinhaltsdatei kann demzufolge so aussehen
title: The Test Project 1 - date: 2009, Jun— - content: Lorem ipsum dolor...
Jedem Wert muss eine Zeile folgen, die nur einen Bindestrick enthält Stacey toleriert aber zufällige Tabs bzw. Leerzeichen.
Nach dem letzten Schlüssel/Wert-Paar ist der Bindestrich optional.
Wenn ein Wert leer sein soll, lässt man einfach ein Leerzeichen nach dem Doppelpunkt.
Diese Variable ist auch in den Inhaltsdateien verfügbar. Das ist besonders nützlich, wenn man Assets (Bilder, Flash-Dateien etc.) innenrhalb des aktuellen Verzeichnisses verlinken will.
Diese Variable kann man zu einer bestimmten Inhaltsdatei hinzufügen, wenn man möchte, dass die entsprechende Seite nicht gecacht werden soll.
Alle Werte innerhalb der Inhaltsdatei, die einen oder mehrere Zeilenumbrüche enthalten, werden als Markdown ausgewertet. In dem folgenden Beispiel wird @title als einfacher Text ausgewertet, @content hingegen als Markdown. So wird aus
date: 2009, Jun— - content: # Title Lorem ipsum.
dies:
@date => 2009, Jun— @content => <h1>Title</h1> <p>Lorem ipsum.</p>
Markdown ignoriert HTML-Tags, daher kann man an Stelle von Markdown auch HTML-Tags zur Kennzeichnung verwenden. Man kann also an Stelle des obigen Beispiels in die Textdatei auch einfügen:
date: 2009, Jun— - content: <h1>Title</h1> <p>Lorem ipsum.</p>
Stacey nutzt PHP Markdown Extra, eine PHP-spezifische Erweiterung von Markdown. Markdown Extra verfügt auch über einige spezische Syntaxelelemente, wie hübsche Codeblöcke und IDs für Überschriften. Es ist also sinnvoll, beide Referenzen zu konsultieren.
Die Templates von Stacey unterstützten mit einer Mischung aus HTML und einfachen dynamischen Variablen die Erstellung der eigentlichen Ausgabeseiten.
Dabei kommt so etwas heraus wie dies:
... <h1 class="col three"> @name <strong>@profession</strong> </h1> <em class="col three">@email</em> <hr> :navigation <div id="content" class="col eight"> :category_lists </div> <hr> <p class="col five">&copy; Copyright @name @current_year</p> ...
Alle Templates befinden sich im Verzeichnis /templates
. Die sogenannten Partial Templates befindnen sich im Verzeichnis /templates/partials
. Sie werden dazu genutzt, Zusammenstellungen (collections) zu erstellen. Diese Zusammenstellungen sind Zusammenfassungen gleichartiger Objekte (z.B. alle Bilder, Navigationsobjekte) in einem Verzeichnis.
Templates werden den Inhaltsdateien auf Grund identischer Namen zugewiesen, d.h. eine Inhaltsdatei meinname.txt muss zwingend eine Templatedatei meinname.html vorfinden. Gibt es diese Datei nicht, gibt Stacey einen Fehler zurück.
Templates müssen nicht zwingend .html-Dateien sein. Stacey erkennt automatisch content-type Header für Templates mit den folgenden Erweiterungen: .html, .json, .xml, .atom, .rss, .rdf & .txt. Solche Templates werden korrekt verarbeitet.
Wenn suchmaschinengerechte URL aktiviert sind, dann sind alle Dateien im Verzeichnis /public
vom Wurzelverzeichnis des Webserver erreichbar. Also ist
/public/docs/css/screen.css
erreichbar unter
http://yourdomain.com/docs/css/screen.css
Das Verzeichnis /public
wird üblicherweise dazu genutzt, um .css, .javascript und andere in Templates genutzte Teile zu speichern.
Diese Aussage muss noch einmal verifiziert werden.
Stacey verarbeitet jedes Template zunächst als reinen Text, erst danach wird es als HTML verarbeitet. Anweisungen wie <?php ?>
werden nicht verarbeitet.
Innerhalb der Templates von Stacey stehen die folgenden drei Sprachkontrukte zur Verfügung:
get
-Blöcke foreach
-Sschleifen if
Abfragen.get "/url" do # do stuff end
foreach $collection do # do stuff endforeach
if @variable do # do stuff endif
if !@variable do # do stuff endif
Wenn man sich innerhalb einer foreeach
-Schleife befindet, verschiebt sich der Kontext auf das aktuelle Objekt, das gerade durch die Schleife referenziert wird.
Wenn man den Kontext einer bestimmten Seite temporär verschieben will, muss man einen get
-Block einfügen.
get "/projects/project-1" do <p>@page_name</p> end
Damit wird der Kontext von der aktuellen, gerade angezeigten Seite verschoben zur Seite /projects/project-1
. Das bedeutet, $children wird mit den Unterelementen der Seite /projects/project-1
gefüllt, @page_name
ist 'Projects' usw.
Wenn man also nur die Unterelemente des Verzeichnisses /projects auflisten (die selbst wieder keine Unterelemente beinhalten), kann man das folgende Partial nutzen:
get "/projects" do foreach $children do if !$children do <p><a href="@url">@page_name</a></p> endif endforeach end
foreach-Schleifen kann man begrenzen in dem man die Konstruktion
$collection[start:limit]
nutzt. Das Array wird nun auf die mit start
und limit
vorgegebenen Werte begrenzt.
Die Werte start
und limit
sind jeweils optional. Man kann auch
$collection[:2]
angeben, um nur die ersten beiden Elemente oder
$collection[2:]
um alle Elemente außer den ersten beiden auszuwählen. Das folgende Partial gibt nur das dritte und vierte Element der Kollektion $children aus:
<ol id="navigation"> foreach $children[2:2] do <li><a href="@url">@page_name</a></li> endforeach </ol>
Um die unterschiedlichen Ebenen eines Objektes zu durchlaufen können foreach-Schleifen ineinander verschachtelt werden, z.B.
<ol id="navigation"> foreach $root do <li><a href="@url">@page_name</a> if $children do <ol> foreach $children do <li><a href="@url">@page_name</a> endforeach </ol> endif </li> endforeach </ol>
Allerdings wäre in diesem Fall wohl ein rekursives Partial die elegantere Lösung.
Außer Bildern und Videos erkennt Stacey auch alle anderen Assets innerhalb des Verzeichnisses einer Seite. Diese werden jeweils in ihren eigenen Kollektionen abgelegt.
So hat zum Beispiel diese Seite Hier Bild
die folgenden Kollektionen:
$pdf: ['pdf-file.pdf' => Asset] $mp3: ['mp3-file-1.mp3' => Asset 'mp3-file-2.mp3' => Asset] $html: ['youtube-embed.html' => HTML] $doc: ['word-document.doc' => Asset] $jpg: ['01.jpg' => Image]
Diese können genauso wie Kollektionen $images oder $video in Templates oder Partials mit Schleifen durchlaufen werden. Beispielsweise so:
foreach $mp3 do <object height="50" width="200"> <param name="kioskmode" value="true"> <param name="src" value="@url"> <param name="autoplay" value="false"> <param name="controller" value="true"> <embed height="50" src="@url" type="video/quicktime" width="200" controller="true" autoplay="false" kioskmode="true"> </object> endforeach
Man kann auch eine spezielle, benannte Kollektion aus Assets erstellen. Stacey erkennt Verzeichnisse, die mit einem Unterstrich (_) beginnen, als Asset Kollektionen. Auf diese Kollektionen kann man mit dem Verzeichnisnahmen, dem ein $ vorangestellt wird, Bezug nehmen.
Zum Beispiel die Verzeichnisstruktur Beispielbild
erstellt die folgenden Asset Kollektionen.
$_logos: ['logo1.gif' => Image 'logo2.mov' => Video] $_thumbnails: ['thumb1.jpg' => Image 'thumb2.jpg' => Image 'thumb3.jpg' => Image 'thumb4.jpg' => Image]
Diese Kollektion kann auf die gleiche Art und Weise durchlaufen werden, wie die Kollektion $images.
foreach $_logos do <li><img src="@url" alt="@name"></li> endforeach
Diese speziellen Kollektionen werden innerhalb anderer Kollektionen ( z.B.: $siblings oder $children) nicht angezeigt.
Stacey weiß schon standardmäßig, wie einige Assettypen zu behandeln sind. Jeder dieser Typen besitzt spezifische Variablen, auf die im Zusammenhang einer Schleife zurückgegriffen werden kann.
(.jpg, .jpeg, .gif, .png)
Die folgenden Variablen werden aus den IPTC metadata des Bildes ausgelesen
(.mov, .mp4, .m4v, .swf)
(.html, .htm)
(.*)
(muss noch fortgesetzt werden)
Im Templatesystem von Stacey gibt es drei Variablentypen:
Innerhalb der Template-Dateien stehen neben den HTML-Tags auch die innerhalb der entsprechenden .txt-Seite erstellten Variablen zur Verfügung. Auf diese kann im Template mit Hilfe des Symbols @, gefolgt vom Schlüsselwort, zugegriffen werden.
z.B. @title
Außerdem sind die in /content/_shared.txt
definierten Variablen in allen Templatedateien verfügbar.
Das Stacey System erstellt eine Reihe generell verfügbarer Variablen. Das sind:
In einigen Fällen können Variablen auch innerhalb von .txt-Dateien genutzt werden. Das sind die Variablen:
Stacey stellt zwei Arten von Kollektionen bereit:
Diese können jeweils mit foreeach
-Schleifen durchlaufen werden.
Die Seitenkollektionen sind:
Partials dienen dazu, wieder verwendbaren HTML-Code auszulagern. Sie werden im Verzeichnis /templates/partials
abgelegt.
Dieses Verzeichniss kann wiederum Unterverzeichnisse enthalten (z.B. /templates/partials/naviagtion
für alle Partials der Navigation) um eine bessere Übersichtlichkeit zu gewährleisten. Das bedeutet aber auch, dass es keine zwei Partials mit gleichem Namen geben darf, auch wenn diese sich in unterschiedlichen Unterverzeichnissen befinden und/oder unterschiedliche Dateierweiterungen haben.
Partials werden in der Templatedatei angesprochen, in dem ein Doppelpunkt (:) gefolgt vom Dateinamen des Partials in die Templatedatei eingefügt wird. Beispiel: Das Partial /templates/partials/assets/images.html
wird im Template mit :images angesprochen.
Ebenso wie Templates müssen auch partials nicht zwingend vom Dateityp HTML sein. Stacey erkennt automatisch die Dateierweiterungen .html, .json, .xml, .atom, .rss, .rdf und .txt.
Partials können ineinander verschachtelt werden. So kann beispielsweise ein Partial :media in /templates/partials/assets/media.html
beinhalten:
if $images do
:images
endif
if $video do
:video
endif
um die entsprechenden Assets aufzurufen, falls sie vorhendne sind.
Partials können Referenzen auf sich selbst enthalten um so eine Rekursion durch verschachtelte zu ermöglichen (z.B. um einen Verzeichnissbaum zu durchlaufen).
So besteht ist es beispielsweise eleganter, an Stelle einer foreeach
-Schleife zwei verschachtelte Partials für die Erstellung einer Navigationsstruktur zu verwenden. Die sehen dann so aus:
/templates/partials/navigation/navigation.html
<ol id="navigation"> foreach $root do <li><a href="@url">@page_name</a> :children </li> endforeach </ol>
/templates/partials/navigation/children.html
if $children do <ol> foreach $children do <li><a href="@url">@page_name</a> :children </li> endforeach </ol> endif
Stacey trifft nicht allzu viele Annahmen hinsichtlich des Formates, in dem Templates geschrieben sind. Es benutzt die Dateierweiterung der Template-Datei, um herauszufinden, welcher Inhaltstyp (content type) ausgeliefert werden soll. Standardmäßig erkennt Stacey die Inhaltstypen .html, .json, .xml, .atom, .rss, .rdf und .txt.
Auf dieser Grundlage wird auch der RSS-Feed erstellt. Das Verzeichnis /content/feed
ist eine ganz normale Stacey-Seite. Der einzige Unterschied besteht darin, dass sie eine .atom-Templatedatei an Stelle einer .html-Templatedatei nutzt.
Wenn man nun also an Stelle des Atom-Formats das RSS2-Format nutzen will, muss die Datei /templates/feed.atom
umbenannt werden in /templates/feed.rss
und der INhalt muss so verändert werden:
<?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>@name's @feed_name</title> <link>http://@base_url/@permalink/</link> <description>@description</description> :feed_loop </channel> </rss>
Stacey komprimiert die JSON-Ausgabe automatisch und entfernt Kommas am Ende. So erzeugt das folgende Template
get "/" do { "pages": [ foreach $children do { "title": "@title" }, endforeach ] } end
diesen Code
{"pages":[{"title":"Projects"},{"title":"About"},{"title":"Contact"}]}
Ein Kontaktformular gehört nicht zur Standardausstattung bei Stacey Version 2.3.0. Ich habe habe trotzdem eine Lösung gefunden. Vor längere Zeit habe ich die Datei stacey-contact-form_v0_2.zip aus dem Web herunter geladen. Allerdings scheint das jetzt nicht mehr möglich zu sein. Die Lösung stammt von Moritz Jacobs, der mit Cindy auch ein Stacey-Fork entwickelt hat. Ich habe bisher nicht geprüft, ob dieses Kontaktformular im Fork enthalten ist. Bei Bedarf kann ich interessierten Nutzern diese kleine zip-Datei zur Verfügung stellen.
Das zip-Archiv enthält gerade einmal drei Dateien:
So geht man vor:
mj-contact.css
wird in das Verzeichnis /public/docs/css
kopiert@import url("mj-contact.css")
in der Standard-CSS-Datei oder in dem in der Templatedatei (bei mir index.html) <link rel="stylesheet" href="@root_path/public/docs/css/mj-contact.css" type="text/css" media="screen">
eingefügt wird.mj-form.php
wird in das Verzeichnis kopiert, das die Inhaltsdatei enthält. Wenn man also diese Datei in /content/index
ablegt, dann wird davon ausgegangen, dass das Kontaktformular auf der Startseite der Website abgelegt wird. Ich habe für diese Demonstration das Kontaktformular nach /content/dokumentation/kontaktformulareinbauen
kopiert.<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
. Wenn aus anderen Gründen bereits jQuery verwendet wird, dann kann man darauf natürlich verzeichten.foreach $php do content endforeach
(Achtung, bei content fehlt das @)/php
angelegt, dorthin wird die Datei mj-contact.php
kopiert.mj-contact.php
müssen mit einem geeigneten Editor Anpassungen vorgenommen werden.Um den Prozess der Einrichtung eines Stacey CMS zu vereinfachen und abzukürzen nutzt Stacey in der Standardeinstellung abfragebasierte URL. Die Adressen der einzelnen Seiten sehen dann so aus:
http://yourdomain.com/?/page-name/
Man beachte das Fragezeichen! Man kann Stacey jedoch so umstellen, dass "saubere" URL erzeugt werden. Oft wird auch behauptet, dass derartige URL suchmaschinenfreundlicher seien. Bei dem vorherigen Beispiel verändert sich dann die URL so:
http://yourdomain.com/page-name/
Das Fragezeichen verschwindet also. Die Umstellung ist ganz einfach: man muss lediglich die bereits im Downloadpaket enthaltene Datei htaccess
umbenennen in *.*htaccess
, also einen Punkt vor den Dateinamen setzten und diese Datei dann auf den Webspace hochladen.
Übrigens bleiben auch nach Aktivierung der .htaccess die URL in der Form
http://yourdomain.com/?/page-name/
weiterhin gültig. wenn man also versäumt hat, die Umstellung frühzeitig vorzunehmen, dann führen zwischenzeitlich gesetzte Links von anderen Webseiten bzw. Google nicht ins Leere.
Allerdings ist es sinnvoll, vorher zu prüfen, ob der eigene Webspace solche .htaccess-Dateien unterstützt und ob auf dem Webspace mod_rewrite aktiviert ist. Man fragt hierzu am besten bei der Serveradminstration nach oder legt kurzzeitig eine PHP-Datei mit einem phpinfo()-Aufruf an. Wenn man diese Datei im Browser aufruft, kann man nach der Zeichenkette mod_rewrite suchen.
Wenn man Stacey nicht im Wurzelverzeichnis des Webspace installiert hat, dann muss in den meisten Fällen in der .htaccess
die Zeile
#RewriteBase /
zu
RewriteBase /staceyverzeichnis/
geändert werden. In einigen Fällen ist auch dann, wenn Stacey im Wurzelverzeichnis installiert wurde, eine Änderung zu
RewriteBase /
erforderlich.
Ich habe festgestellt, dass bei Stacey einige Dinge nicht richtig funktionieren, wenn die .htaccess deaktivert bleibt.
Mit dem Aufruf
http://yourdomain.com/?/feed/
wird eine scheinbar leere Seite angezeigt. Erst ein Blick in den Quellcode zeigt, dass es Inhalt gibt, der aber nicht angezeigt wird. Möglicherweise liegt auch ein problem mit dem Browser (Firefox) vor. Auf jeden Fall ist die Anzeige mit aktivierter .htaccess und
http://yourdomain.com/feed/
korrekt. Hier funktioniert auch
http://yourdomain.com/feed.atom
oder .json, .html und weitere Dateierweiterungen (siehe .htaccess).
Ohne .htaccess ergibt
http://yourdomain.com/?/sitemap/
die Fehlermeldung
Undefined offset: 1 in <b>...\app\page-data.inc.php</b> on line <b>221</b><br />
Wenn die .htaccess aktivert ist, dann funktioniert
http://yourdomain.com/sitemap.xml
korrekt. Allerdings sollte keine "echte" XML-datei vorhanden sein, sonst wird diese an Stelle der virtuellen angezeigt. Hingegen führt
http://yourdomain.com/sitemap/
zur Fehlermeldung
Undefined offset: 1 in <b>...\app\page-data.inc.php</b> on line <b>221</b><br />
In beiden Einstellungsvarianten wird anscheinend vergleichbarer Code erzeugt. Da die URL unterschiedlich sind, ist der Umfang des Codes natürlich auch unterschiedlich.
Bei einigen Webspaceanbietern kann es vorkommen, dass je nach verwendetem FTP-Programm die hochgeladene .htaccess auf dem Webspace nicht angezeigt wird. Abhilfe schafft oft schon eine Veränderung der Einstellungen des FTP-Programms. Auf jeden Fall ist es aber auch in dieser Situation möglich eine geänderte .htaccess hoch zu laden.
http://yourdomain.com/?/robots/
liefert zwar eine entsprechende Datei, allerdings entspricht diese URL nicht den Konventionen.
http://yourdomain.com/?/robots/
und
http://yourdomain.com/?/robots.txt
führen dagegen zu einem 404-Fehler bzw. zu einer leeren Seite.
Mit aktivierter .htaccess führt
http://yourdomain.com/robots.txt
zu einem korrekten Ergebnis.
PHP Markdown Extra ist eine spezielle Erweiterung des PHP Markdown. PHP Markdown Extra verfügt über einige nützliche Erweiterungen gegenüber dem "normalen" Markdown, der Standardvariante. Um die geht es hier als erstes. Danach rkläre ich die Zusätze.
Überschriften kann man auf zweierlei Art und Weise erzeugen:
---
bzw. ====
nach dem eigentlichen Überschriftentext können h1- bzw. h2-Überschriften erzeugt werden.#
, ##
bis ######
am Anfang der Zeile vor dem eigentlichen Überschriftentext können h1, h2 bis h6 Überschriften erzeugt werden.##### So wird eine H5-Überschrift erzeugt
ergibt
Die Darstellung für Zitatabschnitte wird erreicht, indem dem Textabschnitt ein >
vorangestellt wird. Doppelt >>
ergibt sich ein Zitat des Zitates usw. Im HTML-Code wird dann <blockquote></blockquote> erzeugt.
> Hier zitiere ich etwas
Hier zitiere ich etwas
>> Hier zitiere ich ein Zitat
Hier zitiere ich ein Zitat
Ungeordnete Listen werden mit einem _*_
am Anfang der Zeile erzeugt, geordnete Listen, also solche mit numerischer Aufzählung durch _1._
, _2._
usw. am Anfang der Zeile. Bei ungeordneten Listen sind aber auch andere Zeichen am zeilenbeginn möglich, bspw. +, -
* Auf * zäh * lung
erzeugt
und
1. Auf 2. zäh 3. lung
erzeugt
Nach den Ausführungen zur Markdown Grundvariante stelle ich nun die Erweiterungen von Markdown Extra vor.
Code oder kein Code
PHP Markdown Extra verfügt über einen speziellen Fussnotenmechanismus. Dazu wird hinter dem mit einer Fussnote zu versehenden Text in eckigen Klammern das Carret-Zeichen gefolgt von einer Ziffer eingegeben. Der eigentliche Fussnotentext wird erzeugt, in dem die gleiche Zeichenfolge, gefolgt von einem Doppelpunkt am Anfang der Zeile stehen, danach folgt der Fussnotentext. Markdown extra erzeugt automatisch am Ende des Dokumentes einen speziellen Fussnotenabschnitt, der etwa so aussieht:
<div class="footnotes"> <hr> <ol> <li id="fn:1"> <p>Erste Fussnote.&nbsp; <a rev="footnote" href="#fnref:1">↩</a> </p> </li> <li id="fn:2"> <p>Zweite Fusnote.&nbsp; <a rev="footnote" href="#fnref:2">↩</a> </p> </li> </ol> </div>
Diesen Abschnitt kann man durch entsprechende CSS-Anweisungen nach eigenen Wünschen formatieren. Das Backlinkzeichen in der Fussnote (↩) ist allerdings direkt im PHP-Code des Markdown-Parsers festgelegt.
Dieser Text hat die 1. Fussnote.1 Dieser Text hat die 2. Fussnote.2
Markdown kann auch mit sogenannten Abkürzungen umgehen. Diese entsprechen dem <abbr></abbr>
-Tag. Diese werden erzeugt, in dem man, beginnend direkt am Anfang einer Zeile, Code nach diesem Muster einfügt: *[Abkürzung]: Abkürzungserklärung
. Bei diesen Abkürzungen wird zwischen Groß- und Kleinschreibung unterschieden, daher wird markdown wird nicht erklärt.
Auf dieser Seite ist das Wort Markup mit einer Abkürzungserklärung versehen, also *[Markdown]: Markdown ist nicht Markup
.
Item | Value |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
Item | Value |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
Item | Value |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
Hier entseht eine Zusammenstellung eigener Tests und Demos zu Stacey. Außerdem sammle ich hier einige interessante Gimmicks und Lösungen, die ich auf anderen Stacey-Seiten gesehen habe.
Bei den folgenden Beispielen musste ich mich eines Tricks bedienen. An Stelle der Schlüsselworte if
und endif
habe ich die deutsche Entsprechungen wenn
und endewenn
verwendet, da Stacey ansonsten versucht, den Code zu interpretieren.
Im Paket Stacey-HTML5-Boilerplate-master.zip findet man eine Lösung zu bedingtem HTML-Code, die so aussieht:
wenn @metadesc do <meta name="description" content="@metadesc"> endewenn
Das bedeutet: wenn in der .txt-Datei der Schlüssel (also die Variable) @metadesc definiert ist, dann füge ihren Wert ein.
Man könnte auf diese Art und Weise auch bedingt CSS-Festlegungen einfügen, die das Aussehen einzelner Seiten modifiziert.
Auch
<title>wenn @pagetitle do @pagetitle || endewenn @sitetitle</title>
sieht interessant aus. Wenn in der .txt-Datei die Variable @pagetitle definiert ist, dann füge sie in den <title></title> ein und füge in jedem Fall die globale Variable @sitetitle hinzu.
Das sind die Standardvariablen von Stacey specialcontent: inhalt
Mit Stacey hat man mehrere Möglichkeiten, Grafiken und andere Multimediainhalte in die Seiten einzufügen.
Eine sehr einfache Möglichkeit ist das Einfügen direkt mit Hilfe von Markdown- oder HTML-Code in der Inhaltsdatei. Das habe ich zum Beispiel hier gemacht habe. Dabei habe ich die Grafikdatei aber nicht wie allgemein in der Stacey-Anleitung empfohlen im Verzeichnis des Inhaltsdatei abgelegt sondern in einem extra Verzeichnis /bilder
. Ansonsten kann es geschehen, dass man mit anderen Methoden des Einfügens in Konflikt kommt.
Eine andere Möglichkeit ist das Einfügen mit Hilfe der vordefinierten Partials. Wie bereits beschrieben, gibt es im Verzeichnis /templates/partials/assets die folgenden Asset-Partials
die man nutzen kann, in dem man in die Haupttemplatedatei oder in die Inhaltsdatei einen oder mehrere der entsprechenden Platzhalter, also html, images, media usw. jeweils mit einem Doppelpunkt davor einfügt. Dann werden alle im Verzeichnis der Textseite enthaltenen Dateien entsprechenden Typs in die generierte HTML-Seite eingefügt. Der Platzhalter media ist ein übergreifendes Element, dass auf alle anderen Inhalte (außer pdf) zurückgreift.
:images {{ % include 'partials/assets/images.html' % }}
Bei diesem kleinen Beispiel sieht man jedoch, dass ein unangenehmer Nebeneffekt auftritt, weil mit dem Partial auch die Parameter für die Höhe und Breite des Bildes mit übergeben werden.
Ich habe daher das Partial modifiziert: :imagesbs01
Die Modifizierung betrifft nicht nur die Übergabe des Parameters für die Bildhöhe (die weggelassen wurde) sondern auch die Angaben für die Attribute alt und title.
Slideshow 1 :galerybs01
<!-- Anfang: Excel 2 HTML von Karl Fahrtmann //-->
<table style="table-layout: fixed; background-color: #ffffff; border-collapse: collapse; border: none;" width="249">
<colgroup>
<col width="83">
<col width="83">
<col width="83">
</colgroup>
<tr style=" border: none; height: 17px;">
<td style="border: none; margin: 0; padding: 0 2px; overflow: hidden;text-align: left;vertical-align: bottom;background-color: #ffff00;color: #ff0000; font-family: Arial;border: none;">Otto</td>
<td style="border: none; margin: 0; padding: 0 2px; overflow: hidden;text-align: left;vertical-align: bottom;background-color: #ffff00; color: #000000; font-family: Arial;border-bottom: none;border-top: none;">Paul</td>
<td style="border: none; margin: 0; padding: 0 2px; overflow: hidden;text-align: left;vertical-align: bottom;background-color: #00ccff; color: #000000; font-family: Arial;border: none;">Dirk</td>
</tr>
</table>
<!-- Ende: Excel 2 HTML von Karl Fahrtmann //-->
Der Nivo Slider ist gegenwärtig einer der bekanntesten Slider. Der Einbau Stacey ist unproblematisch, man muss im Grund nur der allgemeinen Einbauanleitung folgen.
Ich habe mich, um flexibler sein, entschieden, den Einbau mit Hilfe eines Asset-Partials umzusetzen.
Der Nivo-Slider in der Version 3.2 erfordert mindestens jQuery Version 1.7. Den Link zur jQuery-Bibliothek habe ich direkt in die Haupttemplatedatei index.html eingefügt, da diese Bibliothek auch von anderen Funktionen genutzt wird.
In /templates/partials/assets/
habe ich das Asset-Partial
nivoslider.html angelegt. Dieses enthält die Verlinkungen zur Nivo-CSS-Datei nivo-slider.css und zum Nivo-jQuery-Plugin jquery.nivo.slider.pack.js sowie den jQuery-Initialisierungscode. Schließlich ist noch HTML-Code erforderlich.
:nivoslider
Man kann Doppelpunkt-nivoslider sowohl in einer Templatedatei einbauen, aber auch direkt in die Inhaltsseite. In letzterem Fall soll man darauf achten, dass vor und nach Doppelpunkt-nivoslider keine Leerzeilen stehen, da ansonsten überflüssige bzw. sogar fehlerhafte <p>
bzw. </p>
-Tags erzeugt werden.
In diesem Abschnitt werden einige Musterseiten vorgestellt. Damit insgesamt alles schön übersichtlich bleibt aber auch eine Zusammenstellung der verwendeten Ressourcen.
Das Haupttemplate ist das Template, das auf dieser Seite sowie auf allen allgemein erklärenden Seiten verwendet wird. Dazu gehören:
Sonderseiten sind:
Der Atom-Feed ist über diesen Link erreichbar. Allerdings bleibt die Seite sowohl unter Stacey 2.3.0 und 3.0.0 auf Host4Free als auch auf dem localhost 7.0.4 unter Stacey 3.0 leer. Auf einer früheren Version des localhost hat es noch funktioniert. Möglicherweise ist ein bestimmtes PHP-Modul nicht verfügbar. Dieser Atom Feed wird erzeugt über:
/content/feed/feed.txt
, die nur die Angabe zu feed_name
enthält./templates/feed.atom
die die Grundstruktur des Feeds enthält und das Partial /templates/partials/feed/feed_loop.atom
aufruft/templates/partials/feed/feed_loop.atom
, die die Dateien feed_children.atom
und feed_entry.atom
im gleichen Verzeichnis aufruft/templates/partials/feed/assets/feed_images.atom
, die von der bereits erwähnten Datei feed_entry.atom
aufgerufen wird.Diese Datei ist über robots.txt erreichbar. Sie wird erzeugt von
/content/robots/robots.txt
/templates/robots.txt
, die den eigentlichen Inhalt mitbringt.Auf Host4Free unter Stacey 2.3.0 funktionierte die Anzeige noch, unter Stacey 3.0.0 gibt es aber ebenso wie auf dem localhost 7.0.4 unter Stacey 3.0 den Fehler Zugriff verweigert! Error 403
Diese Datei ist über sitemap.xml erreichbar. Sie wird erzeugt von
/content/sitemap/sitemap.txt
/templates/sitemap.xml
, die die beiden Partials sitemap-children.xml
und sitemap-url.xml
im Verzeichnis /templates/partials/sitemap
aufruft.Diese Sitemap funktioniert sowohl unter Stacey 2.3.0 und 3.0.0 auf Host4Free wie auch unter Stacey 3.0 auf dem localhost 7.0.4
Dieser Feed ist über JSON erreichbar. Er wird erzeugt über:
/content/json/json_feed.txt
/templates/json_feed.json
. Diese Datei bietet ein interessantes Anschauungsmaterial. Diese JSON-Feed funktioniert sowohl unter Stacey 2.3.0 und 3.0.0 auf Host4Free wie auch unter Stacey 3.0 auf dem localhost 7.0.4
Ich habe bereits beschrieben, dass es sich bei den eigentlichen Inhaltsdateien von Stacey um einfache Textdateien handelt, bei denen man lediglich eine bestimmte Struktur einhalten muss. Solche Dateien kann man mit jedem beliebigen Texteditor erstellen -aber keinesfalls mit Microsoft Word oder anderen Programmen, die üblicherweise dem Schreiben formatierter Texte dienen. Sehr sinnvoll und deutlich besser als der Texteditor von Microsoft Windows ist Notepad++, denn bei diesem Editor hat man die volle Kontrolle über die verwendete Kodierung (einschließlich einer Konvertierungsroutine). Man sollte immer darauf achten, dass die Dateien in der UTF-8-Kodierung ohne BOM gespeichert werden.
Es gibt aber auch spezielle Programme, die zusätzlichen Komfort bieten. Ich habe bereits erwähnt, dass Stacey die Seitenauszeichnungssprache Markdown in der Variante Markdown extra verwendet. Für Markdown gibt es spezielle Editoren, die die Verwendung der markdown-typischen Auszeichnungen unterstützen. Einer dieser Editoren st der MarkdownPad
Der MarkdownPad ist ein Programm, mit dem man auf einfache Art und weise Markdown-Dateien bearbeiten kann. Obwohl die Stacey-Inhaltsdateien die Dateiendung txt
haben, können sie jedoch auch Markdown-Formatierungen enthalten. Somit steht einer Bearbeitung dieser Dateien mit dem MarkdownPad nichts mehr im Wege.
MarkdownPad 2 gibt es als kostenlose Version und als Pro-Version. Obwohl die Pro-Version lediglich 14,95 Dollar kostet, dürfte in dem meisten Fällen die einfache Version ausreichen. Hier dazu ein Screenshot:
MarkdownPad Free
Es gibt noch eine große Anzahl weiterer Editoren und Tools zur Bearbeitung von MarkDown Dateien. Allein hier werden mehr knapp 80 aufgezählt.
Neben Stacey gibt einige weitere CMS, die auf dem Dateisystem des Servers aufbauen.
Ein enger Verwandter zu Stacey ist Kirby. Viele Funktionen wirken sehr ähnlich. Hier gibt es eine recht umfangreiche Abwägung zu den Vor- und Nachteilen von Kirby gegenüber Stacey. Ein Punkt ist aus meiner Sicht sehr schwerwiegend, Kirby kostet $39 (ca. 30 EUR) -pro Website.
An eine ganz andere Nutzergemeinde wendet sich Droppages. Um dieses CMS einsetzen zu können, benötigt man einen Dropbox Account. Im Dropbox Speicher werden dann die Inhaltsdateien abgelegt. Man benötigt also nicht einem einen FTP-Zugang, um Veränderungen vorzunehmen.
Ich benutze hier in der Hauptsache zwei Navigationsebenen. Es ist aber problemlos möglich, die Navigationstiefe zu erhöhen. Allerdings leidet dann sehr häufig die Übersichtlichkeit für den Nutzer der Website.
Diese Seite befindet sich auf der obersten Ebene der Navigation. Sie hat zwei Unterseiten
wobei Subsub1 selbst wiederum zwei Unterseiten hat
Subsub2 hat keine weiteren Unterseiten.
Ich habe nicht getestet, wie weit man diese Verschachtelung treiben kann, aber mit einer Tiefe von 3 Stufen sollte man sich begnügen.
Die Seite Subsub1 hat noch zwei Unterseiten
Das ist die Seite Subsub1sub2
Das ist die Seite Subsub1sub1
Subsub2 hat keine weiteren Unterseiten.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est & laborum.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Iñtërnâtiônàlizætiøn
plugins-f3/methylphenidate-fatigue-multiple-sclerosis-t34.html showroom-f9/how-to-easily-make-mov-to-mpeg-conversion-on-mac-t51.html plugins-f3/satyamev-jayate-tv-show-official-website-t25.html showroom-f9/cheap-runescape-gold-t42.html showroom-f9/get-the-most-excellent-offer-at-an-auto-transport--t59.html showroom-f9/the-right-way-to-discover-the-best-auto-transport--t60.html showroom-f9/how-to-convert-mpeg-on-mac-t52.html showroom-f9/fleur-delacour-hermione-granger-femslash-fanfictio-t24.html showroom-f9/louis-vuitton-saleya-mm-damier-ebene-t28.html showroom-f9/how-to-convert-dvd-to-mkv-on-mac--t56.html showroom-f9/nolvadex-stop-bloat-t39.html showroom-f9/2-via-da-conta-livre-embratel-t19.html showroom-f9/13-musical-sendspace-t20.html showroom-f9/envisioning-real-utopias-russell-jacoby-t15.html plugins-f3/file-from-install-of-conflicts-with-file-from-pack-t27.html showroom-f9/enoxaparin-dose-for-pe-t31.html showroom-f9/diwali-riddim-rar-t26.html showroom-f9/duragesic-retail-price-t29.html showroom-f9/how-to-convert-dvd-to-mpeg-on-mac--t46.html showroom-f9/begin-before-clogged-auto-transport-t58.html laberecke-f4/teddies-in-cod6-t23.html
hermione granger femslash fanfiction neue erde entdeckt livre embratel 2° via welchol 1875 mg embratel a cobrar internacional contato livre embratel embratel livre 2 via neue erde embratel livre segunda via conta cheap runescape gold inxs best rar chomikuj lista telefonica embratel enoxaparin segunda via conta embratel neverfull gm damier duragesic embratel 2 via de conta livre embratel fatura nuvaring late period hermione norris nude tim hecker instrumental tourist rar embratel livre 2a. via de conta embratel internacional a cobrar creon 24000 dvd zu mkv segunda via embratel livre wellbutrin amphetamine brasildireto.net 2 via de conta da embratel duragesic patch conversion time turner necklace ebay livre embratel 2 via