- From: James Manger <James@Manger.com.au>
- Date: Mon, 2 Nov 2009 23:40:19 +1100
- To: uri@w3.org
- Message-Id: <D5DCF011-639D-4D27-84AF-5509C0981638@Manger.com.au>
[Comments on the URI Template working draft] Constructing a URI with a substring of a user-provided variable value sounds useful. The current working draft has a dictionary site as an example (/dictionary/{term:1}/{term} produces /dictionary/c/cat), and mentions hash-based storage. Another important example is dates. Many, many URI designs incorporate dates, in quite a variety of ways (just year, year/month/day, XML- style timestamp...) -- which sounds like a perfect situation to use a URI template. Ideally, a spec could define one variable to hold a date (eg 'published=2009-11-02T11:01:00Z'), then different sites can each have their own template to pick out the parts they need in the arrangement they want. The alternative is specs having to define, say, half-a- dozen variables to hold each component of each date, which is much less appealing (eg 'publishedYear=2009', 'publishedMonth=11', 'publishedDay=02', 'publishedHour=11', 'publishedMinute=01'...). Picking a 2-digit month, for instance, from a date string to use as a path segment (quite a common occurrence in URIs) requires a substring function with start and end offsets, not just a prefix or suffix as the current syntax supports ({var:end} or {var^begin} respectively). I suggest a slightly more flexible syntax: {var[begin,end]} A template for W3 standards might be: /TR/{date[,4]}/REC-{title}-{date[,4]}{date[6,8]}{date[9,11]} producing /TR/1998/REC-CSS2-19980512 when title is "CSS2" and date is "1998-05-12T00:00:00Z". Both begin and end can take negative values to indicate offsets from the end of the value, instead of from the beginning (like the current draft). Both begin and end can be optional, defaulting to the beginning and ending of the variable value respectively. My gut feeling is that [begin,end] would be fairly easier for template authors to understand and remember. I would be tempted to RECOMMEND that variables that are dates use the XML date format (yyyy-mm-ddThh:mm:ssZ) were possible, but perhaps it would be sufficient to include an example using this format. Suggested replacement text: 1. Introduction .... http://example.com/dictionary/{term[,1]}/{term} 2.4 Value Modifiers A variable can have a modifier indicating that the substituted value is limited to a substring of the variable value. The primary use of these modifiers is to partition an identifier space hierarchically, as is often found in reference sites, date-based URIs and hash-based storage. They can also be used to indicate the maximum length of a given substitution. modifier = "[" [begin] "," [end] "]" begin = offset end = offset offset = [ "-" ] 1*DIGIT If the variable is not typed, then each offset refers to a number of characters from either the beginning (0 or positive offset) or end (negative offset) of the variable's value (before any %-escaping). If the begin offset is omitted, the substring starts at the beginning of the value. If the end offset is omitted, the substring stops at the end of the value ("-0" SHALL NOT be used). The comma is never omitted. If the begin or end offset is beyond the variable's value (ie the absolute value of the offset is larger than the length of the variable's value) then the nearest end of the value is used. If the end offset is earlier in the string than the begin offset, an empty string is substituted. If the variable is typed as a list, a modifier creates a sub-list. That is, the offsets refer to list elements, not characters. If the variable is typed as an associative array, the offsets refer to tuples. The following examples illustrate how modifiers work with the different variable types. More complex examples are provided in Section 5. Given the variable assignments: date := "2009-10-31T22:55:13Z"; name := [ "Fred", "Wilma", "Pebbles" ]; favs := [ "color", "red", "volume", "high" ]; Example Template Expansion {date} 2009-10-31T22:55:13Z {date[,50]} 2009-10-31T22:55:13Z {date[,4]} 2009 {date[11,]} 22:55:13Z {date[-1,]} Z {date[6,8]} 10 x{date[15,-15]}y xy {?name} ?name=Fred,Wilma,Pebbles {?name[,1]} ?name=F {?@name} ?name=Fred&name=Wilma&name=Pebbles {?@name[,1]} ?name=Fred {?@name[1,]} ?name=Wilma&name=Pebbles {?favs} ?favs=color,red,volume,high {?%favs} ?color=red&volume=high {?%favs[,1]} ?color=red {?%favs[1,]} ?volume=high {?%favs[-1,]} ?volume=high {?%favs[,-1]} ?color=red James Manger
Received on Monday, 2 November 2009 16:33:54 UTC