summaryrefslogtreecommitdiffstats
path: root/_scripts/generate_page.lua
blob: ad5f6d97f02782de605f1be299546c38d7d33176 (plain)
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
62
63
64
65
66
67
#!/usr/bin/lua

markdown = require('discount')
yaml = require('yaml')

function read_markdown(file)
	local f = assert(io.open(file))
	local data = f:read("*a")
	f:close()
	local yml, md = data:match("^(%-%-%-.-%-%-%-)(.*)$")
	local t
	local pagename = file:gsub(".md$","")
	if yml and md then
		t = yaml.load(yml)
		t.pagename = pagename
		return t, markdown(md)
	else
		return {title=pagename, pagename=pagename}, markdown(data)
	end
end

function read_layout(file)
	-- try look for template for 'path/file.md' in this order:
	--   path/file.template.html
	--   layout.template.html
	for _,t in pairs{file:gsub(".md$", ".template.html"),
		"_layout.template.html"} do
		local f = io.open(t)
		if f then
			local data = f:read("*a")
			f:close()
			return data
		end
	end
end

function generate_navbar(active)
	local f = assert(io.open("_navbar.yaml"))
	local nav = yaml.load(f:read("*a"))
	f:close()
	local data = ""
	for align, menu in pairs(nav) do
		data = ('%s<span class="%s">'):format(data, align)
		for _,t in pairs(menu) do
			for label, ref in pairs(t) do
				data = ('%s<a href="%s">%s</a>'):format(data,
					ref, label)
			end
		end
		data = data ..'</span>\n'
	end
	return data
end

function replace_tags(content, meta)
	return content:gsub("{{(.-)}}", function(tag)
			return meta[tag]
		end)
end

page, content = read_markdown(assert(arg[1]))
layout = read_layout(arg[1])
page.navbar = generate_navbar()

page.content = replace_tags(content, page)

io.write((replace_tags(layout, page)))