[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[kahua-dev:01234] Re: オブジェクトの URL 表記と entry をメソッドっぽくディスパッチする



こんばんは柴田です.

クエリストリングを使ったクラス指定は判定は楽だけど生成されるURLが
気に入らないのでやめました.

個人的に目指しているURLは
* 人間がURLを見て,自分がどこにいるのかを大体理解できること.
* URLのお尻を削れば上の階層のページが見えること(/show/file/description -> /show/file/).
* エスケープされた文字列があまり含まれないこと(%2aとか).
です.

で,オブジェクトのURLエンコードを
"オブジェクトのクラス名"+"NULL文字"+"オブジェクトのkey"
としてみました.

goshではNULL文字もクラス名に使えるので,オブジェクトURLかどうかを
完全には判定できないんですが,問題は起きにくいと思います.

実際は "<folder>\0Kahua"のようになって,
URLでは "%3cfolder%3e%00Kahua" になります.

本当は"<>"を"()"を置換してからURLエスケープしようとしたんですが,
反対意見多数だったので今回は見送りました.
"(folder)%00Kahua"と短くなるのに…

ここまでで,引数の「数」と「型」でentryをマッチ出来るようになりましたが,
もう少し「URL」と「やりたい事」とのパスマッピングをサポートする仕組みが欲しいです.
ページを跨ぐ処理はa/contやform/contを使えて楽ちんなんですが,固定URLを持つ比較的静的な
ページを作るのはまだ面倒です.

そこで,「URLパス文字列」と「entryの引数文字列」でentryをマッチ出来るようにしてみました.
syntax-ruleでパターン・データを使ってテンプレートをマッチさせるような感じです.

define-entry-methodの内部で使っているdefine-method-ruleは次のような
動作をします.

{{{
(define-method-rule rule ("a" a)
  (list "a top" a))

(define-method-rule rule ("a" (a <string>))
  (list "a string" a))

(define-method-rule rule ("b" b)
  (list "b top" b))

(rule "a" 12)
=> ("a top" 12)
(rule "a" "hoge")
=> ("a string" "hoge")
(rule "b" 23)
=> ("b top" 23)
}}}

これを使ってentryを次のように定義すれば

{{{
;; (A)
(define-entry-method show ((file <file>) "size")
  (html/
   (body/
    (h1/ "size of " (key-of file))
    (pre/ (x->string (string-length (ref file 'body)))))))

;; (B)
(define-entry-method show ((file <file>) unknown)
  (html/
   (body/
    (h1/ (format "unknown info for ~a : ~a" (key-of file) unknown)))))
}}}

と書けて
/entry-method/show/<file>\0README/size
で(A)が
/entry-method/show/<file>\0README/hoge
で(B)が
表示されます.

ここまでの変更をCVSにコミットしました.
この仕組みが便利かどうか模索中なので,仕様は変更される可能性があります.

On Thu, 29 Dec 2005 22:47:55 +0900
SHIBATA Tomohisa <t0m0h1s4@xxxxxxxxxxxx> wrote:

> あれれ,確かに全体をエンコードしとけば大丈夫かも.
> 
> エンコードとデコードをきっちりと書けば曖昧さは無くなると思うんですが,
> 自分が書いたやつはどうも頼りないです.
> 
> エンコード
> 1) クラス名をURIエンコード.このとき"*"もエスケープして"%2a"にする.
> 3) 2)で出来た文字列を"*"で挟んでから,key-ofをURIエンコードした文字列をお尻に付ける
> 
> デコード
> 1) 先頭の"*"を頼りにURLパスにクラス名が含まれているか判定する.
> 2) 2個目の"*"を頼りにクラス名とkey-ofを抜き出す.
> 3) 2で取ってきた物をそれぞれURIデコードする.
> 
> この操作に加えてKahua側でもURIエンコードをかますので,
> "a*b"クラスは最終的に"a%252ab"になります.
> 
> 全てのURLパスが上の流れで生成される訳じゃないし,この方法だと
> 「オブジェクトを指しているURLパス」の判定を完全にはできない気がしてきました.
> 
> 判定が楽そうなクエリストリング指定を試してみようと思います.
> /entry-method/show/Kahua/README?class_map=4.10
> とか
> /entry-method/show/Kahua/README?class_map=%3cfile%3e.%3cfolder%3e
> 
> 柴田
> 
> On Thu, 29 Dec 2005 20:00:11 +0900
> Katsutoshi Itoh <cut-sea@xxxxxxxxxxxxxxxxxx> wrote:
> 
> > In message <20051229180036.7e6bb402.t0m0h1s4@xxxxxxxxxxxx>,SHIBATA Tomohisa owr
> > >
> > >人間が読み易いURLにしたかったんですが,URLパスにクラス情報を
> > >埋め込むのは難しいですね.
> > >上のだとクラス名に"%2a"を使えないし.
> > >
> > 
> > それをクラス名にしてエンコードしても変わりませんでしたっけ?
> > 
> > 
> > 
> 
>