<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Examples and Usage</title><link rel="stylesheet" type="text/css" href="rivet.css"><meta name="generator" content="DocBook XSL Stylesheets V1.79.1"><link rel="home" href="index.html" title="Apache Rivet"><link rel="up" href="index.html" title="Apache Rivet"><link rel="prev" href="xml.html" title="xml"><link rel="next" href="tcl_packages.html" title="Rivet Tcl Packages"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Examples and Usage</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="xml.html"><img src="images/prev.png" alt="Prev"></a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="tcl_packages.html"><img src="images/next.png" alt="Next"></a></td></tr></table></div><div class="section"><div class="titlepage"><div><div><hr><h2 class="title" style="clear: both"><a name="examples"></a>Examples and Usage</h2></div></div></div><p style="width:90%">
        Some examples of Rivet usage follow.  Some prior Tcl knowledge
        is assumed.  If you don't know much Tcl, don't worry, it's easy,
        and there are some good resources available on the web that will
        get you up to speed quickly.  Go to the 
        <a class="link" href="help.html#websites" title="Web Sites">web sites</a> section and have a look.
    </p><div class="example"><a name="hello_world"></a><p class="title"><b>Example 1. Hello World</b></p><div class="example-contents"><p style="width:90%">
			As with any tool, it's always nice to see something work, so
			let's create a small "Hello World" page.
	    </p><p style="width:90%">
			Assuming you have Apache configured correctly, create a file
			called <code class="filename">hello.rvt</code> where Apache can find
			it, with the following content:
        </p><pre class="programlisting">&lt;?
puts "Hello World"
?&gt;

</pre><p style="width:90%">
			If you then access it with your browser, you should see a
			blank page with the text "Hello World" (without the quotes) on it.
            The command <span style="font-family:monospace"><span class="command"><strong>puts</strong></span></span> is the good old Tcl command for
            terminal printing, which appends to the argument string the control
            characters needed to open a newline. When you don't have to run through
            complex elaboration and the output can be lumped
            in a single string (just like in the 'Hello World' example) you
            can draw on the popular shorthand syntax for string
            output that comes handy in many cases
        </p><pre class="programlisting">&lt;?= "Hello World" ?&gt;
</pre><p style="width:90%">
            which is translated into 
            </p><pre class="programlisting">puts -nonewline "Hello World"</pre><p style="width:90%">
        </p></div></div><br class="example-break"><div class="example"><a name="idm1719"></a><p class="title"><b>Example 2. Generate a Colorful Table</b></p><div class="example-contents"><p style="width:90%">
	   	In another simple example, we dynamically generate a table selecting
	   	a different background color for each cell. The font color is determined
	   	through a simple CSS rule embedded in a HTML &lt;style&gt; element. Create
	   	the file color-table.tcl and put the following code in it
	  	</p><pre class="programlisting">puts "&lt;html&gt;&lt;head&gt;"
puts "&lt;style&gt;\n  td { font-size: 12px; }\n  td.bright { color: #eee; }\n  td.dark { color: #222; }\n&lt;/style&gt;"
puts "&lt;/head&gt;&lt;body&gt;"
puts "&lt;table&gt;"

# we create a 8x8 table selecting a different background for each cell

