#!/usr/bin/env luajit local lcmark = require("lcmark") local globalData = {favicon = 'nYAW_icon.png', logo = 'nYAW.png', version = '-0.1', header = '', footer = '', menu = '', ['_'] = ' ', ['dlr'] = '$'} local sites = {} local directory = arg[1] if nil == directory then directory = '.' end local all = {} if '.' ~= directory then for l in io.popen('find . -name "*.md" -type f,l -printf "%P\n"'):lines() do all[l] = l end end for l in io.popen('find ' .. directory .. ' -name "*.md" -type f,l -printf "%P\n"'):lines() do if nil == all[l] then all[l] = l end end for i, l in pairs(all) do local dir, file, parent, path = '', '', '', '', '' local bits = {} local last = 1 for j = 1, #l do local c = string.sub(l, j, j) if '/' == c then table.insert(bits, string.sub(l, last, j - 1)) last = j + 1 end end file = string.sub(l, last) file = string.gsub(file, '%.md$', '') local ln = #bits if 0 < ln then dir = bits[ln] path = table.concat(bits, '/', 1, ln) if 1 < ln then parent = table.concat(bits, '/', 1, ln - 1) end end local files = {name = file, URL = '

' .. file .. '

', } if nil == sites[path] then sites[path] = {files = {files}} elseif nil == sites[path].files then sites[path].files = {files} else table.insert(sites[path].files, files) end if '' ~= dir then -- FIXME - not sure why this is needed anymore, but it fails building subs without it. Just slows things down otherwise. files = {name = dir, URL = '' .. dir .. '   ', } if nil == sites[parent] then sites[parent] = {subs = {[files.name] = files}} elseif nil == sites[parent].subs then sites[parent].subs = {[files.name] = files} else sites[parent].subs[files.name] = files end end end for k, v in pairs(sites) do local bit, dir, file, parent, path = '', '', '', '', '' local bits = {} local last = 1 for j = 1, #k do local c = string.sub(k, j, j) if '/' == c then table.insert(bits, string.sub(k, last, j - 1)) last = j + 1 end end sites[k].parent = table.concat(bits, '/') table.insert(bits, string.sub(k, last)) sites[k].bits = bits if nil ~= sites[k].files then table.sort(sites[k].files, function(a, b) return (a.name <= b.name) end) end dir = bits[#bits - 1] file = bits[#bits] if nil ~= sites[dir] then if nil == sites[dir].subs then sites[dir].subs = {} end last = nil for j, g in pairs(sites[dir].subs) do if (g.name == dir) or (g.name == file) then last = j break end end if nil == last then sites[dir].subs[file] = {name = file, URL = '' .. file .. '   '} end end bits = {} if nil ~= v.subs then for l, w in pairs(v.subs) do table.insert(bits, w) end table.sort(bits, function(a, b) return (a.name <= b.name) end) v.subs = bits end end for k, v in pairs(sites) do if nil ~= v.files then for l, w in pairs(v.files) do local path = v.parent if '' ~= path then path = path .. '/' end path = path .. v.bits[#(v.bits)] if '' ~= path then path = path .. '/' end local file = path .. w.name .. '.md' if (nil ~= file) and ('' ~= file) then io.write('Parsing ' .. file .. ' -> ') end local h = io.open(file, 'r') if nil ~= h then local cm = h:read('*a') local result = '' local body, metadata, err = lcmark.convert(cm, "html", {smart = true, yaml_metadata = true, columns = 0}) if nil == body then print('oops! ' .. err) else local bod, err = lcmark.compile_template(body) if nil == bod then print('oops! ' .. err) else local templateFile = metadata.template if nil == file then templateFile = nil else if nil == templateFile then templateFile = 'default' end templateFile = templateFile .. '.template' for m, x in pairs(globalData) do if nil == metadata[m] then metadata[m] = x else print('metadata already has ' .. m) end end end if nil ~= v.files then for m, x in ipairs(v.files) do metadata.menu = metadata.menu .. x.URL .. '\n' end end if nil ~= v.subs then for m, x in pairs(v.subs) do metadata.header = metadata.header .. x.URL end end local num = #(v.bits) local trail = 'home   ' local p = v.parent for i = 1, num do trail = trail .. '' .. v.bits[i] .. '   ' end trail = trail .. w.name metadata.trail = trail metadata.body = lcmark.apply_template(bod, metadata) local tm = '' if nil ~= templateFile then local h = io.open(templateFile, 'r') if nil ~= h then tm = tm .. h:read('*a') h:close() else print('oops! No such file ' .. templateFile) end local template, err = lcmark.compile_template(tm) if nil == template then print('oops! ' .. err) else result = lcmark.apply_template(template, metadata) end else result = body end if ('' ~= result) and (nil ~= file) then local base = path .. w.name .. '.HTML' print(base) local a, e = io.open(base, 'w') if nil == a then print('Could not open ' .. base .. ' - ' .. e) else a:write(result) a:close() end else print('') end end end h:close() else print('oops! No such file ' .. file) end end end end