WJR - Sounds interesting. How does this compare to the use of Doc_Include for inclusion of headers, footers, etc.?CMcC it's lower powered - doesn't nest. The wrapper can be a template, and it'll work for a whole directory (or class of files) by virtue of being placed in a /.tml file, and the wrapper name is implicit. Much the same, otherwise.
# wrap.tcl # # This code will use the post-content filter to substitute content # into a file called wrapper.tml or wrapper.html at the point where %BODY% occurs. # # To trigger this, put the following in a Doc domain's .tml # # Httpd_Filter [Httpd_CurrentSocket] Wrap package require struct::list proc Wrap {sock content} { upvar #0 Httpd$sock data global Template foreach dir [::struct::list::Lreverse [Doc_GetPath $sock]] { set template [file join $dir wrapper$Template(tmlExt)] set wrapper [file join $dir wrapper$Template(htmlExt)] if {[file exists $template] && (![file exists $wrapper] || ([file mtime $template] > [file mtime $wrapper]))} { # instantiate the wrapper set dynamic 0 set wrapper [TemplateInstantiate $sock $template $wrapper $data(suffix) dynamic 0] set content [string map [list %BODY% $content] $wrapper] break } elseif {[file exists $wrapper]} { # the wrapper exists set fd [open $wrapper]; set wrapper [read $fd]; close $fd set content [string map [list %BODY% $content] $wrapper] break } } return $content }
Revisions:
- 20041204: improved template generation, used variables for extensions