for {set i 0} { $i &lt; 9 } {incr i} {
    puts "&lt;tr&gt;"
    for {set j 0} {$j &lt; 9} {incr j} {

        set r [expr int(255 * ($i + $j) / 16)] 
        set g [expr int(255 * (8 - $i + $j) / 16)]
        set b [expr int(255 * ($i + 8 - $j) / 16)]

# determining the background luminosity (YIQ space of NTSC) and choosing
# the foreground color accordingly in order maintain maximum contrast

        if { [expr ($r*0.29894)+($g*0.58704)+($b*0.11402)] &gt; 128} {
            set cssclass "dark"
        } else {
            set cssclass "bright"
        }

        puts [format "&lt;td bgcolor=\"%02x%02x%02x\" class=\"%s\"&gt;$r $g $b&lt;/td&gt;" $r $g $b $cssclass]
    }
    puts "&lt;/tr&gt;"
}
puts "&lt;/table&gt;"
puts "&lt;/body&gt;&lt;/html&gt;"
</pre><p style="width:90%">
	    	If you read the code, you can see that this is pure Tcl.  We
	    	could take the same code, run it outside of Rivet, and it
	    	would generate the same HTML
	  	</p><p style="width:90%">
	    	The result should look something like this:
	  	</p><div><img src="images/color-table.png"></div></div></div><br class="example-break"><div class="example"><a name="variable_access"></a><p class="title"><b>Example 3. Variable Access</b></p><div class="example-contents"><p style="width:90%">
			Here, we demonstrate how to access variables set by GET or
			POST operations.
      </p><p style="width:90%">
			Given an HTML form like the following:
      </p><pre class="programlisting">&lt;form action="vars.rvt"&gt;
  &lt;table&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;b&gt;Title:&lt;/b&gt;&lt;/td&gt;
        &lt;td&gt;&lt;input name="title" /&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;b&gt;Salary:&lt;/b&gt;&lt;/td&gt;
        &lt;td&gt;&lt;input name="salary" /&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;b&gt;Boss:&lt;/b&gt;&lt;/td&gt;
        &lt;td&gt;&lt;input name="boss" /&gt;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;b&gt;Skills:&lt;/b&gt;&lt;/td&gt;
        &lt;td&gt;
          &lt;select name="skills" multiple="multiple"&gt;
            &lt;option&gt;C&lt;/option&gt;
            &lt;option&gt;Java&lt;/option&gt;
            &lt;option&gt;Tcl&lt;/option&gt;
            &lt;option&gt;Perl&lt;/option&gt;
          &lt;/select&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;input type="submit" /&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/form&gt;

</pre><p style="width:90%">
			We can use this Rivet script to get the variable values:
      </p><pre class="programlisting">&lt;?
set errlist {}
if { [::rivet::var exists title] } {
    set title [::rivet::var get title]
} else {
    set errlist "You need to enter a title"
}

if { [::rivet::var exists salary] } {
    set salary [::rivet::var get salary]
    if { ! [string is digit $salary] } {
        lappend errlist "Salary must be a number"
    }
} else {
    lappend errlist "You need to enter a salary"
}

if { [::rivet::var exists boss] } {
    set boss [::rivet::var get boss]
} else {
    set boss "Mr. Burns"
}

if { [::rivet::var exists skills] } {
    set skills [::rivet::var list skills]
} else {
    lappend errlist "You need to enter some skills"
}

if { [llength $errlist] != 0 } {
    foreach err $errlist {
        puts "&lt;b&gt; $err &lt;/b&gt;"
    }
} else {
    puts "Thanks for the information!"
    ?&gt;
    &lt;table&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;b&gt;Title:&lt;/b&gt;&lt;/td&gt;
          &lt;td&gt;&lt;?= $title ?&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;b&gt;Boss:&lt;/b&gt;&lt;/td&gt;
          &lt;td&gt;&lt;?= $boss ?&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;b&gt;Salary:&lt;/b&gt;&lt;/td&gt;
          &lt;td&gt;&lt;?= $salary ?&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;b&gt;Skills:&lt;/b&gt;&lt;/td&gt;
          &lt;td&gt;&lt;?= $skills ?&gt;&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
    &lt;?
}
?&gt;

