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 | |
| parent | switch to self-rendering lua code (diff) | |
| download | mmm-28569b422ae3206209384b09dc5d60155e9f670e.tar.gz mmm-28569b422ae3206209384b09dc5d60155e9f670e.zip | |
stable serverside rendering
| -rw-r--r-- | app/index.moon | 3 | ||||
| m--------- | dist | 0 | ||||
| -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 (renamed from client.moon) | 1 | ||||
| -rw-r--r-- | lib/init.server.moon (renamed from server.moon) | 2 | ||||
| -rw-r--r-- | lib/ordered.shared.moon | 27 | ||||
| -rw-r--r-- | render.moon | 8 |
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>" |
