Форум 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 14:30

"Метки-переменных" в XML
 
Такой вопрос: есть ли такая фича при написании строки в xml как то указывать не текст а "метку" которая будет говорить компилятору, чтобы он искал в пределах данного класса переменную и подставлял её вместо метки в результирующую строку? Или это можно сделать только при помощи методов класса String?

gloomyBrain 10.04.2012 14:33

Вас непонятно. Вы компилируете xml?

Universe 10.04.2012 14:37

я загружаю строку из xml, но хочу чтобы в ней содержалась ссылка на переменную которая есть у меня в классе, в котором я эту строку использую. Т.е. вот строка из xml
"Попробуйте ещё раз! У вас осталось %tries% попытки!"
Переменная tries у меня объявлена в классе сверху. Хочется чтобы получилось как то вот так:
"Попробуйте ещё раз! У вас осталось" + tries + "попытки!"

wvxvw 10.04.2012 14:38

Код AS3:

<xml>{this.variable}</xml>

?

EDIT: А... XML уже готовый? Ну тогда нет, нет ничего специально заготовленного, надо самому.

Universe 10.04.2012 14:43

регулярным выражением, через replace ? А как перевести в строку имя переменной?

wvxvw 10.04.2012 14:54

Переменные бывают связаными в лексическом окружении и статическом / динамически (lexical binding and static / dynamic binding). Первый случай - внутри функции аргументы и локальные переменные связаны лексически с контекстом функции. Имена таких переменных не хранятся в скомпилированом коде. Статически / динамически связанные переменные - например, поля класса, их, естественно, можно получить как объект[имя свойства], т.как имена хранятся в скомпилированом коде.
Так что если речь о лексической привязке - то только вручную, типа: string.replace(/variable/g, variable);

gloomyBrain 10.04.2012 14:56

Ну при таком раскладе тебе нужно что-то вроде своего мета-языка небольшого изобрести. То есть смотри как - есть 2 вещи:
- xml с заготовками
- хранилище данных (оттуда берем данные для подстановки)

так вот, имея xml вида:
Код AS3:

<node>У Вас осталось [player.numTries] попыток</node>

Вот тут нужно вычленить все "выражения" (то что внутри []-скобочек) и скомпилировать их. Копиляция - довольно простая вешь - есть хранилище данных, есть имя свойства (указанное как [player.numTries]).
То есть берем наше хранилище, берем у него свойство player, у того что получили берем свойство numTries. То что получили - кладем в xml вместо выражения [player.numTries]. Ну и выводим результат уже с подстановкой.
Кстати, очень крутая система, туда же можно прикрутить условия, вычисления и локализацию. Даже вызовы методов можно. Главное задать "контекст исполнения" - в рассмотренном выше примере это хранилище данных.

ramshteks 10.04.2012 15:03

вот у темя есть нужная для вас функция:
Код AS3:

static public function printfwv(string:String, vars:Object):String {
                        if (vars == null) return string;
 
                        const NOT_EXIST:int = -1;
 
                        const ALPHABET:String = "qwertyuiopasdfghjklzxcvbnm_";
                        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) != -1) {
                                                        var_buff += c;
                                                }else {
                                                        if (c == PREFIX) {
                                                                if (vars[var_buff] == undefined) {
                                                                        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;
                }

первым параметром вы передаете строку типа "bla bla %var% bla bla %var% bla bla %var2%", а вторым объект, если объект содержит переменные с именем var и var2, то вы функция вернет, то что вам нужно

Добавлено через 49 секунд
правда никакой привязки к xml нет, поэтому из xml вам самому придется выдрать строку-шаблон

Universe 10.04.2012 16:44

о, супер, большое спасибо ramshteks! Сейчас попробую!))

Добавлено через 21 минуту
чтото не пашит(((
Засунул вашу функцию в свой класс MyUtils, вызываю следующим образом
Код AS3:

MyUtils.stringVars("a123 %tries% vsvs", this);

var tries в классе есть, пробовал её делать и публичной и статической, но всё равно возвращает не изменённую строку((

ramshteks 10.04.2012 17:17

метод писался под такое использование:
printfwv("a123 %tries% vsvs", {tries:"TEST String"});

Для вашего варианта, даже не проверялось, так что подсказать не могу

тоесть должен работать вот такой вариант:
printfwv("a123 %tries% vsvs", {tries:String(this.tries)});

Добавлено через 10 минут
Я прошу прощения, сейчас обнаружил, что функция действительно не корректно работает


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

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