Ein ganz einfaches Template System

Nicht noch ein Template System!
Ich weiß es gibt so viele Template Systeme wie es Programmierer gibt. Und jedes ist ein wenig anders. Es ist aber auch eine gute Übung und man hat nachher einiges gelernt. Jeder Programmierer sollte mal ein Templatsystem geschrieben haben. ;-)
Dieses Modul hat weniger als 240 Zeilen Code. Das ist recht wenig Code.

Download:simple_template.pm

Wie es funktioniert:
Das ertse Beispiel zeigt die einfache Verwendung. Dabei werden nur die "VAL:" Werte ersetzt. Wenn man keine Gruppierungen braucht ist das sehr schnell:

 $tmpl=simple_template->new($file);
$tmpl->print_simple({ a => 'wert', b => 'wert2', c=> 'wert3'});
Das zweite Beispiel ist mit Gruppierungen, die auch verschachtelt sein dürfen. Das macht das Parsen aufwändiger und langsamer:
$tmpl=simple_template->new($file);
$tmpl->print_extend({
    a => 'wert',
    b => [
      { b1 => 'w1', b2 => 'w2' },
      { b1 => 'w2', b2 => 'w3' },
      { b1 => 'w4', b2 => 'w5' },
    ],
    c => 'wert3',
    d => {
      d1 => 'XXX',
      d2 => 'YYY',
      d3 => 'ZZZ',
    }
  });

Das Template System kennt drei "Befehle":

  • VAL:[key] -- Das wird durch einen gleichnamigen Schlüssel aus dem hash ersetzt
  • BLOCKSTART:[key] -- Das Ist der Beginn einer Untergruppierung
  • BLOCKEND:[key] -- Das beendet den Block der Schlüsselname ist optional (ist aber bei verschachtelten Blöcken empfohlen).
Dabei müssen die Befehle mit %%...%% oder <!--...--> umfasst sein. Da ich persönlich gerne vollständige Seiten als Templates benutze. fasse ich Gruppierungen in HTML-Kommentare und Variablen in %%...%% Das lässt die HTML-Seite valide.

Blöcke funktionieren wie folgt.
Ist dem Schlüssel im übergebenen Hash ein Array so wird der block für jedes Array Element aufgerufen. Ist dem Schlüssel ein Hash zugewiesen wird der Hash verwendet um die Werte im Block zu füllen. Ist dem Schlüssel ein wahrer Wert zugewiesen, so wird der Block eingesetzt In allen anderen fällen wird der Block nicht gesetzt.

Wie funktioniert ein if? so z.B.:

<!--BLOCKSTART:data-->
  <!--BLOCKSTART:if-->
  %%VAL:test1%%
  %%VAL:test2%%
  %%VAL:test3%%
  %%VAL:test4%%
  %%VAL:test5%%
<!--BLOCKEND:data-->
mit dem Aufruf:
{
  data=>{
    if => 1,
    test1 => '1',
    test2 => '2',
    test3 => '3',
    test4 => '4',
    test5 => '5',
  }
}
wenn "if" wahr ist wird der BLOCK "if" gesetzt, damit stehen die Schlüssel test1 - test5 zur Verfügung und können gefüllt werden.


Einschränkungen:

Es gibt keine "lokalen" Variablen, wenn ein Wert in einer ebene ersetzt wurde, so bleibt er besetehn alles Erstezt wurde. Das Format ist sehr strickt. Der Schlüssel wird "wörtlich" genommen das bedeutet alles wichen dem Doppelpunkt und dem Endzeichen wird als Schlüssel genommen. Das betrifft auch Leereichen!

%%VAL:test%%
ist nicht gleich
%%VAL: test %%
oder
%%VAL:
  test
%%
Code oder ähnliches ist nicht vorgesehen. Nur reines ersetzen ist möglich.

Was ist das besondere.
Es ist schnell, es ist wenig Code und es ist einfach. Trotzdem kann es nahezu alles was seine großen Verwandten kann.