From 5a671268340c107ee94f8244f01b6cb8ee9decd0 Mon Sep 17 00:00:00 2001 From: dvs1 Date: Sat, 25 Jan 2025 03:14:10 +1000 Subject: YAR see description for details. New everything page, lists all the pages and where they came from, with links. Now we know where the page came from, type and URL. Rejigged how metadata works. Do our own metadata substitution. Fixed up a bunch of bugs. General cleanups. --- notYetAnotherWiki.lua | 206 +++++++++++++++++++++++++++++++------------------- 1 file changed, 130 insertions(+), 76 deletions(-) (limited to 'notYetAnotherWiki.lua') diff --git a/notYetAnotherWiki.lua b/notYetAnotherWiki.lua index 8c9a5c9..dc64fa2 100755 --- a/notYetAnotherWiki.lua +++ b/notYetAnotherWiki.lua @@ -64,10 +64,11 @@ local globalData = { ['devuanDeepSeaDark'] = '#132f40', ['devuanDeepSeaLight'] = '#1a4562', ['devuanSaphireDark'] = '#004489', ['devuanSaphireLight'] = '#00509f', ['karenPurple'] = '#8800ff', ['onefangPurple'] = '#cc00ff', - favicon = 'nYAW_icon.png', logo = 'nYAW.png', header = '', home = '', --menu = '', - history = '', footer = 'Powered by notYetAnotherWiki version 0.0. ', + favicon = 'nYAW_icon.png', logo = 'nYAW.png', + header = '', home = '', history = '', footer = 'Powered by notYetAnotherWiki version 0.0. ', + --menu = '', } -local Sites, Files, Subs = {}, {}, {} +local Files, Subs = {}, {} @@ -86,7 +87,7 @@ local derefTable = function(t, strip) end --- String together the bits array into a path string. +-- String together the bits array into a path string. Or the other way around. lol local stringBits = function(l) local bits = {} local last = 1 @@ -102,7 +103,19 @@ end -- Put a value into the Files or Subs table, creating things if needed. local toFile = function(name, key, value) - if nil == Files[name] then Files[name] = {} end + if nil == Files[name] then + local bits, bit = stringBits(name) + local path = '' + Files[name] = {} + Files[name].bits = bits + Files[name].bit = bit + for i, d in ipairs(bits) do + if '' ~= path then path = path .. '/' end + path = path .. d + end + Files[name].path = path +-- Files[name].body = '' + end if nil ~= key then Files[name][key] = value end for i, v in ipairs{'metadata', 'bits', } do if nil == Files[name][v] then Files[name][v] = {} end @@ -120,9 +133,15 @@ end -- Actually start doing things. +-- Create the base of everything.md here, so it gets picked up as usual in the file scan. +local body, h = '', io.open('everything.md', 'w') +h:write('# All the pages\n') +h:close() + + -- Scan the subdirectories looking for .md files. local directory = arg[1] -toSub('') --Subs[''] = {files = {}, subs = {}, bits = {}} +toSub('') if nil == directory then directory = '.' end if '.' ~= directory then for l in io.popen('find . -name "*.md" -type f,l -printf "%P\n"'):lines() do @@ -135,39 +154,60 @@ for l in io.popen('find ' .. directory .. ' -name "*.md" -type f,l -printf "%P\n if nil == Files[n] then toFile(n) end end --- Gotta figure out all the files and subs first. File and sub metadata comes along for the ride. + +-- Gotta figure out all the files and subs first. File and sub metadata comes along for the ride, coz we need them later. +local newMeta = {} for name, file in pairs(Files) do local bitter, path = '', '' - local bits, bit = stringBits(name) + local bits, bit = file.bits, file.bit local ln = #bits local body, metadata = '', {} -- Go through our bits, construct Subs with bits. - Files[name].bits = bits - Files[name].bit = bit if ln > 0 then bitter = bits[1] end if '' ~= bitter then Subs[''].subs[bitter] = bitter end -- "bitter end" was entirely by accident, I'm keeping it. B-) for i, d in ipairs(bits) do if '' ~= path then path = path .. '/' end path = path .. d toSub(path, 'bits', derefiTable(bits, true)) - if i < ln then Subs[path].subs[bits[i + 1]] = bits[i + 1] end - if i < ln then table.remove(Subs[path].bits, #bits) end + if i < ln then + Subs[path].subs[bits[i + 1]] = bits[i + 1] + table.remove(Subs[path].bits, #bits) + end end if '.md' == string.sub(name, -3, -1) then -- This is a metadata only file, no content, stash the matadata. for l in io.open(name .. '.md'):lines() do - for k, v in string.gmatch(l, "(%w+)%s*=%s*(.+)") do metadata[k] = v end + for k, v in string.gmatch(l, "(%w+)%s*=%s*(.+)") do + if nil == v then + print(name .. ' ' .. k) + else + metadata[k] = v + end + end end if '.md' == name then toSub(path, 'metadata', metadata) elseif '/.md' == string.sub(name, -4, -1) then toSub(path, 'metadata', metadata) - else toFile(string.sub(name, 1, -4), 'metadata', metadata) +-- else toFile(string.sub(name, 1, -4), 'metadata', metadata) + else newMeta[string.sub(name, 1, -4)] = metadata end Files[name] = nil - else + end +end - -- Start the file parsing here, coz we need it's metadata. +-- FIXTHEM - Lua doesn't like modifying the thing you are pair()ing, like we want to do in the last loop. +for name, file in pairs(newMeta) do + if nil == Files[name] then toFile(name) end + if nil == Files[name].metadata then Files[name].metadata = {} end + for k, v in pairs(file) do + if nil == Files[name].metadata[k] then Files[name].metadata[k] = v end + end +end + +-- Open the files and do the iniital cleanups. +for name, file in pairs(Files) do + if '.md' ~= string.sub(name, -3, -1) then -- print('Parsing ' .. name .. '.md') h = io.open(name .. '.md', 'r') if nil ~= h then @@ -201,13 +241,31 @@ for name, file in pairs(Files) do end until fail == f0 result = result .. string.sub(body, start) + body = result + end + Files[name].body = body + table.insert(Subs[Files[name].path].files, Files[name].bit) + end +end - body = parse(result) +-- Create an "everything" page, for URL links to every file.HTML. +-- TODO - sort the list of pages. +local bdy, h = Files['everything'].body, io.open('everything.md', 'a+') +bdy = bdy .. '\n\n| page | converted | Foswiki | PmWiki | \n| ---- | --------- | ------- | ------ | ' +for name, file in pairs(Files) do + local metadata = derefTable(Files[name].metadata, true) + if 'everything' ~= name then + local ln, fw, pw = 'DUNNO', '', '' + if 'PmWiki' == metadata.ogWiki then pw = '[' .. metadata.ogURL .. '](' .. metadata.ogURL .. ')' end + if 'Foswiki' == metadata.ogWiki then fw = '[' .. metadata.ogURL .. '](' .. metadata.ogURL .. ')' end + if nil ~= file.bit then ln = file.bit end - toFile(name, 'body', body) - table.insert(Subs[path].files, bit) + bdy = bdy .. '\n| ' .. name .. ' | [' .. ln .. '](<' .. name .. '.HTML>) | ' .. fw .. ' | ' .. pw .. ' |' end end +h:write(bdy) +h:close() +toFile('everything', 'body', parse(bdy)) @@ -252,16 +310,20 @@ local linkFrom = function(source, dest) break end end - depth = #(Subs[source].bits) - depth - depth = depth + 1 - link = string.rep('../', depth) - if (0 == depth) or (depth > #(Subs[dest].bits)) then + + if #(Subs[dest].bits) >= #(Subs[source].bits) then + depth = #(Subs[source].bits) for i, v in ipairs(Subs[dest].bits) do - if i >= depth then + if i > depth then if '' ~= link then link = link .. '/' end link = link .. Subs[dest].bits[i] end end + if '' ~= link then link = link .. '/' end + else + depth = #(Subs[source].bits) - depth + depth = depth + 1 + link = string.rep('../', depth) end end return link @@ -269,12 +331,28 @@ end --- TODO - loop through Subs, doing whichPage and inheritance. - - - -- More of this actually doing things nonsense. +-- Loop through Subs, doing whichPage and inheritance. +for name, sub in pairs(Subs) do + sub.whichPage = whichPage(name) + local metadata = sub.metadata + for i, s in pairs(sub.subs) do + local nm = i + if '' ~= name then nm = name .. '/' .. i end + ss = Subs[nm] + for k, v in pairs(metadata) do + if nil == ss.metadata[k] then + if ('favicon' == k) or ('logo' == k) then + ss.metadata[k] = linkFrom(nm, name) .. v + else + ss.metadata[k] = v + end + end + end + end +end + -- Loop through the files we found and actually create their HTML files. for name, file in pairs(Files) do local path, result = '', '' @@ -285,42 +363,31 @@ for name, file in pairs(Files) do path = table.concat(bits, '/', 1, ln) if '' ~= body then - -- Copy any metadata found in parent directories. - local pth = '' - for i, d in ipairs(bits) do - if '' ~= pth then pth = pth .. '/' end - pth = pth .. d - if nil ~= Subs[pth] then - if nil ~= Subs[pth].metadata then - for m, x in pairs(Subs[pth].metadata) do - if nil == metadata[m] then - metadata[m] = x - end - end - end + -- Inherit stuff from sub and global. + local mdata = Subs[path].metadata + for k, v in pairs(mdata) do + if nil == file.metadata[k] then + file.metadata[k] = v end end - -- Root directory needs to be handled separately, for now. - if nil ~= Subs[''].metadata then - for m, x in pairs(Subs[''].metadata) do if nil == metadata[m] then metadata[m] = x end end - end - + Files[name].metadata = file.metadata + metadata = derefTable(Files[name].metadata, true) for m, x in pairs(globalData) do if nil == metadata[m] then metadata[m] = x end end - -- Inherit these images from most recent parent directory that defines them. - for n, y in ipairs{'favicon', 'logo'} do - local pith = '' - if nil ~= metadata[y] then - local pth, found = '', false - if (nil ~= Subs[''].metadata) and (nil ~= Subs[''].metadata[y]) then pith = '' ; found = true end - for m, x in ipairs(bits) do - if '' ~= pth then pth = pth .. '/' end - pth = pth .. x - if (nil ~= Subs[pth].metadata) and (nil ~= Subs[pth].metadata[y]) then pith = pth ; found = true end - end - if found then metadata[y] = linkFrom(path, pith) .. metadata[y] - else metadata[y] = linkFrom(path, pith) .. globalData[y] - end + if nil ~= metadata.ogURL then + body = body .. '\n\n---\n\n[Original page](' .. metadata.ogURL .. '), maybe you can edit it.\n' + end + + -- Figure out this pages trail links. + metadata.home = linkFrom(path, '') .. Subs[''].whichPage + metadata.trail = '' + for i, b in ipairs(bits) do + local p = table.concat(bits, '/', 1, i) + if i < #bits then + metadata.trail = metadata.trail .. '' .. b .. ' 👣 ' + linkFrom(path, table.concat(bits, '/', 1, i)) + else + metadata.trail = metadata.trail .. b .. ' ' end end @@ -334,8 +401,7 @@ for name, file in pairs(Files) do for i, f in ipairs(subs) do local pth = path if '' ~= path then pth = path .. '/' end - local fl = whichPage(pth .. f) - metadata.header = metadata.header .. '' .. f .. ' ' + metadata.header = metadata.header .. '' .. f .. ' ' end -- Figure out this pages menu links. @@ -360,18 +426,6 @@ for name, file in pairs(Files) do end end - -- Figure out this pages trail links. - metadata.home = linkFrom(path, '') .. whichPage('') - metadata.trail = '' - for i, b in ipairs(bits) do - if i < #bits then - metadata.trail = metadata.trail .. '' .. b .. ' 👣 ' - linkFrom(path, table.concat(bits, '/', 1, i)) - else - metadata.trail = metadata.trail .. b .. ' ' - end - end - -- Figure out this pages footer links. if nil ~= metadata.pagehistory then metadata.history = '
Page history
' end if nil ~= metadata.sourcecode then metadata.footer = 'source code ' .. metadata.footer end @@ -382,12 +436,12 @@ for name, file in pairs(Files) do -- Do our own metadata replacement, it's simple and works better. local temp = template local start = 1 - metadata.body = nil local f0, f1, token -- Toss the body in first, so the scan can deal with it to. f0, f1, token = string.find(temp, '%$(body)%$') if fail ~= f0 then - temp = string.sub(temp, 1, f0 - 1) .. body .. string.sub(temp, f1 + 1) + -- NOTE - this is where we actually parse the markup into HTML. + temp = string.sub(temp, 1, f0 - 1) .. parse(body) .. string.sub(temp, f1 + 1) end -- The actual metadata replacement scan. result = '' -- cgit v1.1