SML/CGI is a completely dumb CGI library. CGI libraries have existed for SML forever, so this is really just an up-to-date version of the same thing. It attempts to replicate some of the functionality of smlweb (http://smlweb.sf.net) without relying on SML/NJ integration.
Running make
in the top-level source directory will build the template compiler. No building of the library is necessary. However, the following things are required:
- CMlib > 1.0.0
- MLton or SML/NJ
The easiest way to obtain SML/CGI is to use Smackage:
smackage get smlcgi
smackage make smlcgi
smackage make smlcgi install
This will install all the necessary dependencies.
Using the library is as simple as including cgi.mlb in your application.
A minimal application might be:
val _ = startResponse "text/html"
val _ = print "Hello, world!\n"
SML/CGI also includes the world's most naive template compiler. A template is a plain text file with inline SML code delimited by <% ... %>
blocks. Anything inside such a block must be a valid top-level SML statement. If you just wish to echo a string, you can use the syntax <%% foobar %>
, which will wrap foobar
in an appropriate call to print
.
The CGI
structure is open by default in templates.
A minimal template might be:
<h1><%% title %></h1>
Hello, <%% content %>
A template hello.mlt
is compiled to two files: hello.cgi.sml
and hello.cgi.mlb
with the command:
smlcgic hello.mlt
One might build a full application by having an additional file that invokes the template:
val _ = CGI.startResponse "text/html"
val _ = Template.render ("Some Title", "world!")
The CGI structure provides the function: getParam : string -> string
for retrieving query string values, e.g.:
val _ = print (getParam "greeting" ^ ", world\n")
No effort is made to sanitise incoming data, and URIs escape sequences are decoded with little checking. Beware.