Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.02.2018, 20:39
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 1  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Question Сбиваются индексы из-за иконок Emoji

Всем привет!

Вывожу текст в TextField с хэштегами и иконками. Иконки emoji конечно же не выводятся - они мне не нужны.
Задача: все хэштеги в тексте подсветить определенным цветом.

Код AS3:
var txt:TextField = new TextField();
txt.autoSize = TextFieldAutoSize.LEFT;
txt.text = "Любой текст с #хэштегами для #теста. Any text with #hashtags for the #test";
addChild(txt);
 
var fmt:TextFormat = new TextFormat();
fmt.color = 0x0033CC;
 
var arr:Array = getPosHashtags(txt.text);
for (var i in arr)
	txt.setTextFormat(fmt, arr[i][0], arr[i][1]);
 
function getPosHashtags(str:String):Array
{
	var arr:Array = [];
	var pattern:RegExp = /#[\S]*/g;
	var result:Object = pattern.exec(str);
 
	while (result != null)
	{
		arr.push([result.index, result.index + result[0].length]);
		result = pattern.exec(str);
	}
 
	return arr;
}
Проблема: если в тексте есть иконки emoji, то подсветка хэштегов съезжает...

Код AS3:
txt.text = "Любой текст с #хэштегами и котиками 🐈🐈 для #теста. Any text with #hashtags 😟 for the #test";
Как я догадываюсь, setTextFormat не учитывает скрытые символы в текстовом поле - из-за этого и происходит такой сдвиг...

В общем, решил я перед всем этим делом очищать текст от всех иконок...
Вот, например, хочу удалить из текста иконки с котом, которому соответствует unicode код u+1F408, но что-то никак не выходит...

Код AS3:
var str:String = "Тут иконки с котиками 🐈🐈 Попробуй-ка их удалить...";
trace("\t", s1); // с котами
 
var re:RegExp = new RegExp("([" + gen(0x1F408) + "])", "gi");
str = str.replace(re, "");
trace("\t", str); // ожидаю текст без котов, но увы..
 
function gen (obj:Object):String
{
	return String.fromCharCode(obj);
}
Плз, помогите советом
__________________
кто не отвечает, того garbage collector забирает

Старый 08.02.2018, 21:11
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
djken - понимаю не лучший вариант, но я бы сплитом удалил нафиг, хз как это скажется на оптимихации, но думаю не сильно убьет ваш чат.

Код AS3:
for(var i:int = 0; i < arrayCats.length; i++)  text.split(arrayCats[i]).join("");
__________________
Марк Tween

Старый 08.02.2018, 21:41
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 3  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
На PHP, например, для нахождения иконкок emoji справляется регулярка:

PHP код:
/[\x{1F000}-\x{1F6FF}]/gu 
Как подобное написать на actionscript? Пытался по-всякому, но так и не получилось..

Добавлено через 24 минуты
Интересно, почему, во Flash IDE в swf файле выводятся emoji ?
Код AS3:
var txt:TextField = new TextField();
txt.autoSize = TextFieldAutoSize.LEFT;
txt.text = "\u041e\u0442\u043c\u0435\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0430\ud83d\udc47\ud83d\ude02\n#hashtag";
addChild(txt);
Нажмите на изображение для увеличения
Название: 2b77540c87f2.png
Просмотров: 75
Размер:	68.7 Кб
ID:	33202

А во FlashBuilder только текст...
__________________
кто не отвечает, того garbage collector забирает


Последний раз редактировалось djken; 09.02.2018 в 03:12.
Старый 09.02.2018, 03:09
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 4  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Ура! Проблему решил!
Причина была вот в чем: многие иконки emoji состоят из суррогатных пар - например, \ud83d\ude0d. Это 2 символа. Но регулярка почему-то засчитывает эту комбинацию как один символ. В итоге все найденные индексы сдвинуты. Но если воспользоваться методом length у класса String, то длина текста выводится верно.
Код AS3:
trace(String("\ud83d\ude0d").length); // выведет 2
Отсюда пришел к выводу, что надо попробовать искать индексы хэштегов не через RegExp, а через методы String.
В итоге все хэштеги нахожу через RegExp и запоминаю в массив, а потом прохожусь по этому массиву и ищу эти найденные хэштеги в тексте с помощью indexOf, записывая индексы начала и конца хэштега.

