aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2019-09-15 21:32:55 +0000
committers-ol <s-ol@users.noreply.github.com>2019-09-15 21:33:23 +0000
commit20b00cb70d73137acee0cc800f212b0f19e90ce7 (patch)
tree25652b905d8b2284f56459a0001007ab9d19315f
parentfix code font (diff)
downloadmmm-20b00cb70d73137acee0cc800f212b0f19e90ce7.tar.gz
mmm-20b00cb70d73137acee0cc800f212b0f19e90ce7.zip
wip zip
-rw-r--r--mmm/mmmfs/browser.moon4
-rw-r--r--mmm/mmmfs/fileder.moon9
-rw-r--r--mmm/mmmfs/zip.moon59
-rw-r--r--render_all.moon76
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"