</pre><p style="width:90%">
			The first statement checks to make sure that the
			<code class="varname">boss</code> variable has been passed to the
			script, and then does something with that information.  If
			it's not present, an error is added to the list of errors.
      </p><p style="width:90%">
	In the second block of code, the variable
	<code class="varname">salary</code> is fetched, with one more error
	check - because it's a number, it needs to be composed of
	digits.
      </p><p style="width:90%">
	The <code class="varname">boss</code> variable isn't required to have
	been sent - we set it to "Mr. Burns" if it isn't among the
	information we received.
      </p><p style="width:90%">
	The last bit of variable handing code is a bit trickier.
	Because <code class="varname">skills</code> is a listbox, and can
	potentially have multiple values, we opt to receive them as a
	list, so that at some point, we could iterate over them.
      </p><p style="width:90%">
	The script then checks to make sure that
	<code class="varname">errlist</code> is empty and outputting a thankyou
	message.  If <code class="varname">errlist</code> is not empty, the list
	of errors it contains is printed.
      </p></div></div><br class="example-break"><div class="example"><a name="file_upload"></a><p class="title"><b>Example 4. File Upload</b></p><div class="example-contents"><p style="width:90%">
			The <span style="font-family:monospace"><span class="command"><strong>::rivet::upload</strong></span></span> command endows Rivet with an
			interface to access files transferred over http as parts of a
			multipart form.  The following HTML in one file, say,
			<code class="filename">upload.html</code> creates a form with a text
			input entry. By clicking the file chooser button the file
			browser shows up and the user selects the file to be uploaded
			(the file path will appear in the text input).  In order to make
			sure you're uploading the whole file you must combine the
			action of the enctype and method attributes of the
			&lt;form...&gt; tag in the way shown in the example.  Failure
			to do so would result in the client sending only the file's
			path, rather than the actual contents.
      </p><pre class="programlisting">&lt;form action="foo.rvt" enctype="multipart/form-data" method="post"&gt;
&lt;input type="file" name="MyUpload"&gt;&lt;/input&gt;
&lt;input type="submit" value="Send File"&gt;&lt;/input&gt;
&lt;/form&gt;

</pre><p style="width:90%">
			In the script invoked by the form
			(<code class="filename">upload.rvt</code>) <span style="font-family:monospace"><span class="command"><strong>upload</strong></span></span>
			 ?<span style="font-family:monospace; font-weight: bold;">argument ...</span>? commands can be used to manipulate the
			various files uploaded.
      </p><pre class="programlisting">&lt;?
::rivet::upload save MyUpload /tmp/uploadfiles/file1
puts "Saved file [::rivet::upload filename MyUpload] \
	([::rivet::upload size MyUpload] bytes) to server"
?&gt;

</pre><p style="width:90%">
			Don't forget that the apache server must have write access to
			the directory where files are being created.  The Rivet Apache
			directives have a substantial impact on the upload process,
			you have to carefully read the docs in order to set the
			appropriate directives values that would match your
			requirements.
      </p><p style="width:90%">
			It is also important to understand that some 
			<span style="font-family:monospace"><span class="command"><strong>upload</strong></span></span> commands are effective only when
			used in a mutually exclusive way.  Apache stores the data in
			temporary files which are read by the <span style="font-family:monospace"><span class="command"><strong>upload save
			 ?<span style="font-family:monospace; font-weight: bold;">upload name</span>? ?<span style="font-family:monospace; font-weight: bold;">filename</span>?</strong></span></span> or by the
			<span style="font-family:monospace"><span class="command"><strong>upload data  ?<span style="font-family:monospace; font-weight: bold;">upload name</span>?</strong></span></span>
			command. Subsequent calls to these 2 commands using the same
			 ?<span style="font-family:monospace; font-weight: bold;">upload name</span>? argument will return no data on the
			second call.  Likewise <span style="font-family:monospace"><span class="command"><strong>upload channel  ?<span style="font-family:monospace; font-weight: bold;">upload
			name</span>?</strong></span></span> will return a Tcl file channel that you
			can use in regular Tcl scripts only if you haven't already
			read the data, for example with a call to the <span style="font-family:monospace"><span class="command"><strong>upload
			data  ?<span style="font-family:monospace; font-weight: bold;">upload name</span>?</strong></span></span> command.
      </p></div></div><br class="example-break"><div class="example"><a name="file_download"></a><p class="title"><b>Example 5. File Download</b></p><div class="example-contents"><p style="width:90%">
			In general setting up a data file for being sent over http is 
			as easy as determining the file's URI and letting Apache's
			do all that is needed. If this approach fits your design all 
			you have to do is to keep the downloadable files somewhere 
			within Apache's DocumentRoot (or in any of the directories 
			Apache has right to access).
      </p><p style="width:90%">
			When a client sends a request for a file, Apache takes
			care of determining the filetype, sends appropriate headers to
			the client and then the file content. The client is responsible
			for deciding how to handle the data accordingly to the 
			"content-type" headers and its internal design. For example
			when browsers give up trying to display a certain "content-type"
			they display a download dialog box asking for directions from
			the user. 
      </p><p style="width:90%">
            Rivet can help if you have more sofisticated needs.  For
            instance you may be developing an application that uses
            webpages to collect input data. This information might be
            passed on to scripts or programs for processing. 
            In this case a real file representing the
            data doesn't exist and the content is generated on demand 
            by the server. 
            In other circumstances you may need to dynamically inhibit 
            the download of specific files and hide them away, 
            Your scripts may expunge from the pages
            every link to these files (your pages are dynamic, aren't
            they?) and move them out of way, but it looks like a
            cumbersome solution.
      </p><p style="width:90%">
            Putting Tcl and Rivet in charge of the whole download
            mechanism helps in building cleaner and safer approaches to
            the download problem.
      </p><p style="width:90%">
            In this example a procedure checks for the existence of a
            parameter passed in by the browser. The parameter is the name
            (without extension) of a pdf file.  
            Pdf files are stored in a directory whose path is
            in the <span style="font-family:monospace"><span class="command"><strong>pdf_repository</strong></span></span> variable.
      </p><p style="width:90%">
            This code is reported as an example of how to control 
            the protocol using the <span style="font-family:monospace"><span class="command"><strong>headers</strong></span></span> command.
      </p><pre class="programlisting"># Code example for the transmission of a pdf file. 

