Adobe TLF с Flex/AS3: как программно изменить \n в текстовой строке на теги абзаца и вставить в TextFlow?

Мое веб-приложение Flex/AS3 обращается к базе данных и получает текст, содержащий \ n для символа новой строки. В противном случае текст выглядит как обычный текст.

Есть ли способ конвертировать \ n в теги абзаца, которые я могу вставить в искровой TextFlow?

Например, мой единственный опыт работы с TLF - написание mxml-кода, например:

<s:RichEditableText width="100%" height="100%"
                    textAlign="left" paddingTop="0"
                    paragraphSpaceAfter="0.3"
                    editable="false">
<s:textFlow>
  <s:TextFlow>
    <s:p fontWeight="bold" fontSize="15">My Title Text</s:p>
    <s:p fontSize="2"/>
    <s:p>{paragraph1_text}</s:p>
    <s:p>{paragraph2_text}</s:p>
    <s:p>{paragraph3_text}</s:p>
    <s:p fontSize="2"/>
  </s:TextFlow>
</s:textFlow>
</s:RichEditableText>

Предположим, я извлекаю строку из базы данных, например:

paragraph1_text = "This is some text.\nThis is some more text.\nThis is even more text."

Даже если вставить этот код в код выше, он распознает символ новой строки, но не распознает paragraphSpaceAfter="0.3", Моя цель - получить эффект:

<s:RichEditableText width="100%" height="100%"
                    textAlign="left" paddingTop="0"
                    paragraphSpaceAfter="0.3"
                    editable="false">
<s:textFlow>
  <s:TextFlow>
    <s:p fontWeight="bold" fontSize="15">My Title Text</s:p>
    <s:p fontSize="2"/>
    <s:p>This is some text.</s:p>
    <s:p>This is some more text.</s:p>
    <s:p>This is even more text.</s:p>
    <s:p>{paragraph2_text}</s:p>
    <s:p>{paragraph3_text}</s:p>
  <s:p fontSize="2"/>
</s:TextFlow>

Есть ли способ достичь чего-то подобного программно (текст базы данных может быть чем угодно)?

Я попытался изменить параграф1_текст на:

paragraph1_text="<s:p>This is some text.</s:p><s:p>This is some more text.</s:p><s:p>This is even more text.</s:p>"

а затем с помощью этого в первом блоке кода выше, но он просто распечатал все <s:p> а также </s:p> теги.

Любой совет приветствуется.

1 ответ

Решение

Вы можете достичь этого с помощью ActionScript. Допустим, вы называете свой TextFlow как

<s:TextFlow id="myFlow">

Ваш блок кода ActionScript может выглядеть следующим образом:

import flashx.textLayout.elements.*;

public function insertParagraph( textFlow:TextFlow, text:String, locationIndex:uint ):void
{
    var paragraphs:Vector.<ParagraphElement> = getParagraphElements( text );
    for ( var i:uint = 0; i < paragraphs.length; i++ )
    {
        textFlow.addChildAt( paragraphs[i], locationIndex + i );
    }
}

public function getParagraphElements( text:String ):Vector.<ParagraphElement>
{
    var textParagraphs:Array = text.split("\n");
    var result:Vector.<ParagraphElement> = new Vector.<ParagraphElement>();
    for ( var i:uint = 0; i < textParagraphs.length; i++ )
    {
        var p:ParagraphElement = new ParagraphElement();
        var span:SpanElement = new SpanElement();
        span.text = textParagraphs[i];
        p.addChild(span);
        result.push(p);
    }

    return result;
}

В вашем случае, так как вы хотите добавить абзацы, начинающиеся как 3-й элемент, после получения текста вы можете вызвать insertParagaph( myFlow, text, 2);

Другие вопросы по тегам