Flex TLF - возможность создавать ссылки, используя регулярные выражения? - PullRequest
0 голосов
/ 31 декабря 2010

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

Например:

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

С уважением,

Marty

1 Ответ

0 голосов
/ 04 января 2011

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

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

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

Джастин

...