\documentclass{refart}

\title{JET Extension Tags}
\author{Bradford Matthew Arant Sr.}
\date{\today}

\begin{document}

\maketitle

\tableofcontents

\chaptermark{Introduction}

JET will pass through the untagged areas to the output without any
modifications. Data contained within the tags may modify their
containers before placing any output. The space taken by the tag
itself is not passed to the output and will not appear in the output.

Skip Blank Lines options on containers will skip passing any blank
lines or line containing only whitespace to the output. 

\chaptermark{Tags and Attributes}

XML style tagging is used to insert functions and other behaviors into
the script. As the document contents are output a tag may be inserted
to perform the desired function and affect the output. 

Tag attributes are used to pass parameters into the operations and
functionality for each tag. 

Outputting a database from mysql may be performed using the \<mysql\> tag
in combination with the \<ifrow\>, \<whilerow\> and \<sql\> tags.  

\sectionmark{User Defined Tags and Tag Libraries}

You can define your own tag definitions and use them within your JET
scripts. 

Keywords are not defined as part of the tag definition and any
attribute added to the implementation of the tag is passed into the
tag process as a local variable for that container. 

Tag definitions can also be defined as scoped or unscoped, as follows:

scoped - local variables using the \#[n] format can be scoped to just
your tag contents. Access to local variables where your tag is being
used must use the 'parent' scope option to retrieve variables from the
parent.

unscoped - local variables are shared with the parent tag environment
and are not unique to your tag definition. 

A <container /> tag can be inserted into the container and will take
the contents of the container at runtime and insert it into the output
when processing the user defined tag definition. The container tag of
the the <container /> is processed before the container containing the
<container /> so that local variabls can be set and processed that
will affect the tags overall output. 

Tags are many times nested with tags running within the container of a
higher tag. 



\chaptermark{Variables and Variable Types}

Variables are used to contain dynamic content values and can be
sourced from several locations and limited in scope depending on use.
Some variable types can be set to reflect script state or are read
only from other outside sources of data. 

Jet tags can be either scoped or unscoped. 

The following is a list of
variable types and a brief description of their source:

\begin{itemize}

\item Global - values can be initiaized using the set tag and
specifying the scope of global. 

\item Local - 

\item Keyword - within a tag's container we may access the keyword
values specified on the containing tag.

\end{itemize}

\section{Global Variables}

Global variables are available to all logic once the values have been
set.

Global variables are accessed throughout the procedure with the
\$[name] syntax.

Global is the default if the scope is
not specified for any function that writes to a variable.

\section{Local Variables}

Local variables are established using the set tag and specifying a
scope of local. Local variables are typically only available within
the container where they are defined. Some containers may not be
capable of storing local variables (i.e. set tag) and are inheriting
the local scope from their parent tag.

\section{Keyword Variables}

Keyword variables are set when they are specified on a containing tag.
Within the container you can access the variable using the syntax
\$[\%name]. 

The variable retrieved is not processed for variable resolution. 

\section{Environment Variables}

\section{CGI Variables}

When operating Jet in CGI mode you have access to the form data
submitted by the remote client (usually a browser or curl request)
using the POST method.  

\chapter{Expressions}

Expressions are used to perform complicated calculations (arithmetic), perform
comparisons between values (boolean), manipulate strings (string) or
perform operations on dates (date). 

\section{Operators}

Operators are used to perform arithmetic or boolean operations on
arguments to derive a particular result. There are two types of
operators, as follows:

\begin{itemize}

\item Arithmetic - 

\item Boolean - 

\end{itemize}

\subsection{Arithmentic Operators}

\subsection{Boolean Operators}


\section{Function Reference}

\subsection{concat}

\subsection{integer}

\subsection{left}

\subsection{random}

Use the random function to return a random number between 0 and 1.

\subsection{round}

Use the round function to round a numeric value to the specified
number of digits after the decimal point. 

\subsection{substring}

Use the substring operation to extract a portion of a string and return
the value as a string. 

\chapter{Common Gateway Interface Features}

JET extension tags provides options for enabling the processing of
data using the Common Gateway Interface (CGI) specification used by
Apache and NGINX as well as other HTTP server applications. This makes
JET a powerful tool for creating web interfaces and API handler
environments for various javascript frameworks as well as just native
HTML style interaction. 

To enable the CGI features within a requested document you can specify
the cgi="true" attribute on a <jet> tag containing the document or
<jet /> tag contained within the document. 

When you enable the CGI interface the script will look for specific
environment variables used to retrieve the input data from the browser
interface and automatically provide these values to the JET scripting
using the variables interface. There are currently three supported
data formats or content types through this interface. These content
types are:

formdata/urlencoded
mutipart/formdata
text/json

\section{Session Control}