if {[::rivet::var exists pdfname]} {
    set pdfname [::rivet::var get pdfname]

# let's build the full path to the pdf file. The 'pdf_repository'
# directory must be readable by the apache children

    set pdf_full_path [file join $pdf_repository ${pdfname}.pdf]
    if {[file exists $pdf_full_path]} {

# Before the file is sent we inform the client about the file type and
# file name. The client can be proposed a filename different from the
# original one. In this case, this is the point where a new file name
# must be generated.

        ::rivet::headers type                       "application/pdf"
        ::rivet::headers add Content-Disposition    "attachment; filename=${pdfname}.pdf"
        ::rivet::headers add Content-Description    "PDF Document"

# The pdf is read and stored in a Tcl variable. The file handle is
# configured for a binary read: we are just shipping raw data to a
# client. The following 4 lines of code can be replaced by any code
# that is able to retrieve the data to be sent from any data source
# (e.g. database, external program, other Tcl code)

        set paper       [open $pdf_full_path r]
        fconfigure      $paper -translation binary
        set pdf         [read $paper]
        close $paper

# Now we got the data: let's tell the client how many bytes we are
# about to send (useful for the download progress bar of a dialog box)

        ::rivet::headers add Content-Length  [string length $pdf]

# Let's send the actual file content

        puts $pdf
    } else {
        source pdf_not_found_error.rvt
    }
} else {
    source parameter_not_defined_error.rvt
}

