nodulator
Version:
Complete NodeJS Framework for Restfull APIs
606 lines (416 loc) • 23.7 kB
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 …</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">¶</a>
</div>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-built_in">require</span>! {
underscore: _
q
async
}
tags = <[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]>
selfClosingTags = <[area base br col command embed hr img input keygen link meta param source track wbr]>
customTags = <[root text func]>
events = <[click change]>
<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) ->
@_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 =>
@text = @attrs
@Resolve = <span class="hljs-function">-></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">¶</a>
</div>
<p>Change every child into a Renderable Node</p>
</div>
<div class="content"><div class='highlight'><pre> Resolve: <span class="hljs-function">-></span>
d = q.defer!
async.mapSeries @origChildren, @~_ResolveType, (err, childs) ~>
<span class="hljs-keyword">return</span> d.reject err <span class="hljs-keyword">if</span> err?
childs = @_Flatten childs
childs = childs |> map ~> it.parent = @; it
@children = childs
async.mapSeries childs, (item, done) ~>
promise = item.Resolve!
<span class="hljs-keyword">if</span> promise.<span class="hljs-keyword">then</span>?
promise.<span class="hljs-keyword">then</span> -> 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) ~>
<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> -></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">"<<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">' />'</span>
<span class="hljs-keyword">return</span> anchor.innerHTML += @node
<span class="hljs-keyword">else</span>
@node += <span class="hljs-string">'>'</span>
anchor.innerHTML += @node
<span class="hljs-keyword">if</span> @children?
@children |> map ~>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span>! it <span class="hljs-keyword">is</span> \Array
it |> map ~> it.Render @
<span class="hljs-keyword">else</span>
it.Render? @
SetEvents: <span class="hljs-function">-></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 = ~>
@attrs.click ...
<span class="hljs-keyword">if</span> @attrs.keyup?
node.onkeyup = ~>
@attrs.keyup ...
<span class="hljs-keyword">if</span> @attrs.change?
node.onchange = ~>
@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 |> map (.SetEvents?!)
Make: <span class="hljs-function">-></span>
d = q.defer!
dom = @Resolve!
dom
.<span class="hljs-keyword">then</span> ~>
d.resolve it.Render @parent
it.SetEvents!
.<span class="hljs-keyword">catch</span> -> d.reject it
<span class="hljs-keyword">return</span> d.promise
GetElement: <span class="hljs-function">-></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">¶</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> -></span>
AddChild: <span class="hljs-function">-></span>
@origChildren.push it
@
_Flatten: <span class="hljs-function"><span class="hljs-params">(array)</span> -></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 |> filter -> it?
_MakeAttrStr: <span class="hljs-function">-></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> -></span></pre></div></div>
</li>
<li id="section-4">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-4">¶</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> => @_String <span class="hljs-string">''</span>, done
| <span class="hljs-keyword">typeof</span>! child <span class="hljs-keyword">is</span> \String => @_String child, done
| <span class="hljs-keyword">typeof</span>! child <span class="hljs-keyword">is</span> \Array => @_Array child, done
| child.<span class="hljs-keyword">then</span>? => @_Promise child, done
| child._promise? => @_ResourcePromise child, done
| child.Then? => @_ResourceInst child, done
| child._type <span class="hljs-keyword">is</span> \Node => @_Node child, done
| child.Render? => @_View child, done
| <span class="hljs-keyword">typeof</span>! child <span class="hljs-keyword">is</span> \Function => @_Function child, done
| _ => @_String <span class="hljs-string">''</span> + child, done
_String: <span class="hljs-function"><span class="hljs-params">(text, done)</span> -></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> -></span> done <span class="hljs-literal">null</span> node
_Array: <span class="hljs-function"><span class="hljs-params">(array, done)</span> -></span> async.mapSeries array, @~_ResolveType, done
_Function: <span class="hljs-function"><span class="hljs-params">(f, done)</span> -></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> -></span>
view.Render (err, res) ~>
<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> -></span>
promise
.<span class="hljs-keyword">then</span> -> done <span class="hljs-literal">null</span>, it
.<span class="hljs-keyword">catch</span> -> done it
_ResourceInst: <span class="hljs-function"><span class="hljs-params">(resourceInst, done)</span> -></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> -></span>
resourcePromise
.Then ~>
@_ResolveType it, done
.Catch -> 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) ->
@name = \func
@attrs = anchor: Node.anchorNb++
@children = []
first = <span class="hljs-literal">true</span>
N.Watch ~></pre></div></div>
</li>
<li id="section-5">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-5">¶</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">-></span>
d = q.defer!
@_ResolveType @func!, (err, child) ~>
<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) ~>
promise = item.Resolve!
<span class="hljs-keyword">if</span> promise.<span class="hljs-keyword">then</span>?
promise.<span class="hljs-keyword">then</span> -> 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) ~>
<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> -></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> ~>
<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> ->
d.reject it
<span class="hljs-keyword">return</span> d.promise
tags |> each (tag) ->
DOM[tag] = <span class="hljs-function"><span class="hljs-params">(...args)</span> -></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> -></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">¶</a>
</div>
<p>(intersection tags, keys window) |> each ->
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">¶</a>
</div>
<p>window.Node = Node</p>
</div>
</li>
</ul>
</div>
</body>
</html>