Common use of the CGI is requiring the transaction based interaction
of a web browser to maintain a state between interactions. JET 2.0
provides a built in mechanism to assist in managing a session concept.
This approach uses a single session cookie to identify the session to
the back end services. 

By specifying a seesiondir keyword on the <jet> tag you enable the
session control functionality. Upon the delivery of a request that
does not contain a session 'token' a session token will be generated
for the request and a cookie will be returned in the reponse
containing the session token. Additionally, a session file is placed
into the directory named after the token. Captured session data will
become available to future requests coming into the server and made
available through the variable formats for the session. 

The <set> tag will also have an additional scope value that can be
used to store the value in the session. This is scope="session". 



\chapter{Tag Reference}

This chapter will cover all the tags and parameters required to
perform the operations that JET provides. 

A special character sequence is used to exclude a section from tag and
variable parsing. This sequence is |> this is not parsed or resolved
<|. This takes affect through all levels and depths of tag processing
and is different from the <exclude /> tag as exclude may be further
parsed if output is again evaluated. 

\section{call}

Use the call tag to evoke an executable file from a jet script. 

The atrributes are:

pgm

argn

name

input

error

The call tag is unscoped.

\begin{verbatim}
<call pgm="ls" arg1="-al" name="listing" />
\end{verbatim}

will call the ls command with parameter -al and place the output into
a variable named 'listing'. 

\section{comment}

Use the comment tag to create a section in the jet script that can be
used for making comments and is ignored by the jet reader.

The comments tag has no attributes.

\section{cookie}

Use the cookie tag to specify a cookie when using the CGI features
of JET. 

\section{dump}

Use the dump tag to display the contents of all the global, local and
cgi cariables to a specified file. 

The attributes are:

file

\section{exclude}

Use the exclude tag to exclude a conainer contents from normal parsing
and variable resolution. 

\section{expr}

\section{for}

Use the for tag to iterate a tag container for a logical number of
times.

The attributes are:

start

end

step

name - defines a name for the iterator that will be available within
the loop.

scope - defines the scope of the iterator for the loop. 

\section{header}

Use the header tag to output a header prior to outputting the process
buffer to the requester.

The attributes are:

name

expr

value

container

\section{if/else}

Use the if tag to perform a conditional output on the tag container.
An optional else container provides alternate output in the event the
condition is not met.

The attributes are:

value1

value2

type

expr

\section{ifrow/else}

Use the ifrow tag to output the tag container if a row exists in the
mysql tag. An optional else container provides alternate output in the
event that there is no row for the sql result.

The attributes are:

sessionid

\section{include}

Use the include tag to include another content file at the location of
the include tag.

The attributes are:

file

\section{jet}

Use the jet tag to specify parameters for the jet parsing session and
to control the output options.

\section{mysql}

Use the mysql tag to specify parameters for connecting to a mysql
server. The container of the tag is where you can specify the sql
statement and method of processing the result output of the executed
sql statement. The mysql session created is valid only withon the
container of this tag.

The attributes are:

host

database

user

password

sessionid

\section{read}

Use the read tag to read the contents of a file contained on the local
file system into a variable for further output or processing.

The attributes are:

file

name

\section{set}

Use the set tag to store initialize a variable to a value contained in
a value attribute, the result of an expression (expr) attribute or the
contents of the set tag container. 

The attributes are:

name

expr

value

container

scope

\section{sql}

Use the sql tag to specify an sql statement to run on the sql server
specified in the mysql tag. 

As long as sql statements are executed within the same mysql
containing tag then the same mysql session is used for each sql
statement. 

The attributes are:

sessionid

container

\section{stream}

Use stream tag to output data from the server without waiting for the
standard output buffering and processing of the JET script. This is
useful for outputting images and streams for audio and video without
the server having to load the whole thing into RAM first. 

The attributes are:

file

\section{system}

Use the system tag to execute a bash shell command within the JET
script. 

\section{tag}

Use the tag tag to define a new tag definition for use within the
script. 

Tags are normally defined globally and can be used anywhere within the
script. 

Tags can also be defined within other tags and the scope of those tags
is only within the defining tag's container. The enclosed tag
definition will not be available globally. 

\section{until}

Use the until tag to process a container at least once and
continue to process the container until the specified condition is met. 

Note that this tag always processes the container at least once. 

Be careful not to create a never ending loop by not modifying any of
the condition parameters specified in the condition clause. 

\section{while}

Use the while tag to process a container if the specified condition is
true. 

Note that the container may not be processed if the condition is never
met. 

Be careful not to create a never ending loop by not modifying any of
the condition parameters specified in the condition clause. 

\section{whiledir}

Use the whiledir tag to loop a directory path to the container for
processing. 

\section{whilerow}

Use the whilerow tag in combination with mysql and sql tags to provide
a container to process for each row retrieved by the sql statement. 

\section{write}

Use the write tag to write data to the local file system. 

\end{document}