2012-12-10 [長年日記]

trac.web.chrome.INavigationContributor を実装してみる

いまのhelloworldプラグインは、Webブラウザのアドレス欄に /helloworld を入力することで動作させることができた。このページへのリンクを追加してみよう。

trac画面の右上の metanav や mainnav という領域にアイテムを追加するには、INavigationContributor という拡張ポイントを実装すればいい。やってみる:

implements() に INavigationContributor を追加する

HelloWorldPluginクラスの定義の冒頭にある implements に INavigationContributor を追加する。こんな感じで:

implements(IRequestHandler, INavigationContributor)

import文は例によって Ctrl-1 で追加してやる。

APIを調べる

いま追加した INavigationContributor をクリックすると、class INavigationContributor(Interface): の定義にジャンプできる。残念ながら implements の仕掛けは trac独自なので PyDEVでは認識できず*1、拡張するためのウィザードなどの機能がないので、そのクラスの def 文をコピペで持ってくる。
このクラスで実装すべきは以下の二つ:

def get_active_navigation_item(self, req):
ハイライトさせるべきアイテムを返す。
def get_navigation_items(self, req):
navに追加したいアイテムを categor, name, text のタプルで返す。

*1 これはこれでEclipseプラグインのネタになりそう

第1引数に self を追加してから実装してやる

こんな感じで:

    # INavigationContributor methods
    def get_active_navigation_item(self, req):
        return 'helloworld'
    def get_navigation_items(self, req):
        yield ('metanav', 'helloworld',
            tag.a('Hello world', href= req.href.helloworld()))
例によって、赤い線が出たら ctrl-1 で import を追加する。 実装できたら、tracを再起動すると、ナビゲーションバーに helloworld が追加されている。 metanavmainnav に変更すると、表示される場所が変わるよ。

ExtensionPointを眺めてみる

ほかにどんな拡張ができるかをざっくりつかむために、39コある拡張ポイントを簡単に見てみる気になる拡張ポイントがあったら、HelloWorldPlugin にちょろっと実装して動作を確認してみるといい。あるいは、DeveloperPlugin を利用して、実装しているクラスを探してソースを読んでみるとか。

trac.admin.api.IAdminCommandProvider
trac-admin のコマンドを追加できる。
trac.admin.api.IAdminPanelProvider
管理画面を追加できる。
trac.attachment.IAttachmentChangeListener
attachmentが変化(追加/削除等)したときの動作を追加する。
trac.attachment.IAttachmentManipulator
attachmentがアップロードされた直後の検証を追加できる。
trac.attachment.ILegacyAttachmentPolicyDelegate
attachmentの(旧来の)権限チェックを追加できる。
trac.db.api.IDatabaseConnector
データベースバックエンドを追加できる。現在用意されているのは MySQL、PostgreSQL、SQLite。
trac.env.IEnvironmentSetupParticipant
新しいプロジェクトを作成したとき、アップグレードしたときなどの動作を追加できる。プラグインが固有のデータベーステーブルを使う時はここで実装する。
trac.env.ISystemInfoProvider
about tracページや内部エラーページに表示されるシステム情報を追加できる。
trac.mimeview.api.IContentConverter
Content-Type で示されるコンテンツを変換する処理を追加できる。(将来はAPIが変更される予定)
trac.mimeview.api.IHTMLPreviewAnnotator
ファイルのXHTML表現を追加できる。たとえば、ファイルのメタデータを表示するなど。
trac.mimeview.api.IHTMLPreviewRenderer
ファイルのHTML表現を追加できる。イメージのプレビューやソースの色付けなどで使われている。
trac.notification.IEmailSender
メールによる通知機能を追加できる。
trac.perm.IPermissionGroupProvider
ユーザの権限グルーピングの仕組みを追加できる。
trac.perm.IPermissionPolicy
ユーザの(より詳細な)権限チェックの仕組みを追加できる。
trac.perm.IPermissionRequestor
新たなロール(権限)やアクションを追加できる。
trac.perm.IPermissionStore
権限管理の仕組みを追加できる。
trac.prefs.api.IPreferencePanelProvider
ユーザの個人設定ページに機能追加できる。
trac.resource.IResourceManager
チケット、マイルストーン、リポジトリ、Wikiなどのリソースを新たに追加できる。
trac.search.api.ISearchSource
検索対象を追加できる。
trac.ticket.api.IMilestoneChangeListener
マイルストーンを変更した場合の動作を追加できる。
trac.ticket.api.ITicketActionController
チケットのワークフローの動作に機能を追加できる。
trac.ticket.api.ITicketChangeListener
チケットを変更した場合の動作を追加できる。
trac.ticket.api.ITicketManipulator
チケットを追加/変更する場合の動作を追加できる。
trac.ticket.roadmap.ITicketGroupStatsProvider
ロードマップでのチケットのグルーピングを追加できる。
trac.timeline.ITimelineEventProvider
タイムラインに表示するイベントを追加できる。
trac.versioncontrol.api.IRepositoryConnector
バージョン管理システムを追加できる。
trac.versioncontrol.api.IRepositoryChangeListener
リポジトリにチェンジセットが追加/変更された時の動作を追加できる。
trac.versioncontrol.api.IRepositoryProvider
リポジトリ情報を追加できる。
trac.versioncontrol.web_ui.browser.IPropertyRenderer
Tracのリポジトリブラウザやチェンジセットビューに情報を追加できる。
trac.versioncontrol.web_ui.changeset.IPropertyDiffRenderer
Tracのリポジトリブラウザやチェンジセットビューに差分情報を追加できる。
trac.web.api.IAuthenticator
認証機能を追加できる。
trac.web.api.IRequestFilter
HTTPリクエストの処理前後にフィルタ動作を追加できる。
trac.web.api.IRequestHandler
HTTPリクエストの処理(ハンドラ)を追加できる。
trac.web.api.ITemplateStreamFilter
Genshiテンプレートのフィルタを追加できる。
trac.web.chrome.INavigationContributor
ナビゲーションメニュー(metanav / mainnav)にアイテムを追加できる。
trac.web.chrome.ITemplateProvider
Genshiテンプレートや静的コンテンツを追加できる。
trac.wiki.api.IWikiChangeListener
wikiページが追加/変更/改名/削除されるときの動作を追加できる。
trac.wiki.api.IWikiMacroProvider
wikiマクロを追加できる。
trac.wiki.api.IWikiPageManipulator
wikiページを格納する際の動作を追加できる。
trac.wiki.api.IWikiSyntaxProvider
wiki文法やTracLink文法を追加できる。

«前の日記(2012-12-09) 最新 次の日記(2012-12-11)»