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);