Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонизатор XML, вроде XML\RDF для XUL. 
:(
    Опции темы
tishaishii
Дата 5.11.2011, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Взялся за описание шаблонизатора для XHTML, вроде как RDF в XUL для Mozilla Firefox.
Набросал структуру для примера:
Код
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html [
    <!ENTITY ns_data    "urn:data">
    <!ENTITY ns_xhtml    "http://www.w3.org/1999/xhtml">
    <!ENTITY ns_node    "urn:node">
    <!ENTITY ns_nc        "http://home.netscape.com/NC-rdf#">
]>

<html
    xmlns="&ns_xhtml;"
    xmlns:xhtml="&ns_xhtml;"
    xmlns:data="&ns_data;"
    xmlns:node="&ns_node;"
    xmlns:nc="&ns_nc;"
    xhtml:dataset="dataset.xml"
>
<!--
Разметка
-->
    <head>
        <script type="text/javascript" src="jquery.js"/>
        <script type="text/javascript" src="xmlns.js"/>
        <script type="text/javascript" src="script.js"/>
    </head>
    <body onload="return onCmdLoad(event);">
        <table border="1" data:ref="entity#list">
            <colgroup>
                <col/>
            </colgroup>
            <thead data:event=":before">
                <data:template>
                    <tr>
                        <th>
                            <span data:info="rows"/>
                        </th>
                        <th><![CDATA[имя]]></th>
                        <th><![CDATA[значение]]></th>
                        <th>
                            <![CDATA[комментарий]]>
                            <button data:action="list"><![CDATA[@]]></button>
                        </th>
                    </tr>
                </data:template>
            </thead>
            <tbody data:event="list">
                <data:template>
                    <tr>
                        <td>
                            <span data:info="id"/>.
                        </td>
                        <td>
                            <input>
                                <node:attr data:key="name" node:name="value"/>
                            </input>
                        </td>
                        <td>
                            <input>
                                <node:attr data:key="value" node:name="value"/>
                            </input>
                        </td>
                        <td>
                            <textarea data:key="title" nc:parseType="datetime"/>
                        </td>
                    </tr>
                </data:template>
            </tbody>
            <tfoot data:event=":after">
                <data:template>
                    <tr>
                        <td colspan="4">
                            Всего строк: <span data:info="rows" nc:parseType="float"/>
                        </td>
                    </tr>
                </data:template>
            </tfoot>
        </table>
    </body>
</html>


Код
<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE dataset [
    <!ENTITY ns_data    "urn:data">
]>

<dataset xmlns="&ns_data;">
<!--
Набор контроллеров
-->
    <item name="entity">
        <event name="list" routine="sa_entity"/>
        <event name="filter" routine="s_entity">
            <param name="qname" control="qname"/>
            <param name="qvalue" control="qvalue"/>
            <param name="qcomment" control="qcomment"/>
        </event>
        <event name="update" routine="u_entity" result="filter">
            <param name="name" control="name"/>
            <param name="value" control="value"/>
            <param name="comment" control="comment"/>
        </event>
        <event name="insert" routine="i_entity" result="filter">
            <param name="name" control="name"/>
            <param name="value" control="value"/>
            <param name="comment" control="comment"/>
        </event>
        <event name="delete" routine="d_entity" result="filter">
            <param name="name" control="name"/>
        </event>
    </item>
</dataset>


Код
<?xml version="1.0" encoding="utf8"?>

<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:DB="http://clining-comfort.ru/rdf#" xmlns:nc="http://home.netscape.com/NC-rdf#">

<!--
Сами данные "sa_entity"
-->

    <RDF:Description RDF:about="http://clining-comfort.ru/db"/>
    <RDF:Description RDF:about="http://clining-comfort.ru/db/1">
        <DB:value>350000, г. Краснодар, ул. Северная, д. 324, оф. 62</DB:value>
        <DB:name>content-contacts-address</DB:name>
        <DB:__no__ nc:parseType="Integer">1</DB:__no__>
        <DB:title>адрес</DB:title>
    </RDF:Description>
    <RDF:Description RDF:about="http://clining-comfort.ru/db/2">
        <DB:value>[email protected]</DB:value>
        <DB:name>content-contacts-email</DB:name>
        <DB:__no__ nc:parseType="Integer">2</DB:__no__>
        <DB:title>e-mail</DB:title>
    </RDF:Description>
    <RDF:Description RDF:about="http://clining-comfort.ru/db/3">
        <DB:value>с 09&lt;sup&gt;00&lt;/sup&gt; до 22&lt;sup&gt;00&lt;/sup&gt;</DB:value>
        <DB:name>content-contacts-mode_work</DB:name>
        <DB:__no__ nc:parseType="Integer">3</DB:__no__>
        <DB:title>режим работы</DB:title>
    </RDF:Description>
    <RDF:Description RDF:about="http://clining-comfort.ru/db/4">
        <DB:value>8(918)213-96-78,&lt;br/&gt;8(929)826-53-49</DB:value>
        <DB:name>content-contacts-phone</DB:name>
        <DB:__no__ nc:parseType="Integer">4</DB:__no__>
        <DB:title>телефон</DB:title>
    </RDF:Description>
    <RDF:Description RDF:about="http://clining-comfort.ru/db/5">
        <DB:value>Клининговая компания &quot;Уют&quot;</DB:value>
        <DB:name>content-page-header</DB:name>
        <DB:__no__ nc:parseType="Integer">5</DB:__no__>
        <DB:title>заголовок страницы</DB:title>
    </RDF:Description>
    <RDF:Description RDF:about="http://clining-comfort.ru/db/6">
        <DB:value>Клининговая компания &quot;Уют&quot;</DB:value>
        <DB:name>content-page-title</DB:name>
        <DB:__no__ nc:parseType="Integer">6</DB:__no__>
        <DB:title>заголовок окна</DB:title>
    </RDF:Description>
    <RDF:Description RDF:about="http://clining-comfort.ru/db/7">
        <DB:value>Уборка производится профессиональными гипоаллергенными, антибактериальными средствами с использованием профессионального оборудования известных фирм США и Швейцарии.</DB:value>
        <DB:name>left-menu-comment</DB:name>
        <DB:__no__ nc:parseType="Integer">7</DB:__no__>
        <DB:title>Комментарий в левом меню</DB:title>
    </RDF:Description>
    <RDF:Seq RDF:about="http://clining-comfort.ru/all">
        <RDF:li>
            <RDF:Seq RDF:about="http://clining-comfort.ru/db">
                <RDF:li RDF:resource="http://clining-comfort.ru/db/7"/>
                <RDF:li RDF:resource="http://clining-comfort.ru/db/6"/>
                <RDF:li RDF:resource="http://clining-comfort.ru/db/5"/>
                <RDF:li RDF:resource="http://clining-comfort.ru/db/4"/>
                <RDF:li RDF:resource="http://clining-comfort.ru/db/3"/>
                <RDF:li RDF:resource="http://clining-comfort.ru/db/2"/>
                <RDF:li RDF:resource="http://clining-comfort.ru/db/1"/>
            </RDF:Seq>
        </RDF:li>
    </RDF:Seq>
</RDF:RDF>


Код
//недоописанный недопроектированный движок
Object.prototype.args=function($args) {
    if(!$args)$args=new Object();
    return $args;
};
Object.prototype.coalesce=function() {
    for(var $i=0; $i<coalesce.arguments.length && coalesce.arguments[$i]==null; $i++);
    return coalesce.arguments[$i];
};
Object.prototype.copy=function($preserve) {
    return (new Object()).set(this, $preserve);
};
Object.prototype.set=function($args, $preserve) {
    $args=this.args($args);
    var $is_function=typeof($preserve)=="function";
    for(var $key in $args)
        if(
            (!$is_function && $preserve) ||
            ( $is_function && $preserve($key, $args))
        ) {
            if(!this[$key])
                this[$key]=$args[$key];
        } else
            this[$key]=$args[$key];
    return this;
};
Object.prototype.currentDocument=function($args) {
    return this.document=this.coalesce(this.args($args).document, this.document, window.document);
};
Object.prototype.toString=function() {
    var $result=[];
    for(var $key in this)
        $result.push([$key, this[$key]].join("\t"));
    return $result.join("\n");
};

$.fn.extend({
    attrNS:function($ns, $name) {
        return $(this).get(0).getAttributeNS($.xmlns[$ns], $name);
    },
    valueNC:function($value) {
        $(this).text(NC_PARSER.execute(this, $value));
        return $(this);
    },
    clone:function($deep) {
        return $($(this).get(0).cloneNode($deep));
    }
});

var NC_PARSER={
    new: function() {
        return this.copy(true);
    },
    execute: function($node, $value) {
        var $parseType=$($node).attrNS("nc", "parseType");
        if($parseType && this.parseType[$parseType])
            return this.parseType[$parseType].call(this, $value);
        return $value;
    },
    parseType: {
        integer: function($value) {
            return isNaN($value) ? $value : parseInt($value);
        },
        float: function($value) {
            return isNaN($value) ? $value : parseFloat($value);
        },
        string: function($value) {
            return String($value);
        },
        date: function($value) {
            try {
                return this.parseType.datetime($value).toLocaleDateString();
            } catch(error) {
                return $value;
            }
        },
        time: function($value) {
            try {
                return this.parseType.datetime($value).toLocaleTimeString();
            } catch(error) {
                return $value;
            }
        },
        datetime:function($value) {
            var $result=new Date($value);
            return isNaN($result.getDate()) ? $value : $result;
        }
    }
};

function RDF_render() {
    var $self=this;
    $(this.object).find("[data|event]").each(function() {
        var $event=$(this).attrNS("data", "event");
        if($self.action[$event])
            $self.action[$event].call($self, this);
    });
    $(this.object).find("[data|action]").click(function() {
        return RDF_render.call($self);
    });
    return $self;
}

var RDF={
    new:function($args) {
        var $self=this.copy(true);
        $self.set($args).currentDocument($args);
        $self.xmlns=XMLNS.new($args).register($args);
        $self.nc=NC_PARSER.new();
        return $self.build($args);
    },
    build:function($args) {
        var $self=this.set({
            data: new Array()
        });
        var $doc=$args.document;
        $($doc).find("RDF|li[RDF|resource]").each(function() {
            $self.data.push(
                $($doc).find("RDF|Description[RDF|about='"+$(this).attrNS("RDF", "resource")+"']")
            );
        });
        $self.render();
        return $self;
    },
    render:RDF_render,
    template:function() {
        $(this).find("> :not(data|template)").remove();
        return $(this).find("data|template > *:first-child");
    },
    parse:function($ethalon, $row, $i) {
        var $self=this;
        var $node=$($ethalon).clone(true);
        $node.find("[data|info]").each(function() {
            switch($(this).attrNS("data", "info")) {
                case "id":{
                    $(this).valueNC($i+1);
                    break;
                }
                case "rows":{
                    $(this).valueNC($self.data.length);
                    break;
                }
            }
        });
        $node.find("[data|key]").each(function() {
            $(this).valueNC(
                $row.find("DB|"+$(this).attrNS("data", "key")).text()
            );
            return true;
        });
        $node.find("node|attr").each(function() {
            $(this).parent().attr(
                $(this).attrNS("node", "name"), $(this).text()
            );
            return true;
        });
        return $node;
    },
    action:{
        ":before":function($root) {
            $($root).append(this.parse(this.template.call($root)));
        },
        ":after":function($root) {
            $($root).append(this.parse(this.template.call($root)));
        },
        list:function($root) {
            var $node=this.template.call($root);
            var $rows=this.data.length;
            for(var $i=0; $i<$rows; $i++) {
                var $row=this.data[$i];
                $result=this.parse($node, $row, $i);
                $($root).append($result);
            }
        }
    }
};

var DATASOURCES={
    new:function($args) {
        var $self=this.copy(true);
        $self.set($args).currentDocument($args);
        return $self.build($args);
    },
    parseDataSource:function($ds) {
        try {
            $ds=$ds.split('#');
            return (new Object()).set({
                routine    : $ds[0],
                event    : $ds[1]
            });
        } catch($error) {
            return null;
        }
    },
    data:function($args) {
        $args=this.args($args);
        $.get($args.routine+".xml", function($cont) {
            if($args.callback)
                return $args.callback.call(this, $args.set({
                    cont: $cont
                }));
            return true;
        });
    },
    init:function() {
        var $self=this;
        var $doc=$self.currentDocument();
        if(!$doc.rdf)
            $doc.rdf=new Object();
        $($doc).find("[data|ref]").each(function() {
            var $object=$(this).get(0);
            var $ref;
            $($self).xmlns($.xmlns);
            if($ref=$self.parseDataSource($(this).get(0).getAttributeNS($self.xmlns.get("data"), "ref"))) {
                $object.set({
                    "data-ref"        : $self.dataset.find("> data|item[name='"+$ref.routine+"']"),
                    "data-routine"    : $ref.routine,
                    "data-event"    : $ref.event
                });
                $self.dataset.
                    find("> data|item[name='"+$ref.routine+"']").
                    find("data|event[name='"+$ref.event+"']").
                each(function() {
                    $self.data({
                        ref            : $ref,
                        document    : $self,
                        object        : $object,
                        routine        : $(this).attr("routine"),
                        callback    : function($args) {
                            $args.xmlns=XMLNS.new({
                                document:$args.cont
                            });
                            $args.xmlns.registerNode($args.cont);
                            $object.rdf=$doc.rdf[$ref.routine]=RDF.new({
                                ref        : $ref,
                                object    : $object,
                                document: $args.cont,
                                xmlns    : $args.xmlns,
                                dataset    : $self.dataset
                            });
                        }
                    });
                });
            }
        });
        return this;
    },
    build:function($args) {
        var $self=this;
        var $doc=$self.currentDocument($args);
        $self.xmlns.register($doc);
        var $ds=$doc.documentElement.getAttributeNS(this.xmlns.get("xhtml"), "dataset");
        if($ds) {
            $.get($ds, function($cont) {
                $self.dataset=$($doc.importNode($cont.documentElement, true));
                $($doc.documentElement).append($self.dataset);
                $self.xmlns.registerNode($self.dataset);
                $self.init();
            });
        }
        return this;
    }
};

var XMLNS={
    new:function($args) {
        var $self=this.copy(true);
        return $self.set({
            namespaces:new Object()
        }).build(
            $args
        );
    },
    name:function($name) {
        try {
            var $new_name=$name.replace("xmlns:", "");
            if($name!=$new_name)
                return $new_name;
        } catch(error) {
            return "$";
        }
    },
    register:function($args) {
        return this.registerNode(
            this.currentDocument($args)
        );
    },
    registerNode:function($node) {
        $($node).xmlns(this.namespaces);
        return this;
    },
    add:function($name, $ns) {
        this.namespaces[this.name($name)]=$ns;
        return this.register();
    },
    get:function($name) {
        return this.register().namespaces[$name];
    },
    build:function($args) {
        with(this.currentDocument($args).documentElement)
            for(var $key in attributes)
                if(!isNaN($key))
                    with(attributes[$key]) {
                        this.add(name, value);
                    }
        return this;
    }
};

var CTRL={
    new:function($args) {
        var $self=this.copy(true);
        $args=this.args($args);
        return this.copy(true).init($args);
    },
    init:function($args) {
        return this.set({
            xmlns: XMLNS.new((
                $args=this.args($args)
            ).set({
                ctrl: this
            }))
        }).set({
            datasources: DATASOURCES.new($args.set({
                xmlns: this.xmlns
            }))
        });
    }
};

function onCmdLoad(evt) {
    var $ctrl=CTRL.new();
    return true;
}


Может быть есть готовый?

Это сообщение отредактировал(а) tishaishii - 5.11.2011, 22:23
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Применение библиотек | Следующая тема »


 




[ Время генерации скрипта: 0.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.