プラグインの作り方

プラグインの作り方を紹介します。

HelloWorldプラグインを作ってみよう

  1. 次のようなディレクトリの中にプラグインを作ります。
     + helloplugin/
        + helloworld/
          + __init__.py
          + helloworld.py
        + setup.py
    
  2. プラグイン本体(helloworld.py)を作成します。
    1. import re
    2. from genshi.builder import tag
    3. from trac.core import *
    4. from trac.web import IRequestHandler
    5. from trac.web.chrome import INavigationContributor
    6. class HelloWorldPlugin(Component):
    7. implements(INavigationContributor, IRequestHandler)
    8. # INavigationContributor methods
    9. def get_active_navigation_item(self, req):
    10. return 'helloworld'
    11. def get_navigation_items(self, req):
    12. yield ('mainnav', 'helloworld',
    13. tag.a('Hello World', href=req.href.helloworld()))
    14. # IRequestHandler methods
    15. def match_request(self, req):
    16. return re.match(r'/helloworld(?:_trac)?(?:/.*)?$', req.path_info)
    17. def process_request(self, req):
    18. req.send_response(200)
    19. req.send_header('Content-Type', 'text/plain')
    20. req.end_headers()
    21. req.write('Hello world!')
  3. プラグインをモジュール化するファイルinit.pyを作成します。
    1. from helloworld import *
  4. ビルド用のファイルsetup.pyを作成します。
    1. from setuptools import find_packages, setup
    2. setup(
    3. name='TracHellowWorldPlugin', version='1.1',
    4. packages=find_packages(exclude=['*.tests*']),
    5. entry_points = """
    6. [trac.plugins]
    7. helloworld = helloworld
    8. """,
    9. )

プラグインのビルド、インストールは他のプラグインと同様です。インストールすると、Hello Worldというメニューが追加され、メニューをクリックするとHello Worldが表示されます。

テンプレートの利用

Tracの通常のプラグインは、テンプレートを利用して画面をレンダリングしています。テンプレートを利用するには、次のようにします。

  1. import re
  2. from genshi.builder import tag
  3. from trac.core import *
  4. from trac.web import IRequestHandler
  5. from trac.web.chrome import INavigationContributor, ITemplateProvider
  6. class HelloWorldPlugin(Component):
  7. implements(INavigationContributor, IRequestHandler, ITemplateProvider)
  8. # INavigationContributor methods
  9. def get_active_navigation_item(self, req):
  10. return 'helloworld'
  11. def get_navigation_items(self, req):
  12. yield ('mainnav', 'helloworld',
  13. tag.a('Hello World', href=req.href.helloworld()))
  14. # IRequestHandler methods
  15. def match_request(self, req):
  16. return re.match(r'/helloworld(?:_trac)?(?:/.*)?$', req.path_info)
  17. def process_request(self, req):
  18. data = {}
  19. # テンプレート名、データ、コンテンツタイプを返却
  20. return 'hello.html', data, None
  21. # ITemplateProvider methods
  22. # テンプレートのあるディレクトリを指定
  23. def get_templates_dirs(self):
  24. from pkg_resources import resource_filename
  25. return [resource_filename(__name__, 'templates')]
下記のようにsetup.pyを書き換えます。
  1. from setuptools import find_packages, setup
  2. setup(
  3. name='Trachelloworld', version='1.1',
  4. packages=find_packages(exclude=['*.tests*']),
  5. entry_points = """
  6. [trac.plugins]
  7. helloworld = helloworld
  8. """,
  9. package_data={'helloworld': ['templates/*.html']},
  10. )