From 074cf7fac2677cca3bd8ebbc1e6cff9c261e2e83 Mon Sep 17 00:00:00 2001 From: dvs1 Date: Fri, 27 Dec 2024 10:13:22 +1000 Subject: Yet Another Rewrite. Mostly the menu code again. Added favicon and logo code. Better structure of the site structure structure. --- notYetAnotherWiki.lua | 279 ++++++++++++++++++++++++-------------------------- 1 file changed, 131 insertions(+), 148 deletions(-) diff --git a/notYetAnotherWiki.lua b/notYetAnotherWiki.lua index 0ee0f10..f3956f8 100755 --- a/notYetAnotherWiki.lua +++ b/notYetAnotherWiki.lua @@ -2,118 +2,12 @@ local lcmark = require("lcmark") -local globalData = {version = '-0.1', header = '', footer = '', menu = '', ['_'] = ' ', ['dlr'] = '$'} -local site = {} - -local createHTML = function(cm, file) --- cm = string.gsub(cm, '. ', '. ') - if (nil ~= file) and ('' ~= file) then io.write('Parsing ' .. file .. ' -> ') end - 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 k, v in pairs(globalData) do - if nill == metadata[k] then metadata[k] = v else print('metadata already has ' .. k) end - end - end - - if nil ~= file then - local depth = 0 - local base = '' - for p in string.gmatch(file, '(%w+)/') do - depth = depth + 1 - base = p - end - local path = string.sub(file, 1, #base) - - metadata.header = '' - metadata.menu = '' - local trl = {} - metadata.trail = '' - local dir = site[''] - local dr, pdr, tr = '', '', '' - while nil ~= dir.subs do - local old = dir - for m, x in pairs(dir.subs) do - if x == string.sub(file, 1, #x) then - pdr = pdr .. '/' .. m - tr = tr .. '../' - dr = m - dir = site[dr] - table.insert(trl, '">' .. m .. ' 👣') - break - end - end - if old == dir then break end - end - table.remove(trl) - for m, x in ipairs(trl) do - tr = string.sub(tr, 4) - trl[m] = ' ' .. x.m .. '
\n' - end - end - if nil ~= dir.subs then - local l = {} - for m, x in pairs(dir.subs) do table.insert(l, {m = m; x = x}) end - table.sort(l, function(a, b) return (a.m <= b.m) end) - for m, x in pairs(l) do - metadata.header = metadata.header .. '' .. x.m .. ' ' - end - end - end - 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 globalData = {favicon = 'nYAW_icon.png', logo = 'nYAW.png', version = '-0.1', header = '', footer = '', menu = '', ['_'] = ' ', ['dlr'] = '$'} +local sites = {} - 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 - end - end - if ('' ~= result) and (nil ~= file) then - local base = string.gsub(file, '%.md$', '') - print(base .. '.HTML') - local a, e = io.open(base .. '.HTML', 'w') - if nil == a then print('Could not open ' .. base .. '.HTML - ' .. e) else - a:write(result) - a:close() - end - else - print('') - end - return result -end local directory = arg[1] if nil == directory then directory = '.' end @@ -128,57 +22,146 @@ for l in io.popen('find ' .. directory .. ' -name "*.md" -type f,l -printf "%P\n end for i, l in pairs(all) do - local dir = '' - local files, subs = {}, {} - local c, parent = 1, '' - - for p in string.gmatch(l, '(%w+)/') do - if '' == dir then - dir = p - if nil ~= site[dir] then - subs = site[dir].subs - files = site[dir].files + 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 - - local path = string.sub(l, 1, -1 - #(string.gsub(l, '.*/', ''))) - if nil ~= site[parent] then - if nil == site[parent].subs then site[parent].subs = {} end - site[parent].subs[p] = path - elseif 1 == c then subs[p] = path - else - if ('' ~= parent) and (dir == parent) then subs[p] = path end - site[parent] = {subs = {[p] = path}} - end - c = c + #p + 1 - parent = p end - - if (1 == c) and (nil ~= site[dir]) then - subs = site[dir].subs - files = site[dir].files + 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 base = string.gsub(string.sub(l, c, -1), '%.md$', '') - if nil ~= site[parent] then site[parent].files[base] = string.sub(l, 1, -4) - elseif 1 == c then files[base] = string.sub(l, 1, -4) - else - if ('' ~= parent) and (dir == parent) then files[base] = string.sub(l, 1, -4) end - site[parent] = {files = {[base] = string.sub(l, 1, -4)}} + 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 - --- FIXME - still some minor bug somewhere, this fixes that, but causes other problems. Meh, I can live with excess empty subs tables. --- if (nil ~= subs) and (0 == #subs) then subs = nil end - site[dir] = {files = files, subs = subs} end -for k, v in pairs(site) do +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 m, x in pairs(v.files) do - local file = x .. '.md' + 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 - createHTML(h:read('*a'), file) + 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) -- cgit v1.1