- Template (einführend)
Beispiel
-
Als einführendes Beispiel sollen in einer Zeichenkette str an Zielpositionen Textmuster-Ersetzungen erfolgen.
So soll durch den repl( ) - Aufruf
repl( "Hallo { fun }!", { fun : "ECMAScript" } )
aus dem String
str = "Hallo { fun }!"
der Rückgabestring
Hallo ECMAScript!
entstehen.
Hier ist die Template-Funktion repl(str, obj)
function repl(str, obj) { var i;
for (i in obj) {
if (obj.hasOwnProperty(i)) {
str = str.replace(new RegExp('{\\s*' + i + '\\s*}', 'g'), obj[i] );
}
} return str;
}
Ausgabe von repl( "Hallo { fun }! { fun } ist Klasse!", { fun: "ECMAScript" }) ist
Ausgabe von repl( "Hallo { fun }! time ist {time} ms.", { fun : "ECMAScript", time: Date.now }) ist
Ausgabe von repl( "sin(1) = {sin}, cos(1) = = {sin}", { sin: Math.sin(1),cos: Math.cos(1) }) ist
- Template (allg)
Was ist eine "Template Engine"?
-
Im Zusammenhang mit Text-Strukturen und Text-Mustern
(z.B. HTML-, XML- und TeX-Rahmen, Attribut- und Unicode-Einfügungen,
Drucker-Formular für Seriendruck)
kommen oft Vorlagen (Schablonen, engl. Templates) vor,
die recht ähnlich sind und an den passenden Stellen mit
Daten "gefüttert" (assign, setvar, merge) werden müssen.
Eine "Template Engine" (engl. Vorlage und automatischem Antrieb)
kann Daten aus einer Datei (Template) verarbeitet,
und bestimmte Platzhalter darin mit jeweils aktuellen Inhalten füllt.
Außer einfachen Kontrollstrukturen (IF)
enthalten Templates einer Template Engine kein Programm-Code.
Die Bezeichnungen
Templateklasse, Templatesystem, Template Engine
sind gewisser Weise synonym.
Es gibt zahlreiche attributbasierte Schablonensprachen
(siehe z.B.
Template_Attribute_Language
)
und "Template Engine's" (siehe z.B.
Template_Engine
)
- Variablen als Platzhalter
Wie funktioniert die Text-Ersetzung?
-
Micro-Templating
Ein einfaches ECMAScript-Template
verwendet Variablen als Platzhalter für einzufügenden Text.
Code Snippet: Platzhalter für einzufügenden Text
- <div id="OUT1">... für die Ausgabe</div>
-
- <script type="text/javascript">//<![CDATA[ "use strict";
- var markup1 = {};
- markup1.user = function(data) {
- var html = '<dl class="gruen"><dt>' + data.name1 +
- '</dt><dd><p>' + data.cont1 + '</p></dd></dl>';
- return html;
- };
- var data1 = {name1:"name1:Text für dt", cont1:"cont1:Text für dd"};
- document.getElementById("OUT1").innerHTML = markup1.user(data1);
- //]]></script>
Template-Anzeige:
... für die Ausgabe
Hier etwa das gleiche bei Verwendung von .apply
Code Snippet: Platzhalter für einzufügenden Text mit .apply
- <div id="OUT2">... für die Ausgabe</div>
-
- <script type="text/javascript">//<![CDATA[ "use strict";
- var markup2 = {};
- markup2.user = function() {
- var html = '<dl class="rot"><dt>' + this.name2 +
- '</dt><dd><p>' + this.cont2 + '</p></dd></dl>';
- return html;
- };
- var data2 = { name2: "name2: Text für dt", cont2: "cont2: Text für dd"};
- document.getElementById("OUT2").innerHTML = markup2.user.apply(data2);
- //]]></script>
Template-Anzeige:
... für die Ausgabe
- Einfaches PHP-Template
Wie funktioniert die Text-Ersetzung?
-
Die Datei template01.php fügt php-Strings in template01.htm ein und zeigt das Ergebnis als .htm an">
template01.php?show_htm_code
template01.php?show_php_code
do template01
- Template Attribute Language (allg) ECMAScript-Template nach ejohnNoch nicht getestet ...
-
Zur Generierung von HTML- und XML-Code können Templatesprachen verwendet werden.
Attributbasierte Schablonensprachen (TAL = Template Attribute Language)
können die Zusammenarbeit von Designern und Programmierern erleichtern.
TAL abstrahiert (außer der Ausdrucksauswertung) völlig von der eingesetzten Programmiersprache.
Templates können mit Designwerkzeugen bearbeitet werden,
die alle unbekannten Attribute unbehelligt lassen.
Sowohl die Templates als auch die Ergebnisseiten bleiben gültige Dokumente ihrer Auszeichnungssprache.
Es gibt zahlreiche attributbasierte Schablonensprachen
(siehe z.B.
Template_Attribute_Language
)
und "Template Engine's" (siehe z.B.
Template_Engine
)
- ECMAScript-Template nach ejohn Noch nicht getestet ...
-
Noch nicht getestet ...
Code Snippet
- http://ejohn.org/blog/javascript-micro-templating/#postcomment
-
- <script>
- // Simple JavaScript Templating
- // John Resig - http://ejohn.org/ - MIT Licensed
- (function(){
- var cache = {};
-
- this.tmpl = function tmpl(str, data){
- // Figure out if we're getting a template, or if we need to
- // load the template - and be sure to cache the result.
- var fn = !/\W/.test(str) ?
- cache[str] = cache[str] ||
- tmpl(document.getElementById(str).innerHTML) :
-
- // Generate a reusable function that will serve as a template
- // generator (and which will be cached).
- new Function("obj",
- "var p=[],print=function(){p.push.apply(p,arguments);};" +
-
- // Introduce the data as local variables using with(){}
- "with(obj){p.push('" +
-
- // Convert the template into pure JavaScript
- str
- .replace(/[\r\t\n]/g, " ")
- .split("<%").join("\t")
- .replace(/((^|%>)[^\t]*)'/g, "$1\r")
- .replace(/\t=(.*?)%>/g, "',$1,'")
- .split("\t").join("');")
- .split("%>").join("p.push('")
- .split("\r").join("\\'")
- + "');}return p.join('');");
-
- // Provide some basic currying to the user
- return data ? fn( data ) : fn;
- };
- })();
- </script>
-
- You would use it against templates written like this
- (it doesn't have to be in this particular manner -
- but it's a style that I enjoy):
-
- <script type="text/html" id="item_tmpl">
- <div id="<%=id%>" class="<%=(i % 2 == 1 ? " even" : "")%>">
- <div class="grid_1 alpha right">
- <img class="righted" src="<%=profile_image_url%>"/>
- </div>
- <div class="grid_6 omega contents">
- <p><b><a href="/<%=from_user%>"><%=from_user%></a>:</b> <%=text%></p>
- </div>
- </div>
- </script>
-
- You can also inline script:
- <script type="text/html" id="user_tmpl">
- <% for ( var i = 0; i < users.length; i++ ) { %>
- <li><a href="<%=users[i].url%>"><%=users[i].name%></a></li>
- <% } %>
- </script>
-
- <script>
- var results = document.getElementById("results");
- results.innerHTML = tmpl("item_tmpl", dataObject);
- </script>
-
- You could pre-compile the results for later use.
- If you call the templating function with only an ID
- (or a template code) then it'll return a pre-compiled
- function that you can execute later:
-
- <script>
- var show_user = tmpl("item_tmpl"), html = "";
- for ( var i = 0; i < users.length; i++ ) {
- html += show_user( users[i] );
- }
- </script>