Arjen Markus (17 february 2018) The publication of the wapp tool a couple of weeks ago provided me the perfect platform to experiment with an old idea. The result, while not the most beautiful or functional web application I have ever seen, is a working web application. The code was derived for the most part from the examples that come with wapp - otherwise I would have been hard put to construct a thing like this ;). I mostly built it to get some feeling for wapp - though it may be a nice project in itself to expand this first "wapp-lication" of mine ...
# This script was derived from formajax02.tcl and asks the user for a mathematical # function expressed in x, to show a small table of values. # package require wapp # The default page paints a form to be submitted. # The default content-security-policy of Wapp restricts the use # of in-line javascript, so the script content must be returned by # a separate resource. # proc wapp-default {} { wapp-trim { <h1>Mathematical functions</h1> <form id="theForm"> <table border="0"> <tr><td align="right"><label for="expression">Function f(x) =</label> </td> <td><input type="text" id="expression" width="40"> <tr><td align="right"><label for="minimum">Minimum x =</label> </td> <td><input type="text" id="minimum" width="10"> <tr><td align="right"><label for="maximum">Maximum x =</label> </td> <td><input type="text" id="maximum" width="10"> <tr><td><td><input type="submit" value="Send"> </table> </form> <script src='%url([wapp-param SCRIPT_NAME]/script.js)'></script> <p> Result: <div id="insertionPoint"></div> } } # This is the javascript that takes control of the form and causes form # submissions to be send using XMLHttpRequest with urlencoded content. # proc wapp-page-script.js {} { wapp-mimetype text/javascript wapp-cache-control max-age=3600 set script [wapp-trim { document.getElementById("theForm").onsubmit = function(){ function val(id){ return encodeURIComponent(document.getElementById(id).value) } var jx = "expression="+val("expression")+ "&minimum="+val("minimum")+ "&maximum="+val("maximum"); var xhttp = new XMLHttpRequest(); xhttp.open("POST", "%string([wapp-param SCRIPT_NAME])/acceptjson", true); xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhttp.onreadystatechange = function(){ if(this.readyState!=4)return document.getElementById("insertionPoint").innerHTML = this.responseText; document.getElementById("insCancel").onclick = function(){ document.getElementById("insertionPoint").innerHTML = null } } xhttp.send(jx); return false } }] return $script } # This page accepts a form submission and prints it on standard output. # A real server would do something useful with the data. # proc wapp-page-acceptjson {} { foreach var [lsort [wapp-param-list]] { set $var [list [wapp-param $var]] } set dx [expr {($maximum - $minimum) / 10.0}] set expression [string map {x $x} $expression] set table "<table border=\"1\"> <tr><th>x<th>f(x)" for {set i 0} {$i < 11} {incr i} { set x [expr {$minimum + $dx * $i}] set f [expr $expression] append table "\n<tr><td>[format "%.4f%s%12.4f" $x "<td>" $f]" } append table "\n</table><button id=\"insCancel\">Remove</button>" wapp-trim $table } wapp-start $argv