diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2018-11-22 11:07:24 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2018-11-22 11:07:24 +0000 |
| commit | e98c5becba67d642b5fd5c6e4a206d79749e8953 (patch) | |
| tree | 34965a21413107e089a77da8886dd85022c9e651 /build | |
| parent | move glitch cube, torus4d to experiments (diff) | |
| download | mmm-e98c5becba67d642b5fd5c6e4a206d79749e8953.tar.gz mmm-e98c5becba67d642b5fd5c6e4a206d79749e8953.zip | |
bundle binary files as URLs
Diffstat (limited to 'build')
| -rw-r--r-- | build/bundle_fileder.moon | 155 | ||||
| -rw-r--r-- | build/bundle_module.moon | 51 | ||||
| -rw-r--r-- | build/render_fileder.moon | 47 | ||||
| -rw-r--r-- | build/util.moon | 16 |
4 files changed, 269 insertions, 0 deletions
diff --git a/build/bundle_fileder.moon b/build/bundle_fileder.moon new file mode 100644 index 0000000..c9f8c35 --- /dev/null +++ b/build/bundle_fileder.moon @@ -0,0 +1,155 @@ +require 'mmm' +import get_path from require 'build.util' +import Fileder, Key from require 'mmm.mmmfs.fileder' +import opairs from require 'mmm.ordered' +import to_lua from require 'moonscript.base' + +-- usage: +-- moon bundle_fileder.moon <path_to_root> <dirname> <facets>... -- <children>... +{ path_to_root, dirname } = arg + +assert path_to_root, "please specify the relative root path" +assert dirname, "please specify the fileder dirname" +path = get_path path_to_root + +facets = {} +children_bundles = {} + +do + addto = facets + for file in *arg[3,] + continue if file == 'Tupdefault.lua' + + if file == '--' + addto = children_bundles + continue + table.insert addto, file + +-- load a fs file as a fileder facet +load_facet = (filename) -> + key = (filename\match '(.*)%.%w+') or filename + key = Key key\gsub '%$', '/' + key.filename = filename + + file = assert (io.open filename, 'r'), "couldn't open facet file '#{filename}'" + value = file\read '*all' + file\close! + + key, value + +-- escape a string for lua aparser +escape = (str) -> string.format '%q', tostring str + +-- dump a fileder subtree as Lua source +dump_fileder = do + _dump = (fileder, root=false) -> + code = "Fileder {" + + for key, val in pairs fileder.facets + if key.original + key = "fromcache(#{escape key}, #{escape key.original})" + else + key = escape key + code ..= "\n[#{key}] = #{escape val}," + + for child in *fileder.children + code ..= "\n#{_dump child}," + + code ..= "\n}" + code + + + (fileder) -> " +local mmmfs = require 'mmm.mmmfs' +local Key, Fileder = mmmfs.Key, mmmfs.Fileder +local function fromcache(str, orig) + local key = Key(str) + key.original = Key(orig) + return key +end + +return #{_dump fileder, true} + " + +renders = { + { + inp: '^text/moonscript %-> (.*)' + out: 'text/lua -> %1' + render: (val, fileder, old, new) -> + lua, err = to_lua val + + if not lua + error "Error compiling #{old}: #{err}" + + "-- this moonscript facet has been transpiled to +-- '#{new}' for execution in the browser. +-- refer to the original facet as the source. +#{lua}" + }, + { + inp: '^image/' + out: 'URL -> %0' + render: (val, fileder, old, new) -> "#{fileder.path}/#{old.filename}", "[binary removed]" + }, + { + inp: '^video/' + out: 'URL -> %0' + render: (val, fileder, old, new) -> "#{fileder.path}/#{old.filename}", "[binary removed]" + }, +} + +with io.open '$bundle.lua', 'w' + \write dump_fileder with fileder = Fileder 'name: alpha': dirname + \mount path, true + + order = nil + children = {} + + for facet in *facets + if facet == '$order' + order = [line for line in io.lines facet] + continue + key, value = load_facet facet + .facets[key] = value + + extra_facets = {} + for key, value in pairs .facets + for { :inp, :out, :render } in *renders + continue unless key.type\match inp + + built_key = Key key.name, key.type\gsub inp, out + built_key.original = key + + -- dont overwrite existing keys + continue if \has built_key + + rendered, replace = render value, fileder, key, built_key + + extra_facets[built_key] = rendered + .facets[key] = replace if replace + + break + + for k,v in pairs extra_facets + .facets[k] = v + + for child in *children_bundles + -- @BUG: child bundles are malformed due to Tup bug ($ symbol) + child = child\gsub '/%.lua$', '/$bundle.lua' + + dirname = assert child\match '^([%w-_%.]+)/%$bundle%.lua$' + children[dirname] = dofile child + + if order + -- order from order file + for i, name in pairs order + child = assert children[name], "child in $order but not fs: #{name}" + table.insert .children, child + children[name] = nil + + -- sort remainder alphabeticalally + for name, child in opairs children + table.insert .children, child + warn "child #{name} not in $order!" if order + + \close! diff --git a/build/bundle_module.moon b/build/bundle_module.moon new file mode 100644 index 0000000..1c6b5f6 --- /dev/null +++ b/build/bundle_module.moon @@ -0,0 +1,51 @@ +output_name = assert arg[1], "please specify the output directory" + +escape = (str) -> string.format '%q', str + +readfile = (name) -> + file = io.open name, 'r' + with file\read '*all' + file\close + +with io.open output_name, 'w' + -- final wrap mode + if arg[2] == '--wrap' + assert #arg == 3, "too many arguments for 'wrap' mode" + bundle = arg[3] + + bundle = dofile bundle + \write "local p = package.preload\n" + for { :module, :file, :source } in *bundle + module = escape module + \write "if not p[#{module}] then p[#{module}] = load(#{escape source}, #{escape file}) end\n" + + -- iterative bundling mode + else + \write "return {\n" + + this = assert arg[2] + addmod = (module, file, source) -> + modname = "#{this}.#{module}" + modname = this if module == 'init' + \write " +{ + module = #{escape modname}, + file = #{escape "#{this}/#{file}"}, + source = #{escape source}, +}," + + for file in *arg[3,] + if dirname = file\match '^([%w-_]+)/%.bundle%.lua$' + bundle = dofile file + for { :module, :file, :source } in *bundle + addmod module, file, source + else + module = file\gsub '%.lua$', '' + continue if module\match '%.server' + module = module\gsub '%.client$', '' + module = module\gsub '%.init$', '' + addmod module, file, readfile file + + \write "}" + + \close! diff --git a/build/render_fileder.moon b/build/render_fileder.moon new file mode 100644 index 0000000..d76d162 --- /dev/null +++ b/build/render_fileder.moon @@ -0,0 +1,47 @@ +require 'mmm' +import render from require 'mmm.mmmfs' +import get_path from require 'build.util' + +-- usage: +-- moon render.moon <path_to_root> +{ path_to_root } = arg + +assert path_to_root, "please specify the relative root path" +path = get_path path_to_root + +root = dofile '$bundle.lua' +assert root, "couldn't load $bundle.lua" +root\mount path, true + +content, rehydrate = render root, path +assert content, "no content" + +with io.open 'index.html', 'w' + \write "<!DOCTYPE html> +<html> + <head> + <meta charset=\"UTF-8\"> + <title>MMM: lunar low-gravity scripting playground</title> + <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\" /> + --> + </head> + <body> + #{content} + + <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=\"/fengari-web.js\"></script> + <script type=\"application/lua\" src=\"/mmm.bundle.lua\"></script> + <script type=\"application/lua\">require 'mmm'</script> + + #{rehydrate} + </body> +</html>" + \close! diff --git a/build/util.moon b/build/util.moon new file mode 100644 index 0000000..b9c9613 --- /dev/null +++ b/build/util.moon @@ -0,0 +1,16 @@ +require 'lfs' + +get_path = (root) -> + cwd = lfs.currentdir! + path = '' + + while root\find '^%.%./' + root = root\match '^%.%./(.*)' + cwd, trimmed = cwd\match '(.*)(/[^/]+)$' + path = trimmed .. path + + path + +{ + :get_path +} |
