git.s-ol.nu mmm / 5e145f9
clean up a little s-ol 3 years ago
7 changed file(s) with 170 addition(s) and 417 deletion(s). Raw diff Collapse all Expand all
00 dist
11 out
2 db.sqlite3
23 ##### TUP GITIGNORE #####
34 ##### Lines below automatically generated by Tup.
45 ##### Do not edit.
+0
-155
build/bundle_fileder.moon less more
0 require 'mmm'
1 import get_path from require 'build.util'
2 import Fileder, Key from require 'mmm.mmmfs.fileder'
3 import opairs from require 'mmm.ordered'
4 import to_lua from require 'moonscript.base'
5
6 -- usage:
7 -- moon bundle_fileder.moon <path_to_root> <dirname> <facets>... -- <children>...
8 { path_to_root, dirname } = arg
9
10 assert path_to_root, "please specify the relative root path"
11 assert dirname, "please specify the fileder dirname"
12 path = get_path path_to_root
13
14 facets = {}
15 children_bundles = {}
16
17 do
18 addto = facets
19 for file in *arg[3,]
20 continue if file == 'Tupdefault.lua'
21
22 if file == '--'
23 addto = children_bundles
24 continue
25 table.insert addto, file
26
27 -- load a fs file as a fileder facet
28 load_facet = (filename) ->
29 key = (filename\match '(.*)%.%w+') or filename
30 key = Key key\gsub '%$', '/'
31 key.filename = filename
32
33 file = assert (io.open filename, 'r'), "couldn't open facet file '#{filename}'"
34 value = file\read '*all'
35 file\close!
36
37 key, value
38
39 -- escape a string for lua aparser
40 escape = (str) -> string.format '%q', tostring str
41
42 -- dump a fileder subtree as Lua source
43 dump_fileder = do
44 _dump = (fileder, root=false) ->
45 code = "Fileder {"
46
47 for key, val in pairs fileder.facets
48 if key.original
49 key = "fromcache(#{escape key}, #{escape key.original})"
50 else
51 key = escape key
52 code ..= "\n[#{key}] = #{escape val},"
53
54 for child in *fileder.children
55 code ..= "\n#{_dump child},"
56
57 code ..= "\n}"
58 code
59
60
61 (fileder) -> "
62 local mmmfs = require 'mmm.mmmfs'
63 local Key, Fileder = mmmfs.Key, mmmfs.Fileder
64 local function fromcache(str, orig)
65 local key = Key(str)
66 key.original = Key(orig)
67 return key
68 end
69
70 return #{_dump fileder, true}
71 "
72
73 renders = {
74 {
75 inp: '^text/moonscript %-> (.*)'
76 out: 'text/lua -> %1'
77 render: (val, fileder, old, new) ->
78 lua, err = to_lua val
79
80 if not lua
81 error "Error compiling #{old}: #{err}"
82
83 "-- this moonscript facet has been transpiled to
84 -- '#{new}' for execution in the browser.
85 -- refer to the original facet as the source.
86 #{lua}"
87 },
88 {
89 inp: '^image/'
90 out: 'URL -> %0'
91 render: (val, fileder, old, new) -> "#{fileder.path}/#{old.filename}", "[binary removed]"
92 },
93 {
94 inp: '^video/'
95 out: 'URL -> %0'
96 render: (val, fileder, old, new) -> "#{fileder.path}/#{old.filename}", "[binary removed]"
97 },
98 }
99
100 with io.open '$bundle.lua', 'w'
101 \write dump_fileder with fileder = Fileder 'name: alpha': dirname
102 \mount path, true
103
104 order = nil
105 children = {}
106
107 for facet in *facets
108 if facet == '$order'
109 order = [line for line in io.lines facet]
110 continue
111 key, value = load_facet facet
112 .facets[key] = value
113
114 extra_facets = {}
115 for key, value in pairs .facets
116 for { :inp, :out, :render } in *renders
117 continue unless key.type\match inp
118
119 built_key = Key key.name, key.type\gsub inp, out
120 built_key.original = key
121
122 -- dont overwrite existing keys
123 continue if \has built_key
124
125 rendered, replace = render value, fileder, key, built_key
126
127 extra_facets[built_key] = rendered
128 .facets[key] = replace if replace
129
130 break
131
132 for k,v in pairs extra_facets
133 .facets[k] = v
134
135 for child in *children_bundles
136 -- @BUG: child bundles are malformed due to Tup bug ($ symbol)
137 child = child\gsub '/%.lua$', '/$bundle.lua'
138
139 dirname = assert child\match '^([%w-_%.]+)/%$bundle%.lua$'
140 children[dirname] = dofile child
141
142 if order
143 -- order from order file
144 for i, name in pairs order
145 child = assert children[name], "child in $order but not fs: #{name}"
146 table.insert .children, child
147 children[name] = nil
148
149 -- sort remainder alphabeticalally
150 for name, child in opairs children
151 table.insert .children, child
152 warn "child #{name} not in $order!" if order
153
154 \close!
0 add = (tmpl) ->
1 package.path ..= ";#{tmpl}.lua"
2 package.moonpath ..= ";#{tmpl}.moon"
3
4 add '?'
5 add '?.server'
6 add '?/init'
7 add '?/init.server'
8
9 require 'mmm'
10 require 'lfs'
11 import Fileder, Key from require 'mmm.mmmfs.fileder'
12 import SQLStore from require 'mmm.mmmfs.drivers.sql'
13
14 -- usage:
15 -- moon import_all.moon <root>
16 { root } = arg
17
18 assert root, "please specify the root directory"
19
20 -- load a fs file as a fileder facet
21 load_facet = (filename, filepath) ->
22 key = (filename\match '(.*)%.%w+') or filename
23 key = Key key\gsub '%$', '/'
24 key.filename = filename
25
26 file = assert (io.open filepath, 'r'), "couldn't open facet file '#{filename}'"
27 value = file\read '*all'
28 file\close!
29
30 key, value
31
32
33 with SQLStore verbose: true
34 import_fileder = (fileder, dirpath) ->
35 for file in lfs.dir dirpath
36 continue if '.' == file\sub 1, 1
37 continue if file == 'Tupdefault.lua'
38 continue if file == 'index.html'
39 continue if file == '$order'
40
41 filepath = "#{dirpath}/#{file}"
42 attr = lfs.attributes filepath
43 switch attr.mode
44 when 'file'
45 key, value = load_facet file, filepath
46 \create_facet fileder, key.name, key.type, value
47 when 'directory'
48 next_fileder = \create_fileder fileder, file
49 -- \create_facet next_fileder, 'name', 'alpha', file
50 import_fileder next_fileder, filepath
51 else
52 warn "unknown entry type '#{attr.mode}'"
53
54 import_fileder '', root
0 add = (tmpl) ->
1 package.path ..= ";#{tmpl}.lua"
2 package.moonpath ..= ";#{tmpl}.moon"
3
4 add '?'
5 add '?.server'
6 add '?/init'
7 add '?/init.server'
8
9 require 'mmm'
10 import tohtml from require 'mmm.component'
11 import Browser from require 'mmm.mmmfs.browser'
12 import get_meta, header, footer from require 'build.layout'
13
14 export BROWSER
15
16 render = (fileder, output) ->
17 BROWSER = Browser fileder
18
19 with io.open output, 'w'
20 \write [[
21 <!DOCTYPE html>
22 <html>
23 <head>
24 <link rel="stylesheet" type="text/css" href="/main.css" />
25 <!--
26 <link rel="preload" as="fetch" href="/mmm/dom/init.lua" />
27 <link rel="preload" as="fetch" href="/mmm/component/init.lua" />
28 <link rel="preload" as="fetch" href="/mmm/mmmfs/init.lua" />
29 <link rel="preload" as="fetch" href="/mmm/mmmfs/fileder.lua" />
30 <link rel="preload" as="fetch" href="/mmm/mmmfs/browser.lua" />
31 -->
32
33 <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,400" rel="stylesheet">
34 ]]
35 \write "
36 #{get_meta fileder}
37 </head>
38 <body>
39 #{header}
40
41 #{assert (tohtml BROWSER), "couldn't render BROWSER"}
42
43 #{footer}
44 "
45 \write [[
46 <script src="/highlight.pack.js"></script>
47 <script src="//cdnjs.cloudflare.com/ajax/libs/marked/0.5.1/marked.min.js"></script>
48 <script src="//cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.6/svg.min.js"></script>
49 <script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
50 <script src="/fengari-web.js"></script>
51 <script type="application/lua" src="/mmm.bundle.lua"></script>
52 <script type="application/lua">require 'mmm'</script>
53 ]]
54 \write "
55 <script type=\"application/lua\">
56 on_load = on_load or {}
57 table.insert(on_load, function()
58 local path = #{string.format '%q', path}
59 local browser = require 'mmm.mmmfs.browser'
60 local root = dofile '/$bundle.lua'
61 root:mount('', true)
62
63 BROWSER = browser.Browser(root, path, true)
64 end)
65 </script>
66 </body>
67 </html>
68 "
69 \close!
70
71 import SQLStore from require 'mmm.mmmfs.drivers.sql'
72 import Fileder, Key from require 'mmm.mmmfs.fileder'
73
74 -- split filename into dirname + basename
75 dir_base = (path) ->
76 dir, base = path\match '(.-)([^/]-)$'
77 if dir and #dir > 0
78 dir = dir\sub 1, #dir - 1
79
80 dir, base
81
82 load_tree = (store, root='') ->
83 fileders = setmetatable {},
84 __index: (path) =>
85 with val = Fileder {}
86 .path = path
87 rawset @, path, val
88
89 root = fileders[root]
90 root.facets['name: alpha'] = ''
91 for fn, ft in store\list_facets root.path
92 val = store\load_facet root.path, fn, ft
93 root.facets[Key fn, ft] = val
94
95 for path in store\list_all_fileders root.path
96 fileder = fileders[path]
97
98 parent, name = dir_base path
99 fileder.facets['name: alpha'] = name
100 table.insert fileders[parent].children, fileder
101
102 for fn, ft in store\list_facets path
103 val = store\load_facet path, fn, ft
104 fileder.facets[Key fn, ft] = val
105
106 root
107
108 tree = load_tree SQLStore!
109
110 for fileder in coroutine.wrap tree\iterate
111 print "rendering '#{fileder.path}'..."
112 os.execute "mkdir -p 'out/#{fileder.path}'"
113 render fileder, "out/#{fileder.path}/index.html"
+0
-93
build/render_fileder.moon less more
0 require 'mmm'
1 import get_path from require 'build.util'
2 import tohtml from require 'mmm.component'
3 import Browser from require 'mmm.mmmfs.browser'
4 import get_meta, header, footer from require 'build.layout'
5
6 export BROWSER
7
8 -- usage:
9 -- moon render.moon <path_to_root>
10 { path_to_root } = arg
11
12 assert path_to_root, "please specify the relative root path"
13 path = get_path path_to_root
14
15 do
16 seed = (str) ->
17 len = #str
18 rnd = -> math.ceil math.random! * len
19
20 math.randomseed len
21
22 return if len == 0
23
24 upper, lower = 0, 0
25 for i=1,4
26 upper += str\byte rnd!
27 upper *= 0x100
28
29 lower += str\byte rnd!
30 lower *= 0x100
31
32 math.randomseed upper, lower
33
34 seed path
35
36 root = dofile '$bundle.lua'
37 assert root, "couldn't load $bundle.lua"
38 root\mount path, true
39
40 BROWSER = Browser root, path
41
42 with io.open 'index.html', 'w'
43 \write [[
44 <!DOCTYPE html>
45 <html>
46 <head>
47 <link rel="stylesheet" type="text/css" href="/main.css" />
48 <!--
49 <link rel="preload" as="fetch" href="/mmm/dom/init.lua" />
50 <link rel="preload" as="fetch" href="/mmm/component/init.lua" />
51 <link rel="preload" as="fetch" href="/mmm/mmmfs/init.lua" />
52 <link rel="preload" as="fetch" href="/mmm/mmmfs/fileder.lua" />
53 <link rel="preload" as="fetch" href="/mmm/mmmfs/browser.lua" />
54 -->
55
56 <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,400" rel="stylesheet">
57 ]]
58 \write "
59 #{get_meta root}
60 </head>
61 <body>
62 #{header}
63
64 #{assert (tohtml BROWSER), "couldn't render BROWSER"}
65
66 #{footer}
67 "
68 \write [[
69 <script src="/highlight.pack.js"></script>
70 <script src="//cdnjs.cloudflare.com/ajax/libs/marked/0.5.1/marked.min.js"></script>
71 <script src="//cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.6/svg.min.js"></script>
72 <script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
73 <script src="/fengari-web.js"></script>
74 <script type="application/lua" src="/mmm.bundle.lua"></script>
75 <script type="application/lua">require 'mmm'</script>
76 ]]
77 \write "
78 <script type=\"application/lua\">
79 on_load = on_load or {}
80 table.insert(on_load, function()
81 local path = #{string.format '%q', path}
82 local browser = require 'mmm.mmmfs.browser'
83 local root = dofile '/$bundle.lua'
84 root:mount('', true)
85
86 BROWSER = browser.Browser(root, path, true)
87 end)
88 </script>
89 </body>
90 </html>
91 "
92 \close!
+0
-55
import_all.moon less more
0 add = (tmpl) ->
1 package.path ..= ";#{tmpl}.lua"
2 package.moonpath ..= ";#{tmpl}.moon"
3
4 add '?'
5 add '?.server'
6 add '?/init'
7 add '?/init.server'
8
9 require 'mmm'
10 require 'lfs'
11 import Fileder, Key from require 'mmm.mmmfs.fileder'
12 import SQLStore from require 'mmm.mmmfs.drivers.sql'
13
14 -- usage:
15 -- moon import_all.moon <root>
16 { root } = arg
17
18 assert root, "please specify the root directory"
19
20 -- load a fs file as a fileder facet
21 load_facet = (filename, filepath) ->
22 key = (filename\match '(.*)%.%w+') or filename
23 key = Key key\gsub '%$', '/'
24 key.filename = filename
25
26 file = assert (io.open filepath, 'r'), "couldn't open facet file '#{filename}'"
27 value = file\read '*all'
28 file\close!
29
30 key, value
31
32
33 with SQLStore verbose: true
34 import_fileder = (fileder, dirpath) ->
35 for file in lfs.dir dirpath
36 continue if '.' == file\sub 1, 1
37 continue if file == 'Tupdefault.lua'
38 continue if file == 'index.html'
39 continue if file == '$order'
40
41 filepath = "#{dirpath}/#{file}"
42 attr = lfs.attributes filepath
43 switch attr.mode
44 when 'file'
45 key, value = load_facet file, filepath
46 \create_facet fileder, key.name, key.type, value
47 when 'directory'
48 next_fileder = \create_fileder fileder, file
49 -- \create_facet next_fileder, 'name', 'alpha', file
50 import_fileder next_fileder, filepath
51 else
52 warn "unknown entry type '#{attr.mode}'"
53
54 import_fileder '', root
+0
-114
render_all.moon less more
0 add = (tmpl) ->
1 package.path ..= ";#{tmpl}.lua"
2 package.moonpath ..= ";#{tmpl}.moon"
3
4 add '?'
5 add '?.server'
6 add '?/init'
7 add '?/init.server'
8
9 require 'mmm'
10 import tohtml from require 'mmm.component'
11 import Browser from require 'mmm.mmmfs.browser'
12 import get_meta, header, footer from require 'build.layout'
13
14 export BROWSER
15
16 render = (fileder, output) ->
17 BROWSER = Browser fileder
18
19 with io.open output, 'w'
20 \write [[
21 <!DOCTYPE html>
22 <html>
23 <head>
24 <link rel="stylesheet" type="text/css" href="/main.css" />
25 <!--
26 <link rel="preload" as="fetch" href="/mmm/dom/init.lua" />
27 <link rel="preload" as="fetch" href="/mmm/component/init.lua" />
28 <link rel="preload" as="fetch" href="/mmm/mmmfs/init.lua" />
29 <link rel="preload" as="fetch" href="/mmm/mmmfs/fileder.lua" />
30 <link rel="preload" as="fetch" href="/mmm/mmmfs/browser.lua" />
31 -->
32
33 <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,400" rel="stylesheet">
34 ]]
35 \write "
36 #{get_meta fileder}
37 </head>
38 <body>
39 #{header}
40
41 #{assert (tohtml BROWSER), "couldn't render BROWSER"}
42
43 #{footer}
44 "
45 \write [[
46 <script src="/highlight.pack.js"></script>
47 <script src="//cdnjs.cloudflare.com/ajax/libs/marked/0.5.1/marked.min.js"></script>
48 <script src="//cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.6/svg.min.js"></script>
49 <script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
50 <script src="/fengari-web.js"></script>
51 <script type="application/lua" src="/mmm.bundle.lua"></script>
52 <script type="application/lua">require 'mmm'</script>
53 ]]
54 \write "
55 <script type=\"application/lua\">
56 on_load = on_load or {}
57 table.insert(on_load, function()
58 local path = #{string.format '%q', path}
59 local browser = require 'mmm.mmmfs.browser'
60 local root = dofile '/$bundle.lua'
61 root:mount('', true)
62
63 BROWSER = browser.Browser(root, path, true)
64 end)
65 </script>
66 </body>
67 </html>
68 "
69 \close!
70
71 import SQLStore from require 'mmm.mmmfs.drivers.sql'
72 import Fileder, Key from require 'mmm.mmmfs.fileder'
73
74 -- split filename into dirname + basename
75 dir_base = (path) ->
76 dir, base = path\match '(.-)([^/]-)$'
77 if dir and #dir > 0
78 dir = dir\sub 1, #dir - 1
79
80 dir, base
81
82 load_tree = (store, root='') ->
83 fileders = setmetatable {},
84 __index: (path) =>
85 with val = Fileder {}
86 .path = path
87 rawset @, path, val
88
89 root = fileders[root]
90 root.facets['name: alpha'] = ''
91 for fn, ft in store\list_facets root.path
92 val = store\load_facet root.path, fn, ft
93 root.facets[Key fn, ft] = val
94
95 for path in store\list_all_fileders root.path
96 fileder = fileders[path]
97
98 parent, name = dir_base path
99 fileder.facets['name: alpha'] = name
100 table.insert fileders[parent].children, fileder
101
102 for fn, ft in store\list_facets path
103 val = store\load_facet path, fn, ft
104 fileder.facets[Key fn, ft] = val
105
106 root
107
108 tree = load_tree SQLStore!
109
110 for fileder in coroutine.wrap tree\iterate
111 print "rendering '#{fileder.path}'..."
112 os.execute "mkdir -p 'out/#{fileder.path}'"
113 render fileder, "out/#{fileder.path}/index.html"