„Template-Engine“ – Versionsunterschied

[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Klammern korrigiert | Klammerfehler - Helfer gesucht
InternetArchiveBot hat 1 Archivlink(s) ergänzt und 0 Link(s) als defekt/tot markiert.) #IABot (v2.0.9.5
 
(34 dazwischenliegende Versionen von 27 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{QS-Informatik|Knacknüsse=Ja}}
{{QS-Informatik|Knacknüsse=Ja}}
Eine '''Template-Engine''' (von [[Englische Sprache|engl.]] ''Vorlage'' und ''Maschine'') ist eine [[Software]], die eine Datei (das ''[[Vorlage (Datenverarbeitung)|Template]]'') verarbeitet, und bestimmte Platzhalter darin mit jeweils aktuellen Inhalten füllt. Die Bezeichnungen '''Templateklasse''' und '''Templatesystem''' werden oft als [[Synonymie|Synonym]] für eine Template-Engine verwendet.
Eine '''Template-Engine''' (von {{enS}} für ''Vorlage'' bzw. ''Schablone'' und ''Maschine'') ist eine [[Software]], die eine Vorlagen-Datei (engl. ''[[Vorlage (Datenverarbeitung)|Template]]'') verarbeitet und bestimmte Platzhalter darin ähnlich wie bei einem Formular durch jeweils aktuelle Inhalte ersetzt. Die Bezeichnungen '''Template-Klasse''' (dt. ugs. „Vorlagenklasse“, aber sachlich korrekt: „Klassenvorlage“) und '''Template-System''' werden oft als [[Synonymie|Synonym]] für eine Template-Engine verwendet.


