
Создатель
  
Профиль
Группа: Завсегдатай
Сообщений: 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<sup>00</sup> до 22<sup>00</sup></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,<br/>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>Клининговая компания "Уют"</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>Клининговая компания "Уют"</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
|