The non-terminal html//1 translates a specification into a list of 
atoms and layout instructions. Currently the layout instructions are 
terms of the format nl(N), requesting at least N 
newlines. Multiple consecutive nl(1) terms are combined to 
an atom containing the maximum of the requested number of newline 
characters.
To simplify handing the data to a client or storing it into a file, the following predicates are available from this library:
reply_html_page(default, Head, Body).library(http_wrapper) 
(CGI-style). Here is a simple typical example:
reply(Request) :-
        reply_html_page(title('Welcome'),
                        [ h1('Welcome'),
                          p('Welcome to our ...')
                        ]).
The header and footer of the page can be hooked using the 
grammar-rules user:head//2 and user:body//2. The first argument passed 
to these hooks is the Style argument of reply_html_page/3 
and the second is the 2nd (for head//2) or 3rd (for body//2) argument of reply_html_page/3. 
These hooks can be used to restyle the page, typically by embedding the 
real body content in a div. E.g., the following code 
provides a menu on top of each page of that is identified using the 
style
myapp.
:- multifile
        user:body//2.
user:body(myapp, Body) -->
        html(body([ div(id(top), \application_menu),
                    div(id(content), Body)
                  ])).
Redefining the head can be used to pull in scripts, but 
typically html_requires//1 provides a more modular approach for pulling 
scripts and CSS-files.
DOCTYPE 
header,
html, head or body. It is 
intended for JavaScript handlers that request a partial document and 
insert that somewhere into the existing page DOM. See reply_html_page/3 
to reply with a complete (valid) HTML page.Content-length 
field of an HTTP reply-header.