Updated URI Template proposal

Based on everyone's feedback I've updated my proposal
and updated the URI Template explainer service to reflect that proposal.
Expansions are now of the form:

  {var=default}

or

  {-op|arg|vars}

where <op> is now a word, one of 'prefix', 'append',
'join', 'listjoin', 'opt', 'neg', or 'sub'. This addresses
the concerns with readability, extensibility, embedding in XML,
and also makes parsing easier by delimiting each part with '|'.
In addition I've added in the 'sub' operator
which operates on a sub-string.

Here is an example using sub:

URI Template
    http://example.com/user/{-sub|0-1|username}/{-sub|1|username}
Variables
    username := 'jcgregorio'
URI
    http://example.com/user/j/cgregorio

The examples on this page have been updated
to reflect the new syntax:

  http://bitworking.org/projects/URI-Templates/

Other restrictions that are found in the new BNF include
restricting var names to

  [a-zA-Z0-9][a-zA-Z0-9\_\.\-]*

which makes disambiguating between the IdentityOperatorTemplate
and OperatorTemplate easier now that operators are not punctuation.
Here is the updated BNF:

  token arg        '[^\|]*';
  token varname    '[a-zA-Z0-9][a-zA-Z0-9\_\.\-]*' ;
  token vardefault '[\w\-\.\~\%]+' ;
  token num        '[0-9]+';

  START    -> Template;
  Template ->
       IdentityOperatorTemplate
     | OperatorTemplate
     ;
  IdentityOperatorTemplate-> Var
  OperatorTemplate         ->
       '-append\|'   arg '\|' Var
     | '-prefix\|'   arg '\|' Var
     | '-join\|'     arg '\|' Vars
     | '-listjoin\|' arg '\|' VarNoDefault
     | '-opt\|'      arg '\|' Vars
     | '-neg\|'      arg '\|' Vars
     | '-sub\|'
          num
          ( '-' num )?
          '\|' Var
     ;

  Vars                     -> Var
                                 (
                                    ',' Var
                                 ) * ;
  Var                      -> varname
                                 (
                                   '=' vardefault
                                 ) ? ;
  VarNoDefault             -> varname;


Here are the rest of the examples previously given
rewritten in the new syntax:

URI Template
    {-join|&|q,num}
Variables:
    q := fred
    num := 10
URI
    q=fred&num=10

URI Template
    /foo{-prefix|/notebooks/|notebookID}
Variables
    notebookID := stuff
URI
   /foo/notebooks/stuff

URI Template
  foo{-opt|/-/|categories}
Variables
   opt := fred
URI
   foo/-/

URI Template
   /-/{-listjoin|/|categories}
Variables
   categories := ['A|-B', 'C']
URI
  /-/A%7C-B/C

The python implementation and the associated explainer service have
been updated:

   http://code.google.com/p/uri-templates/

There are two issues that are outstanding:

1. Seven operations is a bit much. Prefix and append are both
    convenience operators that can be done using 'opt'. Is it worth
    dropping them to reduce the count to five?
2. The 'sub' operator could either be defined to operate on
    the octets of the variables value, or on the unicode character points
    of the equivalent utf-8 decoded string. Both have their pros and cons.

   Thanks,
   -joe

-- 
Joe Gregorio        http://bitworking.org

Received on Monday, 5 November 2007 17:32:24 UTC