Понадобилось мне выделять заданные слова или части слов в тексте. Решил поискать готовые решения на ActionScript-е и нашёл несколько таковых. Заинтересовала библиотека классов AS3 TextHighlighter от Martin R?dlinger. Решение довольно необычное, но работающее - проверено. Впрочем, лучше его разобрать на примере (код прокомментирован).
Код ActionScript 3.0:
/*
импорт классов
*/
import com.formatlos.as3.lib.text.highlight.*;
import com.formatlos.as3.lib.text.highlight.style.*;
/*
спрайт-контейнер, внутри которого будет размещаться текст
*/
var cont:Sprite = new Sprite();
addChild(cont);
/*
текстовое поле
*/
var tf:TextField = new TextField();
tf.width = 400;
tf.height = 300;
tf.multiline = true;
tf.wordWrap = true;
tf.text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
/*
помещаем текстовое поле внутрь спрайта-контейнера, а также задаём координаты для спрайта-контейнера
*/
cont.addChild(tf);
cont.x = 50;
cont.y = 50;
/*
устанавливаем стиль выделения для искомого текста
здесь:
- 0xff0000 - цвет выделения
- 0.5 - прозрачность выделения
*/
var style:IHighlightStyle = new SimpleHighlightStyle(0xff0000, 0.5);
/*
выделяем искомый текст
*/
var textHighlighter:TextHighlighter = new TextHighlighter(tf, cont, style);
textHighlighter.highlight(/elit/gi);
textHighlighter.highlight("dolor", false);
Результат следующий:
Как видите, искать можно не только по слову, но и по регулярному выражению. Но тут есть одно "НО": сперва надо вызывается метод highlight() с поиском по регулярному выражению, а только потом можно искать по словам. Если порядок нарушить, то поиск работает некорректно. Кроме этого, данный поиск не подходит для скроллируемых текстовых полей (и это естественно, так как подсветка рисуется в спрайте-контейнере и не скроллируется вместе с текстовым полем).
Конечно, возникает два вопроса:
- Работает ли этот движок с русским текстом?
- Способен ли движок обрабатывать большие тексты?
Да, с русским текстом работает. Что до размера обрабатываемого текста, то, конечно, не берусь утверждать, что "Война и мир" Толстого не повесят flash-плеер. Но рассказ Чехова обрабатывается без каких-либо заметных тормозов. Смотрите сами:
Скачать исходник к данному уроку и саму библиотеку TextHighlighter можно здесь (под Adobe Flash 5.5).