Sun, 06 Sep 2020 22:12:52 +0300
Don't auto-create directories that will be empty
2 | 1 | |
7
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
2 | --@module handlers.render |
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
3 | |
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
4 | local handlers_render={} |
2 | 5 | |
3 | 6 | local ltp=require('ltp.template') |
7
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
7 | local markdown=require('markdown') |
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
8 | local config=require('config') |
26
77cd7b8fb6a6
Rename path.lua mypath.lua not conflict with other lua path modules.
Tuomo Valkonen <tuomov@iki.fi>
parents:
25
diff
changeset
|
9 | local path=require('mypath') |
7
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
10 | local filecache=require('filecache') |
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
11 | local log=require('log') |
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
12 | local dependency=require('dependency') |
16 | 13 | local pandoc=require('pandoc') |
21
3c71c525cec2
Use markdown-it as default markdown parser.
Tuomo Valkonen <tuomov@iki.fi>
parents:
17
diff
changeset
|
14 | local markdown_it=require('markdown_it') |
22
8c8e70569d81
Add missing error handler loading
Tuomo Valkonen <tuomov@iki.fi>
parents:
21
diff
changeset
|
15 | local err=require('err') |
2 | 16 | |
17 | -- | |
18 | -- Phase 1: load & markup | |
19 | -- | |
20 | ||
7
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
21 | function handlers_render.phase1(file, env) |
3 | 22 | local f = io.open(path.join(env.paths.src, file), 'r') |
23 | local data = nil | |
2 | 24 | local in_meta = false |
25 | local linenum=1 | |
3 | 26 | local meta = {} |
2 | 27 | |
28 | for l in f:lines() do | |
23
0ea4b0786b43
Only parse metadata if starts on first line
Tuomo Valkonen <tuomov@iki.fi>
parents:
22
diff
changeset
|
29 | if (linenum==1 or in_meta) and string.match(l, config.meta_marker) then |
2 | 30 | in_meta = not in_meta |
31 | elseif in_meta then | |
32 | local key, val = string.match(l, "%s*([^:]*)%s*:%s*(.*)%s*") | |
33 | if key and val then | |
3 | 34 | -- very primitive quoting, primarily as a hack to |
35 | -- not need converting my files that much from Webgen. | |
36 | local val_unq=string.match(val, '^"(.*)"$') | |
37 | meta[key] = val_unq or val | |
2 | 38 | else |
23
0ea4b0786b43
Only parse metadata if starts on first line
Tuomo Valkonen <tuomov@iki.fi>
parents:
22
diff
changeset
|
39 | err.file_pos(file, linenum, "meta data syntax error: " .. l) |
2 | 40 | end |
41 | else | |
3 | 42 | if data then |
43 | data = data.."\n"..l | |
29 | 44 | else |
3 | 45 | data=l |
46 | end | |
2 | 47 | end |
48 | linenum = linenum+1 | |
49 | end | |
50 | ||
3 | 51 | log.log("Load "..file.."\n") |
52 | ||
2 | 53 | f:close() |
54 | ||
3 | 55 | local destination |
56 | if meta.destination then | |
57 | destination=path.join(path.dirname(file), meta.destination) | |
58 | else | |
25
11ae9103f59d
Destination name creation changes
Tuomo Valkonen <tuomov@iki.fi>
parents:
23
diff
changeset
|
59 | -- If the file has two extensions, then only remove last extension. |
11ae9103f59d
Destination name creation changes
Tuomo Valkonen <tuomov@iki.fi>
parents:
23
diff
changeset
|
60 | -- Otherwise replace extension with .html. |
3 | 61 | destination=path.rmext(file) |
25
11ae9103f59d
Destination name creation changes
Tuomo Valkonen <tuomov@iki.fi>
parents:
23
diff
changeset
|
62 | base=path.rmext(destination) |
11ae9103f59d
Destination name creation changes
Tuomo Valkonen <tuomov@iki.fi>
parents:
23
diff
changeset
|
63 | if base==destination then |
11ae9103f59d
Destination name creation changes
Tuomo Valkonen <tuomov@iki.fi>
parents:
23
diff
changeset
|
64 | destination = destination .. ".html" |
11ae9103f59d
Destination name creation changes
Tuomo Valkonen <tuomov@iki.fi>
parents:
23
diff
changeset
|
65 | end |
3 | 66 | end |
67 | ||
68 | local page={ | |
69 | data=data, | |
70 | meta=meta, | |
71 | destination=destination, | |
72 | file=file, | |
73 | } | |
2 | 74 | |
3 | 75 | env.pages[file]=page |
2 | 76 | end |
77 | ||
7
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
78 | function handlers_render.process_lua(template, env) |
3 | 79 | env=table.join(env, {env=env}) -- TODO: should use __index |
80 | --return ltp.render(nil, 1, template, env, {}, "<%", "%>", {}) | |
81 | return ltp.render_template(template, "<%", "%>", | |
82 | ltp.merge_index(env, _G)) | |
2 | 83 | end |
84 | ||
7
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
85 | function handlers_render.env_for(file, env, path_prefix) |
3 | 86 | local newenv=table.copy(env) |
87 | ||
88 | newenv.base_url=path.to_root(file) | |
89 | newenv.path_prefix=(path_prefix or "") | |
90 | newenv.page=env.pages[file] | |
91 | ||
92 | return newenv | |
2 | 93 | end |
94 | ||
30
3ac53da03439
Support loading TEMPLATE_PATH/katex_config.json.
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
95 | function handlers_render.render(file, env, path_prefix, renderer) |
3 | 96 | local data=env.pages[file].data |
97 | if data then | |
7
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
98 | local newenv=handlers_render.env_for(file, env, path_prefix) |
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
99 | local data2=handlers_render.process_lua(data, newenv) |
16 | 100 | meta = env.pages[file].meta |
21
3c71c525cec2
Use markdown-it as default markdown parser.
Tuomo Valkonen <tuomov@iki.fi>
parents:
17
diff
changeset
|
101 | if renderer == "markdown-it" then |
3c71c525cec2
Use markdown-it as default markdown parser.
Tuomo Valkonen <tuomov@iki.fi>
parents:
17
diff
changeset
|
102 | return markdown_it.markdown(data2, env) |
3c71c525cec2
Use markdown-it as default markdown parser.
Tuomo Valkonen <tuomov@iki.fi>
parents:
17
diff
changeset
|
103 | elseif renderer == "pandoc" then |
16 | 104 | return pandoc.pandoc(data2) |
21
3c71c525cec2
Use markdown-it as default markdown parser.
Tuomo Valkonen <tuomov@iki.fi>
parents:
17
diff
changeset
|
105 | elseif renderer == "lua-markdown" then |
15
82d254b8f01e
added markdown: true/false meta-tag
Tuomo Valkonen <tuomov@iki.fi>
parents:
7
diff
changeset
|
106 | return markdown(data2) |
16 | 107 | elseif renderer == "none" then |
108 | return data2 | |
15
82d254b8f01e
added markdown: true/false meta-tag
Tuomo Valkonen <tuomov@iki.fi>
parents:
7
diff
changeset
|
109 | else |
16 | 110 | error('Unknown renderer') |
15
82d254b8f01e
added markdown: true/false meta-tag
Tuomo Valkonen <tuomov@iki.fi>
parents:
7
diff
changeset
|
111 | end |
2 | 112 | end |
113 | end | |
114 | ||
7
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
115 | function handlers_render.phase2(file, env) |
3 | 116 | local page=env.pages[file] |
117 | local src = path.join(env.paths.src, file) | |
118 | local dst = path.join(env.paths.dst, page.destination) | |
119 | local tmpl = path.join(env.paths.tmpl, | |
120 | page.meta.template or "page.template") | |
30
3ac53da03439
Support loading TEMPLATE_PATH/katex_config.json.
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
121 | renderer = page.meta.renderer or "markdown-it" |
3ac53da03439
Support loading TEMPLATE_PATH/katex_config.json.
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
122 | |
3 | 123 | local deps = {src} |
124 | ||
125 | local build=page.meta.always_build | |
126 | if not build then | |
127 | if page.meta.dependencies then | |
128 | for p, _ in pairs(env.pages) do | |
4 | 129 | if string.match(p, page.meta.dependencies) then |
3 | 130 | table.insert(deps, path.join(env.paths.src, p)) |
131 | end | |
132 | end | |
133 | end | |
134 | table.insert(deps, tmpl) | |
30
3ac53da03439
Support loading TEMPLATE_PATH/katex_config.json.
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
135 | if renderer=="markdown-it" then |
3ac53da03439
Support loading TEMPLATE_PATH/katex_config.json.
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
136 | markdown_it.add_deps(deps, env) |
3ac53da03439
Support loading TEMPLATE_PATH/katex_config.json.
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
137 | end |
3 | 138 | build=dependency.simple_update_check(dst, deps) |
2 | 139 | end |
140 | ||
16 | 141 | if build then |
3 | 142 | log.log("Render "..file.."\n") |
30
3ac53da03439
Support loading TEMPLATE_PATH/katex_config.json.
Tuomo Valkonen <tuomov@iki.fi>
parents:
29
diff
changeset
|
143 | local content=handlers_render.render(file, env, page.meta, renderer) |
3 | 144 | local page_template=filecache.get(tmpl) |
145 | ||
7
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
146 | local newenv=table.join({content=content}, handlers_render.env_for(file, env)) |
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
147 | local data2=handlers_render.process_lua(page_template, newenv) |
3 | 148 | |
149 | log.log("Write "..page.destination.."\n") | |
150 | local f=io.openX(dst, "w") | |
151 | f:write(data2) | |
152 | end | |
2 | 153 | end |
154 | ||
7
038275cd92ed
Convert module stuff to lua 5.3
Tuomo Valkonen <tuomov@iki.fi>
parents:
4
diff
changeset
|
155 | return handlers_render |