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