diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2018-10-19 04:58:14 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2018-10-19 04:58:14 +0000 |
| commit | 28569b422ae3206209384b09dc5d60155e9f670e (patch) | |
| tree | a7524c6d7b8ff7e41f020274e4e51a56e06ce7b7 /lib | |
| parent | switch to self-rendering lua code (diff) | |
| download | mmm-28569b422ae3206209384b09dc5d60155e9f670e.tar.gz mmm-28569b422ae3206209384b09dc5d60155e9f670e.zip | |
stable serverside rendering
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/component.client.moon | 2 | ||||
| -rw-r--r-- | lib/component.server.moon | 8 | ||||
| -rw-r--r-- | lib/html.server.moon | 7 | ||||
| -rw-r--r-- | lib/init.client.moon | 23 | ||||
| -rw-r--r-- | lib/init.server.moon | 40 | ||||
| -rw-r--r-- | lib/ordered.shared.moon | 27 |
6 files changed, 99 insertions, 8 deletions
diff --git a/lib/component.client.moon b/lib/component.client.moon index c012427..ee0f9ca 100644 --- a/lib/component.client.moon +++ b/lib/component.client.moon @@ -1,5 +1,3 @@ -{ :document } = js.global - -- convert anything to a DOM Node -- val must be one of: -- * DOM Node (instanceof window.Node) diff --git a/lib/component.server.moon b/lib/component.server.moon index 456ca71..54bb15c 100644 --- a/lib/component.server.moon +++ b/lib/component.server.moon @@ -1,3 +1,5 @@ +import opairs from require 'lib.ordered' + -- convert anything to HTML string -- val must be one of: -- * MMMElement (have a .render method that returns a string) @@ -69,7 +71,7 @@ class ReactiveElement set: (attr, value) => if attr == 'style' and 'table' == type value - for k,v in pairs value + for k,v in opairs value @attrs.style[k] = v return @@ -88,10 +90,10 @@ class ReactiveElement render: => b = "<#{@element}" - for k,v in pairs @attrs + for k,v in opairs @attrs if 'table' == type v tmp = '' - for kk, vv in pairs v + for kk, vv in opairs v tmp ..= "#{kk}: #{vv}; " v = tmp b ..= " #{k}=\"#{v}\"" diff --git a/lib/html.server.moon b/lib/html.server.moon index cc68fc7..565867c 100644 --- a/lib/html.server.moon +++ b/lib/html.server.moon @@ -1,3 +1,5 @@ +import opairs from require 'lib.ordered' + element = (element) -> (...) -> children = { ... } @@ -9,11 +11,10 @@ element = (element) -> (...) -> attributes = {} b = "<#{element}" - for k,v in pairs attributes - continue unless 'string' == type k + for k,v in opairs attributes if 'table' == type v tmp = '' - for kk, vv in pairs v + for kk, vv in opairs v tmp ..= "#{kk}: #{vv}; " v = tmp b ..= " #{k}=\"#{v}\"" diff --git a/lib/init.client.moon b/lib/init.client.moon new file mode 100644 index 0000000..509f225 --- /dev/null +++ b/lib/init.client.moon @@ -0,0 +1,23 @@ +export MODE, print, warn, relative, append, on_client +export window, document + +window = js.global +document = window.document + +MODE = 'CLIENT' +print = window.console\log +warn = window.console\warn + +-- package.path = './?.shared.lua;./?.client.lua;' .. package.path +package.path = './?.shared.moon.lua;./?.client.moon.lua;./?.moon.lua;./?/init.moon.lua;./?.lua;./?/init.lua' + +-- relative imports +relative = (...) -> + path = ... + + (name) -> + name = path .. name if '.' == name\sub 1, 1 + require name + +append = document.body\appendChild +on_client = (f, ...) -> f ... diff --git a/lib/init.server.moon b/lib/init.server.moon new file mode 100644 index 0000000..912bbb4 --- /dev/null +++ b/lib/init.server.moon @@ -0,0 +1,40 @@ +export MODE, warn, relative, append, on_client +MODE = 'SERVER' + +-- warning messages +warn = (...) -> + io.stderr\write table.concat { ... }, '\t' + io.stderr\write '\n' + +-- relative imports +relative = (...) -> + _require = require + path = ... + + (name) -> + name = path .. name if '.' == name\sub 1, 1 + require name + +-- shorthand to append elements to body +buffer = '' +append = (val) -> + buffer ..= val + +import compile, insert_loader from require 'duct_tape' +insert_loader! + +on_client = (fn, ...) -> + args = {...} + -- warn code + append "<script type=\"application/lua\"> + MODE = 'HYBRID' + local fn = #{compile fn} + fn(#{table.concat [string.format '%q', v for v in *args ], ', '}) + </script>" + +{ + -- access / flush the appended data + flush: -> + with x = buffer + buffer = '' +} diff --git a/lib/ordered.shared.moon b/lib/ordered.shared.moon new file mode 100644 index 0000000..59c07bf --- /dev/null +++ b/lib/ordered.shared.moon @@ -0,0 +1,27 @@ +-- ordered table iterator, for stable(r) renderers + +sort = (t, order_fn) -> + with index = [k for k,v in pairs t when 'string' == type k] + table.sort index, order_fn + +-- ordered next(t) +onext = (state, key) -> + state.i += 1 + { :t, :index, :i } = state + + if key = index[i] + key, t[key] + +-- ordered pairs(t). order_fn is optional; see table.sort +opairs = (t, order_fn) -> + state = { + :t, + i: 0, + index: sort t, order_fn + } + onext, state, nil + +{ + :onext + :opairs +} |
