<HTML>
  <HEAD>
    <TITLE>esp</TITLE>
  </HEAD>
  <BODY BGCOLOR="#FFFFCC">
    <CENTER>
      
      
      <IMG BORDER=0 SRC="min_head.gif">
      <H1>esp</H1>
    </CENTER>
    <H3>MODULE</H3>
    <UL>
        esp</UL>
    <H3>MODULE SUMMARY</H3>
    <UL>
        Erlang Server pages provides storage and generation of dynamically generated Web pages containing embedded erlang code and references to variables.</UL>
    <H3>DESCRIPTION</H3>
    <UL>
        <P>Erlang Server pages provides a mechanism for storing and generating dynamically generated Web pages containing embedded erlang code and references to variables. They are more powerful than ehtml pages as they allow variables to be passed into the page which ehtml does not. Web pages are parsed when stored and converted into a form which is very efficient for regenerating the page. They are stored in an mnesia table named esp.
    </UL>
    <H3>EXPORTS</H3>
    <P><STRONG><CODE>mnesia_table(Nodelist) -> {atomic, ok} | {aborted, Reason}</CODE></STRONG><BR>
    <UL>
        <P>This function creates the mnesia table which stores the esp pages. Nodelist must be a list of nodes where replicas are to reside.
    </UL>
    <P><STRONG><CODE>store(File) -> ok | exit({aborted, Reason} </CODE></STRONG><BR>
    <UL>
        <P>This function reads the file in the current erlang working directory, and if the filename ends in .esp parses it before storing it in the esp table. Files with filenames ending in anything else e.g .html or .gif are stored unchanged.
    </UL>
    <P><STRONG><CODE>expand(Filename, Args) -> Html | Not_found_html </CODE></STRONG><BR>
    <UL>
        <P>Returns the stored content referenced by the Filename prefixed with the correct HTTP header ready to be returned as the result of a CGI script. Filename must be exactly the same as that used for storage (so "/http/home.esp" is not the same as "home.esp").<P>
        When the file is a .esp file it is expanded. Any variables in the page are replaced with their values from Args, and embedded erlang code is executed. E.g if the stored .esp page contained the following HTML fragment:
        <P><CODE><B>Name: ${name}</B><BR>
         <B>Name: <e>io_lib:format("Scott").</e></B>
        </CODE>
        <P>Calling <CODE>esp:expand("home.esp",[{"name","Sean"}]).</CODE> would return HTML containg:
        <P><CODE><B>Name: Sean</B> 
        <BR><B>Name: Scott</B>
        </CODE>

        <P>It is also possible to embed HTML Tags within code using the 
          <CODE><ee>....</ee></CODE> construct. 
          For example the following .esp fragment:
        <P><CODE>
<PRE>

    <ee><e>lists:map(fun({A,B}) -> </e>
        <B>${A},</B>,${B}<P>
      <e> end, Var)</e>
    </ee>
          </CODE>
</PRE>
        <P>when called with <CODE>esp:expand("esp2.esp", [{"Var",[{"a","b"},{"sean","hello"}]}]).</CODE> returns the following html:
          <P>
<PRE>
<B>a</B>,b<P>
<B>sean</B>,hello<P>
</PRE>

        <P>Note that currently it is not permissible to have any space between the <CODE><ee></CODE> and the first <CODE><e></CODE> tag.
        <P>Variables or function calls can return any valid HTML including tables etc.
        <P>If the file is not found a simple HTML page is returned which states just that. This is hard coded at present but could easily be replaced with any html.
    </UL>
    <P><STRONG><CODE>delete(Filename) -> ok | exit({aborted, Reason}) </CODE></STRONG><BR>
    <UL>
        <P>This function deletes an entry from the esp database.
    </UL>

    <H3>AUTHORS</H3>
    <UL>
        Joe Armstrong (Bluetail), Sean Hinde<BR>
    </UL>
    <CENTER>
      <HR>
      <FONT SIZE=-1>shlib  1.1
        <BR>
      </FONT>
    </CENTER>
  </BODY>
</HTML>