''[[Template (Programmierung)#Klassentemplates|Klassentemplates]]'' in der [[C++]]-Programmierung sind dagegen nicht mit Template-Engines vergleichbar, weil sie eine vom [[Datentyp]] unabhängige Programmierung ermöglichen und ganze [[Klasse (Programmierung)|Klassen]] enthalten. In den Templates einer Template-Engine sollte kein Programm-Code enthalten sein. [[Kontrollstruktur]]en (wie IF) sind allerdings oft in Templates möglich und verbreitet. Typische Dateitypen, die verarbeitet werden, sind [[Hypertext Markup Language|HTML]], Text ([[American Standard Code for Information Interchange|ASCII]] oder [[Unicode]]), [[Extensible Markup Language|XML]] oder [[TeX]].
''[[Template (Programmierung)#Klassen-Templates|Klassen-Templates]]'' in der [[C++]]-Programmierung sind dagegen nicht mit Template-Engines vergleichbar, weil sie eine vom [[Datentyp]] unabhängige Programmierung ermöglichen und ganze [[Klasse (Objektorientierung)|Klassen]] generieren können. In den Templates einer Template-Engine sollte kein Programm-Code enthalten sein. [[Kontrollstruktur]]en (wie IF) sind allerdings oft in Templates möglich und verbreitet. Typische Dateitypen, die verarbeitet werden, sind [[Hypertext Markup Language|HTML]], Text ([[American Standard Code for Information Interchange|ASCII]] oder [[Unicode]]), [[Extensible Markup Language|XML]] oder [[TeX]].


== Konzept ==
== Konzept ==
Das Konzept ähnelt den [[Seriendruck]]feldern bei einer [[Textverarbeitung]]: In einem Dokument werden Seriendruckfelder (Platzhalter) eingefügt, etwa ''Name – Straße – Ort''. Bei Template-Engines werden diese Seriendruckfelder ''Templatevariablen'' genannt. Wenn aus dem Dokument dann mehrere Serienbriefe erzeugt werden, steht anstatt der Templatevariablen ''name'' ein realer Name wie „[[Erika Mustermann]]“ im fertigen Serienbrief.
Das Konzept ähnelt den [[Seriendruck]]feldern bei einer [[Textverarbeitung]]: In einem Dokument werden Seriendruckfelder (Platzhalter) eingefügt, etwa ''Name – Straße – Ort''. Bei Template-Engines werden diese Seriendruckfelder ''Template-Variablen'' genannt. Wenn aus dem Dokument dann mehrere Serienbriefe erzeugt werden, steht anstatt der Template-Variablen ''name'' ein realer Name wie „[[Erika Mustermann]]“ im fertigen Serienbrief.


Das Dokument muss nur einmal geschrieben und formatiert werden. Alle Änderungen wirken sich automatisch auf zukünftig erstellte Serienbriefe aus. Das ist bei Template-Engines genauso; weitere Parallelen zu Serienbrief-Vorlagen sind:
Das Dokument braucht nur einmal geschrieben und formatiert zu werden. Alle Änderungen wirken sich automatisch auf zukünftig erstellte Serienbriefe aus. Das ist bei Template-Engines genauso; weitere Parallelen zu Serienbrief-Vorlagen sind:
* Die Daten kommen aus einer externen Quelle ([[Datenbank]], [[Tabellenkalkulation]] etc.).

* Um die Daten zu ändern, braucht das Template nicht verändert zu werden, und umgekehrt.
* Die Daten kommen aus einer externen Quelle ([[Datenbank]], [[Tabellenkalkulation]], etc.).
* Um die Daten zu ändern, muss das Template nicht verändert werden, und umgekehrt.
* Das Template kann wiederverwendet werden.
* Das Template kann wiederverwendet werden.


Zeile 16: Zeile 15:
Template-Engines werden häufig von [[Programmierer]]n eingesetzt, um im Kontext von [[Webanwendung]]en Programm-Code (einer [[Programmiersprache]]) vom Design zu trennen. Genauso wird von den Herstellern mancher Template-Engines angeführt, Templates und Engines sollen durch die Trennung der Programmierlogik vom Design das Skript von HTML-Code befreien und damit übersichtlicher machen.
Template-Engines werden häufig von [[Programmierer]]n eingesetzt, um im Kontext von [[Webanwendung]]en Programm-Code (einer [[Programmiersprache]]) vom Design zu trennen. Genauso wird von den Herstellern mancher Template-Engines angeführt, Templates und Engines sollen durch die Trennung der Programmierlogik vom Design das Skript von HTML-Code befreien und damit übersichtlicher machen.


Demgegenüber steht der ursprüngliche Gedanke der Template-Engines: Sie sollen statischen Text und dynamische Inhalte möglichst effizient miteinander verknüpfen. Oft sind Template-Engines deshalb gerade in Programmiersprachen anzutreffen, deren Syntax eine solche Mischung nicht direkt unterstützt (z. B. Java: [[JavaServer Pages|JSP]]; VBScript u. a.: [[Active Server Pages|ASP]]). Für eine echte Trennung der Darstellung von den Datenmodellen und den Logikkomponenten sind Template-Engines dagegen ungeeignet und es sind zusätzliche Konzepte wie [[Model View Controller]] notwendig.
Demgegenüber steht der ursprüngliche Gedanke der Template-Engines: Sie sollen statischen Text und dynamische Inhalte möglichst effizient miteinander verknüpfen. Oft sind Template-Engines deshalb gerade in Programmiersprachen anzutreffen, deren Syntax eine solche Mischung nicht direkt unterstützt (z. B. Java: [[JavaServer Pages|JSP]]; VBScript u. a.: [[Active Server Pages|ASP]]). Für eine echte Trennung der Darstellung von den Datenmodellen und den Logikkomponenten sind Template-Engines dagegen ungeeignet, und es sind zusätzliche Konzepte wie [[Model View Controller]] notwendig.


=== Vorteile ===
=== Vorteile ===
* Programm-Code (PHP, Python, Perl) wird vom [[Auszeichnungssprache|Markup]] (HTML) getrennt.
* Programm-Code (PHP, Python, Ruby, Perl, JavaScript) wird vom [[Auszeichnungssprache|Markup]] (HTML) getrennt.
* Designer und Programmierer können gleichzeitig an einem Projekt arbeiten.
* Designer und Programmierer können gleichzeitig an einem Projekt arbeiten.
* [[WYSIWYG]]-Editoren können verwendet werden.
* [[WYSIWYG]]-Editoren können verwendet werden.


=== Nachteile ===
=== Nachteile ===

Template-Engines
* Template-Engines erzeugen immer zusätzlichen [[Overhead (EDV)|Overhead]].
* Template-Engines erzeugen zur Laufzeit [[Overhead (EDV)|Zusatzaufwand]] (engl. "overhead").
* Template-Engines müssen im Gebrauch erlernt werden. Neben der neuen Syntax sind auch oft grundlegende Kenntnisse der [[Objektorientierte Programmierung|objektorientierten Programmierung]] Voraussetzung.
* Template-Engines müssen im Gebrauch erlernt werden. Neben der neuen Syntax sind auch oft grundlegende Kenntnisse der [[Objektorientierte Programmierung|objektorientierten Programmierung]] Voraussetzung.
* Template-Engines sind auf eine textuelle Ausgabe beschränkt.
* Template-Engines sind auf eine textuelle Ausgabe beschränkt.


== Sprachabhängige Template-Engines ==
== Sprachabhängige Template-Engines ==
Die Masse von Template-Engines ist enorm. Eigenentwicklungen sind an der Tagesordnung. XSLT ist für alle Template-Engines eine Konkurrenz. Bei PHP ist ''Smarty'' weit verbreitet, hat aber die Eigenentwicklungen und andere Template-Engines nicht vom Markt verdrängt.
Template-Engines sind sehr verbreitet. [[XSLT]] ist für alle Template-Engines eine Konkurrenz. Bei [[PHP]] ist ''[[Smarty]]'' weit verbreitet, hat aber die Eigenentwicklungen und andere Template-Engines nicht vom Markt verdrängt.


=== Template-Engines für PHP ===
=== Template-Engines für PHP ===
PHP selbst ist bereits so entworfen, dass man programmiersprachliche Konstrukte mit der textuellen Ausgabe über Platzhalter bzw. gekennzeichnete Bereiche mischen kann.
PHP selbst ist bereits so entworfen, dass man programmiersprachliche Konstrukte mit der textuellen Ausgabe über Platzhalter bzw. gekennzeichnete Bereiche mischen kann.


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
Zeile 43: Zeile 42:
</syntaxhighlight>
</syntaxhighlight>


Der Vorteil liegt in der einfachen Verwendung. Es muss keine zusätzliche Bibliothek installiert werden, auch ist diese Vorgehensweise für PHP-erfahrene Entwickler am leichtesten zu verstehen und folgt dem [[Principle of Least Surprise|Prinzip der geringsten Überraschung]]. Die Verwendung einer gesonderten Template-Engine für PHP ist daher nicht erforderlich. Dennoch existieren besonders für PHP eine sehr große Zahl von Engines.
Der Vorteil liegt in der einfachen Verwendung. Es braucht keine zusätzliche Bibliothek installiert zu werden, auch ist diese Vorgehensweise für PHP-erfahrene Entwickler am leichtesten zu verstehen und folgt dem [[Principle of Least Surprise|Prinzip der geringsten Überraschung]]. Die Verwendung einer gesonderten Template-Engine für PHP ist daher nicht erforderlich. Dennoch bietet die Verwendung einer Template-Engine für PHP, neben der besseren Übersicht, einige Vorzüge, beispielsweise können einfache, anpassbare Templates für Fehlermeldungen und ähnliche, wiederkehrende Strukturen erstellt werden. Einige populäre Template-Engines sind:


* [[Smarty]]<ref>[http://www.smarty.net/ Smarty extern]</ref>
* [[Smarty]]<ref>[https://www.smarty.net/ Smarty extern]</ref>
* Twig<ref>[http://twig.sensiolabs.org/ Twig]</ref>
* [[Twig (Template-Engine)|Twig]]<ref>{{Webarchiv|url=http://twig.sensiolabs.org/ |wayback=20170709023155 |text=Twig |archiv-bot=2023-01-20 07:03:18 InternetArchiveBot }}</ref>
* Fluid (als Teil von [[TYPO3 Flow]])<ref>([http://forge.typo3.org/projects/show/package-fluid extern])</ref>
* Fluid (als Teil von [[TYPO3 Flow]])<ref>({{Webarchiv|url=http://forge.typo3.org/projects/show/package-fluid |wayback=20090131124210 |text=extern |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }})</ref>
* vlibTemplate<ref>[http://vlib.clausvb.de/ vLIB]: [http://vlib.clausvb.de/vlibtemplate.php vlibTemplate], [http://vlib.clausvb.de/vlibdate.php vlibDate] und [http://vlib.clausvb.de/vlibmimemail.php vlibMimeMail] ([http://vlib.clausvb.de/ englisch], [http://lamp.clausvb.de/ deutsch])</ref>
* vlibTemplate<ref>{{Webarchiv|url=http://vlib.clausvb.de/ |wayback=20050121011753 |text=vLIB |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }}: {{Webarchiv|url=http://vlib.clausvb.de/vlibtemplate.php |wayback=20060619180826 |text=vlibTemplate |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }}, {{Webarchiv|url=http://vlib.clausvb.de/vlibdate.php |wayback=20060717065639 |text=vlibDate |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }} und {{Webarchiv|url=http://vlib.clausvb.de/vlibmimemail.php |wayback=20060717065537 |text=vlibMimeMail |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }} ({{Webarchiv|url=http://vlib.clausvb.de/ |wayback=20050121011753 |text=englisch |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }}, [http://lamp.clausvb.de/ deutsch])</ref>
* TinyButStrong<ref>[http://www.tinybutstrong.com/ TinyButStrong]</ref>
* TinyButStrong<ref>[https://www.tinybutstrong.com/ TinyButStrong]</ref>
* Contemplate<ref>[http://www.typea.net/software/contemplate/assembled/home.html Contemplate]</ref>
* Contemplate<ref>{{Webarchiv|url=http://www.typea.net/software/contemplate/assembled/home.html |wayback=20051122153736 |text=Contemplate |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }}</ref>
* ETS (Easy Template System)<ref>[http://ets.sourceforge.net/ ETS (Easy Template System)]</ref>
* ETS (Easy Template System)<ref>[https://ets.sourceforge.net/ ETS (Easy Template System)]</ref>
* t24 - PHP template parser<ref>[http://www.ister.org/code/t24/index.html t24 - PHP template parser]</ref>
* t24 - PHP template parser<ref>[http://www.ister.org/code/t24/index.html t24 - PHP template parser]</ref>
* HTML_Template_IT: HTML Integrated Templates, PEAR-PackageuBook Template<ref>[http://pear.php.net/package/HTML_Template_IT/ HTML_Template_IT: HTML Integrated Templates, PEAR-Package]</ref>
* HTML_Template_IT: HTML Integrated Templates, PEAR-PackageuBook Template<ref>[https://pear.php.net/package/HTML_Template_IT/ HTML_Template_IT: HTML Integrated Templates, PEAR-Package]</ref>
* uBook Template<ref>[http://www.nongnu.org/ubook/doc/default/Template.html uBook Template]</ref>
* uBook Template<ref>[http://www.nongnu.org/ubook/doc/default/Template.html uBook Template]</ref>
* KTemplate<ref>[http://kuerbis.org/asap/article/12/ KTemplate]</ref>
* KTemplate<ref>{{Webarchiv|url=http://kuerbis.org/asap/article/12/ |wayback=20080514035504 |text=KTemplate |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }}</ref>
* Hyperkit PHP/XML Template-Engine<ref>[http://www.hyperkit-software.com/projects/phptemplates/index.html Hyperkit PHP/XML Template-Engine]</ref>
* Hyperkit PHP/XML Template-Engine<ref>{{Webarchiv|url=http://www.hyperkit-software.com/projects/phptemplates/index.html |wayback=20120124010010 |text=Hyperkit PHP/XML Template-Engine |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }}</ref>
* Beilpuz<ref>[http://beilpuz.get-mike.de Beilpuz]</ref>
* Beilpuz<ref>[http://beilpuz.get-mike.de Beilpuz]</ref>
* Separate<ref>[http://de.separate.esud.info/ Separate]</ref>
* Separate<ref>[http://de.separate.esud.info/ Separate]</ref>
*Blade (als Teil von [[Laravel]])<ref>{{Internetquelle |url=https://laravel.com/docs/5.8/blade |titel=Blade Templates - Laravel - The PHP Framework For Web Artisans |abruf=2019-06-01}}</ref>


==== Beispiel ====
==== Beispiel ====
Um eine Template-Engine zu verwenden, benötigt man die Template-Datei (in der die auszugebenen Daten enthalten sind) sowie das Script, welches das Template lädt und die Platzhalter mit Werten füllt.
Um eine Template-Engine zu verwenden, benötigt man die Template-Datei (in der die auszugebenden Daten enthalten sind) sowie das Script, welches das Template lädt und die Platzhalter mit Werten füllt.


Das Template könnte so aussehen:
Das Template könnte so aussehen:
<syntaxhighlight lang="html4strict">
<syntaxhighlight lang="html">
<body>
<body>
<p>Hallo, {name}!</p>
<p>Hallo, {name}!</p>
Zeile 76: Zeile 76:


Das Ergebnis:
Das Ergebnis:
<syntaxhighlight lang="html4strict">
<syntaxhighlight lang="html">
<body>
<body>
<p>Hallo, Erika Mustermann!</p>
<p>Hallo, Erika Mustermann!</p>
Zeile 83: Zeile 83:


=== Template-Engines für Perl ===
=== Template-Engines für Perl ===
* Template Toolkit<ref>[http://www.template-toolkit.org/ Template Toolkit]</ref>
* [[Template-Toolkit|Template Toolkit]]<ref>[http://www.template-toolkit.org/ Template Toolkit]</ref>
* Contemplate<ref>[http://www.typea.net/software/contemplate/assembled/home.html Contemplate]</ref> (auch [[Active Server Pages|ASP]])
* Contemplate<ref>{{Webarchiv|url=http://www.typea.net/software/contemplate/assembled/home.html |wayback=20051122153736 |text=Contemplate |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }}</ref> (auch [[Active Server Pages|ASP]])
* Embperl<ref>[http://perl.apache.org/embperl/ Embperl]</ref>
* Embperl<ref>[https://perl.apache.org/embperl/ Embperl]</ref>
* Mason<ref>[http://www.masonhq.com/ Mason]</ref>
* Mason<ref>[http://www.masonhq.com/ Mason]</ref>
* HTML Template<ref>[http://html-template.sourceforge.net/ HTML Template]</ref>
* HTML Template<ref>[https://html-template.sourceforge.net/ HTML Template]</ref>
* Text Template<ref>[http://perl.plover.com/Template/ Text Template]</ref>
* Text Template<ref>[https://perl.plover.com/Template/ Text Template]</ref>
* HTML CTPP2<ref>[http://search.cpan.org/dist/HTML-CTPP2/ HTML CTPP2]</ref>
* HTML CTPP2<ref>[http://search.cpan.org/dist/HTML-CTPP2/ HTML CTPP2]</ref>


=== Template-Engines für Python ===
=== Template-Engines für Python ===


Es gibt viele Template-Engines unter [[Python (Programmiersprache)|Python]]. Beispiele sind ''[[Django_(Framework)|Django]]'' oder ''TurboGears''. Eine gute Übersicht (mit URI und Code-Beispielen) findet man im deutschen PythonWiki<ref>[http://pythonwiki.pocoo.org/Template_Engines deutschen PythonWiki]</ref>. Eine umfangreichere Liste, dafür weniger erklärt findet man im englischen Wiki zu Python<ref>[http://wiki.python.org/moin/WebProgramming englischen Wiki zu Python]</ref>. Weitere sind Cheetah, SimpleTAL, pyTemple, pyratemp<ref>[http://www.simple-is-better.org/template/pyratemp.html pyratemp]</ref> und einige Python Template-Engines<ref>[http://www.simple-is-better.org/template/ Vergleich und Benchmarks: Python Template-Engines]</ref>, Spytee, Nevow, Kid, Genshi, Jinja und HTMLTemplate.
Es gibt viele Template-Engines unter [[Python (Programmiersprache)|Python]]. Beispiele sind ''[[Django (Framework)|Django]]'' oder ''TurboGears''. Eine gute Übersicht (mit URI und Code-Beispielen) findet man im deutschen PythonWiki<ref>[http://pythonwiki.pocoo.org/Template_Engines deutschen PythonWiki]{{Toter Link|url=http://pythonwiki.pocoo.org/Template_Engines |date=2019-05 |archivebot=2019-05-17 16:29:30 InternetArchiveBot }}</ref>. Eine umfangreichere Liste, dafür weniger erklärt, findet man im englischen Wiki zu Python<ref>[https://wiki.python.org/moin/WebProgramming englischen Wiki zu Python]</ref>. Weitere sind Cheetah, SimpleTAL, pyTemple, pyratemp<ref>[http://www.simple-is-better.org/template/pyratemp.html pyratemp]</ref> und einige Python Template-Engines<ref>[http://www.simple-is-better.org/template/ Vergleich und Benchmarks: Python Template-Engines]</ref>, Spytee, Nevow, Kid, Genshi, Jinja und HTMLTemplate.


==== Anwendungsbeispiel ====
==== Anwendungsbeispiel ====
Zeile 107: Zeile 107:
template = Template(vorl_inhalt)
template = Template(vorl_inhalt)
# Ersetzungen nach folgendem Schema festlegen
# Ersetzungen nach folgendem Schema festlegen
ersetzungen = { 'Name' : 'Hans Meier', 'Strasse' : 'Bahnhofstr. 69', 'Ort' : '12345 Foobarhausen' }
ersetzungen = { 'Name' : 'Hans Meier', 'Straße' : 'Bahnhofstraße 69', 'Ort' : '12345 Foobarhausen' }
# Ersetzungen vornehmen
# Ersetzungen vornehmen
ersetzen = template.substitute(ersetzungen)
ersetzen = template.substitute(ersetzungen)
Zeile 119: Zeile 119:
<syntaxhighlight lang="text">
<syntaxhighlight lang="text">
Name: ${Name}
Name: ${Name}
Strasse: ${Strasse}
Straße: ${Straße}
Ort: ${Ort}
Ort: ${Ort}
</syntaxhighlight>
</syntaxhighlight>
Zeile 125: Zeile 125:
<syntaxhighlight lang="text">
<syntaxhighlight lang="text">
Name: Hans Meier
Name: Hans Meier
Strasse: Bahnhofstr. 69
Straße: Bahnhofstr. 69
Ort: 12345 Foobarhausen
Ort: 12345 Foobarhausen
</syntaxhighlight>
</syntaxhighlight>
Zeile 132: Zeile 132:
Für C++ und C gibt es verschiedene Template-Engines, wie
Für C++ und C gibt es verschiedene Template-Engines, wie
* ClearSilver<ref>[http://www.clearsilver.net/ ClearSilver]</ref> Die Template-Engine von Orkut und Yahoo Groups (setzen einen eigenen Branch ein).
* ClearSilver<ref>[http://www.clearsilver.net/ ClearSilver]</ref> Die Template-Engine von Orkut und Yahoo Groups (setzen einen eigenen Branch ein).
* Grantlee Template System<ref>[http://www.grantlee.org/ Grantlee Template System]</ref>
* Grantlee Template System<ref>{{Webarchiv|url=http://www.grantlee.org/ |wayback=20201130004953 |text=Grantlee Template System |archiv-bot=2024-05-26 12:24:30 InternetArchiveBot }}</ref>
* Google CTemplate<ref>{{Google Code|google-ctemplate|Google CTemplate}}</ref>
* Google CTemplate<ref>{{Google Code|google-ctemplate|Google CTemplate}}</ref>


=== Template-Engines für Java ===
=== Template-Engines für Java ===
Einige Template-Engines für Java<ref>[http://java-source.net/open-source/template-engines ''Java-Source.net - Open Source Template Engines in Java'']</ref> sind java-basierte Template-Engines, welche unter einer OpenSource Lizenz zugänglich sind.
Einige Template-Engines für Java<ref>[http://java-source.net/open-source/template-engines ''Java-Source.net - Open Source Template Engines in Java'']</ref> sind java-basierte, quelloffene Template-Engines.
*[https://www.stringtemplate.org/ StringTemplate] Template-Engine von Terence Parr, Basis für sein [https://www.antlr.org/ ANTLR], portiert auf C#, Objective-C und JavaScript
* [[FreeMarker]] – Java-basierte Template-Engine<ref>[http://freemarker.org/ Freemarker website]</ref>
*[[FreeMarker]] – Java-basierte Template-Engine<ref>[http://freemarker.org/ Freemarker website]</ref>
* [[Apache Velocity]] – Java-basierte Template-Engine
* [[Apache Velocity]] – Java-basierte Template-Engine
* [[Apache Tapestry]] - Java-basierte Template-Engine<ref>[http://tapestry.apache.org/ Tapestry website]</ref>
* Thymeleaf - Java-basierte Template-Engine<ref>[https://www.thymeleaf.org/ Thymeleaf]</ref>

=== Template-Engines für JavaScript ===
Im Gegensatz zu den vorherigen Lösungen können Templates vom Web-Browser verarbeitet werden. Der Server liefert nur die Daten z.&nbsp;B. als JSON, oder XML String. Der Rest übernimmt JavaScript im Browser.
* [[AngularJS]] Clientseitiges JavaScript-Webframework von Google


=== Weitere Informationen zu Template-Engines ===
=== Weitere Informationen zu Template-Engines ===
Weitere Template-Engines sind mitunter java-basiert.
Einige weitere Template-Engines sind Java-basiert:
* [[Hamlets]] – Java-basierte Template-Engine
* [[Hamlets]] – Java-basierte Template-Engine
* action4JAVA<ref>[http://www.action4java.org action4JAVA]</ref> - Java-basiertes Framework mit Template-Kern.
* action4JAVA<ref>{{Webarchiv|url=http://www.action4java.org/ |wayback=20130228072112 |text=action4JAVA |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }}</ref> - Java-basiertes Framework mit Template-Kern.
* [[jade4j]] – Java-basierte, freie Implementierung der Jade Template-Engine<ref>[https://github.com/neuland/jade4j jade4j Bezugsquelle]</ref>
* [[jade4j]] – Java-basierte, freie Implementierung der Jade Template-Engine<ref>[https://github.com/neuland/jade4j jade4j Bezugsquelle]</ref>
* [[XSLTengine]] - Java-basierte Template-Engine, insbesondere für Web-Entwickler<ref>[http://www.java4web.com/xslt?xsltengine XSLTengine website]</ref>
* [[openArchitectureWare|Xpand]] Java-basierte Template-Engine für die Codegenerierung<ref>[https://www.openarchitectureware.org oAW website]</ref>
* ASP<ref>{{Webarchiv|url=http://www.typea.net/software/contemplate/assembled/home.html |wayback=20051122153736 |text=Contemplate (englisch) |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }}</ref>
* [[openArchitectureWare|Xpand]] – Java-basierte Template-Engine für die Codegenerierung<ref>[http://www.openarchitectureware.org oAW website]</ref>
* CTPP, Cross-platform Template-Engine für C++, C, PERL und PHP<ref>[https://ctpp.havoc.ru/en/ CTPP]</ref>
* ASP<ref>[http://www.typea.net/software/contemplate/assembled/home.html Contemplate (englisch)]</ref>
* CTPP, Crossplatform Template-Engine für C++, C, PERL und PHP<ref>[http://ctpp.havoc.ru/en/ CTPP]</ref>
* GvTags Template-Engine für Groovy<ref>[http://www.gvtags.org GvTags Template-Engine für Groovy]</ref>
* GvTags Template-Engine für Groovy<ref>[http://www.gvtags.org GvTags Template-Engine für Groovy]</ref>
* jQote2 - jQuery Javascript Templating Engine<ref>[http://aefxx.com/jquery-plugins/jqote2/ jQote2]</ref>
* jQote2 - jQuery JavaScript Templating Engine<ref>{{Webarchiv|url=http://aefxx.com/jquery-plugins/jqote2/ |wayback=20100409055942 |text=jQote2 |archiv-bot=2019-05-17 16:29:30 InternetArchiveBot }}</ref>
* FilesFromCSV - .NET basiert - erzeugt pro CSV Datensatz ein Dokument<ref>[http://www.somebytes.net/54-0-FilesFromCSV.html FilesFromCSV]</ref>
* FilesFromCSV - .NET basiert - erzeugt pro CSV Datensatz ein Dokument<ref>[https://www.somebytes.net/54-0-FilesFromCSV.html FilesFromCSV]</ref>
* Handlebars – [[JavaScript]]-basierte semantische Template-Engine<ref>[https://handlebarsjs.com/ Handlebars.js: Minimal Templating on Steroids]</ref>, wird u.&nbsp;a. in [[Ghost (Blogging-Plattform)|Ghost]] verwendet
* AWS Templates Parser – [[Ada (Programmiersprache)|Ada]]-basierte Template-Engine<ref>[https://docs.adacore.com/aws-docs/templates_parser/ AWS Templates Parser: A template engine]</ref>


== Literatur ==
== Literatur ==
Zeile 158: Zeile 164:


== Einzelnachweise ==
== Einzelnachweise ==
<references />
<references responsive />





Aktuelle Version vom 26. Mai 2024, 14:24 Uhr

QS-Informatik
Beteilige dich an der Diskussion!
Dieser Artikel wurde wegen inhaltlicher Mängel auf der Qualitätssicherungsseite der Redaktion Informatik eingetragen. Dies geschieht, um die Qualität der Artikel aus dem Themengebiet Informatik auf ein akzeptables Niveau zu bringen. Hilf mit, die inhaltlichen Mängel dieses Artikels zu beseitigen, und beteilige dich an der Diskussion! ()

Eine Template-Engine (von englisch für Vorlage bzw. Schablone und Maschine) ist eine Software, die eine Vorlagen-Datei (engl. Template) verarbeitet und bestimmte Platzhalter darin ähnlich wie bei einem Formular durch jeweils aktuelle Inhalte ersetzt. Die Bezeichnungen Template-Klasse (dt. ugs. „Vorlagenklasse“, aber sachlich korrekt: „Klassenvorlage“) und Template-System werden oft als Synonym für eine Template-Engine verwendet.

Klassen-Templates in der C++-Programmierung sind dagegen nicht mit Template-Engines vergleichbar, weil sie eine vom Datentyp unabhängige Programmierung ermöglichen und ganze Klassen generieren können. In den Templates einer Template-Engine sollte kein Programm-Code enthalten sein. Kontrollstrukturen (wie IF) sind allerdings oft in Templates möglich und verbreitet. Typische Dateitypen, die verarbeitet werden, sind HTML, Text (ASCII oder Unicode), XML oder TeX.

Konzept

Das Konzept ähnelt den Seriendruckfeldern bei einer Textverarbeitung: In einem Dokument werden Seriendruckfelder (Platzhalter) eingefügt, etwa Name – Straße – Ort. Bei Template-Engines werden diese Seriendruckfelder Template-Variablen genannt. Wenn aus dem Dokument dann mehrere Serienbriefe erzeugt werden, steht anstatt der Template-Variablen name ein realer Name wie „Erika Mustermann“ im fertigen Serienbrief.

Das Dokument braucht nur einmal geschrieben und formatiert zu werden. Alle Änderungen wirken sich automatisch auf zukünftig erstellte Serienbriefe aus. Das ist bei Template-Engines genauso; weitere Parallelen zu Serienbrief-Vorlagen sind:

  • Die Daten kommen aus einer externen Quelle (Datenbank, Tabellenkalkulation etc.).
  • Um die Daten zu ändern, braucht das Template nicht verändert zu werden, und umgekehrt.
  • Das Template kann wiederverwendet werden.

Abgrenzung

Template-Engines werden häufig von Programmierern eingesetzt, um im Kontext von Webanwendungen Programm-Code (einer Programmiersprache) vom Design zu trennen. Genauso wird von den Herstellern mancher Template-Engines angeführt, Templates und Engines sollen durch die Trennung der Programmierlogik vom Design das Skript von HTML-Code befreien und damit übersichtlicher machen.

Demgegenüber steht der ursprüngliche Gedanke der Template-Engines: Sie sollen statischen Text und dynamische Inhalte möglichst effizient miteinander verknüpfen. Oft sind Template-Engines deshalb gerade in Programmiersprachen anzutreffen, deren Syntax eine solche Mischung nicht direkt unterstützt (z. B. Java: JSP; VBScript u. a.: ASP). Für eine echte Trennung der Darstellung von den Datenmodellen und den Logikkomponenten sind Template-Engines dagegen ungeeignet, und es sind zusätzliche Konzepte wie Model View Controller notwendig.

Vorteile

  • Programm-Code (PHP, Python, Ruby, Perl, JavaScript) wird vom Markup (HTML) getrennt.
  • Designer und Programmierer können gleichzeitig an einem Projekt arbeiten.
  • WYSIWYG-Editoren können verwendet werden.

Nachteile

  • Template-Engines erzeugen zur Laufzeit Zusatzaufwand (engl. "overhead").
  • Template-Engines müssen im Gebrauch erlernt werden. Neben der neuen Syntax sind auch oft grundlegende Kenntnisse der objektorientierten Programmierung Voraussetzung.
  • Template-Engines sind auf eine textuelle Ausgabe beschränkt.

Sprachabhängige Template-Engines

Template-Engines sind sehr verbreitet. XSLT ist für alle Template-Engines eine Konkurrenz. Bei PHP ist Smarty weit verbreitet, hat aber die Eigenentwicklungen und andere Template-Engines nicht vom Markt verdrängt.

Template-Engines für PHP

PHP selbst ist bereits so entworfen, dass man programmiersprachliche Konstrukte mit der textuellen Ausgabe über Platzhalter bzw. gekennzeichnete Bereiche mischen kann.

<h1><?php echo $body_text; ?></h1>

<?php foreach($test_array as $key => $value) : ?>
   <p>Schlüssel: <?php echo $key; ?> - Wert: <?php echo $value; ?></p>
<?php endforeach; ?>

Der Vorteil liegt in der einfachen Verwendung. Es braucht keine zusätzliche Bibliothek installiert zu werden, auch ist diese Vorgehensweise für PHP-erfahrene Entwickler am leichtesten zu verstehen und folgt dem Prinzip der geringsten Überraschung. Die Verwendung einer gesonderten Template-Engine für PHP ist daher nicht erforderlich. Dennoch bietet die Verwendung einer Template-Engine für PHP, neben der besseren Übersicht, einige Vorzüge, beispielsweise können einfache, anpassbare Templates für Fehlermeldungen und ähnliche, wiederkehrende Strukturen erstellt werden. Einige populäre Template-Engines sind:

Beispiel

Um eine Template-Engine zu verwenden, benötigt man die Template-Datei (in der die auszugebenden Daten enthalten sind) sowie das Script, welches das Template lädt und die Platzhalter mit Werten füllt.

Das Template könnte so aussehen:

<body>
  <p>Hallo, {name}!</p>
</body>

Und so könnte eine Wertzuweisung vom Script aus aussehen:

$template->assign('name', 'Erika Mustermann');

Das Ergebnis:

<body>
  <p>Hallo, Erika Mustermann!</p>
</body>

Template-Engines für Perl

Template-Engines für Python

Es gibt viele Template-Engines unter Python. Beispiele sind Django oder TurboGears. Eine gute Übersicht (mit URI und Code-Beispielen) findet man im deutschen PythonWiki[23]. Eine umfangreichere Liste, dafür weniger erklärt, findet man im englischen Wiki zu Python[24]. Weitere sind Cheetah, SimpleTAL, pyTemple, pyratemp[25] und einige Python Template-Engines[26], Spytee, Nevow, Kid, Genshi, Jinja und HTMLTemplate.

Anwendungsbeispiel

# -*- coding: utf-8 -*-
# Modul Template muss importiert werden
from string import Template
# Vorlage zum Lesen öffnen, Inhalt übergeben und Datei schließen
vorlage = open('vorlage.txt', 'r')
vorl_inhalt = vorlage.read()
vorlage.close()
# Den Inhalt als Template behandeln
template = Template(vorl_inhalt)
# Ersetzungen nach folgendem Schema festlegen
ersetzungen = { 'Name' : 'Hans Meier', 'Straße' : 'Bahnhofstraße 69', 'Ort' : '12345 Foobarhausen' }
# Ersetzungen vornehmen
ersetzen = template.substitute(ersetzungen)
# Vorgang in Datei schreiben
outfile = open('ausgabe.txt', 'w')
outfile.write(ersetzen)
outfile.close()

vorlage.txt:

Name: ${Name}
Straße: ${Straße}
Ort: ${Ort}

ausgabe.txt:

Name: Hans Meier
Straße: Bahnhofstr. 69
Ort: 12345 Foobarhausen

Template-Engines für C++ und C

Für C++ und C gibt es verschiedene Template-Engines, wie

  • ClearSilver[27] Die Template-Engine von Orkut und Yahoo Groups (setzen einen eigenen Branch ein).
  • Grantlee Template System[28]
  • Google CTemplate[29]

Template-Engines für Java

Einige Template-Engines für Java[30] sind java-basierte, quelloffene Template-Engines.

  • StringTemplate Template-Engine von Terence Parr, Basis für sein ANTLR, portiert auf C#, Objective-C und JavaScript
  • FreeMarker – Java-basierte Template-Engine[31]
  • Apache Velocity – Java-basierte Template-Engine
  • Thymeleaf - Java-basierte Template-Engine[32]

Template-Engines für JavaScript

Im Gegensatz zu den vorherigen Lösungen können Templates vom Web-Browser verarbeitet werden. Der Server liefert nur die Daten z. B. als JSON, oder XML String. Der Rest übernimmt JavaScript im Browser.

  • AngularJS Clientseitiges JavaScript-Webframework von Google

Weitere Informationen zu Template-Engines

Einige weitere Template-Engines sind Java-basiert:

  • Hamlets – Java-basierte Template-Engine
  • action4JAVA[33] - Java-basiertes Framework mit Template-Kern.
  • jade4j – Java-basierte, freie Implementierung der Jade Template-Engine[34]
  • Xpand – Java-basierte Template-Engine für die Codegenerierung[35]
  • ASP[36]
  • CTPP, Cross-platform Template-Engine für C++, C, PERL und PHP[37]
  • GvTags Template-Engine für Groovy[38]
  • jQote2 - jQuery JavaScript Templating Engine[39]
  • FilesFromCSV - .NET basiert - erzeugt pro CSV Datensatz ein Dokument[40]
  • Handlebars – JavaScript-basierte semantische Template-Engine[41], wird u. a. in Ghost verwendet
  • AWS Templates Parser – Ada-basierte Template-Engine[42]

Literatur

  • Karsten Wendland: Der Template-Zyklus. Web-Templates im Spannungsfeld von schöpferischem Gestalten und einschränkender Zumutung. Aachen 2006, ISBN 3-8322-5285-1.

Einzelnachweise

  1. Smarty extern
  2. Twig (Memento des Originals vom 9. Juli 2017 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/twig.sensiolabs.org
  3. (extern (Memento des Originals vom 31. Januar 2009 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/forge.typo3.org)
  4. vLIB (Memento des Originals vom 21. Januar 2005 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/vlib.clausvb.de: vlibTemplate (Memento des Originals vom 19. Juni 2006 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/vlib.clausvb.de, vlibDate (Memento des Originals vom 17. Juli 2006 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/vlib.clausvb.de und vlibMimeMail (Memento des Originals vom 17. Juli 2006 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/vlib.clausvb.de (englisch (Memento des Originals vom 21. Januar 2005 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/vlib.clausvb.de, deutsch)
  5. TinyButStrong
  6. Contemplate (Memento des Originals vom 22. November 2005 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.typea.net
  7. ETS (Easy Template System)
  8. t24 - PHP template parser
  9. HTML_Template_IT: HTML Integrated Templates, PEAR-Package
  10. uBook Template
  11. KTemplate (Memento des Originals vom 14. Mai 2008 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/kuerbis.org
  12. Hyperkit PHP/XML Template-Engine (Memento des Originals vom 24. Januar 2012 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.hyperkit-software.com
  13. Beilpuz
  14. Separate
  15. Blade Templates - Laravel - The PHP Framework For Web Artisans. Abgerufen am 1. Juni 2019.
  16. Template Toolkit
  17. Contemplate (Memento des Originals vom 22. November 2005 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.typea.net
  18. Embperl
  19. Mason
  20. HTML Template
  21. Text Template
  22. HTML CTPP2
  23. deutschen PythonWiki@1@2Vorlage:Toter Link/pythonwiki.pocoo.org (Seite nicht mehr abrufbar, festgestellt im Mai 2019. Suche in Webarchiven)  Info: Der Link wurde automatisch als defekt markiert. Bitte prüfe den Link gemäß Anleitung und entferne dann diesen Hinweis.
  24. englischen Wiki zu Python
  25. pyratemp
  26. Vergleich und Benchmarks: Python Template-Engines
  27. ClearSilver
  28. Grantlee Template System (Memento des Originals vom 30. November 2020 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.grantlee.org
  29. Projektübersicht zu Google CTemplate bei Google Code
  30. Java-Source.net - Open Source Template Engines in Java
  31. Freemarker website
  32. Thymeleaf
  33. action4JAVA (Memento des Originals vom 28. Februar 2013 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.action4java.org
  34. jade4j Bezugsquelle
  35. oAW website
  36. Contemplate (englisch) (Memento des Originals vom 22. November 2005 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.typea.net
  37. CTPP
  38. GvTags Template-Engine für Groovy
  39. jQote2 (Memento des Originals vom 9. April 2010 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/aefxx.com
  40. FilesFromCSV
  41. Handlebars.js: Minimal Templating on Steroids
  42. AWS Templates Parser: A template engine