aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2018-10-19 04:58:14 +0000
committers-ol <s-ol@users.noreply.github.com>2018-10-19 04:58:14 +0000
commit28569b422ae3206209384b09dc5d60155e9f670e (patch)
treea7524c6d7b8ff7e41f020274e4e51a56e06ce7b7 /lib
parentswitch to self-rendering lua code (diff)
downloadmmm-28569b422ae3206209384b09dc5d60155e9f670e.tar.gz
mmm-28569b422ae3206209384b09dc5d60155e9f670e.zip
stable serverside rendering
Diffstat (limited to 'lib')
-rw-r--r--lib/component.client.moon2
-rw-r--r--lib/component.server.moon8
-rw-r--r--lib/html.server.moon7
-rw-r--r--lib/init.client.moon23
-rw-r--r--lib/init.server.moon40
-rw-r--r--lib/ordered.shared.moon27
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
+}