cgi webcalc; // -*-C-*-ish import CGI; import calclang; import Dict; import Regex; Void PreContent() { content("<html><head><title>Web Calculator</title></head>"); content("<body>"); content("<h1>Web Calculator</h1>"); } Void Default() { runCalc(Dict::new()); } Void runCalc(Context ctxt) { content("<h3>Defined variables</h3>"); displayVars(ctxt); content("<hr>"); content(formHandler(OnCalc,ctxt)+ "Sum "+textBox("sum","",40)+ submit("Calculate")+ closeForm()); } Void displayVars(Context ctxt) { for p in entries(ctxt) { content(p.fst+" = "+p.snd+"<br>"); } } Void OnCalc(Context ctxt) { insum = incomingValue("sum",DataPost); case match(compile(r"[A-Za-z 0-9+\-*/]*"), insum) of { matches(xs,_,_) -> sum = xs[0]; } content("<p>"); try { res = calcExpr(ctxt, sum); content("<hr><strong>"+sum+ " = "+res+"</strong><hr>"); } catch(CalcParseError(err,p)) { content("<strong>Error: "+err+" at position "+p+"</strong>"); } catch(e) { content("<strong>Error: "+exceptionMessage(e)+"</strong>"); } content("</p>"); runCalc(ctxt); } String sc(String f) = "<li><a href=\"../files/"+f+"\">"+f+"</a>"; Void PostContent() { content("<hr><ul>"+ sc("webcalc.k")+ sc("calclang.k") ); content("</body></html>"); }