読者です 読者をやめる 読者になる 読者になる

kaakaa Blog

この世は極楽 空にはとんぼ

TracWikiで投稿時間を表示するマクロについて考える

trac

とりあえず調べたところまでを残しておく。


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が用意してる拡張ポイントでも無いし、{{{ 〜 }}}で囲んだ部分のも置換してしまうだろうし。

まぁ、とりあえず今日はここまで。