% Translate html format and send to stdout
pred output_html(+html_term).
    
% Translates html terms to list of characters and vice-versa
pred html2terms(-string, +html_term).
pred html2terms(+string, -list(html_simple_term)).

% Hook predicate to define macros for html2terms(-,+)
pred html_expansion(+html_term, -html_term)

% Report an error through HTML
pred html_report_error(+html_term).

html_term ===
    # start |
    # end |
    # -- |
    # \\ |
    # $ |
    # comment(string) |
    # declare(string) |
    # image(html_item) |
    # image(html_item, list(attrib)) |
    # ref(html_item, html_term) |
    # label(html_item, html_term) |
    # heading(integer, html_term) |
    # itemize(list(html_term)) |
    # enumerate(list(html_term)) |
    # description(list(html_description)) |
    # nice_itemize(html_item, list(html_term)) |
    # preformatted(list(html_term)) |
    # entity(html_item) |
    # start_form |
    # start_form(html_item) |
    # start_form(html_item, list(attrib)) |
    # end_form |
    # checkbox(html_item, state) |
    # radio(html_item, html_item, html_item) |
    # input(html_item, list(attrib)) |
    # textinput(html_item, list(attrib), string) |
    # menu(html_item, list(attrib), list(option)) |
    # cgi_reply |
    # verbatim(html_item) |
    # nl |
    # begin(tag) |
    # begin(tag, list(attrib)) |
    # end(tag) |
    # env(tag, list(attrib), html_term) |
    # $(tag,list(attrib)) |
    list(html_term) |
    any(html_term) |
    any(list(attrib), html_term) |
    string |
    term.

html_simple_term ===
    # comment(string) |
    # declare(string) |
    # env(tag, list(attrib), list(html_simple_term)) |
    # $(tag,list(attrib)) |
    string.

html_description === #(html_term , html_description) | html_term.

tag === atom.

option === # $(html_item) | html_item.

state === # on | # off.

attrib === atom | #(atom = html_item).

html_item === atom | string.

% Transforms form data to a dictionary
pred get_form_input(-dict).

% Get values in dictionary
pred get_form_value(+dict, +dict_name, -dict_value).

% Transform input from a text area to a list of lines
pred text_lines(+dict_value,-list(string))

% Checks that a value is empty
pred form_empty_value(+dict_value).

% Set form defaults
pred form_default(+term, +term, -term).

% Gives request method of the form
pred form_request_method(-atom).

% Gives the URL of the form
pred my_url(-string).

% Database of useful image addresses
pred icon_address(+atom, -string).

% Computes GET parameters for CGI's
pred url_query(+dict, -string).

dict === list(#(dict_name = dict_value))

dict_name === atom

dict_value === # '$empty' | atomic | list(string) | # file(atom,list(string)).

% Extracts information from a URL, or creates a URL from information
pred url_info(+url, -url_info).
pred url_info(-string, +url_info).

% Extracts information from a URL, relative to a base URL
pred url_info_relative(+url, +url_info, -url_info)

url === atom | string.

url_info === # http(host, port, document).

host === atom.

port === integer.

document === string.

% Fetch a document from an HTTP server
pred fetch_url(+url, +list(http_request), -list(http_response)).

http_request ===
    # head |              % If we don't what the document, only the header
    # timeout(integer) |  % Time to wait for the response
    # if_modified_since(date) |   % Get document only if newer
    # user_agent(atom) |  % Provide a user-agent field
    # authorization(scheme, auth_params) |  % For authentication
    any(atom).            % Any other option (for example from('user@machine'))

http_response ===
    # content(string) |   % Document content
    % Type of response, status code and reason phrase
    # status(status_type,status_code,reason_phrase) |
    # pragma(string) |    % Misc. data
    # message_date(date) |    % Date of the response
    # location(atom) |    % Where has moved the document
    # http_server(string) |   % Server responding
    # authenticate(list(challenge)) |  % Request for authentication
    # allow(list(atom)) | % Methods allowed by the server
    # content_encoding(atom) |
    # content_length(integer) |
    # content_type(type,subtype,list(content_type_param)) |
    % Date/time after which the entity should be considered stale
    # expires(date) |
    % Date/time at which the sender believes the resource was last modified
    # last_modified(date) |
    any(string).    %  Any other functor is an extension header

status_type ===
    # informational  |
    # success        |
    # redirection    |
    # request_error  |
    # server_error   |
    # extension_code.

status_code === integer.

reason_phrase === string.

challenge === # challenge(scheme,realm,challenge_params)

scheme === # basic | atom.

auth_params === string | list(#(atom = string)).

realm = string.

challenge_params === list(#(atom = string)).

type === atom.

subtype === atom.

content_type_param === #(atom = (atom|string)).

date === # date(weekday,day,month,year,hour)

weekday ===
    # 'Monday'    |
    # 'Tuesday'   |
    # 'Wednesday' |
    # 'Thursday'  |
    # 'Friday'    |
    # 'Saturday'  |
    # 'Sunday'.

day === integer. % From 1 to 31

month ===
    # 'January'   |
    # 'February'  |
    # 'March'     |
    # 'April'     |
    # 'May'       |
    # 'June'      |
    # 'July'      |
    # 'August'    |
    # 'September' |
    # 'October'   |
    # 'November'  |
    # 'December'.

year === integer. % >= 1000

hour === atom. % Of the form '06:14:02'

% Protect a goal for cgi-bin execution
pred html_protect(+callable).

