Показать сообщение отдельно
Старый 10.04.2012, 17:41
ramshteks вне форума Посмотреть профиль Отправить личное сообщение для ramshteks Найти все сообщения от ramshteks
  № 12  
Ответить с цитированием
ramshteks
 
Аватар для ramshteks

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
на данный момент, я проверил работу и все таки первый вариант был рабочим. Я подумал, что он не работает, потому что использовал в тестовом варианте сейчас в названиях полей символы которые не разрешены.
обратите внимание в содержание константы ALPHABET
Все символы которые она содержит, являются разрешенными. В случае если в шаблоне в названии переменной есть символ которые не является разрешенным, например цифра или английская буква в верхнем регистре, то эта переменная не будет воспринята. И замены не произойдет. А вобще скиньте ваш код конкретный, который не работает. Я попробую вам помочь.

А так даже тот код который я скидывал вполне рабочий. Переменные работают для такого объекта прекрасно:
Код AS3:
package  
{
	/**
	 * ...
	 * @author Shirobok Pavel (ramshteks@gmail.com)
	 */
	public class TestObject 
	{
		public var test:String = "111";
		public var test1:int=112;
		public var test2:*= 113;
		public function TestObject() 
		{
 
		}
 
		public function get test4():String {
			return "114"
		}
 
		public function get test5():int {
			return 115;
		}
 
	}
 
}
Использование:
Код AS3:
trace(StringUtils.printfwv("%test% %test1% %test2% %test4% %test5% ", new TestObject()));//Trace: 111 112 113 114 115
Добавлено через 17 минут
единственно нашел ошибку с вылитающим эксепшеном, если в объекте нет такой переменной. Теперь обработка не прекращается, а просто выдается трейс. Ну и переменная остается незамененной. +Добавил в алфавит цифры. Вот исправленный вариант

Код AS3:
static public function printfwv(string:String, vars:Object):String {
			if (vars == null) return string;
 
			const NOT_EXIST:int = -1;
 
			const ALPHABET:String = "qwertyuiopasdfghjklzxcvbnm_1234567890";
			const S_TEXT:int = 1;
			const S_VAR:int = 2;
			const PREFIX:String = "%";
 
			//быстрая проверка на содержание двух %
			var iof:int = string.indexOf(PREFIX);
			if (iof == NOT_EXIST) {
				return string;
			}else {
				if (string.indexOf(string, iof++) == NOT_EXIST) return string;
			}
			//
 
			var src:String = string;
			var buffer:String = "";
			var state:int = S_TEXT;
			var var_buff:String = "";
			var c:String;
 
			for (var i:int = 0, len:int = src.length; i < len; i++) {
				c = src.charAt(i);
 
				switch(state) {
					case S_TEXT:
						if (PREFIX == c) {
							state = S_VAR;
						}else {
							buffer += c;
						}
						break;
 
					case S_VAR:
						if (ALPHABET.indexOf(c) != NOT_EXIST) {
							var_buff += c;
						}else {
							if (c == PREFIX) {
								var correct_object:Boolean = true;
								try {
									vars[var_buff];
									if (vars[var_buff] == undefined) correct_object = false;
								}catch (e:Error) {
									correct_object = false;
									trace("warning: was catched exception when using source-object:" + e.message);
								}
 
								if (!correct_object){
									buffer += PREFIX + var_buff;
									var_buff = "";
									i--;
									state = S_TEXT;
								}else {
									buffer += vars[var_buff];
								}
							}else{
								buffer += PREFIX + var_buff + c;
							}
							var_buff = "";
							state = S_TEXT;
						}
						break;
				}
			}
 
			if (state == S_VAR) {
				buffer += PREFIX + var_buff;
			}
 
			return buffer;
		}