- From: John Cowan <cowan@ccil.org>
- Date: Mon, 15 Oct 2007 19:13:49 -0400
- To: Mike Schinkel <mikeschinkel@gmail.com>
- Cc: 'Joe Gregorio' <joe@bitworking.org>, 'John Cowan' <cowan@ccil.org>, uri@w3.org
Mike Schinkel scripsit: > Forgive me if I'm not seeing it correctly but why would template vars (i.e. > the stuff inside braces) need to follow the same rules are URIs? As far as > I understand, a URI Template is not a URI, it is a new entity specifically > designed to allow the creation of URIs. Requiring URI Template *variables* > to follow the encoding rules for URI seems to me to invite tremendous > complexity where I don't currently see it being needed. I'm not sure whether by "template vars" you mean the *names* of variables, or their *content*. I assume that variable *names* are just alphanumeric, a subset of URI unreserved characters. The value of a variable can be any sequence of characters: when the value of a variable is inserted into the result URI, all characters are UTF-8-encoded and then %-escaped with the exception of unreserved characters. (The unreserved characters are the letters, digits, hyphen, period, underscore, and tilde.) In Joe's proposal, a template can only contain URI-characters, plus "{" to mark the start of an expansion, "|" to separate the parts of an expansion, and "}" to mark the end of an expansion. This makes the template very simple to parse, as you don't have to worry about any of "{", "|", or "}" being anything but an expansion. So if you want an unreserved character, it can be directly in the template or in the value of a variable. If you want a reserved character, it must be directly in the template, either outside an expansion or in the "stuff" part of an expansion. If you want a non-URI character, it must be in the value of a variable, or else you can UTF-8-encode and %-escape it yourself and put it in the template. > If I'm wrong on this point can you please explain why, and also give > concrete examples as I'm not so good in visualizing things when only > discussed in the abstract. Given the template "foo/{<bar/|baz}", which can be read "foo slash followed by the value of baz prefixed by bar slash", here are some possible results depending on the value of baz: if baz is null/undefined, you get "foo/" (slash inserted from template) if baz is the empty string, you get "foo/bar/" (second slash is from expansion); if baz is the string "toto", you get "foo/bar/toto"; if baz is the string "toto/tutu", you get "foo/bar/baz/toto%2Ftutu" (slash in variable value is escaped). > > You can't put the var first because there may be multiple vars. > > But there are also multiple potential args, so that argument doesn't > fly, right? Yes, my bad. I should have said that you can put the stuff and the var(s) in either order, but you must use a delimiter character that can't appear in either. The simplest way to achieve that is to use a character that can't appear in a URI at all, such as "|". -- John Cowan cowan@ccil.org http://ccil.org/~cowan Big as a house, much bigger than a house, it looked to [Sam], a grey-clad moving hill. Fear and wonder, maybe, enlarged him in the hobbit's eyes, but the Mumak of Harad was indeed a beast of vast bulk, and the like of him does not walk now in Middle-earth; his kin that live still in latter days are but memories of his girth and his majesty. --"Of Herbs and Stewed Rabbit"
Received on Monday, 15 October 2007 23:14:05 UTC