Flashエクスポートの技術的探求 その2

SWFテンプレートファイル

ところで、CorelDRAWはどのようにして、SWFファイルを埋め込んだHTMLを生成しているのでしょう? その秘密は、コマンド実行後に(2番目に)表示される「Flashのエクスポート」ダイアログで、見つけることができます。

同ダイアログの「HTML」タブをクリックしてパネルを切り替えると、そこには「Flash HTMLのテンプレート」というリストボックスがあります。

「Flash HTMLのテンプレート」リストボックス

そして、デフォルトでは「SWFDefaultTemplate.htm」ファイルが指定され、以下のフォルダに収納されています(註2)。

  • C:\Program Files\Corel\CorelDRAW Graphics Suite 13\Languages\JP\Custom Data\

テンプレートの解析

では、この「SWFDefaultTemplate.htm」ファイルの中身はどうなっているのでしょう?

SWFDefaultTemplate.htmのソースコード

$TTFlash Only (Default)
$DS
Flashの表示にOBJECTとEMBEDタグの両方を使用する。
$DF
<HTML>
<HEAD>
<TITLE>$TI</TITLE>
</HEAD>
<BODY bgcolor="$BG">
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0" ID=$TI WIDTH=$WI HEIGHT=$HE>
$PO
<EMBED $PE WIDTH=$WI HEIGHT=$HE TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">
</EMBED>
</OBJECT>

</BODY>
</HTML>
					

このように、基本的にはHTMLのタグが記入されていますが、ところどころ、怪しい記号があります。そう、$マークと英字の組み合わせによる暗号です。これらは、次の内容を代入する記号なのです。

  • $TI: ファイル名(拡張子なし)
  • $BG: 背景色
  • $WI: イメージサイズの幅
  • $HE: イメージサイズの高さ
  • $PO: objectタグ用のパラメータ
  • $PE: embedタグ用のパラメータ
  • $TT: テンプレート用タイトル
  • $DS$DF: テンプレート用のコメント範囲

つまり、「Flashのエクスポート」ダイアログで設定した内容を、CorelDRAWがこれらの記号部分に書き込み、HTMLファイルを仕上げているのです。

ダイアログの設定内容

しかも、これは「テンプレート」ですから、別のテンプレートに差し替えて実行させることもできます。ということは、うまく代入記号を当てはめていけば、スクリプトも記述させることが可能ではないか、という発想に辿り着きます。

テンプレートのカスタマイズ

そこで、ソースコードを組み替えてみたものが、以下のテンプレート「cdr_flash.htm」ファイルです。

スクリプト用テンプレート(cdr_flash.htm)のソースコード

$TTFlash Only (Default)
$DS
FlashをJavaScriptで記述する(DOM対応ブラウザ専用)
divタグの中に配置
$DF
<html>
<head>
<title>$TI</title>
<style type="text/css">
body {background-color: $BG; }
</style>
<script type="text/javascript"> //←このタグは削除する
//↓ここから切り取る
function loadSwf$TI() {
	var tag1 ='<object ';
	var cId = 'classid="clsid:D27CDB6E-AE6D-11CF-96B8-444553540000"';
	var cBase = 'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"';
	var ti = 'id="$TI"'; 
	//parameter for ID
	var wi = 'width="$WI"'; 
	//parameter for weight
	var he = 'height="$HE"'; 
	//parameter for height
	var odt = 'data="$TI.swf"'; 
	//parameter for data in object tag
	var tag2 = '>';
	var po = '$PO'; 
	//parameter for object tag
	var tag3 = '<embed '
	var pe = '$PE';
	//parameter for embed tag
	var tp = 'type="application/x-shockwave-flash"';
	var pgn = 'pluginspage="http://www.macromedia.com/go/getflashplayer"';
	var tag4 = '</embed>';
	var tag5 = '</object>';
	document.getElementById("loadSwf$TI").innerHTML = tag1 + cId + cBase + ti + wi + he + tag2 + po + tag3 + pe + wi + he + tp + pgn + tag4 + tag5
}
//↑ここまで切り取る
//このタグは削除する→ </script>
<script type="text/javascript" src="$TI.js"></script>
</head>
<body onLoad="loadSwf$TI();">

<div id="loadSwf$TI"></div>

</body>
</html>
					

DOMによる構成

基本的な構造としては、

  1. divタグでボックスを用意しておく
  2. そこに「loadSwfファイル名」という名前をid属性で付ける
  3. このidを「getElementById」メソッドで見つけ出す
  4. そのidが付いた要素(divのボックス)の中に「innerHTML」プロパティでFlashHTMLソースを書き込む

という方法を取っています。これは、DOMDocument Object Model)という仕様に則ったJavaScriptで、Internet Explorer 6以降やFireFoxであれば、問題なく動作します(註3)。

ここでは、先に解説した「document.write」メソッドは、使っていません。その代わりに、DOMgetElementByIdメソッドとinnerHTMLプロパティを利用しています。それは、私がCSSによるWebページデザインに慣れ親しんでいるので、DOMの構造の方が論理的で判り易かったことが理由です。

変数による整理

肝心のFlashソースコード部分は、定義した変数(水色部分)で必要な文字列とCorelDRAWの記号を組み合わせて代入し、innerHTMLプロパティの値で結合しています。例えば、

width="760"

という属性を書き込むために「wi」という変数を定義し、次のようにテンプレートに記述しておきます。

var wi = 'width="$WI"'

水色=変数、緑色=必要な文字列、赤色=CorelDRAWによる記号

これで、1行内にソースコードを羅列するよりも、構造的に整理されるでしょう。

イベントハンドラによる読み込み

そして、スクリプトには「loadSwfファイル名」(loadSwf$TI)という関数名を付け、bodyタグのonLoad属性(イベントハンドラ)で読み込ませることにより、スクリプトを実行します。


<body onLoad="loadSwf$TI();">
					

スクリプトが実行される(すなわち、Flash画像が読み込まれる)場所は、ID属性に「loadSwf$TI」を付けたdivボックス内です。


<div id="loadSwf$TI"></div>
					

ただし、CorelDRAWのテンプレートの構造上、スクリプトを直接外部ファイルに書き出すことはできません。そこで、HTML内のヘッダセクション(headタグ内)に、scriptタグで書き込むようにしています。


記事内のナビゲーション
記事中の各見出しは、クリックすると「目次」(Contents)に戻ることができます。「目次」の各項目は、クリックすると記事内の見出しに移動できます。
目次とそのリンクは、JavaScriptによって自動的に生成しているため、JavaScriptを無効にしている場合、機能しなくなります。

脚注
註2
このフォルダの場所は、CorelDRAW X3の場合です。12も「Languages」-「JP」以下の「Custom Data」フォルダに収納されています。11は「Corel Graphic 11」直下に「Custom Data」フォルダがあり、その中の「SWF Templates」フォルダに収納されています。10は、「Graphic10」フォルダ直下の「Custom」フォルダにある「SWF Templates」フォルダ内に収納されています。