Was ist Heredoc
Ein Heredoc, auch here document (von englisch, wörtlich hier dokument) genannt, ist ein Sprachkonzept der Informatik zur Spezifikation eines Zeichenfolgenliterals in Kommandozeileninterpretern wie beispielsweise der bash, Windows PowerShell und der Bourne-Shell sowie in Programmiersprachen wie etwa Perl, PHP, Python und Ruby. Der Bezeichnung entsprechend dienen Heredocs zur Definition von Textabschnitten. Im Unterschied zu herkömmlichen Stringdefinitionen werden enthaltene Zeilenumbrüche sowie Einzüge und viele Sonderzeichen im Text bewahrt. Einige Sprachen ermöglichen auch die Interpolation von Variablen oder auch Programmcode innerhalb der Zeichenfolge.
Der Content
Der serielle Content unterteilt in einzelne Sektionen die der Reihe nach vom Parser in die {#}-Tokens des Templates eingesetzt werden. Die Bereiche des Contents werden mit Hilfe sonst unbenutzer Zeichenkombinationen unterteilt, etwa so:
$data = <<<EOD
Titel 1
~~~
Das ist der Text zu Titel 1
~~~
Titel 2
~~~
Das ist der zweite Text zum zweiten Titel
...
...
EOD;
Code
Das HTML-Template
Das vollständige HTML-Template ist mit {#}-Token angereichert, an den Stellen, an denen Ersetzungen aus dem Content in das Template erfolgen sollen, etwa so:
...
<h1>{#}</h1>
<p class="lead">{#}</p>
...
Code
Alle mit {#} gekennzeichneten Stellen, werden vom Parser mit je einem Baustein aus dem Content-Block ersetzt. Für das Template ist es nicht die Tokens, wie in anderen Parsern erforderlich, zu benennen.
Der Parser
Der Parser des kleinen Heredoc CMS übernimmt die Aufgabe den Content in kleine Häppchen aufzuteilen (explode), die nicht nummerierten {#}-Tokens in nummerierte Tokens umzuwandeln und dann den Text mittels str_replace() im Template zu ersetzen.
...
$data = explode("~~~", trim($data)); // teilt den Content in einzelne Blöcke auf
$template = explode('{#}', $template); // zerlegt das Template anhand der {#}-Tokens
$token_count = 0; // zählt die {#}-Tokens
$template_order = ''; // nimmt das neue Template mit {#1}, {#2}... auf
$template_target_array = array(); // nimmt das Ziel-Array {#1}, {#2},... auf
foreach ($template as $value) {
$template_order .= $value.'{#'.$token_count.'}'; // konkatiniert string{#1}string{#2}string...
$template_target_array[] = '{#'.$token_count.'}'; // erzeugt Array Inhalte {#1}, {#2},...
$token_count = $token_count+1;
}
$template = str_replace($template_target_array, $data, $template_order);
echo $template;
...
Code
Der vollständige Code
Sie sehen unten den vollständigen CMS und PHP-Template Parser in Heredoc-Syntax. Zu optisch schöneren Darstellung, habe ich das CSS-Framework Bootstrap in Zeile 042 eingehängt.
001 <?php
002
003 //=============================================================================
004 // Der serielle Content unterteilt in einzelne Sektionen die der Reihe nach in
005 // die {#}-Tokens des Templates eingesetzt werden
006 //=============================================================================
007
008 $data = <<<EOD
009 HeredocParser - home
010 ~~~
011 HeredocParser
012 ~~~
013 Eigenständig lauffähiger Heredoc-Template Parser in PHP
014 ~~~
015 Content
016 ~~~
017 Der Content ist Bestandteil der PHP-Datei und liegt in der Heredoc-Syntax vor.
018 Der Content wird dabei mit drei Bindestrichen in Blöcke unterteilt. Alternativ
019 können andere Platzhalter genutzt werden.
020 ~~~
021 HTML Template
022 ~~~
023 Das HTML-Template befindet sich im zweiten Teil der PHP-Datei ebenfalls in der
024 Heredoc Syntax verfasst. Das Template ist mit {#} Tokens angereichert, in denen
025 der spätere Content eingesetzt wird.
026 ~~~
027 Tokens
028 ~~~
029 Die {#}-Tokens stellen alle Stellen im Template dar, in denen Content der Reihe
030 nach eingesetzt werden soll. Der Parser wandelt alle normalen {#}-Tokens in
031 nummerierte {#1}, {#2},... um.
032 EOD;
033
034 //=============================================================================
035 // Das vollständige HTML-Template mit den {#}-Token
036 //=============================================================================
037
038 $template = <<<EOD
039 <!doctype html>
040 <html lang="de">
041 <head>
042 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
043 <title>{#}</title>
044 </head>
045 <body>
046
047 <div class="container-fluid py-5 bg-secondary text-light shadow">
048 <div class="container">
049 <h1>{#}</h1>
050 <p class="lead">{#}</p>
051 </div>
052 </div>
053
054 <div class="container py-5">
055 <div class="row">
056 <div class="col-sm"> <h2>{#}</h2> <p>{#}</p> </div>
057 <div class="col-sm"> <h2>{#}</h2> <p>{#}</p> </div>
058 <div class="col-sm"> <h2>{#}</h2> <p>{#}</p> </div>
059 </div>
060 <div class="row">
061 <div class="col-sm"> <h2>{#}</h2> <p>{#}</p> </div>
062 <div class="col-sm"> <h2>{#}</h2> <p>{#}</p> </div>
063 <div class="col-sm"> <h2>{#}</h2> <p>{#}</p> </div>
064 </div>
065 </div>
066
067 </body>
068 </html>
069 EOD;
070
071 //=============================================================================
072 // Der Parser und Renderer ersetzt alle {#}-Tokens durch die nummerierten {#1},
073 // {#2},... Tokens und fügt den Content der Reihe nach in jeden Token ein.
074 //=============================================================================
075
076 $data = explode("~~~", trim($data)); // teilt den Content in einzelne Blöcke auf
077 $template = explode('{#}', $template); // zerlegt das Template anhand der {#}-Tokens
078 $token_count = 0; // zählt die {#}-Tokens
079 $template_order = ''; // nimmt das neue Template mit {#1}, {#2}... auf
080 $template_target_array = array(); // nimmt das Ziel-Array {#1}, {#2},... auf
081
082 foreach ($template as $value) {
083 $template_order .= $value.'{#'.$token_count.'}'; // konkatiniert string{#1}string{#2}string...
084 $template_target_array[] = '{#'.$token_count.'}'; // erzeugt Array Inhalte {#1}, {#2},...
085 $token_count = $token_count+1;
086 }
087
088 $template = str_replace($template_target_array, $data, $template_order);
089 echo $template;
090 ?>
Code
Die index.php kann wie gewohnt auf dem Webserver abgelegt und via URL gestartet werden. Sie erhalten die Anzeige eine Webseite mit Header und drei Spalten-Artikel.
Weiterführende Informationen
- Wikipedia.de: Heredoc...
- SelfPHP.de: Praxisbuch...
- CMSWorkbench: Kleinster Templateparser mit Heredoc...
Dieser kleinste Heredoc Template-Parser und PHP CMS ist ideal für kleine und schnelle Interventionen oder das Prototyping im Bereich Webdesign. Alles liegt innerhalb einer transportablen und kompakten Datei und kann easy angepasst werden. Das Templating ist überaus simpel, da auf konkrete Template-Token, wie sie beispielsweise aus Twig oder Smarty bekannt sind, verzichtet werden kann. Zudem ist dieser Parser überaus sicher!
Das Skript erhebt nicht den Anspruch ein vollständiger und ausgereifter CMS Parser zu sein, es soll lediglich einige Sachverhalte darstellen und Denkanstöße liefern - mehr nicht.