Silverlightコンテンツを埋め込むTracマクロ

TracにはWiki用のマクロをPythonで記述して簡単に組み込むための機構が用意されている。これを利用するとTracに大抵の機能は追加することができる。

そこで、今回はSilverlightコンテンツを埋め込むマクロを作ってみた。

Download Silverlight.py

# -*- coding: UTF-8 -*-
"""
Silverlightコンテンツを埋め込みます。

Silverlightコンテンツはプロジェクト毎の「htdocs」ディレクトリに「ClientBin」というディレクトリ
を作り、その下に配置する必要があります。

ex.
[[Silverlight(src=Hoge.xap)]]

[[Silverlight(src=Hoge.xap, width=200, height=200)]]
"""
from StringIO import StringIO

def execute(hdf, txt, env):
  args = {}
  for arg in txt.split(','):
      val = arg.split('=')
      args[val[0].strip()] = val[1]

  xap_width, xap_height = 100, 100
  xap_src = env.abs_href.chrome('site', 'ClientBin', args['src'])

  if args.has_key('width'): xap_width = args['width']
  if args.has_key('height'): xap_height = args['height']

  buf = StringIO()
  buf.write(
  '<object data="data:application/x-silverlight," type="application/x-silverlight-2-b1" width="%(xap_width)s" height="%(xap_height)s">' \
  '<param name="source" value="%(xap_src)s" />' \
  '<param name="background" value="white" />' \
  '<a href="http://go.microsoft.com/fwlink/?LinkID=108182" style="text-decoration: none;">' \
  '<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>' \
  '</a>' \
  '</object>' % vars()
  )
  return buf.getvalue()

このPythonファイルをTracのプロジェクト毎に用意されている「wiki-macros」ディレクトリに置くと使うことができる。

使い方

Silverlight」という名前のマクロを宣言すると使える。引数として「src=ファイル名」を渡す必要がある。
ここでは「Hello.xap」*1というファイル名のSilverlightコンテンツを埋めこんでいる。

[[Silverlight(src=Hello.xap)]]

このマクロで表示するSilverlightコンテンツはTracのプロジェクト毎に用意されている「htdocs」ディレクトリに「ClientBin」というディレクトリを作って、その下に配置しておく必要がある。

このWiki ページのスクリーンショット

これを使うと結構お手軽にSilverlightコンテンツをTracに埋め込めると思う。
Tracに埋め込まれて実行されるということはSilverlightからTracへのアクセスはクロスドメインアクセスにならないので、直接XML-RPCを使ってTracの情報を取り出せるというのもおいしい。

これでTracにリッチなUIを持ったマクロを作ってみよう。

*1:Helloと表示するだけのSilverlightコンテンツ