プラグインの作り方を紹介します。
+ helloplugin/
+ helloworld/
+ __init__.py
+ helloworld.py
+ setup.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!')
from helloworld import *
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']},
)