Код AS3:
var txt:TextField = new TextField();
txt.x = txt.y = 15;
txt.autoSize = TextFieldAutoSize.LEFT;
addChild(txt);
 
txt.text = "#Dog \ud83d\ude0d #Test \ud83d\ude0e #Night Всякий текст с \n#хэштегами и смайликами";
var arr:Array = searchHashtag(txt.text);
 
var baseFormat:TextFormat = new TextFormat(new PartnerCondensedBold().fontName, 30, 0xFFFFFF);
txt.setTextFormat(baseFormat);
 
var tagColorize:TextFormat = new TextFormat(null, null, 0x66FE03);
for (var i:uint in arr)
	txt.setTextFormat(tagColorize, arr[i][0], arr[i][1]);
 
function searchHashtag(str:String):Array
{
	var arr:Array = new Array();
	var pattern:RegExp = /#[\S]+/g;
	arr = str.match(pattern);
 
	var res:Array = new Array();
	var index:uint = 0;
	var s1:uint;
	var s2:uint;
 
	for (var i:uint in arr)
	{
		s1 = str.indexOf(arr[i], index);
		s2 = s1 + arr[i].length;
		res.push([s1,s2]);
 
		index = s2;
	}
 
	return res;
}
И кстати, emoji тоже получилось отображать прямо в тексте - просто создал текстовое поле программно и они отобразились

Нажмите на изображение для увеличения
Название: Снимок экрана 2018-02-09 в 1.45.55.png
Просмотров: 75
Размер:	160.6 Кб
ID:	33203
__________________
кто не отвечает, того garbage collector забирает

Старый 09.02.2018, 03:21
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 5  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Прикольно, не знал, что штатный текстфилд без танцев с бубном умеет смайлы рисовать. А откуда растр берется? Ось предоставляет? Так только с системными шрифтами можно?

Старый 09.02.2018, 03:53
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 6  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
undefined, если ты про растр, который на фоне - тоже в скрипте прописан, просто не вывел в примере.

А смайлы и не надеялся выводить, т.к. знал что это трудоемко - но случайно заметил что программным текстфилдом отрисовались. При чем нормально позиционируются, выделяются вместе с текстом. Шрифт не системный - PartnerCondensed. С другими шрифтами тоже работает.
__________________
кто не отвечает, того garbage collector забирает

Старый 09.02.2018, 04:25
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 7  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
ссори.. проверил сейчас - с заранее созданными текстовыми полями на сцене тоже все работает )

Нажмите на изображение для увеличения
Название: Снимок экрана 2018-02-09 в 3.17.33.png
Просмотров: 68
Размер:	139.0 Кб
ID:	33204

Теперь понял почему до этого не выводились смайлы. Смайл можно записать в виде суррогатной пары \uxxxx\uxxxx , либо в общем виде \uxxxxx.
Например, иконку "fire / огонь" можно записать так \u1F525 либо суррогатами \udd25\ud83d. Вторым способом выведет, первым - нет. В этом не особо разбираюсь, но думаю связано с размером кодировки - не умеет работать с этим диапазоном наверно..

Кому интересно, тут находил формулы преобразования в суррогатные пары:
http://as3coder.blogspot.ru/2014/08/emoji.html
__________________
кто не отвечает, того garbage collector забирает

Старый 09.02.2018, 10:40
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 8  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
Сообщение от djken Посмотреть сообщение
undefined, если ты про растр, который на фоне - тоже в скрипте прописан, просто не вывел в примере.
Нет, я про растр для смайлов. Откуда он берется?

Старый 09.02.2018, 13:06
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Текст в обычном текстфилде, шрифт не внедренный, значит используется системный рендер. Видимо, ОС и подставляет. Не факт, что будет работать на других осях.
__________________
Reality.getBounds(this);

Старый 09.02.2018, 14:04
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 10  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Да, проверил на другой машине с Виндой - там вместо смайлов пустые квадраты
__________________
кто не отвечает, того garbage collector забирает

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:49.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
emoji , unicode , смайлики , хэштег , юникод
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:49.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.