TextFieldでHTML

復習から

 結局TextFieldをまとめたページを作った。
 それでも、まだ良く判ってないので、もうちょっと色々とやってみる。

 学習と訓練がてら、TextFieldのプロパティをプロパティインスペクタと対応づけたムービーを作ってみた。
 プロパティをクリックすると、対応するヘルプページへ飛ぶ。Abobeもこのくらい作ってくれよー。いきなりプロパティ一覧出されたって良くわかんねーんだよー。Flashの正しい使い方の一つはクリッカブルマップだと思うんだよー。本家なんだから活用してくれよー。
 といった訳で、特にこれと言ったポリシーがある訳ではないが、今回からもう<embed>タグを使わずに<object>のみで行くことにした。…前もそう言った気もするが、そこはそれ。

 静止テキストというやつは、TextFieldではなくて別のクラス。ActionScriptでは生成できなくて、オーサリング環境で置いていくしかない。
 しかもActionScriptから利用するにはTextSnapshotとかいうクラスを使わなきゃいけないらしい。
 うわもーホセ・メンドクサー!!

 Σc ' _' )  < 寒いぜ

 うっせー、StaticTextはActionScriptからは使わないことに決めた。

HTMLを取り出してみる

 TextFieldにはtextプロパティとhtmlTextがあるが、実のところ同じものを設定している。
 htmlTextを経由して設定すると、HTMLタグがパースされる。
 textで設定したものに、setTextFromat()を使ってスタイルを設定して、htmlTextで取り出したら、タグがついたものが取り出されるし、textで取り出したらタグが外れてる。
 実際どんなものか試してみた。

 まずオーサリングでボールドとイタリックの色違いの文字を作って、スクリプトのhtmlTextで取り出してみた。

<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="ヒラギノ角ゴ Pro W3" SIZE="12" COLOR="#0000FF" LETTERSPACING="0" KERNING="0"><B>ボールド</B><FONT COLOR="#FF0000"><I>イタリック</I><FONT COLOR="#0000FF"></FONT></FONT></FONT></P></TEXTFORMAT>

 大文字いやぁぁぁぁ!!
 それはともかく、なにこのTEXTFORMATとかいう独自拡張な雰囲気丸出しのタグは。LEADINGとかも謎な属性(Attribute)だなぁ。
 TextField.htmlTextのリファレンスを見ると、小文字で書いてるやんふざけんなよ。設定で変えられるんか??
 TEXTFORMATはTextFormatクラスのタグ版みたいなもんらしい。…style属性で良くね?なんでこんな変な拡張するの?Adobeさんはバカなの??
 そして<FONT COLOR="#0000FF"></FONT>って無駄タグはなに??

 だいたい、アンダーラインがオーサリング環境で設定できないとか、どういう嫌がらせだ?MXからCS3になるまでナニやってた(答:何もやってません)
 バレット(liのような箇条書きの頭につく)もオーサリングでは使えないけど、逆になんでこれを使えるタグに入れたのかが謎だ。使いどころが分からない。

 ちなみに、TextFieldの中でフォントスタイルを色々と変えるには[<>]って感じのボタンをONにしておく必要がある、てゆーかこのボタン全部常にONでまったく一片も困らない。

HTMLを設定してみる

 次に、スクリプトでhtmlTextを設定し、htmlTextを取り出してみる。
 以下のスクリプトでだいたい上記と同じようなスクリプト(律儀に大文字にしてやがる)が取れる。流石に無駄FONTタグはない。編集の際に残ったり残らなかったりするようだ。
 これ前から思ってるんだけど、所謂ホームページ制作ソフトで頻発する症状なんだけど、なんで取れないのか謎だ。ちょっと内容が空になっているタグ探して削除するだけじゃないの?どんだけ手抜きなの?

_txt.htmlText = "<font color='#0000ff'><b>ボールド</b></font><font color='#ff0000'><i>イタリック</i></font>";

trace( _txt.htmlText);

 そうそうimgにはswfも指定できる。これは流石という感じだ。多分、一番楽なimgの読み込み方法だ。
 _txt.htmlText = "<img src='a.swf'>"でいいんだから楽なもんだ。
 他の部分も、このくらいのラクチンさが良いよ。

textFormatで設定してみる

 次に、textFormatでスタイル指定して、htmlTextを取り出してみる。

_txt.text = "ボールドイタリック";
var a_tf:TextFormat = new TextFormat();
a_tf.bold = true;
a_tf.color = 0x0000ff;
_txt.setTextFormat( a_tf, 0, 4 );

var b_tf:TextFormat = new TextFormat();
b_tf.italic = true;
b_tf.color = 0xff0000;
_txt.setTextFormat( b_tf, 4, 9 );

