ploticus: ploticus scripts

## Ploticus scripts | Welcome Gallery Handbook |
| Manual page for Ploticus_scripts(PL)

## DESCRIPTION

Ploticus is controlled by scripts that a user creates in a text editor.`` The scripts can also be created by other programs.``

## EXAMPLE

Here is an example of a ploticus script:

     #proc areadef
       rectangle: 1 1 4 2
       xrange: 0 5
       yrange: 0 100

     #proc xaxis:
       stubs: text
     	Africa
     	Americas
     	Asia
     	Europe,\nAustralia,\n Pacific

     #proc yaxis
       label: Growth Rate
       stubs: inc 20
       minortics: yes
       minorticinc: 5

     #proc getdata
       data: 76
     	54
     	60
     	59

     #proc bars
       lenfield: 1
       color: teal
       barwidth: 0.2

As you can see, this is not low-level 3GL-style code. It is a sort of hybrid; plotting actions (#procs) are specified in procedural order, but within each #proc the language is goal-driven (4GL). Thus, traditional procedural programming skills are not required.``

The above Ploticus script invokes a number of procedures (procs).`` First, proc areadef to set up a plotting area, then proc xaxis and yaxis to render the axes.`` Then proc getdata is invoked to define some data, and then finally proc bars is invoked to produce a bar graph.``

For each proc, the user may specify a various attributes or options.`` Attributes that are not specified use a default when possible.`` In the above example, the user has invoked `proc areadef` and specified values for these attributes: `rectangle`, `xrange`, and `yrange`. All of the procs, as well as the names, types, and acceptable values for all attributes, are described in the ploticus handbook.``

## PROCEDURES (PROCS) AND ATTRIBUTES

Procedures (procs) are always invoked using this construct: `#proc` procname.`` The word `#proc` indicates the start of a procedure specification block; the other word is the name of a procedure (case insensitive).``

Attributes within a procedure may be specified in any order. A colon (:) may be used after an attribute name or a procedure name (however it is not required). All proc names and attribute names are case-insensitive. Attributes that are multiline text type are terminated by a blank line.``

The following script directives are used by ploticus in executing procedures:

## #proc

  This directive signals the beginning of a ploticus procedure (proc).
  Example: `#proc bars`

## #proc endproc

  This signals the end of a ploticus procedure (proc).`` Only required in certain cases.``
  Example: `#proc endproc`

## #procdef

  This directive is used similarly to #proc, but it does not execute the procedure; it only defines it so that it may be #cloned later.`` The procedure should contain a `#saveas`.``
  Example: `#procdef bars`

## #saveas

  Makes the current proc available to be cloned by procs encountered later in the script, and assigns it an identifier (B1 in the example below).`` A gallery example that uses saveas and clone is rangebar1 . May be used anywhere within the proc.``
  Example: `#saveas B1`

## #clone

  clone is used like an attribute.`` Inherits all attribute values from a previously saved proc. May be used anywhere within the proc.`` Attributes may be overridden locally as desired.``
  Example: `#clone B1`

Other general purpose directives are described below.``

## SYNTAX AND VARIABLES

Any line where the first non-whitespace content is `//` is a comment and is ignored. Comments must be alone on the line.`` Any line where the first non-whitespace content begins with # is a directive (an operator that does something).`` Everything else is generally HTML and is passed through transparently, except for evaluation of variables, and possible processing of certain inline formatting codes .``

Double quotes (") may be used to enclose character strings in set , setifnotgiven , if, elseif and call .`` Everywhere else, quotes have no special syntactical meaning and may be used freely without any special treatment.`` It is safe to use TABs to indent lines of code and in transparent output; other uses (such as embedding TAB in variable contents) should be avoided.``

Scripts can set and reference variables.`` Variable names must begin with a letter and may contain letters, digits, underscore (_) and period (.).`` Names are case-sensitive.`` Maximum length of a variable name is 38 characters.`` Variables may hold numbers, alphanumerics, or single-line text strings, up to a maximum content length of 250 characters. Variables cannot hold more than one line of text.`` All data, including numbers, are stored as characters.`` Where a variable is to be evaluated, it should be prefaced with an at-sign (@).`` In order to print an at-sign a double at sign (@) may be used.`` When setting or identifying a variable, the at-sign should not be used.`` Examples:

    	 Hello, my name is @NAME
    	 #shell cat data | recsel "@@3 = res"
    	 #set NAME = "Harvey Smith"

An attempt to evaluate a variable that has never been assigned a value will result in cancellation of the evaluation (the variable name will be passed through transparently) and no error condition will be raised.`` Several reserved variables exist. All variables are global in scope.``

## FUNCTIONS

Functions may be used to assign a value to a variable ( set , setifnotgiven ), and in if statements. Function names always begin with a dollar sign ($), for example: `$strlen( "hello world" )`.`` For descriptions of the available functions, see the functions man page .`` There are functions for plotting , arithmetic , strings , commalists , shell , sql , dates , times , and other .`` Custom functions may be implemented in `custom.c`.``

## MORE DIRECTIVES

Directives are operators that do something, such as `#set`.`` Directives always begin with a pound sign (#), and usually occupy one line alone (a few of the directives, such as shell and sql can be multiline constructs).`` Individual "words" or tokens within a directive must be separated by white space.`` Directives may be indented using spaces or tabs.``

Descriptions of the flow-of-control directives follow:

## #set

  `#set` variable`=` numeric
  `#set` variable`= "`text`"`
  `#set` variable`= $`function

  Assigns a value to a variable.`` The value may be a constant or a variable, and may be a numeric, alphanumeric/text, or function result.`` Alphanumeric/text literals should be enclosed in double quotes (the closing quote may be omitted if desired).`` The variable may be a simple standalone variable or a field in a logical record .`` Whitespace must follow the `#set`, the variable, and the equals sign (=).`` Multiple alphanumeric variables or constants may be used on the right hand side, resulting in concatenation, however they must be separated by whitespace.`` Other directives that can set variables include: setifnotgiven , shell , sql , .`` Examples:

       #set COUNT = 0
       #set LABEL = "My favorite martian"
       #set LABEL = "My favorite martian
       #set LABEL = @A @B
       #set LABEL = @A ", " @B
       #set TODAY = $todaysdate()
       #set TOTAL = $arith(@X+@Y+@Z)

## #setifnotgiven

  `#setifnotgiven` variable`=` value

  Similar to set except that it takes action only if variable is empty ("") or has never been assigned a value. Useful for setting default values in forms.``
  Example: `#setifnotgiven CUTOFF = 0.5`

## #call

  `#call` function

  Invoke a function without retaining its return value.
  Example: `#call $setdatefmt( "yyyy-mmm-dd" )`

## #if

  Alter execution flow of control based on conditional expressions . if and endif are required. elseif and else are optional.`` An example of an #if construct:

       #if @mode = A
          <h4>Mode is A</h4>
       #elseif @mode = B
          <h4>Mode is B</h4>
       #else
          <h4>Mode not given</h4>
       #endif

  Some examples of conditional expressions:

       #if @tag = TOTAL
       #if @meas > 0.0 && @meas < 8.5
       #if @name = ""
       #if @type like "west*" || @type = "bl*"
       #if $arith(@A+@B) > 10

## #for

  `#for` var`in` commalist
  ..``
  `#endloop`
  `#for` var`across` multirow-response
  ..``
  `#endloop`

  Loop the flow of control, iterating across members of commalist var will be set to each member from first to last.`` If commalist or multirow-response is empty, the loop body will not be executed.`` This example illustrates the construct, without doing anything useful:

       #set COLORLIST = "red,blue,green,yellow
       #for  COLOR  in  @COLORLIST
           #if  @COLOR  =  green
               #break
           #elseif  @COLOR  =  blue
               #continue
           #endif
       #endloop

## #while

  `#while``` conditional expression
  ..(loop body)..``
  `#endloop`

  Loop the flow of control while conditional is true.`` If conditional expression is initially false, the loop body will not be executed at all.`` The following example loops until I > 10:

       #set I = 0
       #while @I <= 10
         #set I = $arith(@I+1)
       #endloop

## #loop

  `#loop`
  ..``
  `#endloop`

  Loop the flow of control. A break statement must be used to terminate the loop.`` The following example loops until I > 10:

       #set I = 0
       #loop
          #set I = $arith(@I+1)
          #if @I > 10
              #break
          #endif
       #endloop

## #break

  Terminate the iteration of the most recently invoked for loop, while loop, or plain loop . Script execution resumes at the statement immediately following the corresponding endloop.`` There are restrictions if used within an included file.``

## #continue

  Proceed directly to the next iteration of the most recently invoked for loop, while loop, or plain loop . There are restrictions if used within an included file.``

## #exit

  Terminate execution immediately. Example:

       #if @_DEBUG = 1
           #exit
       #endif

## #include

  `#include` file

  Include script code from a file.`` file is relative to scriptdir as defined in the project config file .`` Includes may be nested.`` included code is interpreted in the same manner as ordinary code.`` However, break and continue may be used only if the corresponding loop / #endloop is also within the included file.`` return may be used to immediately exit the included file and resume execution in the including file.``
  Example: `#include projectheader`

## #cat

  `#cat` file1 [..fileN]

  Copy the contents of files to the standard output.`` No processing or interpretation is done to the contents.`` Suitable for text files or binary files.``
  Example: `#cat /home/scg/img/banner.gif`

## #return

  Terminate execution of an included file immediately.`` Execution is resumed at the statement immediately following the include.``

## #write

  `#write` file`[`filemode]
  ..text..``
  `#endwrite` `[noclose]`

  Write text to file.`` file may be a file name or `stderr` or `stdout`.`` filemode is either `w` to create, or `a` to append.`` Within the construct, other directives, such as #if , #for , #include and so on may be freely used.`` If `stdout` or `stderr` are used, the filemode is ignored and the `noclose` option should be given with #endwrite.``

  The following example, if used in header code included by all pages in a cgipal project, would log page hits with date, time, name of page, and the HTTP info.``

       #set RH = $getenv(HTTP_REMOTE_HOST)
       #set RF = $getenv(HTTP_REFERER)
       #call $setdatefmt(yyyy/mmm/dd)
       #set DATE = $todaysdate()
       #set TIME = $time()
       #write /tmp/mylog a
       @DATE @TIME @_PAGE @RH @RF
       #endwrite

## #control

  `#control` attribute`` value

  Set various operational modes.`` attribute may be one of: `allowinlinecodes`, `dbquote`, `htmlqhmode`, `listsep`, `evalvars` , `suppressdll`, or `dot_in_varnames`.``

  Full description of #control directive

## INTERACTION WITH DATABASES AND SHELL

## #sql

  `#sql [`option`]` sql command`[#endsql]`

  This directive allows SQL code to be embedded in scripts, and submits the embedded SQL code to your database.`` The sql command may use a single line construct or a multi-line construct. `#endsql` must be used to terminate a multi-line construct.`` For SQL SELECT commands an option may be given; available options are `#processrows` (the default), `#load`, `#dump`, `#dumptab`, `#dumphtml`, and `#dumpsilent`.``

  Two separate SQL database connections are available. For connection 1, use #sql; for connection 2, use #sql2 instead of #sql (all other syntax is the same).``

  More on #sql and interacting with databases

## #shell

  `#shell` option`` command`[#endshell]`

  Execute the given shell command, and optionally display or capture the results.`` The command may use a single line construct or a multi-line construct. `#endshell` must be used to terminate a multi-line construct.`` An option may be given; available options are `#load`, `#processrows`, `#dump` (the default), `#dumptab`, `#dumphtml`, and `#dumpsilent`.``

  More on #shell and interacting with the shell
  data display engine
  Copyright Steve Grubb

Markup created by unroff 1.0, `` `` September 06, 2001.