clean up a little
s-ol
3 years ago
0 | 0 | dist |
1 | 1 | out |
2 | db.sqlite3 | |
2 | 3 | ##### TUP GITIGNORE ##### |
3 | 4 | ##### Lines below automatically generated by Tup. |
4 | 5 | ##### Do not edit. |
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 | 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 | 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" |