The New Mongrel2.org Site
I'm the process of putting up the new Mongrel2.org website, so please be patient. I've got a lot going on right now so I'll be hacking on the site as I need. If you have suggestions for the site then let us know.
Incidentally, here's the code I'm using to generate the site:
local tir = require 'tir.view' local markdown = require 'markdown' local posix = require 'posix' local json = require 'json' local Generator = { output = 'output/', source = 'src/', header = Tir.view('header.html'), footer = Tir.view('footer.html'), top = Tir.view('top.html') } function Generator:load_template(data, in_name) local out_ext = data.template:match("(%.[a-zA-Z0-9]+)$") local out_front = in_name:match("(.+)%.[a-zA-Z0-9]+$") local out_name = out_front .. out_ext local template = Tir.view(data.template) return template, out_name end function Generator:load_data(in_name) local input = assert(Tir.load_file(self.source, in_name)) local data = assert(json.decode(input)) return data end function Generator:write(data, body, out_name) local out = assert(io.open(self.output .. out_name, 'w')) out:write(self.header(data)) if data.top then out:write(self.top(data.top)) end out:write(body(data) .. self.footer(data)) end function Generator:render(data, in_name) local body, out_name = self:load_template(data, in_name) self:write(data, body, out_name) return out_name end function Generator:extract_meta(stat, out_name, md) local month, day, year = out_name:match("(%a+)_(%d+)_(%d+)") local date = nil if month then date = ("%s-%s-%s"):format(month, day, year) else date = posix.strftime("%b-%d-%Y", stat.ctime) end local meta = { date = date, link = out_name, title = md:match("(.-)%s==") or "NO TITLE", intro = markdown(md:match("=+\n(.-)\n\n")) } return meta end function Generator:render_contents(data, source, output) local base_strip = "^" .. self.source local results = {} local mdfiles = posix.glob(source .. "*.md") if mdfiles then for _, path in ipairs(mdfiles) do local target = path:gsub(base_strip, "") local template, out_name = self:load_template(data, target) local content = Tir.load_file(self.source, target) data.contents = markdown(content) out_name = self:render(data, target) local stat = posix.stat(path) results[#results + 1] = self:extract_meta(stat, out_name, content) end end return results end function Generator:run(dirs) local base_strip = "^" .. self.source for _, dir in ipairs(dirs) do local source = self.source .. dir local output = self.output .. dir posix.mkdir(output) for _, path in ipairs(posix.glob(source .. '*.json')) do local target = path:gsub(base_strip, "") local data = self:load_data(target) if data.contents then data.contents = self:render_contents(data.contents, source, output) end self:render(data, target) end end end local input = assert(Tir.load_file("./", "config.json")) local config = assert(json.decode(input)) Generator:run(config.contents)
This uses the template code from the Tir framework.