Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > cd38b09e3cb8d6c675b02d30393e68af > files > 40

kaya-doc-0.5.2-8.fc14.noarch.rpm

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>");
}