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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 09.11.2006, 04:18
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 1  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
По умолчанию Парсер для иврита

В принципе можно тему и в "Для начинающих" было запостить. Вобщем, модератору виднее. =)

Значит, решил я сделать парсер для иврита. Сначала объясню, зачем он вообще нужен.
Дело в том, что если пытатьтся отрендерить ивритский текст с использованием шрифтов из библиотеки в програмно созданном текстовом поле, то возникает довольно неприятная ситуация: плеер "не понимает" в какую сторону нужно читать текст и отображает ивритские тексты задом на перед, но это еще пол беды... А вот когда нужно сделать так, чтобы в текстовом поле отображались одновременно иврит и английский - начинаются более серьезные неприятности. К сожалению, для ивритских шрифтов не предусмотрены "родные" знаки препинания, поэтому, как правило, никто не делает флешек с использованием не системных шрифтов, ну или просто пользуются посторонним софтом для того, чтобы конвертнуть текст "зеркально" и потом уже такой вставлять во флешку. К сожалению, второй вариант так же имеет недостатки. Т.как если у заказчика нет (как правило ее таки нет) програмы для переворачивания текста, то он не сможет самовольно ничего поменять на сайте.

Код ниже - практически работающее решение проблемы, увы, у него есть 2 серьезных недостатка.
1. Мне не удалось решить проблему с wordWrap, т.е. если этот параметр у поля выставлен в true, то строки начинают отображаться в обратном порядке.
2. На мой взгляд, код через чур громоздкий. И я бы был очень признателен за любые советы по оптимизации.
Код:
class HebrewConvertor {
	static function conv(_str:String):String {
		var tt_arr:Array = _str.split("\r\n");
		for (var ii = 0; ii<tt_arr.length; ii++) {
			var t_arr:Array = tt_arr[ii].split("");
			var h_arr:Array = [];
			var h_str:String = "";
			var j:Number = 0;
			for (var i = 0; i<t_arr.length; i++) {
				var tmp_arr:Array = [];
				if (t_arr[i].charCodeAt(0)>=1488) {
					for (j=i; j<t_arr.length && t_arr[j].charCodeAt(0)>=1488; j++) {
						tmp_arr.push(t_arr.splice(j, 1, "%"));
					}
					tmp_arr.reverse();
					h_arr.push(tmp_arr.join(""));
				}
			}
			h_arr.reverse();
			for (var i = 0; i<t_arr.length; i++) {
				if (t_arr[i] == "%") {
					for (j=i+1; j<t_arr.length && t_arr[j] == "%"; ) {
						t_arr.splice(j, 1);
					}
				}
			}
			t_arr = t_arr.join("").split("%");
			for (var i = 0; i<t_arr.length; i++) {
				for (j=0; j<t_arr[i].length; j++) {
					if (t_arr[i].charAt(j) == "-" || t_arr[i].charAt(j) == "\"" || t_arr[i].charAt(j) == ":" || t_arr[i].charAt(j) == ";" || t_arr[i].charAt(j) == "." || t_arr[i].charAt(j) == "," || t_arr[i].charAt(j) == " ") {
						var tmp_arr:Array = t_arr[i].split("");
						t_arr[i] = HebrewConvertor.en_sort(tmp_arr);
						break;
					}
				}
			}
			t_arr.reverse();
			var rt:String = "";
			for (var i = 0; i<t_arr.length; i++) {
				h_arr[i] != undefined ? rt += t_arr[i]+h_arr[i] : "";
			}
			tt_arr[ii] = rt;
		}
		return tt_arr.join("\r\n");
	}
	static function en_sort(_arr:Array):String {
		var end_arr:Array = [];
		var tmp_arr:Array = [];
		var tmp1_arr:Array = [];
		var tmp_str:String = "";
		var r_arr:Array = _arr;
		if (r_arr.length>1) {
			for (var i = 0; i<_arr.length; i++) {
				if (r_arr[i] == " " || r_arr[i] == ":" || r_arr[i] == ";" || r_arr[i] == "-" || r_arr[i] == "," || r_arr[i] == "." || r_arr[i] == "\"") {
					for (var j = i; (r_arr[j] == " " || r_arr[j] == ":" || r_arr[j] == ";" || r_arr[j] == "-" || r_arr[j] == "," || r_arr[j] == "." || r_arr[j] == "\"") && j<r_arr.length; j++) {
						tmp_arr.push(r_arr.splice(j, 1, "%"));
						i++;
					}
					tmp_arr.reverse();
					tmp_str = tmp_arr.join("");
					tmp1_arr.splice(0, 1, r_arr.join(""));
					tmp_arr.splice(0);
				}
				end_arr.push(tmp_str);
				end_arr.reverse();
				tmp_str = "";
			}
			tmp1_arr = tmp1_arr.toString().split("");
			for (var i = 0; i<tmp1_arr.length; i++) {
				if (tmp1_arr[i] == "%" && tmp1_arr[i+1] == "%") {
					tmp1_arr.splice(i+1, 1);
					i--;
				}
			}
			for (var i = 0; i<tmp1_arr.length; i++) {
				if (tmp1_arr[i] == "%") {
					tmp1_arr[i] = end_arr.splice(0, 1);
				}
			}
			tmp_str = tmp1_arr.join("");
		} else {
			tmp_str = r_arr.join("");
		}
		return tmp_str;
	}
}
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 09.11.2006 в 04:48.
Создать новую тему   Часовой пояс GMT +4, время: 15:17.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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