TracWikiで投稿時間を表示するマクロについて考える
とりあえず調べたところまでを残しておく。
TracWikiに書き込んだ時間を残しておける機能が欲しくて色々調べてる。
Pukiwikiの"time?"みたいな記法。
TimestampMacroなんてのもあるけど、コレはページを更新した時間を表示するものなので、目的とは違う。
あくまでも表示したいのは書き込んだ時間。
TracDBのWikiテーブルを見ると、Wiki記法から生成されるHTMLは保存されておらず、TracWiki記法のテキスト保存されていないようなので、ページをレンダリングする時にparseなりしてHTMLを生成しているんだと思う。
(パーサを調べてみるのも面白そうだなぁ… TracのWikiパーサを読むAdd Star)
なので、DBに格納される前にちょろまかさないとレンダリングされる度に時刻が更新されてしまうことになる。
とりあえずTracのソースをちょろちょろ見てみると、${TRAC_HOME}\python-lib\trac\trac\wiki\model.pyのsaveメソッドでWikiに書き込んだ情報をDBに格納しているみたい。
def save(self, author, comment, remote_addr, t=None, db=None): if not validate_page_name(self.name): raise TracError(_("Invalid Wiki page name '%(name)s'", name=self.name)) new_text = self.text != self.old_text if not new_text and self.readonly == self.old_readonly: raise TracError(_('Page not modified')) t = t or datetime.now(utc) @self.env.with_transaction(db) def do_save(db): cursor = db.cursor() if new_text: cursor.execute(""" INSERT INTO wiki (name,version,time,author,ipnr,text, comment,readonly) VALUES (%s,%s,%s,%s,%s,%s,%s,%s) """, (self.name, self.version + 1, to_utimestamp(t), author, remote_addr, self.text, comment, self.readonly)) self.version += 1 self.resource = self.resource(version=self.version) else: cursor.execute("UPDATE wiki SET readonly=%s WHERE name=%s", (self.readonly, self.name)) if self.version == 1: # Invalidate page name cache del WikiSystem(self.env).pages self.author = author self.comment = comment self.time = t for listener in WikiSystem(self.env).change_listeners: if self.version == 1: listener.wiki_page_added(self) else: listener.wiki_page_changed(self, self.version, t, comment, author, remote_addr) self.old_readonly = self.readonly self.old_text = self.text
DBに格納する前にself.text内の「time?」だか何だかの正規表現でひっかけて置換かければ出来ないことはなさそうだけど、悪手な臭いがしてためらっている。
Tracが用意してる拡張ポイントでも無いし、{{{ 〜 }}}で囲んだ部分のも置換してしまうだろうし。
まぁ、とりあえず今日はここまで。