#!/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 bit, dir, file, parent, path = '', '', '', '', '' local bits = {} local last = 1 for i = 1, #l do local c = string.sub(l, i, i) if '/' == c then bit = string.sub(l, last, i - 1) if 0 == ln then parent = bit end table.insert(bits, bit) last = i + 1 end end bit = string.sub(l, last) bit = string.gsub(bit, '%.md$', '') table.insert(bits, bit) local ln = #bits local base = table.concat(bits, '/') if 1 < ln then dir = bits[ln - 1] parent = table.concat(bits, '/', 1, ln - 2) end if 0 < ln then path = table.concat(bits, '/', 1, ln - 1) end local file = bit local files = {name = file, URL = '
'} 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 sites[path].depth = ln - 1 sites[path].parent = parent sites[path].dir = dir sites[path].bits = bits table.sort(sites[path].files, function(a, b) return (a.name <= b.name) end) 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 for k, v in pairs(sites) do local st = {} if nil ~= v.subs then for l, w in pairs(v.subs) do table.insert(st, w) end table.sort(st, function(a, b) return (a.name <= b.name) end) v.subs = st end 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.dir 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.depth local trail = 'home ' local p = v.parent for i = 1, num - 1 do trail = trail .. '' .. v.bits[i] .. ' ' p = w[parent] if nil == p then break end end trail = trail .. v.bits[#(v.bits)] 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