0

TLF にリンクを挿入しようとしています。通常、単に使用するだけです

var linkElement:LinkElement = textArea.textFlow.interactionManager.applyLink( ... );

問題は、異なるフォーマットのテキスト (ボールド、イタリックなど) にまたがるリンクを作成したり、パラグラフやリスト項目をまたいでリンクを作成したりすると、リンクが完全に完全にクラッシュして燃え尽きてしまうことです。リンクのフォーマットは完全に失われ、リスト構造は崩壊します。

選択したテキスト内のフォーマットと構造の両方を保持する場合は、 addChild() を介して LinkElement を追加するだけでは機能しません。

選択範囲の textFlow を、interactionManager.cutTextScrap(...) でリッピングし、interactionManager.applyLink( ... ) で LinkElement にラップしてから、"貼り付け" て戻します... また、混乱が生じます。

そのため、独自のリンク挿入ルーチンを作成する必要があります。

私がやろうと決心したのは:

1) textflow タグを文字列に変換します

2) テキストフロー文字列内の選択範囲の開始インデックスと終了インデックスを見つける

3) 開始インデックスに次の文字列を挿入します。

</span><a href="[hrefVar]" target="[targetVar]"><span>

4) 最後のインデックスに次の文字列を挿入します。

</span></a><span>

5) textflow 文字列を TextArea の textflow オブジェクトに再変換する

そして出来上がり!インスタントRTFリンク!

唯一の問題は...結果が複数のタグに分散する可能性があるXMLマークアップ内の文字列一致の開始インデックスと終了インデックスを見つけることができる正規表現解析式を作成する方法がわかりません。

たとえば、TextFlow が (省略形) の場合:

<TextFlow><p><span>Lorem Ip</span><span fontWeight="bold">sum do</span><span>
lor sit am</span><span fontStyle="italic">et, consectetur adipiscing elit.
</span></p></TextFlow>

たとえば、ユーザーが「Ipsum dolor sit amet」を選択してリンクに変換したとします。その RTF マークアップ内で「Ipsum dolor sit amet」の最初と最後のインデックスを検索し、上記の 3) と 4) で示した文字列を挿入して、最終結果が次のようになるようにする必要があります。

<TextFlow><p><span>Lorem </span><a href="http://www.google.ca" target="_blank">
<span>Ip</span><span fontWeight="bold">sum do</span><span>lor sit am</span>
<span fontStyle="italic">et</span></a><span>, consectetur adipiscing elit.
</span></p></TextFlow>

スタイルの書式設定が失われる可能性がありますが、後でテキストフローの書式設定を解析することで修正できます。

必要なのは、ステップ 2) を実行するための正規表現です。

タグを無視してタグ間のテキストを削除する正規表現と、削除されたテキストフローテキストで選択したテキストの文字列一致を見つける方法を知っています...しかし、元の(ストリップされていない)テキストフロー文字列内で一致インデックスを見つける方法はわかりません.

誰?

4

1 に答える 1

0

私見のより良い方法は、正規表現を使用するのではなく、文字列を通過することです。これは簡単な汚い方法のアイデアです。このコードは改善する必要がありますが、とにかく指示を与える可能性があります。そのため、主な目標はタグを「破棄」してテキストを一致させることかもしれませんが、プロセス内で渡される多くの文字を数えます。

//This code might need revision for not to get < and > symbols as fake tags starting and finishing points, also reseting searchwhen text not completly done. 

var sourceStr:String = '<TextFlow><p><span>Lorem Ip</span><span fontWeight="bold">sum do</span><span>lor sit am</span><span fontStyle="italic">et, consectetur adipiscing elit.</span></p></TextFlow>';
var searchStr:String = "Lorem Ipsum d";
var indexes:Object = firstLast(sourceStr, searchStr);

trace(indexes.startIndex,indexes.finishIndex);


function firstLast(sourceStr:String, searchStr:String):Object 
{
    var indexCounter:int = -1;

    var searchFlag:Boolean = true;
    var searchPos:int = 0;

    var searchChar:String;
    var sourceChar:String;

    var startIndex:int;
    var finishIndex:int;

    for (var i:int = 0; i < sourceStr.length; i++ )
    {
        indexCounter++;


        sourceChar = sourceStr.substr(i, 1);
        if (sourceChar == "<")
        {
            searchFlag = false;

        } 
        else if (sourceChar == ">")
        {
            searchFlag = true;
        }

        if (!searchFlag) 
        {
            continue;
        }

        searchChar = searchStr.substr(searchPos, 1);    
        if (sourceChar == searchChar)
        {
            if (searchPos == 0)
            {
                startIndex = indexCounter;
            }
            if (searchPos == searchStr.length - 1)
            {
                finishIndex = indexCounter;
            }
            searchPos++;
        }


    }

    return { startIndex:startIndex, finishIndex:finishIndex };

}
于 2014-04-13T21:59:46.590 に答える