UNPKG

nodulator

Version:

Complete NodeJS Framework for Restfull APIs

606 lines (416 loc) 23.7 kB
<!DOCTYPE html> <html> <head> <title>DOM.ls</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <ul id="jump_to"> <li> <a class="large" href="javascript:void(0);">Jump To &hellip;</a> <a class="small" href="javascript:void(0);">+</a> <div id="jump_wrapper"> <div id="jump_page_wrapper"> <div id="jump_page"> <a class="source" href="Nodulator.html"> Nodulator.ls </a> <a class="source" href="ClientDB.html"> ClientDB.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="Resource.html"> Resource.ls </a> <a class="source" href="Bus.html"> Bus.ls </a> <a class="source" href="Cache.html"> Cache.ls </a> <a class="source" href="ChangeWatcher.html"> ChangeWatcher.ls </a> <a class="source" href="Debug.html"> Debug.ls </a> <a class="source" href="Wrappers.html"> Wrappers.ls </a> <a class="source" href="Nodulator.html"> Nodulator.ls </a> <a class="source" href="Resource.html"> Resource.ls </a> <a class="source" href="Schema.html"> Schema.ls </a> <a class="source" href="NModule.html"> NModule.ls </a> <a class="source" href="AccountResource.html"> AccountResource.ls </a> <a class="source" href="User.html"> User.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="Nodulator-Angular.html"> Nodulator-Angular.ls </a> <a class="source" href="TaskDirective.html"> TaskDirective.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="TaskService.html"> TaskService.ls </a> <a class="source" href="main.html"> main.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="Task.html"> Task.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="DOM.html"> DOM.ls </a> <a class="source" href="View.html"> View.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="Nodulator.html"> Nodulator.ls </a> <a class="source" href="Mongo.html"> Mongo.ls </a> <a class="source" href="Mysql.html"> Mysql.ls </a> <a class="source" href="SqlMem.html"> SqlMem.ls </a> <a class="source" href="index.html"> index.ls </a> <a class="source" href="Resource.html"> Resource.ls </a> <a class="source" href="Request.html"> Request.ls </a> <a class="source" href="Route.html"> Route.ls </a> <a class="source" href="index.html"> index.ls </a> </div> </div> </li> </ul> <ul class="sections"> <li id="title"> <div class="annotation"> <h1>DOM.ls</h1> </div> </li> <li id="section-1"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-1">&#182;</a> </div> </div> <div class="content"><div class='highlight'><pre><span class="hljs-built_in">require</span>! { underscore: _ q async } tags = &lt;[a abbr address area article aside audio b base bdo blockquote body br button canvas caption cite code col colgroup datalist dd del details dfn dialog div dl dt em embed fieldset figcaption figure footer form head header h1 h2 h3 h4 h5 h6 hr html i iframe img ins input kbd keygen label legend li link map mark menu menuitem meta meter nav object ol optgroup option output p param pre progress q s samp script section select small source span strong style sub summary sup table td th tr textarea time title track u ul var video]&gt; selfClosingTags = &lt;[area base br col command embed hr img input keygen link meta param source track wbr]&gt; customTags = &lt;[root text func]&gt; events = &lt;[click change]&gt; <span class="hljs-built_in">window</span>.DOM = {} <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Node</span></span> @anchorNb = <span class="hljs-number">0</span> (@name, @attrs = {}, ...@origChildren) -&gt; @_type = <span class="hljs-string">'Node'</span> <span class="hljs-keyword">throw</span> <span class="hljs-string">"Unknown Tag: <span class="hljs-subst">#{name}</span>"</span> <span class="hljs-keyword">if</span> @name <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> tags <span class="hljs-keyword">and</span> @name <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> customTags <span class="hljs-keyword">if</span> @name <span class="hljs-keyword">in</span> customTags <span class="hljs-keyword">switch</span> @name | \text =&gt; @text = @attrs @Resolve = <span class="hljs-function">-&gt;</span> @text <span class="hljs-keyword">if</span> @attrs? <span class="hljs-keyword">and</span> (<span class="hljs-keyword">typeof</span>! @attrs <span class="hljs-keyword">isnt</span> \Object <span class="hljs-keyword">or</span> @attrs._promise? <span class="hljs-keyword">or</span> @attrs.<span class="hljs-keyword">then</span>? <span class="hljs-keyword">or</span> @attrs._type <span class="hljs-keyword">is</span> \Node) @origChildren.unshift @attrs @attrs = {} @attrs.anchor = Node.anchorNb++ @origChildren = @_Flatten @origChildren</pre></div></div> </li> <li id="section-2"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-2">&#182;</a> </div> <p>Change every child into a Renderable Node</p> </div> <div class="content"><div class='highlight'><pre> Resolve: <span class="hljs-function">-&gt;</span> d = q.defer! async.mapSeries @origChildren, @~_ResolveType, (err, childs) ~&gt; <span class="hljs-keyword">return</span> d.reject err <span class="hljs-keyword">if</span> err? childs = @_Flatten childs childs = childs |&gt; map ~&gt; it.parent = @; it @children = childs async.mapSeries childs, (item, done) ~&gt; promise = item.Resolve! <span class="hljs-keyword">if</span> promise.<span class="hljs-keyword">then</span>? promise.<span class="hljs-keyword">then</span> -&gt; done <span class="hljs-literal">null</span> it promise.<span class="hljs-keyword">catch</span> done <span class="hljs-keyword">else</span> done <span class="hljs-literal">null</span> promise ,(err, childs) ~&gt; <span class="hljs-keyword">return</span> d.reject err <span class="hljs-keyword">if</span> err? d.resolve @ <span class="hljs-keyword">return</span> d.promise Render: <span class="hljs-function"><span class="hljs-params">(parent)</span> -&gt;</span> <span class="hljs-keyword">if</span> (anchor = @GetElement!) anchor.outerHTML = <span class="hljs-string">''</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> parent anchor = <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">"body"</span>) <span class="hljs-keyword">else</span> anchor = parent.GetElement! <span class="hljs-keyword">if</span> @name <span class="hljs-keyword">is</span> \text <span class="hljs-keyword">return</span> anchor.innerHTML += @text @node = <span class="hljs-string">"&lt;<span class="hljs-subst">#{@name}</span><span class="hljs-subst">#{@_MakeAttrStr!}</span>"</span> <span class="hljs-keyword">if</span> @name <span class="hljs-keyword">in</span> selfClosingTags <span class="hljs-keyword">and</span> @origChildren.length <span class="hljs-keyword">throw</span> <span class="hljs-string">"Self closing tags cannot have children: <span class="hljs-subst">#{@name}</span>"</span> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> @name <span class="hljs-keyword">in</span> selfClosingTags @node += <span class="hljs-string">' /&gt;'</span> <span class="hljs-keyword">return</span> anchor.innerHTML += @node <span class="hljs-keyword">else</span> @node += <span class="hljs-string">'&gt;'</span> anchor.innerHTML += @node <span class="hljs-keyword">if</span> @children? @children |&gt; map ~&gt; <span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span>! it <span class="hljs-keyword">is</span> \Array it |&gt; map ~&gt; it.Render @ <span class="hljs-keyword">else</span> it.Render? @ SetEvents: <span class="hljs-function">-&gt;</span> node = @GetElement! <span class="hljs-keyword">if</span> @name <span class="hljs-keyword">isnt</span> \root <span class="hljs-keyword">and</span> any (<span class="hljs-keyword">in</span> events), keys @attrs <span class="hljs-keyword">if</span> @attrs.click? node.onclick = ~&gt; @attrs.click ... <span class="hljs-keyword">if</span> @attrs.keyup? node.onkeyup = ~&gt; @attrs.keyup ... <span class="hljs-keyword">if</span> @attrs.change? node.onchange = ~&gt; @attrs.change ... <span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span>! @attrs?.value <span class="hljs-keyword">is</span> \Function node.value = @attrs.value! <span class="hljs-keyword">if</span> @children? @children |&gt; map (.SetEvents?!) Make: <span class="hljs-function">-&gt;</span> d = q.defer! dom = @Resolve! dom .<span class="hljs-keyword">then</span> ~&gt; d.resolve it.Render @parent it.SetEvents! .<span class="hljs-keyword">catch</span> -&gt; d.reject it <span class="hljs-keyword">return</span> d.promise GetElement: <span class="hljs-function">-&gt;</span> <span class="hljs-keyword">if</span> @name <span class="hljs-keyword">is</span> \text <span class="hljs-keyword">and</span> @parent? <span class="hljs-keyword">return</span> <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">"<span class="hljs-subst">#{@name}</span>[anchor='<span class="hljs-subst">#{@attrs.anchor}</span>']"</span>)</pre></div></div> </li> <li id="section-3"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-3">&#182;</a> </div> <p>else</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">"<span class="hljs-subst">#{@name}</span>[anchor='<span class="hljs-subst">#{@attrs.anchor}</span>']"</span>) Empty: <span class="hljs-function"><span class="hljs-params">(@origChildren = [])</span> -&gt;</span> AddChild: <span class="hljs-function">-&gt;</span> @origChildren.push it @ _Flatten: <span class="hljs-function"><span class="hljs-params">(array)</span> -&gt;</span> newArray = [] <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> array <span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span>! item <span class="hljs-keyword">is</span> \Array newArray = newArray.concat item <span class="hljs-keyword">else</span> newArray.push item newArray |&gt; filter -&gt; it? _MakeAttrStr: <span class="hljs-function">-&gt;</span> <span class="hljs-keyword">return</span> <span class="hljs-string">''</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> @attrs? res = <span class="hljs-string">''</span> <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">of</span> @attrs <span class="hljs-keyword">when</span> k <span class="hljs-keyword">isnt</span> \click res += <span class="hljs-string">" #k=\"#v\""</span> res _ResolveType: <span class="hljs-function"><span class="hljs-params">(child, done)</span> -&gt;</span></pre></div></div> </li> <li id="section-4"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-4">&#182;</a> </div> <p>console.log ‘Child’, child</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">switch</span> | child <span class="hljs-keyword">is</span> <span class="hljs-literal">undefined</span> =&gt; @_String <span class="hljs-string">''</span>, done | <span class="hljs-keyword">typeof</span>! child <span class="hljs-keyword">is</span> \String =&gt; @_String child, done | <span class="hljs-keyword">typeof</span>! child <span class="hljs-keyword">is</span> \Array =&gt; @_Array child, done | child.<span class="hljs-keyword">then</span>? =&gt; @_Promise child, done | child._promise? =&gt; @_ResourcePromise child, done | child.Then? =&gt; @_ResourceInst child, done | child._type <span class="hljs-keyword">is</span> \Node =&gt; @_Node child, done | child.Render? =&gt; @_View child, done | <span class="hljs-keyword">typeof</span>! child <span class="hljs-keyword">is</span> \Function =&gt; @_Function child, done | _ =&gt; @_String <span class="hljs-string">''</span> + child, done _String: <span class="hljs-function"><span class="hljs-params">(text, done)</span> -&gt;</span> done <span class="hljs-literal">null</span> <span class="hljs-keyword">new</span> Node \text text _Node: <span class="hljs-function"><span class="hljs-params">(node, done)</span> -&gt;</span> done <span class="hljs-literal">null</span> node _Array: <span class="hljs-function"><span class="hljs-params">(array, done)</span> -&gt;</span> async.mapSeries array, @~_ResolveType, done _Function: <span class="hljs-function"><span class="hljs-params">(f, done)</span> -&gt;</span> done <span class="hljs-literal">null</span> <span class="hljs-keyword">new</span> WatchableNode f, @ _View: <span class="hljs-function"><span class="hljs-params">(view, done)</span> -&gt;</span> view.Render (err, res) ~&gt; <span class="hljs-keyword">return</span> done err <span class="hljs-keyword">if</span> err? @_ResolveType res, done _Promise: <span class="hljs-function"><span class="hljs-params">(promise, done)</span> -&gt;</span> promise .<span class="hljs-keyword">then</span> -&gt; done <span class="hljs-literal">null</span>, it .<span class="hljs-keyword">catch</span> -&gt; done it _ResourceInst: <span class="hljs-function"><span class="hljs-params">(resourceInst, done)</span> -&gt;</span> <span class="hljs-keyword">throw</span> <span class="hljs-string">"No Render() on <span class="hljs-subst">#{resourceInst._type}</span>. Attach view first"</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> resourceInst.Render? resourceInst.Render done _ResourcePromise: <span class="hljs-function"><span class="hljs-params">(resourcePromise, done)</span> -&gt;</span> resourcePromise .Then ~&gt; @_ResolveType it, done .Catch -&gt; done it <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">WatchableNode</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Node</span></span> (@func, @parent) -&gt; @name = \func @attrs = anchor: Node.anchorNb++ @children = [] first = <span class="hljs-literal">true</span> N.Watch ~&gt;</pre></div></div> </li> <li id="section-5"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-5">&#182;</a> </div> <p>res = @func!</p> </div> <div class="content"><div class='highlight'><pre> @Rerender first .<span class="hljs-keyword">catch</span> <span class="hljs-built_in">console</span>~error <span class="hljs-keyword">if</span> first first := <span class="hljs-literal">false</span> Resolve: <span class="hljs-function">-&gt;</span> d = q.defer! @_ResolveType @func!, (err, child) ~&gt; <span class="hljs-keyword">return</span> d.reject err <span class="hljs-keyword">if</span> err? <span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span>! child <span class="hljs-keyword">isnt</span> \Array child = [child] @children = child async.mapSeries @children, (item, done) ~&gt; promise = item.Resolve! <span class="hljs-keyword">if</span> promise.<span class="hljs-keyword">then</span>? promise.<span class="hljs-keyword">then</span> -&gt; done <span class="hljs-literal">null</span> it promise.<span class="hljs-keyword">catch</span> done <span class="hljs-keyword">else</span> done <span class="hljs-literal">null</span> promise ,(err, childs) ~&gt; <span class="hljs-keyword">return</span> d.reject err <span class="hljs-keyword">if</span> err? d.resolve @ <span class="hljs-keyword">return</span> d.promise Rerender: <span class="hljs-function"><span class="hljs-params">(first)</span> -&gt;</span> d = q.defer! <span class="hljs-keyword">if</span> first @func! d.resolve <span class="hljs-literal">null</span> <span class="hljs-keyword">return</span> d.promise @Resolve! .<span class="hljs-keyword">then</span> ~&gt; <span class="hljs-keyword">if</span> (anchor = @GetElement!) anchor.innerHTML = <span class="hljs-string">''</span> it.Render @parent it.SetEvents! d.resolve it .<span class="hljs-keyword">catch</span> -&gt; d.reject it <span class="hljs-keyword">return</span> d.promise tags |&gt; each (tag) -&gt; DOM[tag] = <span class="hljs-function"><span class="hljs-params">(...args)</span> -&gt;</span> <span class="hljs-keyword">new</span> (Node.bind.apply Node, [Node, tag].concat args) DOM.root = <span class="hljs-function"><span class="hljs-params">(...args)</span> -&gt;</span> <span class="hljs-keyword">new</span> (Node.bind.apply Node, [Node, \root].concat args) DOM.map_ = DOM.map DOM.head_ = DOM.head <span class="hljs-keyword">delete</span> DOM.map <span class="hljs-keyword">delete</span> DOM.head</pre></div></div> </li> <li id="section-6"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-6">&#182;</a> </div> <p>(intersection tags, keys window) |&gt; each -&gt; if it isnt \div and it isnt \span DOM[it + _] = DOM[it] delete DOM[it] else window[it + _] = window[it] delete window[it]</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-built_in">window</span> import DOM</pre></div></div> </li> <li id="section-7"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-7">&#182;</a> </div> <p>window.Node = Node</p> </div> </li> </ul> </div> </body> </html>