aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/notYetAnotherWiki.lua
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xnotYetAnotherWiki.lua293
1 files changed, 197 insertions, 96 deletions
diff --git a/notYetAnotherWiki.lua b/notYetAnotherWiki.lua
index e84e9b0..f53691b 100755
--- a/notYetAnotherWiki.lua
+++ b/notYetAnotherWiki.lua
@@ -215,27 +215,51 @@ else
215 print("Can't open everything.md for writing.") 215 print("Can't open everything.md for writing.")
216end 216end
217 217
218-- Scan the subdirectories looking for our files. 218-- Scan the sub folders looking for our files.
219local Directory = arg[1] 219local Folder = arg[1]
220toSub('') 220toSub('')
221if nil == Directory then Directory = '.' end 221if nil == Folder then Folder = '.' end
222 222--GlobalMetaData.root = Folder
223-- Sort out realURL for symlinked .md.md files. 223
224for l in io.popen('find -L ' .. Directory .. ' -name unsorted -prune -o -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
225 local metadata = readMdMd(string.sub(l, 1, -4), {}) 236 local metadata = readMdMd(string.sub(l, 1, -4), {})
226-- FIXME - if this already exists, compare the timestamps, most recent wins. 237 if nil == metadata.realURL then
227 metadata.realURL = string.sub(l, 1, -7) 238 metadata.realURL = string.sub(l, 1, -7)
228 local a, e = io.open(l, 'w') 239 else
229 if nil == a then print('Could not open ' .. l .. ' - ' .. e) else 240 if metadata.realURL ~= string.sub(l, 1, -7) then
230 for k, v in pairs(metadata) do 241 metadata.realURL = string.sub(l, 1, -7)
231 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()
232 end 257 end
233 a:close()
234 end 258 end
235end 259end
236 260
237-- Clean up unsorted. 261-- Clean up unsorted.
238for l in io.popen('find -L ' .. Directory .. ' -name unsorted -prune -o -name "*.md" -a -not -name "*.md.md" -xtype l -printf "%P\n"'):lines() do 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
239 local tp = '_fos' 263 local tp = '_fos'
240 local metadata = readMdMd(l, {}) 264 local metadata = readMdMd(l, {})
241 if nil ~= metadata then 265 if nil ~= metadata then
@@ -245,35 +269,62 @@ for l in io.popen('find -L ' .. Directory .. ' -name unsorted -prune -o -name "*
245 local a, e = io.open(unsort .. tp .. '.md' , 'r') 269 local a, e = io.open(unsort .. tp .. '.md' , 'r')
246 if nil ~= a then 270 if nil ~= a then
247 a:close() 271 a:close()
248 os.execute('rm ' .. unsort .. tp .. '.*') 272 -- Keep the .md.md symlink, delete the rest.
273 os.execute('rm ' .. unsort .. tp .. '.HTML')
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)
292 end
293
249 end 294 end
250 end 295 end
251 end 296 end
252end 297end
253 298
254-- Look for copied pages from the other wikis. 299-- Look for copied pages from the other wikis.
255for l in io.popen('find -L ' .. Directory .. ' -name "*.HTM" -type f,l -printf "%P\n"'):lines() do 300for l in io.popen('find -L ' .. Folder .. ' -name "*.HTM" -type f,l -printf "%P\n"'):lines() do
256-- print('pandoc converting ' .. l .. ' -> ' .. string.sub(l, 1, -4) .. 'md') 301-- Only do this if .HTM is newer than .md, or .md doesn't exist.
257 -- Open the HTM files and do the initial cleanups, then pandoc them. 302 local htime = io.popen("date -ur " .. l .. " +%s"):read('l')
258 h = io.open(l, 'r') 303 local mtime = io.popen("date -ur " .. string.sub(l, 1, -4) .. "md +%s 2>/dev/null"):read('l')
259 if nil ~= h then 304 if (nil == mtime) or (htime > mtime) then
260 local body = h:read('*a') ; h:close() 305 print('pandoc converting ' .. l .. ' -> ' .. string.sub(l, 1, -4) .. 'md')
261 if 'Foswiki' == string.sub(l, 1, 7) then 306os.execute('cp ' .. l .. ' ' .. l .. '_ORIGINAL0')
262 -- Strip out the actual content. 307 -- Open the HTM files and do the initial cleanups, then pandoc them.
263 local beg, en = RE.find(body, [['<div id="patternMainContents">']]) if nil ~= beg then body = string.sub(body, en + 1) end 308 h = io.open(l, 'r')
264 beg, en = RE.find(body, [['<div class="patternContent">']]) if nil ~= beg then body = string.sub(body, en + 1) end 309 if nil ~= h then
265 beg, en = RE.find(body, [['<div class="foswikiTopic">']]) if nil ~= beg then 310 local body = h:read('*a') ; h:close()
266 if ' -- ' == string.sub(body, en + 1, en + 4) then 311writeString(l .. '_ORIGINAL1', body)
267 beg, en = RE.find(body, '[%nl]', en + 4) 312 if 'Foswiki' == string.sub(l, 1, 7) then
268 body = string.sub(body, en + 1) 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
269 end 321 end
270 end 322 beg, en = RE.find(body, [['<div class="patternInfo">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end
271 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
272-- 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
273 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
274 beg, en = RE.find(body, [['<div class="foswikiSearchResultsPager">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end 326 -- Some clean ups.
275 -- Some clean ups. 327 local result = RE.compile( [[{~
276 local result = RE.compile( [[{~
277 ( 328 (
278 {'class="foswikiCurrentTopicLink"'} -> blank / 329 {'class="foswikiCurrentTopicLink"'} -> blank /
279 {'class="foswikiNewLink"'} -> blank / 330 {'class="foswikiNewLink"'} -> blank /
@@ -287,41 +338,58 @@ for l in io.popen('find -L ' .. Directory .. ' -name "*.HTM" -type f,l -printf "
287-- {'style="' ([^"])+ '"'} -> blank / {"style='" ([^'])+ "'"} -> blank / 338-- {'style="' ([^"])+ '"'} -> blank / {"style='" ([^'])+ "'"} -> blank /
288 . 339 .
289 )* ~}]], { blank = function(a) return '' end } ):match(body) 340 )* ~}]], { blank = function(a) return '' end } ):match(body)
290 body = result 341 body = result
291-- body = RE.gsub(body, [=[{"<!-- ".*"-->"}]=], '') -- FIXME 342-- body = RE.gsub(body, [=[{"<!-- ".*"-->"}]=], '') -- FIXME
292 local here = 1 343 local here = 1
293 beg, en = RE.find(body, [['https://fos.wiki.devuan.org/']], here) 344 beg, en = RE.find(body, [['https://fos.wiki.devuan.org/']], here)
294 while nil ~= beg do 345 while nil ~= beg do
295 here = beg + 1 346 here = beg + 1
296 local beg0, en0 347 local beg0, en0
297 local url = nil 348 local url = nil
298 if '"' == string.sub(body, beg - 1, beg - 1) then 349 if '"' == string.sub(body, beg - 1, beg - 1) then
299 beg0, en0 = RE.find(body, [['"']], en) 350 beg0, en0 = RE.find(body, [['"']], en)
300 url = string.sub(body, en + 1, en0 - 1) 351 url = string.sub(body, en + 1, en0 - 1)
301 end 352 end
302 if "'" == string.sub(body, beg - 1, beg - 1) then 353 if "'" == string.sub(body, beg - 1, beg - 1) then
303 beg0, en0 = RE.find(body, [["'"]], en) 354 beg0, en0 = RE.find(body, [["'"]], en)
304 url = string.sub(body, en + 1, en0) 355 url = string.sub(body, en + 1, en0)
305 end 356 end
306 357
307 if nil ~= url then 358 if nil ~= url then
308 if ('pub/' == string.sub(url, 1, 4)) then 359 if ('pub/' == string.sub(url, 1, 4)) then
309-- FIXME? - evil hack? 360-- FIXME? - evil hack?
310 url = 'Foswiki/' .. url 361 url = 'Foswiki/' .. url
311 else 362--print('FOSWIKI HTM ' .. url)
312 url = nil 363 else
364 url = nil
365 end
313 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]=]
314 end 384 end
315 beg, en, body, here = commonLinky(l, body, 'https://fos.wiki.devuan.org/', url, beg, en, beg0, en0, 1)
316 end
317 385
318 writeString(l .. '_NEW', body) 386 writeString(l .. '_NEW', body)
319 elseif 'PmWiki' == string.sub(l, 1, 6) then 387 elseif 'PmWiki' == string.sub(l, 1, 6) then
320 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
321 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
322 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.
323 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
324 local result = RE.compile( [[{~ 392 local result = RE.compile( [[{~
325 ( 393 (
326 {"class='categorylink'"} -> blank / 394 {"class='categorylink'"} -> blank /
327 {"class='createlink'"} -> blank / 395 {"class='createlink'"} -> blank /
@@ -341,41 +409,53 @@ for l in io.popen('find -L ' .. Directory .. ' -name "*.HTM" -type f,l -printf "
341 {"<span class='hlt " {([a-z])+} "'></span><pre" } -> "<pre class='%2'" / 409 {"<span class='hlt " {([a-z])+} "'></span><pre" } -> "<pre class='%2'" /
342 . 410 .
343 )* ~}]], { blank = function(a) return '' end } ):match(body) 411 )* ~}]], { blank = function(a) return '' end } ):match(body)
344 body = result 412 body = result
345 here = 1 413-- body = RE.gsub(body, [=["<a " {([^ >])+} " >"]=], "<a %1>")
346 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>
347 while nil ~= beg do 415-- most of the time I'll see <pre class='escaped'>
348 here = beg + 1 416-- My own looking glass has several.
349 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)
350-- FIXME? - This might be working around a bug elsewhere. 427-- FIXME? - This might be working around a bug elsewhere.
351 if "'" == string.sub(body, en0, en0) then en0 = en0 - 1 end 428 if "'" == string.sub(body, en0, en0) then en0 = en0 - 1 end
352 local url = string.sub(body, en + 1, en0) 429 local url = string.sub(body, en + 1, en0)
353 if '?n=' == string.sub(url, 1, 3) then 430 if '?n=' == string.sub(url, 1, 3) then
354 url = string.sub(url, 4):gsub('[%a]+%.([%a-]+)', '%1_pm.HTML') 431 url = string.sub(url, 4):gsub('[%a]+%.([%a-]+)', '%1_pm.HTML')
355 elseif ("'" == url) or ('uploads/' == string.sub(url, 1, 8)) then 432 elseif ("'" == url) or ('uploads/' == string.sub(url, 1, 8)) then
356-- 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.
357 url = 'PmWiki/' .. url 434 url = 'PmWiki/' .. url
358 else 435 else
359 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
360 end 441 end
361 beg, en, body, here = commonLinky(l, body, "'https://wiki.devuan.org/", url, beg, en, beg0, en0, 0)
362 end
363 442
364 writeString(l .. '_NEW', body) 443 writeString(l .. '_NEW', body)
444 end
365 end 445 end
366 end
367 446
368 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
369end 449end
370 450
371if '.' ~= Directory then 451if '.' ~= Folder then
372 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
373 toFile(string.gsub(l, '%.md$', '')) 453 toFile(string.gsub(l, '%.md$', ''))
374 end 454 end
375end 455end
376 456
377-- 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.
378for 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
379 local n = string.gsub(l, '%.md$', '') 459 local n = string.gsub(l, '%.md$', '')
380 if nil == Files[n] then toFile(n) end 460 if nil == Files[n] then toFile(n) end
381end 461end
@@ -430,12 +510,25 @@ for name, file in pairs(Files) do
430 end 510 end
431end 511end
432 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
433 526
434 527
435--------------------------------------------------------------------------------- 528---------------------------------------------------------------------------------
436-- These functions assume the above file and sub scan has completed. 529-- These functions assume the above file and sub scan has completed.
437 530
438-- Which page in this directory should we show? 531-- Which page in this folder should we show?
439-- 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.
440local whichPage = function(f) 533local whichPage = function(f)
441 local fl = '' 534 local fl = ''
@@ -478,7 +571,7 @@ local whichWiki = function(metadata)
478end 571end
479 572
480 573
481-- Calculate a link from the source directory to the destination directory. 574-- Calculate a link from the source folder to the destination folder.
482local linkFrom = function(source, dest) 575local linkFrom = function(source, dest)
483 -- Evil hacks! 576 -- Evil hacks!
484 if 'Profiles' == dest then dest = 'PmWiki/Profiles' end 577 if 'Profiles' == dest then dest = 'PmWiki/Profiles' end
@@ -697,9 +790,9 @@ local lunaLinky = function(url) -- Fix up the links.
697 url = xlnk .. string.gsub(ur, '.*%.', '', 1) 790 url = xlnk .. string.gsub(ur, '.*%.', '', 1)
698-- end 791-- end
699 if 'PmWiki/uploads/' == p then 792 if 'PmWiki/uploads/' == p then
700 url = '../' .. p .. string.gsub(ur, '%.', '.', 1) 793 url = '../../' .. p .. string.gsub(ur, '%.', '.', 1)
701 elseif 'Foswiki/pub/' == p then 794 elseif 'Foswiki/pub/' == p then
702 url = '../' .. p .. ur 795 url = '../../' .. p .. ur
703 else 796 else
704 url = url .. '.HTML' 797 url = url .. '.HTML'
705 end 798 end
@@ -714,7 +807,7 @@ function Writer.header(s, level)
714 local text = Lunamark.util.rope_to_string(s) 807 local text = Lunamark.util.rope_to_string(s)
715-- FIXME - Work around a bug in Lunamark? 808-- FIXME - Work around a bug in Lunamark?
716 text = RE.gsub(text, "{[\\]}", "") 809 text = RE.gsub(text, "{[\\]}", "")
717 return '<h' .. level .. ' id="' .. RE.gsub(text, '{[ ]}', '_') .. '">' .. text .. ' <a style="font-size: 0.42em;" href="#top">👆</a></h' .. level .. '>' 810 return '<h' .. level .. ' id="' .. RE.gsub(text, '{[ ]}', '_') .. '">' .. text .. ' <a style="font-size: 0.42em;" href="#top">🔼</a></h' .. level .. '>'
718end 811end
719local 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.
720function Writer.link(lab, url, tit) 813function Writer.link(lab, url, tit)
@@ -761,7 +854,7 @@ for name, file in pairs(Files) do
761 local pth = file.path 854 local pth = file.path
762 if '' ~= file.path then pth = file.path .. '/' end 855 if '' ~= file.path then pth = file.path .. '/' end
763 if 'true' ~= Subs[pth .. f].metadata.hidden then 856 if 'true' ~= Subs[pth .. f].metadata.hidden then
764 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; '
765 end 858 end
766 end 859 end
767 860
@@ -798,7 +891,15 @@ for name, file in pairs(Files) do
798 end 891 end
799 else 892 else
800 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>'
801 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
802 end 903 end
803 end 904 end
804 end 905 end
@@ -816,7 +917,7 @@ for name, file in pairs(Files) do
816 metadata.history = '' 917 metadata.history = ''
817 end 918 end
818 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
819 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
820 if metadata.footer ~= '' then metadata.footer = 'Web site ' .. metadata.footer end 921 if metadata.footer ~= '' then metadata.footer = 'Web site ' .. metadata.footer end
821 -- Add a link to the original page. 922 -- Add a link to the original page.
822 if nil ~= metadata.ogURL then 923 if nil ~= metadata.ogURL then