aboutsummaryrefslogtreecommitdiffstats
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
parentswitch to self-rendering lua code (diff)
downloadmmm-28569b422ae3206209384b09dc5d60155e9f670e.tar.gz
mmm-28569b422ae3206209384b09dc5d60155e9f670e.zip
stable serverside rendering
-rw-r--r--app/index.moon3
m---------dist0
-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.moon (renamed from client.moon)1
-rw-r--r--lib/init.server.moon (renamed from server.moon)2
-rw-r--r--lib/ordered.shared.moon27
-rw-r--r--render.moon8
9 files changed, 42 insertions, 16 deletions
diff --git a/app/index.moon b/app/index.moon
index 59f7a4f..44df8bc 100644
--- a/app/index.moon
+++ b/app/index.moon
@@ -1,4 +1,5 @@
import h1, p, a, br, ul, tt, li from require 'lib.html'
+import opairs from require 'lib.ordered'
moon = '\xe2\x98\xbd'
demos =
@@ -34,7 +35,7 @@ append p {
'.'
}
append p 'current demos:'
-append ul for name, desc in pairs demos
+append ul for name, desc in opairs demos
li (a name, href: "/#{name}.html"), ': ', desc
append p {
diff --git a/dist b/dist
-Subproject 19c3c05a3427978d76af70c4656ba082f20af25
+Subproject 23385318986b083adfb1c2b6d5c25f2848515b9
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/client.moon b/lib/init.client.moon
index 884d96b..509f225 100644
--- a/client.moon
+++ b/lib/init.client.moon
@@ -9,7 +9,6 @@ print = window.console\log
warn = window.console\warn
-- package.path = './?.shared.lua;./?.client.lua;' .. package.path
-print package.path
package.path = './?.shared.moon.lua;./?.client.moon.lua;./?.moon.lua;./?/init.moon.lua;./?.lua;./?/init.lua'
-- relative imports
diff --git a/server.moon b/lib/init.server.moon
index add40ef..912bbb4 100644
--- a/server.moon
+++ b/lib/init.server.moon
@@ -1,5 +1,3 @@
-package.moonpath = './?.shared.moon;./?.server.moon;' .. package.moonpath
-
export MODE, warn, relative, append, on_client
MODE = 'SERVER'
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
+}
diff --git a/render.moon b/render.moon
index f56e8b8..af6b60b 100644
--- a/render.moon
+++ b/render.moon
@@ -1,5 +1,7 @@
+package.moonpath = './?.shared.moon;./?.server.moon;' .. package.moonpath
+
import to_lua from require 'moonscript.base'
-import flush from require 'server'
+import flush from require 'lib.init'
error "please specify the module to build as an argumnet" unless arg[1]
@@ -18,9 +20,7 @@ print "<!DOCTYPE html>
</head>
<body>
<script src=\"fengari-web.js\"></script>
- <script type=\"application/lua\">
- #{to_lua load_file 'client.moon'}
- </script>
+ <script src=\"lib/init.client.lua\"></script>
#{flush!}
</body>
</html>"