.. _rfc9:

===============================================================
  MS RFC 9: Item tag for query templates
===============================================================

:Date: 2006/01/05 
:Author: Steve Lime
:Contact: steve.lime at DNR.STATE.MN.US
:Status: Implemented
:Version: MapServer 4.10

Description: A the moment processing of attributes exposed via query templates
is limited to a couple forms of escaping. This is too limiting. It would be
much nicer to be able to apply a format to an attribute (e.g. truncate
decimals or add a prefix) or detect when it is NULL or empty and present an
alternative representation. This RFC describes a simple scheme to allow for
extended processing of attributes before sending to the a users.

This would involve adding a new "item" tag to the template processor.

Files affected
~~~~~~~~~~~~~~~~~

- maptemplate.c => add tag processor, update query template processor to use
  tag processor.

Backwards compatibility issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

N/A, new functionality. Existing methods for exposing an attribute (e.g.
[attribute name] would continue to function, although we might mark that as
deprecated at some point.

Implementation Details
~~~~~~~~~~~~~~~~~~~~~~

The "item" tag would have the following properties.

- name: the name of the attribute to be exposed

- format: a simple string containing the token(s) $value, default format is
  the result of any processing

- nullformat: string to return if value is NULL or empty (length=0)

- uc: convert string to upper case

- lc: convert string to lower case

- substr: perform a perl-like substring operation by providing offset, and
  optionally length (un-implemented as of 3/13/07)

- commify: add commas to a numeric string (12345 would become 12,345), note,
  supports only North American notation at the moment

- escape: what type of escaping to do (default is html), permissible values
  would be html, url, none

- precision: number of decimals to retain after the decimal point

- pattern: regular expression that must validate (against the column value) to
  process the tag

We could add simple case statement support at a later date but the above would
more than meet my needs at the moment.

Examples
~~~~~~~~

Display no decimal places, and commify: 

  [item name=foo commity=true precision=0] - 12345.6789 output as 12,345

Conditional display an item if its value contains 'bar':

  [item name=foo pattern=bar]

Escape a value for inclusion in a URL, and convert to upper case:

  [item name=foo uc=true escape=url] - "hello world" output as "HELLO%20WORLD"

Apply a custom format to an item, and display a message if the item is empty:

  [item name=foo format="foo=$value" nullformat="foo is not found"]

Notes
~~~~~

Item tags are processed after other column tags (e.g. [foo]) so you can
include substitution strings within the item tag itself.

Bug ID
~~~~~~~~

1636

Voting history
~~~~~~~~~~~~~~~~~

+1: Lime, Morissette, Butler
+0: Gillies, Warmerdam