ひよっこ。

I want to…

FlashViewプラグインに引数を追加してみた

Posted by hikaruworld : 2009 9月 28

tracでFlashを表示するためのプラグインとしてFlashViewPluginというプラグインがあります。
これは大変便利なのですが、引数として、対象となるswfファイル、幅、高さしか渡せないため、
FlashVarsで引数やquorityを設定できないのでちょっと困るときがあります。ありますよね?

というわけで、このマクロを少し拡張してみました。
やりたいことは以下のとおりです。

  • FlashVarsを渡したい
  • quorityを指定したい(デフォルトはlow)

できるだけ、元ソースに編集を加えない方向で修正してみました。
修正結果のdiffを張っておきます。

diffを適用すれば以下のような感じで利用できるようになります。

[[FlashView(hoge.swf, 400,300,vars="hoge=piyo", quality=hight)]]
変数 内容 補足
第1引数 対象のswfファイル 必須
第2引数 必須?
第3引数 高さ 必須?
keyがvars FlashVarsに渡される引数(ペア値を渡す場合は括弧でくくること) 任意
keyがquality 解像度。デフォルトはlow 任意
*** flashview.py.r2457	2009-09-28 14:27:54.000000000 +0900
--- flashview.py	2009-09-28 14:30:04.000000000 +0900
***************
*** 5,11 ****
  from cgi import escape as escapeHTML
  import os
  from trac.core import *
! from trac.wiki.api import IWikiMacroProvider

  def swfsize(f):
	  magic, version, datasz = unpack("<3s1B1L", f.read(8))
--- 5,11 ----
  from cgi import escape as escapeHTML
  import os
  from trac.core import *
! from trac.wiki.api import IWikiMacroProvider, parse_args

  def swfsize(f):
	  magic, version, datasz = unpack("<3s1B1L", f.read(8))
***************
*** 63,69 ****
		  # args will be null if the macro is called without parenthesis.
		  if not content:
			  return ''
!         args = content.split(',')
		  filespec = args[0]

		  # parse filespec argument to get module and id if contained.
--- 63,70 ----
		  # args will be null if the macro is called without parenthesis.
		  if not content:
			  return ''
!         args, kw = parse_args(content);
!         #args = content.split(',')
		  filespec = args[0]

		  # parse filespec argument to get module and id if contained.
***************
*** 142,151 ****
				  width = args[1]
				  height = args[2]

		  vars = {
			  'width': width,
			  'height': height,
!             'raw_url': raw_url
			  }

		  return """
--- 143,165 ----
				  width = args[1]
				  height = args[2]

+         # Custom Options..
+         if "vars" in kw:
+             vars_val = kw['vars'].strip("\"")
+         else:
+             vars_val = ''
+         if 'quality' in kw:
+             qlt = kw['quality'].strip("\"")
+         else:
+             # default parameter
+             qlt = "low"
+ 
		  vars = {
			  'width': width,
			  'height': height,
!             'raw_url': raw_url,
!             'vars_val': vars_val,
!             'qlt': qlt
			  }

		  return """
***************
*** 153,161 ****
		  codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"
		  width="%(width)s" height="%(height)s">
	<param name="movie" value="%(raw_url)s">
!   <param name="quality" value="low">
	<param name="play" value="true">
!   <embed src="%(raw_url)s" quality="low" width="%(width)s" height="%(height)s"
		   type="application/x-shockwave-flash"
		   pluginspage="http://www.macromedia.com/go/getflashplayer">
	</embed>
--- 167,176 ----
		  codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"
		  width="%(width)s" height="%(height)s">
	<param name="movie" value="%(raw_url)s">
!   <param name="quality" value="%(qlt)s">
	<param name="play" value="true">
!   <param name="FlashVars" value="%(vars_val)s" />
!   <embed src="%(raw_url)s" quality="%(qlt)s" width="%(width)s" height="%(height)s" FlashVars="%(vars_val)s"
		   type="application/x-shockwave-flash"
		   pluginspage="http://www.macromedia.com/go/getflashplayer">
	</embed>

面白かったのは、trac.wiki.api. parse_argsという関数がめちゃ便利でした。
この関数は、引数に渡されたマクロのパラメータを分解してくれるんですが、
例えば[[Hoge(http://hoge/, 400, piyo=hogepiyo)]]という値の場合

http://hoge/, 400, piyo=hogepiyo

という文字列が渡されてくるのですがparse_argsを使って以下のようにします。
[/sourcecode]
args, kw = parse_args(content);
[/sourceocde]
すると、argsには

list: [u’http://hoge/&#8217;, u’400′]

kwには

dict: {‘piyo’: u’hogepiyo’}

が渡されます。

つまり、argsにはキーを持たない値の一覧、kwにはキーと値のペアを辞書型で渡してくれるという優れものです。
これは面白いので、是非ソースを…と言いたいところですが
これはまた後日tracのソースを読みながら見てみたいと思います(使い方はhelp()で)。

ということをやった後に実は既に対応されている方がいました(SWFObjectの対応に併せて、Flashvarsも渡せるようにしてくれています)。

何が悲しいかといえば、既に自分のプロジェクトでもパッチを適用していたことに後で気がついたことです。
amlineというグラフチャートを利用していたので、SwfObjectも設定されているし。
悲しい…

まぁ、SWFObjectをいちいちヘッダーに埋め込みたくないようなかたがいれば使ってください。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。