</pre><p style="width:90%">
            Before the pdf is sent the procedure sets the
            <code class="constant">Content-Type</code>, 
            <code class="constant">Content-Disposition</code>,
            <code class="constant">Content-Description</code> and
            <code class="constant">Content-Length</code> headers to inform
            the client about the file type, name and size. Notice that in
            order to set the <code class="constant">Content-Type</code> header Rivet 
            uses a specialiezed form of the <span style="font-family:monospace"><span class="command"><strong>headers</strong></span></span> 
            command. Headers must be sent before data gets sent down the 
            output channel. Messing with this prescription causes an error 
            to be raised (in fact the protocol itself is been violated)
      </p><p style="width:90%">
	More information about the meaning of the mime headers in the
	http context can be found at 
	<a class="ulink" href="http://www.w3.org/Protocols/rfc2616/rfc2616.html" target="_top">http://www.w3.org/Protocols/rfc2616/rfc2616.html</a>
      </p></div></div><br class="example-break"><div class="example"><a name="ajax_xml_messaging"></a><p class="title"><b>Example 6. XML Messages and Ajax</b></p><div class="example-contents"><p style="width:90%">
	The <span style="font-family:monospace"><span class="command"><strong>headers</strong></span></span> command is crucial for generating 
	XML messages that have to be understood by JavaScript code used 
	in Ajax applications. 
      </p><p style="width:90%">
	    Ajax is a web programming technique that heavily relies on the abilty of a web browser to run in backround
	    JavaScript functions. JavaScript functions can be run as callbacks of events generated by a user interaction 
	    but they can also react to other I/O events, for example network events. 
	    Modern browsers endow JavaScript with the ability to build http GET/POST requests to be sent to a remote
	    webserver. Generally these requests refer to scripts (e.g. Tcl scripts run by Rivet) which inherit as 
	    variables the arguments encoded in the request. 
	    The output produced by these scripts is sent back to the browser where callbacks functions extract 
	    information and hand it down to functions that directly manipulate a page's DOM.
	    Therefore through Ajax becomes possible to build web applications that are more responsive and flexible: 
	    instead of going through the cycle of request-generation-transfer-display 
	    of a whole page, Ajax scripts request from a webserver only the essential data to be displayed.
	    Ajax emphasizes the requirement of separation between data and user interface, saves 
	    the server from sending over the same html code and graphics if only a fraction of a page has to be 
	    updated, allows the programmer to design flexible solutions for complex forms and makes possible
	    to find new innovative approaches to simple problems (e.g. Google tips that show up as you type in
	    a query). A downside of this approach is the large number of complexities, subtleties and incompatibilities 
	    that still exist in the way different versions of popular browsers handle the DOM elements of a page.
      </p><p style="width:90%">
	    JavaScript can handle the communication between client and server through an instance of a 
	    specialized object. For quite a long time 2 approaches existed, the non-IE world (Firefox,Safari,Opera...) 
	    used the XMLHttpRequest class to create this object, whereas IE (before IE7) used the ActiveXObject class.
	    With the release of IE7 Microsoft introduced native support for XMLHttpRequest class objects thus enabling
	    programmers with a unique method for the development of dynamic pages. 
	</p><p style="width:90%">
	    By creating an instance of this class a POST or GET request can be sent to the server and the response is 
	    stored in a property ('returnedText') of the communication object. It's become widely customary to encode 
	    these responses in XML messages. You can invent your own message structure (either based on XML or anything 
	    else), but one has to be aware that if the http headers are properly set and the message returned to the 
	    client is a well formed XML fragment, also the property XMLResponse is assigned with a reference to an object 
	    that represents the DOM of the XML response. By means of the XML W3C DOM interface the programmer can easily
	    manipulate the data embedded in the XML message.
	</p><p style="width:90%">
	    In this example a Rivet script initializes an array with the essential data regarding a few of the major 
	    composers of the european music. This array plays the role of a database. The script sends back to the 
	    client two types of responses: a catalog of the composers or a single record of a composer.
	</p><pre class="programlisting">#
# Ajax query servelet: a pseudo database is built into the dictionary 'composers' with the
# purpose of emulating the role of a real data source. 
# The script answers with  2 types of responses: a catalog of the record ids and a database 
# entry matching a given rec_id. The script obviously misses the error handling and the
# likes. Just an example to see rivet sending xml data to a browser. The full Tcl, JavaScript
# and HTML code are available from http://people.apache.org/~mxmanghi/rivet-ajax.tar.gz

# This example requires Tcl8.5 or Tcl8.4 with package 'dict' 
# (http://pascal.scheffers.net/software/tclDict-8.5.2.tar.gz)
# 

# A pseudo database. rec_id matches a record in the db

set composers [dict create  \
                1 {first_name Claudio middle_name "" last_name Monteverdi   \
                    lifespan 1567-1643 era Renaissance/Baroque}             \
                2 {first_name Johann middle_name Sebastian last_name Bach   \
                    lifespan 1685-1750 era Baroque }                        \
                3 {first_name Ludwig middle_name "" last_name "van Beethoven" \
                    lifespan 1770-1827 era Classical/Romantic}              \
                4 {first_name Wolfgang middle_name Amadeus last_name Mozart \
                    lifespan 1756-1791 era Classical }                      \
                5 {first_name Robert middle_name "" last_name Schumann      \
                    lifespan 1810-1856 era Romantic} ]

