Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   "Метки-переменных" в XML (http://www.flasher.ru/forum/showthread.php?t=177861)

Universe 10.04.2012 17:31

сможете сюда скинуть рабочий вариант?:)

ramshteks 10.04.2012 17:41

на данный момент, я проверил работу и все таки первый вариант был рабочим. Я подумал, что он не работает, потому что использовал в тестовом варианте сейчас в названиях полей символы которые не разрешены.
обратите внимание в содержание константы 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;
                }


Universe 10.04.2012 22:07

незнаю....несколько раз проверил ваш метод и он не работает у меня(((
кстати, а запись new TestObject() ведь равносильна this, если мы пишем этот код внутри класса TestObject ?

strangedk 10.04.2012 22:38

А зачем всё так сложно, не проще иметь 2 узла xml, а между ними вставлять уже необходимую переменную.

<useVarCount>
<node>У вас осталось</node>
<node>попыток</node>
</useVarCount>

Universe 10.04.2012 22:39

Нашёл проблему: ваш метод не работает, если в строке перед %tries% идёт какойто текст. Как это решить?

Добавлено через 1 минуту
to strangedk - а если у вас таких узлов нужно 10 в строке, будете 10 тегов писать? Это как минимум не удобно

strangedk 10.04.2012 22:46

ага, буду 10 тегов)

Не, ну я просто размышляю простым путём, и ничто не мешает создать тег типа <injectNode> и в него пихать то что должно быть между тегами:

<node1>У вас осталось</node1>
<injectNode>counter</injectNode>
<node2>попыток</node2>

Я знаю что это совсем не гибко, и прекрасно это понимаю.
Но увидев тучу кода выше, я уж и не знаю какой метод лучше.

Хочется - пишите свой парсер, кто ж мешает

ramshteks 10.04.2012 22:46

так вот эту вещь удалите:
Код AS3:

//быстрая проверка на содержание двух %
                        var iof:int = string.indexOf(PREFIX);
                        if (iof == NOT_EXIST) {
                                return string;
                        }else {
                                if (string.indexOf(string, iof++) == NOT_EXIST) return string;
                        }
                        //

Добавлено через 7 минут
strangedk, Извините, конечно, на правах холивара. Но я удивляюсь порой программистам. Вы предлагаете меньше писать кода, но при этом предлагаете решение, которое труднее поддерживать и заранее более уязвимое к человеческому фактору и в плане количества данных гораздо более избыточное?

strangedk 10.04.2012 23:06

Я вас прекрасно понимаю. Сам стремлюсь всегда к совершенству, и это замечательно.
Только перебарщивать с преждевременной оптимизацией - зло

И так как мне совершенно не ясны масштабы задачи - я предложил свой вариант, который был применен в одном из моих приложений, буквально с 20 строчками текста.

Если же у вас таких внедрений будет много, тогда разумеется есть смысл изобрести свой парсер.

ramshteks 10.04.2012 23:12

всем давно известно(а может и не всем?), что "преждевременная оптимизация-это зло" фраза за которую даже Кнут уже извинялся. Так как ее цитирование без контекста, порождает вот такие "аргументы". Преждевременная оптимизация не зло. Забудьте уже про это.

strangedk 11.04.2012 00:02

Ага, в приложении которое должно выводить 2 строчки давайте прикрутим locale, ant, внешний logger и еще какой-нибудь фреймверк заюзаем, а-ля robotlegs или parsley.

- так чувствуется разница? )


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

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