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/bundle_fileder.moon | |
| 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/bundle_fileder.moon')
| -rw-r--r-- | build/bundle_fileder.moon | 155 |
1 files changed, 155 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! |
