最近、「URIテンプレート(URI Template)」という言葉を聞くことがあるので、次の仕様を読んでみました。
要するに次のようなもんです。
一種のテンプレート言語なので、テンプレートプロセッサにより展開される部分があります。その構文は次のとおり。
展開部分 ::= '{' 式 '}'
式が、変数束縛の環境のもとで評価されて文字列になります。テンプレートプロセッサは、展開部分内の式言語(expression languate)のインタプリタにもなっています。
その式言語の特徴は:
- データは、UNICODE文字列、またはUNICODE文字列のリスト。
- 変数にデータが束縛された環境を持つ。
- 変数に何も束縛されてないことを表すundefinedがある(undefinedを状態とみなしても特殊な値とみなしてもよい)
- 空文字列や空リストはundefinedではない。
- 変数参照とオペレータ呼び出しが使える。
次に構文。まずは変数名。
変数名 ::= (英字 | 数字) (英字 | 数字 | '.' | '_' | '-') *
名前先頭文字に数字を許し、ピリオドとハイフンも名前文字です。
変数参照には、オプショナルにデフォルト値を指定できます。
変数参照 ::= 変数名 ('=' デフォルト値)?
デフォルト値はそのままURIの一部になるので、特殊文字はパーセントエスケープする必要があります。生で入れてもいい文字は次のとおり。
- 英字 数字 - . _ ~
変数参照以外にオペレータ呼び出しが使えます。
オペレータ名 ::= 英字+ オペレータ呼び出し::= '-' オペレータ名 '|' 引数データ '|' 変数参照並び 引数データ ::= (URIで許される文字 | パーセントエスケープ)* 変数参照並び ::= 変数参照 (',' 変数参照)*
URIで許される文字には、次の予約文字も含まれます。
- : / ? # [ ] @ ! $ & ' ( ) * + , ; =
'|'や'^'はパーセントエスケープする必要があります。
それで、展開部分に含まれる式の構文は次です。
式 ::= 変数参照 | オペレータ呼び出し
変数束縛の環境のもとで、変数参照やオペレータ呼び出しがどう評価されるかについては、原仕様を参照してください。