Develop and Download Open Source Software

Recent Changes

2012-04-06
2012-02-23
2011-12-09
2011-11-12
2011-08-07

Wiki Guide

Side Bar

プラグインの作り方

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

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

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

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

テンプレートの利用

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

import re

from genshi.builder import tag

from trac.core import *
from trac.web import IRequestHandler
from trac.web.chrome import INavigationContributor, ITemplateProvider

class HelloWorldPlugin(Component):
    implements(INavigationContributor, IRequestHandler, ITemplateProvider)

    # INavigationContributor methods
    def get_active_navigation_item(self, req):
        return 'helloworld'

    def get_navigation_items(self, req):
        yield ('mainnav', 'helloworld',
               tag.a('Hello World', href=req.href.helloworld()))

    # IRequestHandler methods
    def match_request(self, req):
        return re.match(r'/helloworld(?:_trac)?(?:/.*)?$', req.path_info)

    def process_request(self, req):
        data = {}        
        # テンプレート名、データ、コンテンツタイプを返却
        return 'hello.html', data, None

    # ITemplateProvider methods
    # テンプレートのあるディレクトリを指定
    def get_templates_dirs(self):
        from pkg_resources import resource_filename
        return [resource_filename(__name__, 'templates')]
下記のようにsetup.pyを書き換えます。
from setuptools import find_packages, setup

setup(
    name='Trachelloworld', version='1.1',
    packages=find_packages(exclude=['*.tests*']),
    entry_points = """
        [trac.plugins]
        helloworld = helloworld
    """,
    package_data={'helloworld': ['templates/*.html']},
)


SourceForge.JP is a Japanese version of SourceForge.net. For developments that are not related to Japan, we recommend you to use SourceForge.net.