aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/notYetAnotherWiki.lua
diff options
context:
space:
mode:
Diffstat (limited to 'notYetAnotherWiki.lua')
-rwxr-xr-xnotYetAnotherWiki.lua404
1 files changed, 287 insertions, 117 deletions
diff --git a/notYetAnotherWiki.lua b/notYetAnotherWiki.lua
index 33a9e32..f53691b 100755
--- a/notYetAnotherWiki.lua
+++ b/notYetAnotherWiki.lua
@@ -15,7 +15,7 @@ local RE = require("re") -- Part of lpeg. https://www.inf.puc-rio.br/~roberto/
15-- Some global data. 15-- Some global data.
16 16
17local GlobalMetaData = { 17local GlobalMetaData = {
18 dlr = '$', perc = '%', 18 dlr = '$', perc = '%', dot = '.',
19 devuanCinnabarDark = '#310202', devuanCinnabarLight = '#510505', 19 devuanCinnabarDark = '#310202', devuanCinnabarLight = '#510505',
20 devuanDarkPurpyDark = '#33313b', devuanDarkPurpyLight = '#3c3a45', 20 devuanDarkPurpyDark = '#33313b', devuanDarkPurpyLight = '#3c3a45',
21 devuanDeepSeaDark = '#132f40', devuanDeepSeaLight = '#1a4562', 21 devuanDeepSeaDark = '#132f40', devuanDeepSeaLight = '#1a4562',
@@ -31,6 +31,7 @@ local GlobalMetaData = {
31} 31}
32 32
33local Files, Subs, xLinks = {}, {}, {} 33local Files, Subs, xLinks = {}, {}, {}
34local Context = {} -- Coz can't otherwise pass context through to the deeper Lunamark functions I'm overriding.
34 35
35local Template = '' 36local Template = ''
36local h = io.open("default.template", 'r') 37local h = io.open("default.template", 'r')
@@ -87,6 +88,7 @@ local toFile = function(name, key, value)
87 local bits, bit = stringBits(name) 88 local bits, bit = stringBits(name)
88 local path = '' 89 local path = ''
89 Files[name] = {} 90 Files[name] = {}
91 Files[name].headers = {}
90 Files[name].bits = bits 92 Files[name].bits = bits
91 Files[name].bit = bit 93 Files[name].bit = bit
92 for i, d in ipairs(bits) do 94 for i, d in ipairs(bits) do
@@ -107,6 +109,7 @@ local toFile = function(name, key, value)
107 h = io.open(name .. '.md', 'r') 109 h = io.open(name .. '.md', 'r')
108 if nil ~= h then 110 if nil ~= h then
109-- print('Parsing ' .. name .. '.md') 111-- print('Parsing ' .. name .. '.md')
112 Context = Files[name]
110 body = h:read('*a') ; h:close() 113 body = h:read('*a') ; h:close()
111 -- Deal with my typical double spaced sentence endings, and other things. 114 -- Deal with my typical double spaced sentence endings, and other things.
112 local result = RE.compile( [=[{~ 115 local result = RE.compile( [=[{~
@@ -119,10 +122,13 @@ local toFile = function(name, key, value)
119 {":::"} -> '' / 122 {":::"} -> '' /
120 {"-noComment-"} -> ' -- ' / 123 {"-noComment-"} -> ' -- ' /
121 {"| bgcolor=#" {([^ ])+} " " } -> "| <span style='background: #%2;'> bgcolor=#%2 </span> " / -- Deal with debdog's color table. 124 {"| bgcolor=#" {([^ ])+} " " } -> "| <span style='background: #%2;'> bgcolor=#%2 </span> " / -- Deal with debdog's color table.
125 {"[" {([^]])+} ']{style="color: ' {([^}])+} "}" } -> "<span style='color: %3;'>%2</span>" /
126 {"[" {([^]])+} "]{style='color: " {([^}])+} "}" } -> "<span style='color: %3;'>%2</span>" /
122 {"{#"[A-Za-z_]+"}"} -> '' / 127 {"{#"[A-Za-z_]+"}"} -> '' /
123 {"### [[edit](/bin/edit/Main/" {([^%nl])+} } -> '' / 128 {"### [[edit](/bin/edit/Main/" {([^%nl])+} } -> '' /
129 {"#"+ " " {([^%nl])+} } -> header /
124 . 130 .
125 )* ~}]=], { } ):match(body) 131 )* ~}]=], { header = function(a) table.insert(Context.headers, a); return a end } ):match(body)
126 body = result 132 body = result
127-- {"<!--".*"-->"} -> '' / 133-- {"<!--".*"-->"} -> '' /
128-- {"[$]"} -> '$dlr$' / -- Replace $, coz otherwise it confuses things later. 134-- {"[$]"} -> '$dlr$' / -- Replace $, coz otherwise it confuses things later.
@@ -209,47 +215,116 @@ else
209 print("Can't open everything.md for writing.") 215 print("Can't open everything.md for writing.")
210end 216end
211 217
212-- Scan the subdirectories looking for our files. 218-- Scan the sub folders looking for our files.
213local Directory = arg[1] 219local Folder = arg[1]
214toSub('') 220toSub('')
215if nil == Directory then Directory = '.' end 221if nil == Folder then Folder = '.' end
216 222--GlobalMetaData.root = Folder
217-- Sort out realURL for symlinked .md.md files. 223
218for l in io.popen('find -L ' .. Directory .. ' -name "*.md.md" -xtype l -printf "%P\n"'):lines() do 224--[[ Sort out realURL for symlinked .md.md files.
225 realURL is the generic URL part for this page. By policy it points to whatever is the latest copy / symlink of the original download .md.md.
226 realURL starts out being the path to the downloaded file and friends.
227 If we make a symlink during SuckIt, then that gets updated to point to the place the symlink is in.
228 below we compare timestamps and select the latest version if there's more than one symlink.
229 For the "page symlinked" problem, this should work if realURL is kept updated.
230 For the "page copied" problem, this should work if realURL is kept updated, same as symlinked really, coz that's just another copy.
231 For the "page moved" problem, that'll be the most recent symlink, the old one still has it's symlink pointing to the download .md.md, which gets updated with the current realURL.
232 So when some external old URL points to someplace a page used to be, it's old symlink points to the up to date download .md.md, and we know where to go to find the page now.
233 A left over .md.md file should have a redirect .HTML page created for it.
234]]
235for l in io.popen('find -L ' .. Folder .. ' -name unsorted -prune -o -name "*.md.md" -xtype l -printf "%P\n"'):lines() do
219 local metadata = readMdMd(string.sub(l, 1, -4), {}) 236 local metadata = readMdMd(string.sub(l, 1, -4), {})
220-- FIXME - if this already exists, compare the timestamps, most recent wins. 237 if nil == metadata.realURL then
221 metadata.realURL = string.sub(l, 1, -7) 238 metadata.realURL = string.sub(l, 1, -7)
222 local a, e = io.open(l, 'w') 239 else
223 if nil == a then print('Could not open ' .. l .. ' - ' .. e) else 240 if metadata.realURL ~= string.sub(l, 1, -7) then
224 for k, v in pairs(metadata) do 241 metadata.realURL = string.sub(l, 1, -7)
225 a:write(k .. '=' .. v .. '\n') 242 -- If this already exists, compare the timestamps, most recent wins.
243 local time0 = io.popen('ls -l --time-style=+%s "' .. metadata.realURL .. '.md.md" | cut -d \' \' -f 6'):read('l')
244 local time1 = io.popen('ls -l --time-style=+%s "' .. l .. '" | cut -d \' \' -f 6'):read('l')
245 if time0 > time1 then metadata = nil end
246 else metadata = nil end
247 end
248
249 if nil ~= metadata then
250-- DUNNO if this writes to the original file, or overwrites the symlink.
251 local a, e = io.open(l, 'w')
252 if nil == a then print('Could not open ' .. l .. ' - ' .. e) else
253 for k, v in pairs(metadata) do
254 a:write(k .. '=' .. v .. '\n')
255 end
256 a:close()
226 end 257 end
227 a:close()
228 end 258 end
229end 259end
230 260
231for l in io.popen('find -L ' .. Directory .. ' -name "*.HTM" -type f,l -printf "%P\n"'):lines() do 261-- Clean up unsorted.
232-- print('pandoc converting ' .. l .. ' -> ' .. string.sub(l, 1, -4) .. 'md') 262for l in io.popen('find -L ' .. Folder .. ' -name unsorted -prune -o -name "*.md" -a -not -name "*.md.md" -xtype l -printf "%P\n"'):lines() do
233 -- Open the HTM files and do the initial cleanups, then pandoc them. 263 local tp = '_fos'
234 h = io.open(l, 'r') 264 local metadata = readMdMd(l, {})
235 if nil ~= h then 265 if nil ~= metadata then
236 local body = h:read('*a') ; h:close() 266 if "PmWiki" == metadata.ogWiki then tp = '_pm' end
237 if 'Foswiki' == string.sub(l, 1, 7) then 267 if nil ~= metadata.ogFile then
238 -- Strip out the actual content. 268 local unsort = 'unsorted/' .. metadata.ogFile
239 local beg, en = RE.find(body, [['<div id="patternMainContents">']]) if nil ~= beg then body = string.sub(body, en + 1) end 269 local a, e = io.open(unsort .. tp .. '.md' , 'r')
240 beg, en = RE.find(body, [['<div class="patternContent">']]) if nil ~= beg then body = string.sub(body, en + 1) end 270 if nil ~= a then
241 beg, en = RE.find(body, [['<div class="foswikiTopic">']]) if nil ~= beg then 271 a:close()
242 if ' -- ' == string.sub(body, en + 1, en + 4) then 272 -- Keep the .md.md symlink, delete the rest.
243 beg, en = RE.find(body, '[%nl]', en + 4) 273 os.execute('rm ' .. unsort .. tp .. '.HTML')
244 body = string.sub(body, en + 1) 274 os.execute('rm ' .. unsort .. tp .. '.md')
275 a, e = io.open(unsort .. tp .. '.HTML', 'w')
276 if nil == a then print('Could not open ' .. unsort .. tp .. '.HTML' .. ' - ' .. e) else
277 local dst = string.sub(l, 1, -4) .. '.HTML'
278 local cnt = 1
279 for j = 1, #metadata.ogFile do
280 if '/' == string.sub(metadata.ogFile, j, j) then cnt = cnt + 1 end
281 end
282 dst = string.rep('../', cnt) .. dst
283 a:write(
284[=[<!DOCTYPE html>
285<html>
286 <head><meta http-equiv="refresh" content="0; url=]=] .. dst .. '"' .. [=[/></head>
287 <body><p>Click this if you don't get redirected to the real page - <a href="]=] .. dst .. '"' .. [=[>Redirect</a></p></body>
288</html>
289]=])
290 a:close()
291 print('REDIRECT ' .. unsort .. tp .. '.HTML \t-> ' .. dst)
245 end 292 end
293
246 end 294 end
247 beg, en = RE.find(body, [['<div class="patternInfo">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end 295 end
248-- beg, en = RE.find(body, [['<div class="foswikiForm foswikiFormStep">']]) if nil ~= beg then body = string.sub(body, 1, en + 1) end 296 end
249 beg, en = RE.find(body, [['<div class="foswikiAttachments foswikiFormStep" style="overflow:auto">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end 297end
250 beg, en = RE.find(body, [['<div class="foswikiSearchResultsPager">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end 298
251 -- Some clean ups. 299-- Look for copied pages from the other wikis.
252 local result = RE.compile( [[{~ 300for l in io.popen('find -L ' .. Folder .. ' -name "*.HTM" -type f,l -printf "%P\n"'):lines() do
301-- Only do this if .HTM is newer than .md, or .md doesn't exist.
302 local htime = io.popen("date -ur " .. l .. " +%s"):read('l')
303 local mtime = io.popen("date -ur " .. string.sub(l, 1, -4) .. "md +%s 2>/dev/null"):read('l')
304 if (nil == mtime) or (htime > mtime) then
305 print('pandoc converting ' .. l .. ' -> ' .. string.sub(l, 1, -4) .. 'md')
306os.execute('cp ' .. l .. ' ' .. l .. '_ORIGINAL0')
307 -- Open the HTM files and do the initial cleanups, then pandoc them.
308 h = io.open(l, 'r')
309 if nil ~= h then
310 local body = h:read('*a') ; h:close()
311writeString(l .. '_ORIGINAL1', body)
312 if 'Foswiki' == string.sub(l, 1, 7) then
313 -- Strip out the actual content.
314 local beg, en = RE.find(body, [['<div id="patternMainContents">']]) if nil ~= beg then body = string.sub(body, en + 1) end
315 beg, en = RE.find(body, [['<div class="patternContent">']]) if nil ~= beg then body = string.sub(body, en + 1) end
316 beg, en = RE.find(body, [['<div class="foswikiTopic">']]) if nil ~= beg then
317 if ' -- ' == string.sub(body, en + 1, en + 4) then
318 beg, en = RE.find(body, '[%nl]', en + 4)
319 body = string.sub(body, en + 1)
320 end
321 end
322 beg, en = RE.find(body, [['<div class="patternInfo">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end
323-- beg, en = RE.find(body, [['<div class="foswikiForm foswikiFormStep">']]) if nil ~= beg then body = string.sub(body, 1, en + 1) end
324 beg, en = RE.find(body, [['<div class="foswikiAttachments foswikiFormStep" style="overflow:auto">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end
325 beg, en = RE.find(body, [['<div class="foswikiSearchResultsPager">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end
326 -- Some clean ups.
327 local result = RE.compile( [[{~
253 ( 328 (
254 {'class="foswikiCurrentTopicLink"'} -> blank / 329 {'class="foswikiCurrentTopicLink"'} -> blank /
255 {'class="foswikiNewLink"'} -> blank / 330 {'class="foswikiNewLink"'} -> blank /
@@ -263,41 +338,58 @@ for l in io.popen('find -L ' .. Directory .. ' -name "*.HTM" -type f,l -printf "
263-- {'style="' ([^"])+ '"'} -> blank / {"style='" ([^'])+ "'"} -> blank / 338-- {'style="' ([^"])+ '"'} -> blank / {"style='" ([^'])+ "'"} -> blank /
264 . 339 .
265 )* ~}]], { blank = function(a) return '' end } ):match(body) 340 )* ~}]], { blank = function(a) return '' end } ):match(body)
266 body = result 341 body = result
267-- body = RE.gsub(body, [=[{"<!-- ".*"-->"}]=], '') -- FIXME 342-- body = RE.gsub(body, [=[{"<!-- ".*"-->"}]=], '') -- FIXME
268 local here = 1 343 local here = 1
269 beg, en = RE.find(body, [['https://fos.wiki.devuan.org/']], here) 344 beg, en = RE.find(body, [['https://fos.wiki.devuan.org/']], here)
270 while nil ~= beg do 345 while nil ~= beg do
271 here = beg + 1 346 here = beg + 1
272 local beg0, en0 347 local beg0, en0
273 local url = nil 348 local url = nil
274 if '"' == string.sub(body, beg - 1, beg - 1) then 349 if '"' == string.sub(body, beg - 1, beg - 1) then
275 beg0, en0 = RE.find(body, [['"']], en) 350 beg0, en0 = RE.find(body, [['"']], en)
276 url = string.sub(body, en + 1, en0 - 1) 351 url = string.sub(body, en + 1, en0 - 1)
277 end 352 end
278 if "'" == string.sub(body, beg - 1, beg - 1) then 353 if "'" == string.sub(body, beg - 1, beg - 1) then
279 beg0, en0 = RE.find(body, [["'"]], en) 354 beg0, en0 = RE.find(body, [["'"]], en)
280 url = string.sub(body, en + 1, en0) 355 url = string.sub(body, en + 1, en0)
281 end 356 end
282 357
283 if nil ~= url then 358 if nil ~= url then
284 if ('pub/' == string.sub(url, 1, 4)) then 359 if ('pub/' == string.sub(url, 1, 4)) then
285-- FIXME? - evil hack? 360-- FIXME? - evil hack?
286 url = 'Foswiki/' .. url 361 url = 'Foswiki/' .. url
287 else 362--print('FOSWIKI HTM ' .. url)
288 url = nil 363 else
364 url = nil
365 end
289 end 366 end
367--print('HTM0 ' .. string.sub(body, beg, en + 84) .. ' \t\t')
368 beg, en, body, here = commonLinky(l, body, 'https://fos.wiki.devuan.org/', url, beg, en, beg0, en0, 1)
369--if nil ~= en then print('HTM1 ' .. string.sub(body, beg, en + 84) .. ' \t\t') end
370--[=[
371 if nil == url then
372 print('OOPS! unknown linky - @' .. l .. '\t\t\t' .. string.sub(body, beg - 9, en) .. ' ' .. string.sub(body, en + 1, en0))
373 else
374-- print(' linky - @' .. l .. '\t\t\t' .. string.sub(body, beg - 9, en) .. ' ' .. string.sub(body, en + 1, en0) .. ' -> ' .. url)
375 local md = readMdMd(url, {})
376-- if nil ~= md then
377 if nil ~= md.realURL then url = md.realURL end
378-- end
379 body = string.sub(body, 1, beg - 1) .. url .. string.sub(body, en0 + 1)
380 here = here + #url
381 end
382 beg, en = RE.find(body, [['https://fos.wiki.devuan.org/']], here)
383]=]
290 end 384 end
291 beg, en, body, here = commonLinky(l, body, 'https://fos.wiki.devuan.org/', url, beg, en, beg0, en0, 1)
292 end
293 385
294 writeString(l .. '_NEW', body) 386 writeString(l .. '_NEW', body)
295 elseif 'PmWiki' == string.sub(l, 1, 6) then 387 elseif 'PmWiki' == string.sub(l, 1, 6) then
296 local beg, en = RE.find(body, [['<!--PageText-->']]) if nil ~= beg then body = string.sub(body, en + 2) end 388 local beg, en = RE.find(body, [['<!--PageText-->']]) if nil ~= beg then body = string.sub(body, en + 2) end
297 beg, en = RE.find(body, [["div id='wikitext'>"]]) if nil ~= beg then body = string.sub(body, en + 2) end 389 beg, en = RE.find(body, [["div id='wikitext'>"]]) if nil ~= beg then body = string.sub(body, en + 2) end
298 beg, en = RE.find(body, [["<div id='printfoot'>"]]) if nil ~= beg then body = string.sub(body, 1, beg - (2 + 9)) end -- There's a </div> to get rid of to. 390 beg, en = RE.find(body, [["<div id='printfoot'>"]]) if nil ~= beg then body = string.sub(body, 1, beg - (2 + 9)) end -- There's a </div> to get rid of to.
299 beg, en = RE.find(body, [['<!--HTMLFooter-->']]) if nil ~= beg then body = string.sub(body, 1, beg - 2) end 391 beg, en = RE.find(body, [['<!--HTMLFooter-->']]) if nil ~= beg then body = string.sub(body, 1, beg - 2) end
300 local result = RE.compile( [[{~ 392 local result = RE.compile( [[{~
301 ( 393 (
302 {"class='categorylink'"} -> blank / 394 {"class='categorylink'"} -> blank /
303 {"class='createlink'"} -> blank / 395 {"class='createlink'"} -> blank /
@@ -317,41 +409,53 @@ for l in io.popen('find -L ' .. Directory .. ' -name "*.HTM" -type f,l -printf "
317 {"<span class='hlt " {([a-z])+} "'></span><pre" } -> "<pre class='%2'" / 409 {"<span class='hlt " {([a-z])+} "'></span><pre" } -> "<pre class='%2'" /
318 . 410 .
319 )* ~}]], { blank = function(a) return '' end } ):match(body) 411 )* ~}]], { blank = function(a) return '' end } ):match(body)
320 body = result 412 body = result
321 here = 1 413-- body = RE.gsub(body, [=["<a " {([^ >])+} " >"]=], "<a %1>")
322 beg, en = RE.find(body, [["'https://wiki.devuan.org/"]], here) 414-- DONE? - <span class='hlt html'></span><pre style='background-color: #cc00ff;' class='escaped'> ... lines of HTML code ... </pre>
323 while nil ~= beg do 415-- most of the time I'll see <pre class='escaped'>
324 here = beg + 1 416-- My own looking glass has several.
325 local beg0, en0 = RE.find(body, [["'"]], en) 417-- Foswiki <pre class='bash'>
418-- CommonMark->HTML ---lua <pre><code class="language-lua"> .............................. </code></pre>
419-- Seems to be the spec way of doing it.
420-- most of the time I'll see <pre><code>
421
422 here = 1
423 beg, en = RE.find(body, [["'https://wiki.devuan.org/"]], here)
424 while nil ~= beg do
425 here = beg + 1
426 local beg0, en0 = RE.find(body, [["'"]], en)
326-- FIXME? - This might be working around a bug elsewhere. 427-- FIXME? - This might be working around a bug elsewhere.
327 if "'" == string.sub(body, en0, en0) then en0 = en0 - 1 end 428 if "'" == string.sub(body, en0, en0) then en0 = en0 - 1 end
328 local url = string.sub(body, en + 1, en0) 429 local url = string.sub(body, en + 1, en0)
329 if '?n=' == string.sub(url, 1, 3) then 430 if '?n=' == string.sub(url, 1, 3) then
330 url = string.sub(url, 4):gsub('[%a]+%.([%a-]+)', '%1_pm.HTML') 431 url = string.sub(url, 4):gsub('[%a]+%.([%a-]+)', '%1_pm.HTML')
331 elseif ("'" == url) or ('uploads/' == string.sub(url, 1, 8)) then 432 elseif ("'" == url) or ('uploads/' == string.sub(url, 1, 8)) then
332-- FIXME - evil hack? Yep, evil hack, need to know the depth of the source, which isn't here. 433-- FIXME - evil hack? Yep, evil hack, need to know the depth of the source, which isn't here.
333 url = 'PmWiki/' .. url 434 url = 'PmWiki/' .. url
334 else 435 else
335 url = nil 436 url = nil
437 end
438--print('HTM0 ' .. string.sub(body, beg, en + 84) .. ' \t\t')
439 beg, en, body, here = commonLinky(l, body, "'https://wiki.devuan.org/", url, beg, en, beg0, en0, 0)
440--if nil ~= en then print('HTM1 ' .. string.sub(body, beg, en + 84) .. ' \t\t') end
336 end 441 end
337 beg, en, body, here = commonLinky(l, body, "'https://wiki.devuan.org/", url, beg, en, beg0, en0, 0)
338 end
339 442
340 writeString(l .. '_NEW', body) 443 writeString(l .. '_NEW', body)
444 end
341 end 445 end
342 end
343 446
344 ok, rslt, status = os.execute('pandoc --wrap=preserve -f html -t commonmark_x --self-contained ' .. l .. '_NEW' .. ' >' .. string.sub(l, 1, -4) .. 'md') 447 ok, rslt, status = os.execute('pandoc --wrap=preserve -f html -t commonmark_x --self-contained ' .. l .. '_NEW' .. ' >' .. string.sub(l, 1, -4) .. 'md')
448 end
345end 449end
346 450
347if '.' ~= Directory then 451if '.' ~= Folder then
348 for l in io.popen('find -L . -name "*.md" -type f,l -printf "%P\n"'):lines() do 452 for l in io.popen('find -L . -name "*.md" -type f,l -printf "%P\n"'):lines() do
349 toFile(string.gsub(l, '%.md$', '')) 453 toFile(string.gsub(l, '%.md$', ''))
350 end 454 end
351end 455end
352 456
353-- Can add in a distant directory to, for putting it's results in the current directory. 457-- Can add in a distant folder to, for putting it's results in the current folder.
354for l in io.popen('find -L ' .. Directory .. ' -name "*.md" -type f,l -printf "%P\n"'):lines() do 458for l in io.popen('find -L ' .. Folder .. ' -name "*.md" -type f,l -printf "%P\n"'):lines() do
355 local n = string.gsub(l, '%.md$', '') 459 local n = string.gsub(l, '%.md$', '')
356 if nil == Files[n] then toFile(n) end 460 if nil == Files[n] then toFile(n) end
357end 461end
@@ -406,12 +510,25 @@ for name, file in pairs(Files) do
406 end 510 end
407end 511end
408 512
513-- Find empty subs.
514for name, sub in pairs(Subs) do
515 if 0 == #sub.files then
516 print("EMPTY " .. name)
517 h = io.open(name .. '/index.md', 'w')
518 if nil ~= h then
519 h:write('This folder has no files.')
520 h:close()
521 else
522 print("Can't open " .. name .. '/index.md for writing.')
523 end
524 end
525end
409 526
410 527
411--------------------------------------------------------------------------------- 528---------------------------------------------------------------------------------
412-- These functions assume the above file and sub scan has completed. 529-- These functions assume the above file and sub scan has completed.
413 530
414-- Which page in this directory should we show? 531-- Which page in this folder should we show?
415-- NOTE - only looking for the .md files we scanned for before, any stray HTML, html, HTM, and htm files will get ignored. 532-- NOTE - only looking for the .md files we scanned for before, any stray HTML, html, HTM, and htm files will get ignored.
416local whichPage = function(f) 533local whichPage = function(f)
417 local fl = '' 534 local fl = ''
@@ -454,7 +571,7 @@ local whichWiki = function(metadata)
454end 571end
455 572
456 573
457-- Calculate a link from the source directory to the destination directory. 574-- Calculate a link from the source folder to the destination folder.
458local linkFrom = function(source, dest) 575local linkFrom = function(source, dest)
459 -- Evil hacks! 576 -- Evil hacks!
460 if 'Profiles' == dest then dest = 'PmWiki/Profiles' end 577 if 'Profiles' == dest then dest = 'PmWiki/Profiles' end
@@ -507,7 +624,7 @@ end
507-- More of this actually doing things nonsense. 624-- More of this actually doing things nonsense.
508 625
509-- Create an "everything" page, for URL links to every file.HTML. 626-- Create an "everything" page, for URL links to every file.HTML.
510local Bdy = '# All the pages\n\n| page | converted | original page | last edited UTC | \n| ---- | --------- | ------- | --------------- | ' 627local Bdy = '# All the pages\n\n| page | original page | last edited UTC | \n| --------- | ------- | --------------- | '
511Pages = {} 628Pages = {}
512for name, file in pairs(Files) do 629for name, file in pairs(Files) do
513 local metadata = derefTable(Files[name].metadata, true) 630 local metadata = derefTable(Files[name].metadata, true)
@@ -520,7 +637,7 @@ for name, file in pairs(Files) do
520 if nil ~= metadata.timestamp then ts = metadata.timestamp end 637 if nil ~= metadata.timestamp then ts = metadata.timestamp end
521 if nil ~= file.bit then ln = file.bit 638 if nil ~= file.bit then ln = file.bit
522 end 639 end
523 table.insert(Pages, '\n| ' .. name .. ' | [' .. ln .. '](<' .. name .. '.HTML>) | ' .. fw .. ' ' .. pw .. ' | ' .. ts .. ' |') 640 table.insert(Pages, '\n| [' .. name .. '](<' .. name .. '.HTML>) | ' .. fw .. ' ' .. pw .. ' | ' .. ts .. ' |')
524 641
525 -- Track our external links. 642 -- Track our external links.
526 if (nil ~= metadata.ogBase) and (nil ~= metadata.ogFile) then 643 if (nil ~= metadata.ogBase) and (nil ~= metadata.ogFile) then
@@ -626,9 +743,20 @@ local LunamarkOpts = {
626} 743}
627local Writer = Lunamark.writer.html5.new(LunamarkOpts) 744local Writer = Lunamark.writer.html5.new(LunamarkOpts)
628-- Can override the various writer functions, there's something for each of the basic HTML elements. 745-- Can override the various writer functions, there's something for each of the basic HTML elements.
629local Context = {} -- Coz can't otherwise pass context through to the deeper Lunamark functions I'm overriding.
630local lunaLinky = function(url) -- Fix up the links. 746local lunaLinky = function(url) -- Fix up the links.
631 if ('https://wiki.devuan.org/' ~= url) and ('https://fos.wiki.devuan.org/' ~= url) then 747 if ('https://wiki.devuan.org/' ~= url) and ('https://fos.wiki.devuan.org/' ~= url) then
748 -- TODO - This might be covering up a bug elsewhere.
749 if '/Main/' == string.sub(url, 1, 6) then
750 local link = linkFrom(Context.path, 'Foswiki/Main')
751 if '' == link then
752 url = string.sub(url, 7) .. '.HTML'
753 else
754 url = link .. '/' .. string.sub(url, 7) .. '.HTML'
755 end
756 end
757 if '/System/' == string.sub(url, 1, 8) then
758 url = 'https://fos.wiki.devuan.org' .. url
759 end
632 for i, p in ipairs{'https://wiki.devuan.org/?n=', 'https://wiki.devuan.org?n=', 'PmWiki/uploads/', 'Foswiki/pub/', 'https://fos.wiki.devuan.org/'} do 760 for i, p in ipairs{'https://wiki.devuan.org/?n=', 'https://wiki.devuan.org?n=', 'PmWiki/uploads/', 'Foswiki/pub/', 'https://fos.wiki.devuan.org/'} do
633 if p == string.sub(url, 1, #p) then 761 if p == string.sub(url, 1, #p) then
634 local ur = string.sub(url, #p + 1) 762 local ur = string.sub(url, #p + 1)
@@ -646,26 +774,28 @@ local lunaLinky = function(url) -- Fix up the links.
646 end 774 end
647 if (nil ~= md) and (nil ~= md.realURL) then url = md.realURL end 775 if (nil ~= md) and (nil ~= md.realURL) then url = md.realURL end
648 776
649 local xlnk = xLinks[string.gsub(ur, '%..*', '', 1)] 777 if ('https://fos.wiki.devuan.org/bin/' ~= string.sub(url, 1, 32)) and ('https://fos.wiki.devuan.org/System/' ~= string.sub(url, 1, 35)) then
650 if nil == Context.path then 778 local xlnk = xLinks[string.gsub(ur, '%..*', '', 1)]
651 url = string.gsub(ur, '%.', '/', 1) 779 if nil == Context.path then
652 else 780 url = string.gsub(ur, '%.', '/', 1)
653 if nil == xlnk then xlnk = string.gsub(string.gsub(ur, '%..*', '', 1), '/.*', '', 1) end 781 else
654 if '' ~= Context.path then xlnk = linkFrom(Context.path, xlnk) end 782 if nil == xlnk then xlnk = string.gsub(string.gsub(ur, '%..*', '', 1), '/.*', '', 1) end
655 if '/' == string.sub(xlnk, 1, 1) then xlnk = string.sub(xlnk, 2) end 783 if '' ~= Context.path then xlnk = linkFrom(Context.path, xlnk) end
656 if ('' ~= xlnk) and ('/' ~= string.sub(xlnk, -1)) then xlnk = xlnk .. '/' end 784 if '/' == string.sub(xlnk, 1, 1) then xlnk = string.sub(xlnk, 2) end
657 if 'DUNNO/' == xlnk then print('OOPS! page not found - @' .. Context.path .. ' / ' .. Context.bit .. '\t' .. url .. ' -> ' .. xlnk .. ' ' .. string.gsub(ur, '.*%.', '', 1) .. '.HTML') end 785 if ('' ~= xlnk) and ('/' ~= string.sub(xlnk, -1)) then xlnk = xlnk .. '/' end
658 end 786 if 'DUNNO/' == xlnk then print('OOPS! page not found - @' .. Context.path .. ' / ' .. Context.bit .. '\t' .. url .. ' -> ' .. xlnk .. ' ' .. string.gsub(ur, '.*%.', '', 1) .. '.HTML') end
787 end
659-- if (nil ~= md) and (nil ~= md.realURL) then url = md.realURL 788-- if (nil ~= md) and (nil ~= md.realURL) then url = md.realURL
660-- else 789-- else
661 url = xlnk .. string.gsub(ur, '.*%.', '', 1) 790 url = xlnk .. string.gsub(ur, '.*%.', '', 1)
662-- end 791-- end
663 if 'PmWiki/uploads/' == p then 792 if 'PmWiki/uploads/' == p then
664 url = '../' .. p .. string.gsub(ur, '%.', '.', 1) 793 url = '../../' .. p .. string.gsub(ur, '%.', '.', 1)
665 elseif 'Foswiki/pub/' == p then 794 elseif 'Foswiki/pub/' == p then
666 url = '../' .. p .. ur 795 url = '../../' .. p .. ur
667 else 796 else
668 url = url .. '.HTML' 797 url = url .. '.HTML'
798 end
669 end 799 end
670 end 800 end
671 end 801 end
@@ -673,6 +803,12 @@ local lunaLinky = function(url) -- Fix up the links.
673 return url 803 return url
674end 804end
675 805
806function Writer.header(s, level)
807 local text = Lunamark.util.rope_to_string(s)
808-- FIXME - Work around a bug in Lunamark?
809 text = RE.gsub(text, "{[\\]}", "")
810 return '<h' .. level .. ' id="' .. RE.gsub(text, '{[ ]}', '_') .. '">' .. text .. ' <a style="font-size: 0.42em;" href="#top">🔼</a></h' .. level .. '>'
811end
676local OgWriterLink = Writer.link -- So we can call the original from within mine, we are just changing the URL. 812local OgWriterLink = Writer.link -- So we can call the original from within mine, we are just changing the URL.
677function Writer.link(lab, url, tit) 813function Writer.link(lab, url, tit)
678 return OgWriterLink(lab, lunaLinky(url), tit) 814 return OgWriterLink(lab, lunaLinky(url), tit)
@@ -718,7 +854,7 @@ for name, file in pairs(Files) do
718 local pth = file.path 854 local pth = file.path
719 if '' ~= file.path then pth = file.path .. '/' end 855 if '' ~= file.path then pth = file.path .. '/' end
720 if 'true' ~= Subs[pth .. f].metadata.hidden then 856 if 'true' ~= Subs[pth .. f].metadata.hidden then
721 metadata.header = metadata.header .. '<a href="' .. f .. '/' .. whichPage(pth .. f) .. '">' .. f .. '</a> &nbsp; ' 857 metadata.header = metadata.header .. '<a href="' .. f .. '/' .. whichPage(pth .. f) .. '">' .. f .. '</a> &nbsp; &#128194; '
722 end 858 end
723 end 859 end
724 860
@@ -736,29 +872,62 @@ for name, file in pairs(Files) do
736 url = Files[file.path .. '/' .. f].metadata.URL 872 url = Files[file.path .. '/' .. f].metadata.URL
737 end 873 end
738 if nil == title then title = f end 874 if nil == title then title = f end
739 if bit == f then metadata.menu = metadata.menu .. '<p>' .. title .. '</p>' 875 if bit == f then
876 metadata.menu = metadata.menu .. '<p>' .. title .. '</p>'
877 for j, g in ipairs(file.headers) do
878 local beg, en = RE.find(g, [['{']])
879 if nil ~= beg then
880 g = string.sub(g, 1, beg - 2)
881 end
882 local h = string.sub(RE.gsub(g, '{[#]}', ''), 2)
883 local l = string.len(g) - string.len(h)
884 g = h
885 h = RE.gsub(h, '{[ ]}', '&nbsp;')
886-- FIXME - Work around a bug in Lunamark?
887 g = RE.gsub(g, '{[\\]}', '')
888 h = RE.gsub(h, '{[\\]}', '')
889-- FIXME - if it's a linky, strip off the URL part. The Wiki audit has such things.
890 metadata.menu = metadata.menu .. '<p>' .. string.rep('&nbsp;', l) .. '<a style="font-size: 0.80em;" href="#' .. RE.gsub(g, '{[ ]}', '_') .. '">' .. h .. '</a></p>'
891 end
740 else 892 else
741 if nil ~= url then metadata.menu = metadata.menu .. '<p><a href="' .. url .. '">' .. title .. ' &#9757;</a></p>' 893 if nil ~= url then metadata.menu = metadata.menu .. '<p><a href="' .. url .. '">' .. title .. ' &#9757;</a></p>'
742 else metadata.menu = metadata.menu .. '<p><a href="' .. f .. '.HTML">' .. title .. '</a></p>' 894 else
895 local pth = file.path
896 if '' ~= pth then pth = pth .. '/' end
897 -- Don't include any left over .md.md files, so don't do this if f.md doesn't exist.
898 local a, e = io.open(pth .. f .. '.md' , 'r')
899 if nil ~= a then
900 a:close()
901 metadata.menu = metadata.menu .. '<p><a href="' .. f .. '.HTML">' .. title .. '</a></p>'
902 end
743 end 903 end
744 end 904 end
745 end 905 end
746 906
747 -- Figure out this pages footer links. 907 -- Figure out this pages footer links.
908 local temp = ''
748 metadata.footer = '' 909 metadata.footer = ''
749 if nil ~= metadata.pagehistory then metadata.history = '<p>Page&nbsp;<a href="' .. metadata.pagehistory .. '/' .. name .. '.md">history</a></p>' else metadata.history = '' end 910 if nil == metadata.pagehistory then
911 if 'Foswiki' == metadata.ogWiki then metadata.pagehistory = metadata.ogURL .. '/bin/oops/' .. metadata.ogBase .. '/' .. metadata.ogFile .. '?template=oopshistory' end
912 if 'PmWiki' == metadata.ogWiki then metadata.pagehistory = metadata.ogURL .. '/?n=' .. metadata.ogBase .. '.' .. metadata.ogFile .. '?action=diff' end
913 else
914 temp = '/' .. name .. '.md'
915 end
916 if nil ~= metadata.pagehistory then metadata.history = '<p>Page&nbsp;<a href="' .. metadata.pagehistory .. temp .. '">history</a></p>' else
917 metadata.history = ''
918 end
750 if nil ~= metadata.sourcecode then metadata.footer = '<a href="' .. metadata.sourcecode .. '">source code</a>' end 919 if nil ~= metadata.sourcecode then metadata.footer = '<a href="' .. metadata.sourcecode .. '">source code</a>' end
751 if nil ~= metadata.feedatom then metadata.footer = '<a href="' .. metadata.feedatom .. '">atom feed</a> &nbsp; &nbsp; ' .. metadata.footer end 920 if nil ~= metadata.feedatom then metadata.footer = '<a href="' .. metadata.feedatom .. '">atom feed<img src="feed-icon-14x14.png"></img></a> &nbsp; &nbsp; ' .. metadata.footer end
752 if metadata.footer ~= '' then metadata.footer = 'Web site ' .. metadata.footer end 921 if metadata.footer ~= '' then metadata.footer = 'Web site ' .. metadata.footer end
753 -- Add a link to the original page. 922 -- Add a link to the original page.
754 if nil ~= metadata.ogURL then 923 if nil ~= metadata.ogURL then
755 local title, link = whichWiki(metadata) 924 local title, link = whichWiki(metadata)
756 link = string.gsub(link, 'https://', 'HTTPS://') -- Prevent this one from being converted. 925 link = string.gsub(link, 'https://', 'HTTPS://') -- Prevent this one from being converted.
757-- TODO - wrap "edit" in a link to actually edit it. PmWiki "?action=edit" Foswiki "https://fos.wiki.devuan.org/bit/edit/" .. page .. "?t=" .. 10 digit random number? 926-- TODO - wrap "edit" in a link to actually edit it. PmWiki "?action=edit" Foswiki "https://fos.wiki.devuan.org/bit/edit/" .. page .. "?t=" .. 10 digit random number?
758 local edit = 'edit' 927 local edit = 'T'
759 if 'PmWiki' == metadata.ogWiki then edit = '<a href="' .. link .. '?action=edit">edit</a>' end 928 if 'PmWiki' == metadata.ogWiki then edit = 'Maybe you can <a href="' .. link .. '?action=edit">edit</a> t' end
760-- if 'Foswiki' == metadata.ogWiki then edit = 'edit' end 929-- if 'Foswiki' == metadata.ogWiki then edit = '' end
761 metadata.footer = '<a href="' .. link .. '">Original page</a>, maybe you can ' .. edit .. ' it. &nbsp; ' .. metadata.footer 930 metadata.footer = edit .. 'he <a href="' .. link .. '">original page</a>. &nbsp; ' .. metadata.footer
762 end 931 end
763 metadata.footer = '<p>' .. metadata.footer .. '</p>' 932 metadata.footer = '<p>' .. metadata.footer .. '</p>'
764 933
@@ -767,6 +936,7 @@ for name, file in pairs(Files) do
767 -- Toss the body in first, so the scan can deal with it to. 936 -- Toss the body in first, so the scan can deal with it to.
768 -- NOTE - this is where we actually parse the markup into HTML. 937 -- NOTE - this is where we actually parse the markup into HTML.
769 Context = file 938 Context = file
939 body = RE.gsub(body, '{[%nl]^1[%a]+}[.]^1 ', '%1$dot$ ') -- Coz otherwise stray . trip up the list detection.
770 local bd, md = Parse(body) -- The md is a table of extracted metadata, not likely to be any, and we wont do anything with it. 940 local bd, md = Parse(body) -- The md is a table of extracted metadata, not likely to be any, and we wont do anything with it.
771 bd = RE.gsub(bd, '{[%]}', '$perc$') -- Coz otherwise stray % trip up the capture part. 941 bd = RE.gsub(bd, '{[%]}', '$perc$') -- Coz otherwise stray % trip up the capture part.
772 temp = RE.gsub(temp, '"$body$"', bd) 942 temp = RE.gsub(temp, '"$body$"', bd)