20 Minute Wiki Page 4

よりURLをわかりやすく

現在の状態で私を悩ませるのはURLがあまりステキではないことです。 "/?pagename=Foo" よりも "/Foo" の方がステキだと思いませんか?幸いにして、これを実現するのはとても簡単です。リクエストにマッチするメソッドがないときにCherryPyが呼ぶような、デフォルトのメソッドを追加するだけです:

@expose()
def default(self, pagename):
    return self.index(pagename)

そしてsaveメソッド内のリダイレクトを変えてやります:

raise turbogears.redirect(turbogears.url("/%s" % pagename))

Wikiワードって?

WikiワードはWordsSmashedTogetherのように記述されるものです。典型的なWikiではこれらの言葉を探し出して自動的にリンクを貼るようになっています。なかなか良いアイデアのように見えます。正規表現の出番です。コントローラにimportを追加することから始めましょう:

import re

Wikiワードは大文字で始まり、いくつかの小文字の集合を持ち、他の大文字とさらに文字や数字が続きます。これらに合うような正規表現は以下の通りです:

wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)")

これをRootコントローラクラスの一番上に挿入します。そしてこれらの正規表現を使う必要があります。indexメソッドのpublish_parts(これがHTMLを生成しています)の直前に以下を追加します:

root = str(turbogears.url("/"))
content = wikiwords.sub(r'<a href="%s\1">\1</a>' % root, content)

フロントページをWikiワードを含むように編集してみてください。ページが表示されると、それがリンクになっているのが見えるでしょう。それをクリックしてエラーが出ても驚かないで下さいね。

おいおい、ページはどこだ?

ここで存在しないページのチェックを追加しましょう。ここで取るアプローチはシンプルです: もしページが存在しなければ、それを生成して編集ページとして受け取るというものです。indexメソッドでページが存在しているかどうかを確認します。もし存在していなければ新しいnotfoundメソッドへリダイレクトします。indexメソッドを以下のように変更します:

try:
    page = Page.byPagename(pagename)
except SQLObjectNotFound:
    raise redirect("/notfound", pagename = pagename)

また同様に例外もimportする必要があります。これをファイルの一番上へ追加します:

from sqlobject import SQLObjectNotFound

そしてnotfoundメソッドを追加しましょう。editテンプレートを再利用すればよいでしょう:

@expose("wiki20.templates.edit")
def notfound(self, pagename):
    page = Page(pagename=pagename, data="")
    return dict(page=page)

SQLObject?では、オブジェクトを初期化すればデータベースに挿入することができますので、このメソッドではデータベースに新しいページを生成しています。

試してみてください!これで新しいページが作成できるはずです。

Go back to page 3 | Continue on to page 5