diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2019-09-15 21:32:55 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2019-09-15 21:33:23 +0000 |
| commit | 20b00cb70d73137acee0cc800f212b0f19e90ce7 (patch) | |
| tree | 25652b905d8b2284f56459a0001007ab9d19315f | |
| parent | fix code font (diff) | |
| download | mmm-20b00cb70d73137acee0cc800f212b0f19e90ce7.tar.gz mmm-20b00cb70d73137acee0cc800f212b0f19e90ce7.zip | |
wip zip
| -rw-r--r-- | mmm/mmmfs/browser.moon | 4 | ||||
| -rw-r--r-- | mmm/mmmfs/fileder.moon | 9 | ||||
| -rw-r--r-- | mmm/mmmfs/zip.moon | 59 | ||||
| -rw-r--r-- | render_all.moon | 76 |
4 files changed, 142 insertions, 6 deletions
diff --git a/mmm/mmmfs/browser.moon b/mmm/mmmfs/browser.moon index 379537e..f94b62a 100644 --- a/mmm/mmmfs/browser.moon +++ b/mmm/mmmfs/browser.moon @@ -35,12 +35,12 @@ for convert in *converts table.insert casts, convert class Browser - new: (@root, path='', rehydrate=false) => + new: (@root, path, rehydrate=false) => -- root fileder assert @root, 'root fileder is nil' -- active path - @path = ReactiveVar path + @path = ReactiveVar path or '' -- update URL bar if MODE == 'CLIENT' diff --git a/mmm/mmmfs/fileder.moon b/mmm/mmmfs/fileder.moon index 0055a88..16eef77 100644 --- a/mmm/mmmfs/fileder.moon +++ b/mmm/mmmfs/fileder.moon @@ -95,11 +95,12 @@ class Fileder -- * path - the path to mount at -- * mount_as - dont append own name to path mount: (path, mount_as) => - assert not @path, "mounted twice: #{@path} and now #{path}" + if not mount_as + path ..= @gett 'name: alpha' + + assert not @path or @path == path, "mounted twice: #{@path} and now #{path}" @path = path - if not mount_as - @path ..= @gett 'name: alpha' for child in *@children child\mount @path .. '/' @@ -159,7 +160,7 @@ class Fileder key, conversions = @find want if key - value = apply_conversions conversions, @facets[key], @, key + value = apply_conversions conversions, @facets[key]!, @, key value, key -- like @get, throw if no value or conversion path diff --git a/mmm/mmmfs/zip.moon b/mmm/mmmfs/zip.moon new file mode 100644 index 0000000..c6417e2 --- /dev/null +++ b/mmm/mmmfs/zip.moon @@ -0,0 +1,59 @@ +require = relative ..., 1 +import Fileder, Key from require '.fileder' +zip = require 'brimworks.zip' + +-- split filename into dirname + basename +dir_base = (path) -> + dir, base = path\match '(.-)([^/]-)$' + if dir and #dir > 0 + dir = dir\sub 1, #dir - 1 + + dir, base + +-- insert into array unless contained +table_add = (tbl, entry) -> + for _, v in ipairs tbl + if v == entry + return + + table.insert tbl, entry + +-- strip facet formatting +load_facet = (filename) -> + key = (filename\match '(.*)%.%w+') or filename + key = Key key\gsub '%$', '/' + key.filename = filename + + key + +load_tree = (file='root.zip') -> + archive = zip.open file + + fileders = setmetatable {}, + __index: (path) => + with val = Fileder {} + .path = path + rawset @, path, val + + fileders['/root'].facets['name: alpha'] = -> 'root' + + for i = 1, #archive + { :name, :size } = archive\stat i + + path, facet = dir_base "/#{name}" + parent, name = dir_base path + + key = load_facet facet + + this = fileders[path] + this.facets['name: alpha'] = -> name + this.facets[key] = -> + file = archive\open i + with file\read size + file\close! + + table_add fileders[parent].children, this + + fileders['/root'] + +{ :load_tree } diff --git a/render_all.moon b/render_all.moon new file mode 100644 index 0000000..3d295c9 --- /dev/null +++ b/render_all.moon @@ -0,0 +1,76 @@ +add = (tmpl) -> + package.path ..= ";#{tmpl}.lua" + package.moonpath ..= ";#{tmpl}.moon" + +add '?' +add '?.server' +add '?/init' +add '?/init.server' + +require 'mmm' +import tohtml from require 'mmm.component' +import Browser from require 'mmm.mmmfs.browser' +import load_tree from require 'mmm.mmmfs.zip' +import get_meta, header, footer from require 'build.layout' + +export BROWSER + +render = (fileder, output) -> + BROWSER = Browser fileder + + with io.open output, 'w' + \write [[ + <!DOCTYPE html> + <html> + <head> + <link rel="stylesheet" type="text/css" href="/main.css" /> + <!-- + <link rel="preload" as="fetch" href="/mmm/dom/init.lua" /> + <link rel="preload" as="fetch" href="/mmm/component/init.lua" /> + <link rel="preload" as="fetch" href="/mmm/mmmfs/init.lua" /> + <link rel="preload" as="fetch" href="/mmm/mmmfs/fileder.lua" /> + <link rel="preload" as="fetch" href="/mmm/mmmfs/browser.lua" /> + --> + + <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,400" rel="stylesheet"> + ]] + \write " + #{get_meta fileder} + </head> + <body> + #{header} + + #{assert (tohtml BROWSER), "couldn't render BROWSER"} + + #{footer} + " + \write [[ + <script src="/highlight.pack.js"></script> + <script src="//cdnjs.cloudflare.com/ajax/libs/marked/0.5.1/marked.min.js"></script> + <script src="//cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.6/svg.min.js"></script> + <script src="//platform.twitter.com/widgets.js" charset="utf-8"></script> + <script src="/fengari-web.js"></script> + <script type="application/lua" src="/mmm.bundle.lua"></script> + <script type="application/lua">require 'mmm'</script> + ]] + \write " + <script type=\"application/lua\"> + on_load = on_load or {} + table.insert(on_load, function() + local path = #{string.format '%q', path} + local browser = require 'mmm.mmmfs.browser' + local root = dofile '/$bundle.lua' + root:mount('', true) + + BROWSER = browser.Browser(root, path, true) + end) + </script> + </body> + </html> + " + \close! + +for fileder in coroutine.wrap load_tree!\iterate + print "rendering '#{fileder.path}'..." + os.execute "mkdir -p 'out/#{fileder.path}'" + render fileder, "out/#{fileder.path}/index.html" |
