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
|