# we use the 'load' argument in order to determine the type of query
#
# load=catalog:         we have to return a list of the names in the database
# load=composer&amp;amp;res_id=&lt;id&gt;: the script is supposed to return the record
#               having &lt;id&gt; as record id

if {[::rivet::var exists load]} {

# the xml declaration is common to every message (error messages included)

    set xml "&lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\"?&gt;\n"
    switch [::rivet::var get load] {
        catalog {
            append xml "&lt;catalog&gt;\n"
            foreach nm [dict keys $composers] {
                set first_name  [dict get $composers $nm first_name]
                set middle_name [dict get $composers $nm middle_name]
                set last_name   [dict get $composers $nm last_name]
                append xml "    &lt;composer key=\"$nm\"&gt;$first_name "
                if {[string length [string trim $middle_name]] &gt; 0} {
                    append xml "$middle_name "
                }
                append xml "$last_name&lt;/composer&gt;\n"
            }
            append xml "&lt;/catalog&gt;\n"
        }
        composer {
            append xml "&lt;composer&gt;\n"
            if {[::rivet::var exists rec_id]} {
                set rec_id [::rivet::var get rec_id]
                if {[dict exists $composers $rec_id]} {
                    foreach {k v} [dict get $composers $rec_id] {
                        append xml "&lt;$k&gt;$v&lt;/$k&gt;\n"
                    }
                }
            }
            append xml "&lt;/composer&gt;\n"
        }
    }

# we have to tell the client this is an XML message. Failing to do so
# would result in an XMLResponse property set to null

    ::rivet::headers type "text/xml"
    ::rivet::headers add Content-Length [string length $xml]
    puts $xml
}


</pre><p style="width:90%">
	    For sake of brevity the JavaScript and HTML will not listed here. They can be downloaded (along with the Tcl 
	    script) stored in the <a class="ulink" href="http://people.apache.org/~mxmanghi/rivet-ajax.tar.gz" target="_top">rivet-ajax.tar.gz</a> archive. 
	    By simply opening this tar archive in a directory accessible 
	    by your apache server and pointing your browser to the rivetService.html page you should see a page with a 
	    drop-down list. Every time a different name is picked from the list a new query is sent and logged in the 
	    apache access.log file, even though the html is never reloaded.
	</p></div></div><br class="example-break"><div class="example"><a name="calexample"></a><p class="title"><b>Example 7. A Calendar Utility</b></p><div class="example-contents"><p style="width:90%">
	    Rivet comes with a <span class="emphasis"><em>Calendar</em></span> package that provides classes for printing 
	    calendar tables in various forms.	
	</p><p style="width:90%">
		The <span class="emphasis"><em>HtmlCalendar</em></span> class prints a calendar table in a similar form the Unix 
		program 'cal' does. Example: the following code
		</p><pre class="programlisting">package require Calendar

proc ::cal_cell_attributes { day month year weekday } {
    if {$weekday == 3} {
        return [list class curr_wkday]
    }
}

set htmlc [HtmlCalendar #auto]
set html_txt [$htmlc emit -container {table class calendar} -current_weekday 3 \
                          -cell_function cal_cell_attributes ]
puts $html_txt
</pre><p style="width:90%">

	    with some CSS styling would print
	 </p><p style="width:90%">
		</p><div><img src="images/calendar.png"></div><p style="width:90%">
	 </p></div></div><br class="example-break"></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="xml.html"><img src="images/prev.png" alt="Prev"></a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="tcl_packages.html"><img src="images/next.png" alt="Next"></a></td></tr><tr><td width="40%" align="left" valign="top">xml </td><td width="20%" align="center"><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home"></a></td><td width="40%" align="right" valign="top"> Rivet Tcl Packages</td></tr></table></div></body></html>
