DDG: After seeing a lot of template approaches where the template becomes more and more bloated with programming logic I was reading an article about Template::Recall, Reverse Callback Templating , by James Robsen. Here is its Tcl counterpart written as an Itcl-class:
# Created By : Dr. Detlef Groth
# Created : Mon Mar 17 13:56:04 2008
#
# Description
#
# History
#
package require Itcl
itcl::class TemplateRecall {
public variable template_path ""
private variable TemplateText ""
private variable Templ
constructor {args} {
eval configure $args
if {$template_path eq ""} {
error "Option -template_path not given"
}
if [catch {open $template_path r} infh] {
puts stderr "Cannot open $template_path: $infh"
exit
} else {
set TemplateText [read $infh]
close $infh
}
array set Templ [list]
}
method render {template args} {
if {![info exists Templ($template)]} {
foreach line [split $TemplateText "\n"] {
if {[regexp {\[ *=+ ([^\s]+) +=+ *\]} $line -> lastTempl]} {
continue
} elseif {[info exists lastTempl]} {
append Templ($lastTempl) "$line\n"
}
}
}
set cpTempl $Templ($template)
set cpTempl [regsub -all {\['} $cpTempl "'''''"]
set cpTempl [regsub -all {']} $cpTempl "'''''"]
foreach {var repl} $args {
set var [regsub {^-} $var ""]
set cpTempl [regsub -all "'{5} +$var +'{5}" $cpTempl $repl]
}
return $cpTempl
}
}
if {0} {
set goods [list "oxfords,Brown leather,\$85,0" \
"hiking,All sizes,\$55,7" \
"tennis shoes,Women's sizes,\$35,15" \
"flip flops,Colors of the rainbow,\$7,90" ]
TemplateRecall tr -template_path template1.html
puts [tr render header -title MyStore -date [clock format [clock seconds]]]
foreach good $goods {
set attr [split $good ,]
set q [lindex $attr 3]
if { $q == 0} {
set q "Out Of stock"
}
puts [tr render product_row -shoe [lindex $attr 0] -details [
lindex $attr 1] -price [lindex $attr 2] -quantity $q]
}
puts [tr render footer]
}Here is the template-file template1.html:
[ =================== header ===================]
<html>
<head>
<title>my site - [' title ']</title>
</head>
<body>
<h4>The date is [' date ']</h4>
<table border="1">
<tr>
<th>Shoe</th>
<th>Details</th>
<th>Price</th>
<th>Quantity</th>
</tr>
[ =================== product_row =================== ]
<tr>
<td>[' shoe ']</td>
<td>[' details ']</td>
<td>[' price ']</td>
<td>[' quantity ']</td>
</tr>
[= footer =]
</table>
</body>
</html>Here is the output of the test:
<html>
<head>
<title>my site - MyStore</title>
</head>
<body>
<h4>The date is Mon Mar 17 15:23:45 +0100 2008</h4>
<table border="1">
<tr>
<th>Shoe</th>
<th>Details</th>
<th>Price</th>
<th>Quantity</th>
</tr>
<tr>
<td>oxfords</td>
<td>Brown leather</td>
<td>$85</td>
<td>Out Of stock</td>
</tr>
<tr>
<td>hiking</td>
<td>All sizes</td>
<td>$55</td>
<td>7</td>
</tr>
<tr>
<td>tennis shoes</td>
<td>Women's sizes</td>
<td>$35</td>
<td>15</td>
</tr>
<tr>
<td>flip flops</td>
<td>Colors of the rainbow</td>
<td>$7</td>
<td>90</td>
</tr>
</table>
</body>
</html>Enter your comments here.