From 20b00cb70d73137acee0cc800f212b0f19e90ce7 Mon Sep 17 00:00:00 2001 From: s-ol Date: Sun, 15 Sep 2019 23:32:55 +0200 Subject: wip zip --- mmm/mmmfs/browser.moon | 4 +-- mmm/mmmfs/fileder.moon | 9 +++--- mmm/mmmfs/zip.moon | 59 +++++++++++++++++++++++++++++++++++++++ render_all.moon | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+), 6 deletions(-) create mode 100644 mmm/mmmfs/zip.moon create mode 100644 render_all.moon 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 [[ + + + + + + + + ]] + \write " + #{get_meta fileder} + + + #{header} + + #{assert (tohtml BROWSER), "couldn't render BROWSER"} + + #{footer} + " + \write [[ + + + + + + + + ]] + \write " + + + + " + \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" -- cgit v1.2.3