Flex TLF — возможность создавать ссылки с использованием регулярных выражений?

При импорте/преобразовании текста в TextFlow есть ли способ определить парсеры на основе RegEx, которые генерируют элементы?

Например:

  • Я хочу создать LinkElement всякий раз, когда адрес электронной почты совпадает.
  • Я хочу создать InlineGraphicElement всякий раз, когда сопоставляется смайлик :)

С уважением,

Марти


person Marty Pitt    schedule 31.12.2010    source источник


Ответы (1)


Самый простой способ, который я знаю, - это взять текст и использовать последовательность регулярных выражений для встраивания HTML. Затем создайте TextFlow из HTML и назначьте его 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 [email protected] 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
}

Вы также можете вручную создать TextFlow на основе строки, проанализировав строку для электронных писем/смайлов и создав SpanElement, LinkElement и InlineGraphicElement, хотя это гораздо более громоздко для программиста, однако я видел в этом потребность (особенно с RichEditableText и необходимость анализировать каждый SpanElement, когда пользователь набирает ключ, чтобы увидеть, совпадают ли смайлики и заменяются ли они графикой; использование HTML здесь не поможет, потому что вы не захотите переназначать весь объект TextFlow, поскольку это вызовет полную перерисовку весь поток вместо того, чтобы обновлять только то, что должно быть обновлено, например, один SpanElement разбивается на последовательность SpanElement — InlineGraphicElement — SpanElement).

Надеюсь это поможет!

Джастин

person Justin N    schedule 04.01.2011