aboutsummaryrefslogtreecommitdiffstats
path: root/dump_tree.moon
blob: a35a2230c5491af4ebd58a336bb5899f1736f3e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package.moonpath = './?.server.moon;./?/init.server.moon;' .. package.moonpath
require 'mmm.init'
import Key from require 'mmm.mmmfs'
import load_fileder from require 'mmm.mmmfs.fs'
import to_lua from require 'moonscript.base'

-- usage:
-- moon render.moon <output> [fileder_path]
{ output_name, path } = arg

assert output_name, "please specify the output filename as an argument"
path or= '/'

root = load_fileder 'root' .. path
root\mount path

-- dump a fileder subtree as Lua source
dump_fileder = do
  escape = (str) -> string.format '%q', tostring str

  compile = (old, new, val) -> escape "
-- this property has been transpiled from '#{old}'
-- to '#{new}' for execution in the browser.
-- refer to the original property as the source.
#{to_lua val}"

  _dump = (fileder) ->
    code = "Fileder {"

    for key, val in pairs fileder.props
      code ..= "
        [#{escape key}] = #{escape val},"

      if key.type\match '^text/moonscript %->'
        newkey = Key key.name, key.type\gsub '^text/moonscript %-> (.*)', 'text/lua -> %1'
        code ..= "
          [fromcache(#{escape newkey}, #{escape key})] = #{compile key, newkey, val},"

    for child in *fileder.children
      code ..= "
        #{_dump child},"

    code ..= "
      }"
    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}
  "

with io.open output_name, 'w'
  \write dump_fileder root