Die Elemente der Templatesprache von Stacey

Stacey verarbeitet jedes Template zunächst als reinen Text, erst danach wird es als HTML verarbeitet. Anweisungen wie <?php ?> werden nicht verarbeitet.

Sprachkonstrukte

Innerhalb der Templates von Stacey stehen die folgenden drei Sprachkontrukte zur Verfügung:

  • get -Blöcke
  • foreach -Sschleifen
  • boolische if Abfragen.
get
get "/url" do
  # do stuff
end
foreach
foreach $collection do
  # do stuff
endforeach
if
if @variable do
  # do stuff
endif
if not
if !@variable do
  # do stuff
endif

Variablenkontext

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 begrenzen

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>

foreach-Schleifen verschachteln

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.