テキストを TextFlow にインポート/変換する場合、要素を生成する RegEx ベースのパーサーを定義する方法はありますか?
例えば:
- メールアドレスが一致するたびに LinkElement を作成したいと考えています。
- スマイリー :) が一致するたびに InlineGraphicElement を作成したい
よろしく、
マーティ
テキストを TextFlow にインポート/変換する場合、要素を生成する RegEx ベースのパーサーを定義する方法はありますか?
例えば:
よろしく、
マーティ
私が知っている最も簡単な方法は、テキストを取得し、一連の正規表現を使用して HTML を埋め込むことです。次に、HTML から TextFlow を作成し、RichEditableText (または使用しているコンポーネント) に割り当てます。何かのようなもの:
var emailRE:RegExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
var smileyRE:RegExp = /:\)/g;
var sample:String = "Email john@doe.com with smiley :) example.";
var result:String = '';
while (emailRE.test(sample)) {
result = sample.replace(emailRE, "<a href='event:emailClicked'><font color='0x0000DD'>$&</font></a>");
}
if (result.length > 0) {
sample = result;
}
var result2:String = '';
while (smileyRE.test(sample)) {
result2 = sample.replace(smileyRE, "<img src='smiley.png'/>");
}
if (result2.length > 0) {
sample = result2;
}
richEditableTextComponent.textFlow = TextConverter.importToFlow(sample, TextConverter.TEXT_FIELD_HTML_FORMAT);
richEditableTextComponent.textFlow.addEventListener("emailClicked", emailClickedHandler, false, 0, true);
次に、クリック ハンドラーは次のようになります。
private function emailClickedHandler(event:FlowElementMouseEvent):void {
var emailAddress:String = LinkElement(event.flowElement).getFirstLeaf().text;
// do something with emailAddress
}
電子メール/スマイリーの文字列を解析し、SpanElement、LinkElement、および InlineGraphicElement を構築することにより、文字列に基づいて TextFlow を手動で構築することもできますが、これはプログラマーにとってはるかに面倒ですが、私はその必要性を見てきました (特に RichEditableText の場合)また、スマイリーが一致してグラフィックスに置き換えられるかどうかを確認するために、ユーザーがキーを入力するたびに各 SpanElement を解析する必要があります; ここで HTML を使用しても役に立ちません。単一の SpanElement が一連の SpanElement - InlineGraphicElement - SpanElement に分割されるなど、更新する必要があるものだけを更新するのではなく、フロー全体を更新します)。
お役に立てれば!
ジャスティン