Version 0 of Tclhttpd Content Wrapping

Updated 2004-12-03 07:19:06 by CMCc

# 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
    #
    #        upvar #0 Httpd[Httpd_CurrentSocket] data
    #        lappend data(filter) Wrap 

    package require struct::list
    proc Wrap {sock content} {
        upvar #0 Httpd$sock data

        foreach dir [::struct::list::Lreverse [Doc_GetPath $sock]] {
            set template [file join $dir wrapper.tml]
            set wrapper [file join $dir wrapper.html]

            if {![file exists $wrapper]
                && [file exists $template]} {
                # 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
    }