Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Читалка FB2 для мультитач планшета (http://www.flasher.ru/forum/showthread.php?t=165776)

Mulin 26.08.2011 16:44

Читалка FB2 для мультитач планшета
 
Суть такова. Прикупил планшет на Win7, но семерка не очень то и заточена под тач. В частности нормальной FB2 читалки, хотя бы не заточенной но увернно работающей, под тач нету впринципе. Флеш в связке с цинком неплохая платформа для написания своей такой читалки, а формат FB2 тот же самый XML. Однако есть свои сложности. Вот кусок XML

Код AS1/AS2:

<?xml version="1.0" encoding="Windows-1251"?>
<FictionBook>
<description>
        <title-info>
                <genre></genre>
                <author>
                        <first-name>Piter</first-name>
                        <middle-name></middle-name>
                        <last-name>Uots</last-name>
                </author>
                <book-title>Ложная слепота</book-title>
        </title-info>
</description>

Суть в том, что узел, например, <author> совсем необязательно будет стоять вторым в блоке <title-info>. Таким образом обращение к имени автора по childNodes[1] не всегда будет правильным. А таких узлов там масса. Вот и вопрос, есть ли возможность в AS2 обращаться к узлу по его имени? Заранее спасибо.
Вот еще созрел вопрос. В том же FB2 есть возможность хранить изображение в бинарном виде, прямо в смом теле документа. Вот пример
Код AS1/AS2:

<binary content-type="image/jpeg" id="tolstoy_port.png">
/9j/4AAQSkZJRgABAgEAYABgAAD/7Qz8UGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAYAAA
AAEAAgBgAAAAAQACOEJJTQQNAAAAAAAEAAAAeDhCSU0D8wAAAAAACAAAAAAAAAAAOEJJTQQK
AAAAAAABAAA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9mZgABAGxmZgAG
AAAAAAABAC9mZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0AAAAG
AAAAAAABOEJJTQP4AAAAAABwAAD    (Это очень большой бинарник обложки- сокращено)
2Q==</binary>

Есть ли возможность эти данные преобразовать в изображение? Если есть то как?

olexandr 26.08.2011 21:15

у вас отличная возможность начать изучать AS3 :)

Mulin 26.08.2011 21:31

Цитата:

Сообщение от olexandr (Сообщение 1025808)
у вас отличная возможность начать изучать AS3 :)

Возможность она имеется всегда, но хотелось бы все же по теме :)

Котяра 26.08.2011 21:42

по теме: а зачем вам ас2?

Mulin 26.08.2011 22:28

Цитата:

Сообщение от Котяра (Сообщение 1025823)
по теме: а зачем вам ас2?

Ну раз уж вы тут все так хотите поофтопить, то ладно. Уговорили :)
AS2 знаю более менее, AS3 не знаю чуть менее чем полностью. Времени изучать нет вообще. Кодю на AS2 в перерывах работы. Но дело в том, что если и изучать для этого дела новый язык, то все же лучше для данной цели подойдет Си. Но как я написал времени у меня нету, да и хотелось бы реализации на AS2. Разделом же вроде не ошибся?
А теперь по теме. Вот совсем унылый пример XML
Код AS1/AS2:

<value>
        <value1>1</value1>
        <value2>2</value2>
        <value3>3</value3>
</value>

Выделить второй нод имя которому <value2> непроблема
Код AS1/AS2:

childNodes[0].firstChild

Но иногда XML может иметь вид
Код AS1/AS2:

<value>
        <value2>1</value2>
        <value3>2</value3>
        <value4>3</value4>
</value>

То есть начинается с <value2> и заканчиватеся <value4>. Но мне все равно нужно получать значение <value2>
Воспользовавшись старым кодом
Код AS1/AS2:

childNodes[0].firstChild

Я получу значение <value3>. Что разумеется.
В другом случае вообще может не быть никаких значений во всех валуях, или даже вовсе не быть самих валуев. Например так
Код AS1/AS2:

<value>
        //Пусто...
</value>

Или так
Код AS1/AS2:

<value>
        <value2>1</value2>
        ...
        <value40>40</value40>
</value>

Но зато всегда известно имя <value n>. Вот я и хочу узнать можно ли каким либо образом обратиться к узлу по его имени а не по индексу? И прошу не предлагайте мне AS3, это не тот раздел. Здесь обсуждают AS2. Да я старый зануда :)

Котяра 26.08.2011 22:52

Обходите всех чилдов и смотрите по имени нода ( я в своё время завел такой метод в XML)
Код AS1/AS2:

XMLNode.prototype.getChildByName = function(name:String):XMLNode {.. .}

Могу ошибаться, ибо ас2 уже совсем подзабыл.
Просто как преобразовать в ас2 бинарник в jpg я не представляю. В ас3 это делается влёгкую.