trace( _txt.htmlText);

 いやもー、とたんに面倒くさい。せめてコンストラクタにObject形式で渡せませんかね。new TextField( {color:0x0000ff, bold:true} )みたいに。まぁwithで括れば良いのか。
 前から思ってんだけど、常にラベル付きで変数は渡せるべきだよ。4つぐらいになると順番とか覚えきれないから!!人のコード見ても、何がなんだか分からないから。
 AppleScriptはできるよ、みんなAppleScriptやろうよJavaScriptとか考え方がいつまでたってもプログラマ思考なんだよ、お前みたいに記憶力良くないんだよオレらは!もっとコードヒントもStageに置いたものぐらい判別するようになって、コードスニペット(snippet:断片)も付けて使いやすく充実してくれよ「月面兎兵器ミーナもびっくりするぐらいに!!」

 $ σ_σ$  < なにそれ?
 Σc ' _' )  < オレは、大月ミーナ派。

 それをMacromediaはビヘイビア(注)とか良く判らん方向に奉仕精神発揮しおって。
 ナニあの使いにくさ満開のインタフェース。Macromediaは絶対「マウス操作=分かりやすい」以上の軸を持ってないね。そりゃ買収もされるわ。マウスでもキーボードでも分かりやすいもんは分かりやすいし、分かりにくいもんは分かりにくいの!!
 …えーとAdobeがそれ以外の軸を持っているかというと、かなり怪しいですが。

注: ビヘイビアはActionScript2.0で使える機能…いえActionScript2.0の使えない機能です。

 それにsetTextFormat()だけど。1番目から4番目の文字を指定するのに、0, 4 って指定するのって分かりにくくない?感覚的には一つ多く指定してるように思えるけど。

スタイルシートをパースして設定してみる

 なんか、CSSで文字のスタイルを設定することもできるらしい。
 外部にCSSを置いといて、それをFlashの中のオブジェクトに適用したりもできるという話だ。
 ますます前のTEXTFORMATって意味ない。

 では、早速CSSで設定してみたいので、StyleSheetのリファレンスを読む。
 SthleSheetクラスを作って、TextFieldクラスのstyleSheetってプロパティに設定すればいいらしい。
 なんかHTML形式だけではなくXML形式のデータにもスタイルを付けられるらしい。

 まずは、CSSのテキストをパースしてくれるparseCSS()を使ってみる。

var _css:StyleSheet = new StyleSheet();
_css.parseCSS(
	".a {"
		+ "font-weight: bold;"
		+ "color: #0000ff;"
	+ "}"
	+ ".b {"
		+ "font-style: italic;"
		+ "color: #ff0000;"
	+ "}");
 _txt.styleSheet = _css;
 _txt.htmlText = "<span class='a'>ボールド</span><span class='b'>イタリック</span>"; 
 
trace( _txt.htmlText);

 試しにspanをc(適当)に変えてみたが、動かなかった。それにidもダメ。見ての通りclassはOK。p等のタグそのものに対してはOK。
 取れたHTMLは設定したものそのまま。あと、htmlTextよりstyleSheetプロパティを先に設定しておかないと、htmlTextにCSS設定が反映されない。

setStyle()で設定してみる

 次はsetStyle()を使ってみる。
 注意するのは、属性名に-が入っているものはキャメル式に書き換える必要があること。以下の例でいけばfont-weightとfont-styleがそれにあたる。
 あと、値は文字列になるのでちゃんとクオートしておく。

var _css:StyleSheet = new StyleSheet();
_css.setStyle( ".a", { fontWeight: "bold", color: "#0000ff" } );
_css.setStyle( ".b", { fontStyle: "italic", color: "#ff0000" } );
_txt.styleSheet = _css;
_txt.htmlText = "<span class='a'>ボールド</span><span class='b'>イタリック</span>"; 
 
trace( _txt.htmlText);

 外部からテキストを読み込んだりしない限りは、こっちの方が楽かな。なんでTextFormatではこの手法使えないの?というかもう少し統一感のある仕様にしましょうよ。
 parseCSS()でも、ステージの外にCSSデータ用のTextFieldを置いておくという、個人的に好きな手法を使っても良いけど。
 んで_css.parseCSS( css_txt.text );てな感じで設定。読み込み処理とかいらんから楽。

 全然先に進まないなぁしかし。
 [<>]の意味とか、かなりつまらないところで躓いている。落とし穴バリバリ掘ってんのはAdobeさんだ。やる気あるんかこら。
 にしても思うんだが、TextFormatとStyleSheetと二種類用意したりすんなよなー。イベントの設定法が複数あって混乱したから統一したんだろー、新しい機能も統一感大事にしようぜー。
 これは多分、ActionScript4.0でどっちか廃止されるね、予言しておく。私はTextFormatが廃止されると思うので、極力StyleSheetを使っていくことにする。

 今日はここまで。


2008-04-07