olexandr 26.08.2011 23:19

ну, собственно, о чем и речь была
те задачи, которые перед вами стоят легко решаются с помощью AS3
не вижу смысла выдумывать неизвестно что для устаревшего языка, тем более сомневаюсь, что это вообще возможно

Mulin 26.08.2011 23:21

Цитата:

Сообщение от Котяра (Сообщение 1025841)
Просто как преобразовать в ас2 бинарник в jpg я не представляю. В ас3 это делается влёгкую.

Скажу больше, это не бинарник, это base64, его еще нужно преобразовать в бинарник :D. Но вроде таблица преобразований есть на вики. Но я уже придумал как вытянуть изображение, разумеется после его преобразования в бинарник. Нужно потом этот бинарник сохранить цинком в любом месте с расширением соответствующим изображению (расширение в атрибутах узла указано), и потом его подгрузить во флешку. Понимаю, вариант ректальнейший, но as3 еще сложнее :D Но вы почти уговорили

olexandr 26.08.2011 23:21

вот еще.
по поводу обращения по имени - я когда то давно писал класс один для этого дела. если разберетесь как им пользоваться, то на здоровье:

Код AS1/AS2:

class XML2Array {
 
        static public var COMPLETE:Number = 0;
        static public var ERROR:Number = 1;
 
        private var onComplete:Function;
        private var onError:Function;
 
        private var xml:XML;
        private var sorting:Boolean;
 
        public function XML2Array($sorting:Boolean) {
                sorting = $sorting;
        }
 
        public function load(str:String) {
                var t:XML2Array = this;
 
                xml = new XML();
                xml.ignoreWhite = true;
                xml.onLoad = function(ok:Boolean):Void {
                        if (ok) {
                                if (this.status) {
                                        t.onError('Неправильный формат данных (' + this.status + ')');
                                }else {
                                        t.onComplete(t.parseXML(this));
                                }
                        }else {
                                t.onError('Файл не найден');
                        }
                }
                xml.load(str);
        }
 
        public function convert(str:String) {
                xml = new XML(str);
                xml.ignoreWhite = true;
                if (xml.status) {
                        onError('Неправильный формат данных (' + xml.status + ')');
                }else {
                        onComplete(parseXML(xml));
                }
        }
 
        public function addEventListener(p_event:Number, p_function:Function):Void {
 
                switch (p_event) {
                        case XML2Array.COMPLETE:
                                this.onComplete = p_function;
                                break;
                        case XML2Array.ERROR:
                                this.onError = p_function;
                                break;
                        default:
                                break;
                }
 
        }
 
        private function parseXML(p_xml:XML):Array {
 
                var arr:Array = [];
 
                // parse attributes
                for (var p:String in p_xml.attributes) {
                        arr[p] = p_xml.attributes[p];
                }
 
                // parse nodeValue
                var nv:String = p_xml.childNodes[0].nodeValue;
                if (nv != undefined && nv != null){
                        arr.value = nv;
                }
 
                // parse childs
                var nameArr:Array = [];
                for (var i:Number = 0; i < p_xml.childNodes.length; i++ ) {
                        nameArr.push(p_xml.childNodes[i].nodeName);
                }
                for (var i:Number = 0; i < p_xml.childNodes.length; i++ ) {
                        if (p_xml.childNodes[i].nodeName != null) {
                                if (isUnique(nameArr, p_xml.childNodes[i].nodeName)){
                                        arr[p_xml.childNodes[i].nodeName] = parseXML(p_xml.childNodes[i]);
                                }else {
                                        if (arr[p_xml.childNodes[i].nodeName] == undefined) {
                                                arr[p_xml.childNodes[i].nodeName] = [];
                                        }
                                        var idArr:Array = parseXML(p_xml.childNodes[i]);
                                        // сортировка по id
                                        if (!sorting) { /*if (isNaN(idArr.id)){*/
                                                arr[p_xml.childNodes[i].nodeName].push(idArr);
                                        }else{
                                                arr[p_xml.childNodes[i].nodeName][Number(idArr.id)] = idArr;
                                        }
                                }
                        }
                }
                return arr;
 
        }
 
        private function isUnique(p_arr:Array, p_str:Object):Boolean {
                var c:Number = 0;
                for (var i:Number = 0; i < p_arr.length; i++ ) {
                        if (p_arr[i].toString() == p_str.toString()) {
                                c++;
                                if (c > 1) {
                                        return false;
                                };
                        }
                }
                return (c == 1);
        }
}


Котяра 26.08.2011 23:25

А вы вообще уверены что цинк делает приложения под Win7?
Ой что-то туплю. Показалось что имеется в виду Win Phone 7.
По идее Haali reader должен пойти там.


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

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