aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authordvs12025-02-19 17:40:48 +1000
committerdvs12025-02-19 17:40:48 +1000
commitc560ae0b2a0c714c9944fa988632527f4f2630b4 (patch)
treea2fcfc3e0dc485321ac36605b021ec1099232e8c
parentTODO is tricksy. (diff)
downloadnotYetAnotherWiki-c560ae0b2a0c714c9944fa988632527f4f2630b4.zip
notYetAnotherWiki-c560ae0b2a0c714c9944fa988632527f4f2630b4.tar.gz
notYetAnotherWiki-c560ae0b2a0c714c9944fa988632527f4f2630b4.tar.bz2
notYetAnotherWiki-c560ae0b2a0c714c9944fa988632527f4f2630b4.tar.xz
Major YAR!!
Moved the post download code from the SuckIt's to the main script, and combined what's left. Minor icon tweak. Think I have almost figured out the HTML and CSS to get the layout to behave. Major rearrange of the main script. Use more of lunamark and RE. Moar colours! Solved the generic colour shenanigans. Solved a few other bugs. Hidden directories. Lots of things I forgot about.
-rwxr-xr-xSuckIt69
-rwxr-xr-xSuckItFos68
-rwxr-xr-xSuckItPm72
-rw-r--r--TODO.md25
-rw-r--r--default.template88
-rw-r--r--nYAW.pngbin12273 -> 16624 bytes
-rw-r--r--nYAW.xcfbin20267 -> 25929 bytes
-rwxr-xr-xnotYetAnotherWiki.lua662
-rw-r--r--testing/index.md21
9 files changed, 592 insertions, 413 deletions
diff --git a/SuckIt b/SuckIt
new file mode 100755
index 0000000..57aa88b
--- /dev/null
+++ b/SuckIt
@@ -0,0 +1,69 @@
1#!/bin/bash
2
3TIMEFORMAT=" took %lR using %P%% CPU"
4time {
5pushd /opt/merged
6
7rm -fr Foswiki/*
8cp -r /opt/merged_EMPTY/Foswiki .
9rm -fr PmWiki/*
10cp -r /opt/merged_EMPTY/PmWiki .
11
12
13filter="
14 -name _default -prune -o \
15 -name _empty -prune -o \
16 -name System -prune -o \
17 -name Trash -prune -o \
18 -name TWiki -prune -o \
19"
20URL="https://fos.wiki.devuan.org"
21time find /opt/Foswiki/data ${filter} \
22-name "*.txt" -type f,l -printf "%P\n" | while read line
23do
24 base=`echo "${line}" | cut -d '/' -f 1`
25 file=`echo "${line}" | cut -d '/' -f 2- | rev | cut -b 5- | rev`
26 if [[ ! $file =~ (AdminGroup|AdminUser|AdminUserLeftBar|EditorGroup|GroupTemplate|GroupViewTemplate|NobodyGroup|PatternSkinUserViewTemplate|ProjectContributor|RegistrationAgent|SitePreferences|UnprocessedRegistrations|UnprocessedRegistrationsLog|UserHomepageHeader|UserList|UserListByDateJoined|UserListByLocation|UserList|UserListHeader|WebAtom|WebChanges|WebCreateNewTopic|WebHome|WebIndex|WebLeftBar|WebLeftBarExample|WebNotify|WebPreferences|WebRss|WebSearch|WebSearchAdvanced|WebTopicList|WikiGroups|WikiUsers)$ ]]; then
27 time=`date --rfc-3339=seconds -ur /opt/Foswiki/data/${base}/${file}.txt | cut -d '+' -f 1`
28 mkdir -p Foswiki/$base
29 mkdir -p Foswiki/${base}/`dirname ${file}`
30 echo -e "ogWiki=Foswiki\nogURL=${URL}\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > Foswiki/${base}/${file}.md.md
31 echo "downloading ${URL}/${base}/${file}?cover=print"
32 # Doesn't help with redownloads, coz natch a dynamic site isn't cached. But I can at least comment out the curl command during testing to save time.
33 curl --silent --no-progress-meter ${URL}/${base}/${file}?cover=print -o Foswiki/${base}/${file}.HTM
34 fi
35done
36
37
38filter="
39 -not -name "*~" -a \
40 -not -name ".flock" -a \
41 -not -name ".htaccess" -a \
42 -not -name ".lastmod" -a \
43 -not -name ".pageindex" -a \
44"
45URL="https://wiki.devuan.org"
46time find /opt/pmwiki/wiki.d ${filter} \
47-name "*.*" -type f,l -printf "%P\n" | while read line
48do
49 base=`echo "${line}" | cut -d '.' -f 1`
50 if [[ "${base}" != "Site" ]]; then
51 file=`echo "${line}" | cut -d '.' -f 2`
52 time=`date --rfc-3339=seconds -ur /opt/pmwiki/wiki.d/${base}.${file} | cut -d '+' -f 1`
53 mkdir -p PmWiki/$base
54 echo -e "ogWiki=PmWiki\nogURL=${URL}\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > PmWiki/${base}/${file}.md.md
55# echo "downloading ${URL}/?n=${base}.${file}?action=markdown"
56# curl --no-progress-meter ${URL}/?n=${base}.${file}?action=markdown -o PmWiki/${base}/${file}.MARKDOWN
57 echo "downloading ${URL}/?n=${base}.${file}?action=print"
58 curl --no-progress-meter ${URL}/?n=${base}.${file}?action=print -o PmWiki/${base}/${file}.HTM
59
60# pandoc -f markdown -t commonmark_x --self-contained PmWiki//${base}/${file}.MD >PmWiki/${base}/${file}.md
61# pandoc -f html -t commonmark_x --self-contained PmWiki//${base}/${file}.HTM >PmWiki/${base}/${file}.md
62 fi
63done
64
65
66time notYetAnotherWiki.lua
67
68popd
69}
diff --git a/SuckItFos b/SuckItFos
deleted file mode 100755
index dc65505..0000000
--- a/SuckItFos
+++ /dev/null
@@ -1,68 +0,0 @@
1#!/bin/bash
2
3URL="https://fos.wiki.devuan.org"
4
5filter="
6 -name _default -prune -o \
7 -name _empty -prune -o \
8 -name System -prune -o \
9 -name Trash -prune -o \
10 -name TWiki -prune -o \
11"
12
13pushd /opt/mergedWork
14
15find /opt/Foswiki/data ${filter} \
16-name "*.txt" -type f,l -printf "%P\n" | while read line
17do
18 base=`echo "${line}" | cut -d '/' -f 1`
19 file=`echo "${line}" | cut -d '/' -f 2- | rev | cut -b 5- | rev`
20 time=`date --rfc-3339=seconds -ur /opt/Foswiki/data/${base}/${file}.txt | cut -d '+' -f 1`
21 mkdir -p Foswiki/$base
22 mkdir -p Foswiki/${base}/`dirname ${file}`
23 mkdir -p combined/$base
24 mkdir -p combined/${base}/`dirname ${file}`
25 echo "Converting ${URL}/${base}/${file}?cover=print -> Foswiki/${base}/${file}.md"
26 echo -e "ogWiki=Foswiki\nogURL=${URL}\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > Foswiki/${base}/${file}.md.md
27 # Doesn't help with redownloads, coz natch a dynamic site isn't cached. But I can at least comment out the curl command during testing to save time.
28 curl --silent --no-progress-meter ${URL}/${base}/${file}?cover=print -o Foswiki/${base}/${file}.HTM
29 cp Foswiki/${base}/${file}.HTM Foswiki/${base}/${file}.HTM_ORIGINAL
30 csplit -ks Foswiki/${base}/${file}.HTM '%<div id="patternMainContents">%' '/<div class="foswikiAttachments foswikiFormStep" style="overflow:auto">/'
31 if [ -f xx00 ]; then
32 rm Foswiki/${base}/${file}.HTM
33 mv xx00 Foswiki/${base}/${file}.HTM
34 fi
35 sed -i -E Foswiki/${base}/${file}.HTM \
36 -e "s/rel='nofollow'//g" \
37 -e 's/rel="nofollow"//g' \
38 -e "s/target='_blank'//g" \
39 -e "s/class='foswiki[[:alpha:]]*'//g" \
40 -e 's/class="foswikiTopic"/class="FoswikiTopic"/g' \
41 -e 's/class="foswiki[[:alpha:]]*"//g' \
42 -e "s/style='.*;'//g"
43
44 pandoc -f html -t commonmark_x --self-contained Foswiki//${base}/${file}.HTM >Foswiki/${base}/${file}.md
45 cp Foswiki/${base}/${file}.md Foswiki/${base}/${file}.md_ORIGINAL
46
47 csplit -ks Foswiki/${base}/${file}.md '%::: {.FoswikiTopic}%' '/::: {.patternInfo}/'
48 if [ -f xx00 ]; then
49 rm Foswiki/${base}/${file}.md
50 mv xx00 Foswiki/${base}/${file}.md
51 fi
52 if [ -f xx01 ]; then
53 rm xx01
54 fi
55
56 # Attempt to clean things up, badly.
57 sed -i -E Foswiki/${base}/${file}.md \
58 -e 's/\$/\$dlr\$/g' \
59 -e 's/\{#.*\}//g' \
60 -e '/^:::/d' \
61 -e '/^<!-- -->/d' \
62# -e 's/\{\.pattern.*\}//g' \
63# -e 's/\{\.pattern.*//g' \
64
65 ln -frs Foswiki/${base}/${file}.md combined/${base}/${file}.md
66done
67
68popd
diff --git a/SuckItPm b/SuckItPm
deleted file mode 100755
index 246f485..0000000
--- a/SuckItPm
+++ /dev/null
@@ -1,72 +0,0 @@
1#!/bin/bash
2
3URL="https://wiki.devuan.org"
4
5filter="
6 -not -name "*~" -a \
7 -not -name ".flock" -a \
8 -not -name ".htaccess" -a \
9 -not -name ".lastmod" -a \
10 -not -name ".pageindex" -a \
11"
12
13pushd /opt/mergedWork
14
15find /opt/pmwiki/wiki.d ${filter} \
16-name "*.*" -type f,l -printf "%P\n" | while read line
17do
18 base=`echo "${line}" | cut -d '.' -f 1`
19 file=`echo "${line}" | cut -d '.' -f 2`
20 time=`date --rfc-3339=seconds -ur /opt/pmwiki/wiki.d/${base}.${file} | cut -d '+' -f 1`
21 mkdir -p PmWiki/$base
22 mkdir -p combined/$base
23 echo "Converting ${URL}/?n=${base}.${file}?action=print -> PmWiki/${base}/${file}.md"
24 echo -e "ogWiki=PmWiki\nogURL=${URL}\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > PmWiki/${base}/${file}.md.md
25 # Doesn't help with redownloads, coz natch a dynamic site isn't cached. But I can at least comment out the curl command during testing to save time.
26# curl --no-progress-meter ${URL}/?n=${base}.${file}?action=markdown -o PmWiki/${base}/${file}.MD
27 curl --no-progress-meter ${URL}/?n=${base}.${file}?action=print -o PmWiki/${base}/${file}.HTM
28 cp PmWiki/${base}/${file}.HTM PmWiki/${base}/${file}.HTM_ORIGINAL
29 csplit -ks PmWiki/${base}/${file}.HTM '%<!--PageText-->%' '/<!--HTMLFooter-->/'
30 if [ -f xx00 ]; then
31 rm PmWiki/${base}/${file}.HTM
32 mv xx00 PmWiki/${base}/${file}.HTM
33 fi
34 if [ -f xx01 ]; then
35 rm xx01
36 fi
37 sed -i -E PmWiki/${base}/${file}.HTM \
38 -e "s/rel='nofollow'//g" \
39 -e "s/target='_blank'//g" \
40 -e "s/class='categorylink'//g" \
41 -e "s/class='createlink'//g" \
42 -e "s/class='createlinktext'//g" \
43 -e "s/class='escaped'//g" \
44 -e "s/class='diffmarkup'//g" \
45 -e "s/class='selflink'//g" \
46 -e "s/class='urllink'//g" \
47 -e "s/class='vspace'//g" \
48 -e "s/class='wikilink'//g" \
49 -e "s/style='.*;'//g"
50
51# pandoc -f markdown -t commonmark_x --self-contained PmWiki//${base}/${file}.MD >PmWiki/${base}/${file}.md
52 pandoc -f html -t commonmark_x --self-contained PmWiki//${base}/${file}.HTM >PmWiki/${base}/${file}.md
53 cp PmWiki/${base}/${file}.md PmWiki/${base}/${file}.md_ORIGINAL
54
55 # Attempt to clean things up, badly.
56 sed -i -E PmWiki/${base}/${file}.md \
57 -e 's/\$/\$dlr\$/g' \
58 -e 's/\{#.*\}//g' \
59 -e '/^:::/d' \
60# -e '/\[Site$/d' \
61# -e '/^\[\]/d' \
62# -e "s/\`<a id='trailstart'>\`\{=html\}\`<\/a>\`\{=html\}//g" \
63# -e "s/^\`<img /<img /g" \
64# -e "s/^\`\`\`\{=html\}//g" \
65# -e "s/^\`\`\`//g" \
66# -e "s/\`\{=html\}//g"
67
68 ln -frs PmWiki/${base}/${file}.md combined/${base}/${file}.md
69 ln -frs PmWiki/${base}/${file}.md.md combined/${base}/${file}.md.md
70done
71
72popd
diff --git a/TODO.md b/TODO.md
index ed3b79b..3979931 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,17 +1,20 @@
1# TODO 1# TODO
2 2
3Make it perphekd!
4
3## Do these 5## Do these
4 6
5Convert the links in the converted pages to point to their new home. We have ogURL for the source now, should help. 7Syntax highlighting in code blocks.
6 8
7- Gonna be tricky dealing with links to pages that have been symlink copied all over the place, where do we point to them? 9Other colour shenanigans.
8 10
11- Mostly fixed Devuan Cluster. Hopefully fixes any other Foswiki ones.
9 12
10Bugs - 13Bugs -
11 14
12- /users/Plentyn/WebHome.HTML &nbsp; has that twisty thing which looks not simple to remove.
13- /users/dunno/Devuan Cluster.HTML &nbsp; A very lengthy and complex document, I'll likely miss something, but chip away at the obvious.
14- /users/Debdog.HTML &nbsp; pandoc can't handle the background table cell colours in the "Background colours" table, which is kinda the point of it. 15- /users/Debdog.HTML &nbsp; pandoc can't handle the background table cell colours in the "Background colours" table, which is kinda the point of it.
16- /users/dunno/Devuan Cluster.HTML &nbsp; A very lengthy and complex document, I'll likely miss something, but chip away at the obvious. Lots of colour shenanigans.
17- /Foswiki/Main/WikiGroups.HTML &nbsp; has that twisty thing which looks not simple to remove.
15 18
16Check the timestamps on the files, only update if source is newer than destination. Meh, it's already 600 times faster than the pandoc version. 19Check the timestamps on the files, only update if source is newer than destination. Meh, it's already 600 times faster than the pandoc version.
17 20
@@ -31,18 +34,11 @@ Deal with complex directory trees.
31- On the other hand, I could just create an empty page with the sub directories shown as usual. 34- On the other hand, I could just create an empty page with the sub directories shown as usual.
32- Scanning /usr/share/doc on my super desktop with looots of software installed will be fun. 35- Scanning /usr/share/doc on my super desktop with looots of software installed will be fun.
33- On the gripping hand, this is where we want empty directories to vanish. 36- On the gripping hand, this is where we want empty directories to vanish.
34 37- SOOOOOOO don't show empty directories, but show their subs that have content, even if that sub is deep, but as per usual stop once we find a sub on that branch. EEEEW branches.
35
36## Maybe not
37
38Extract title from Fos and Pm, maybe even pagetitle if possible. Title is pointless, both of them just use the file name.
39
40 38
41 39
42## Try out 40## Try out
43 41
44Lua pattern matching sucks in general. Might be why people use lpeg instead. Try it.
45
46htmx 42htmx
47 43
48cgit has Lua 44cgit has Lua
@@ -54,6 +50,7 @@ Reuse the user system from SledjChisl.
54 50
55levels - 51levels -
56 52
53- everyone
57- banned 54- banned
58- reader 55- reader
59- member 56- member
@@ -63,6 +60,8 @@ levels -
63- shell 60- shell
64- root 61- root
65 62
63Everyone can read the pages, no need for an account.
64
66Banned people can't do squat, except maybe pester an admin once to start the unbanning process. 65Banned people can't do squat, except maybe pester an admin once to start the unbanning process.
67 66
68When first registered, accounts are set to reader level. 67When first registered, accounts are set to reader level.
@@ -89,6 +88,6 @@ site, including configuration and modules. Likely this is the person
89that set the system up in the first place. 88that set the system up in the first place.
90 89
91Admin should have access to everything that shell level has, but there's always things need tweaking at some lower level. 90Admin should have access to everything that shell level has, but there's always things need tweaking at some lower level.
92Built in file browser might do the trick. Would be useful for content creators to to organise the content. Naturally should obey the permisisons. 91Built in file browser might do the trick. Would be useful for content creators to to organise the content. Naturally should obey the permissions.
93 92
94root level is whoever controls the server things are running on. They can do anything at all. 93root level is whoever controls the server things are running on. They can do anything at all.
diff --git a/default.template b/default.template
index bedfdcf..72462f4 100644
--- a/default.template
+++ b/default.template
@@ -6,41 +6,95 @@
6 <title>$title$</title> 6 <title>$title$</title>
7 <link rel="icon" type="image/png" href="$favicon$" /> 7 <link rel="icon" type="image/png" href="$favicon$" />
8 <style> 8 <style>
9 a:hover {color:red}
10
9 html {font-family: sans-serif;} 11 html {font-family: sans-serif;}
10 12
13 menu {
14 list-style-type: none;
15 }
16
11 pre { 17 pre {
12 background-color: $onefangPurple$; 18 background-color: $onefangPurple$;
13 overflow-x: auto; 19 overflow-x: auto;
14 width: 92vw; 20 width: 84vw;
15 margin: 1px; 21 margin: 1px;
16 } 22 }
17 23
18 menu { 24 table,
19 list-style-type: none; 25 td,
26 th {
27 background-color black;
28 border-collapse: collapse;
29 border: 1px solid white;
30 }
31
32 .contentBox {
33 }
34 .contentBox a:active {color: red}
35 .contentBox a:link {color: yellow}
36 .contentBox a:visited {color: yellowgreen}
37 .contentBox a:hover {color: red}
38
39 .stuff {
40 background-image: linear-gradient($karenPurple$, $onefangPurple$);
41 height: 98vh;
42 width: 98vw;
43 margin: 1;
44 line-style: none;
45 border-style: none;
46 border-spacing: 0;
47 border: none;
48 }
49 .stuffCell {
50 height: fit-content;
51 border: none;
52 }
53 .stuffCellBody {
54 background-color: black;
55 color: white;
56 border: none;
57 overflow-x: hidden;
58 overflow-y: auto;
59 height: 100%;
60 width: 100%;
61 vertical-align: top;
62 }
63 .stuffCellMenu {
64 height: fit-content;
65 width: fit-content;
66 border: none;
67 white-space: nowrap;
68 vertical-align: top;
69 }
70 .stuffCellRight {
71 height: fit-content;
72 border: none;
73 text-align: right;
20 } 74 }
21 75
22 </style> 76 </style>
23 </head> 77 </head>
24 <body bgcolor="black" text="white" alink="yellow" link="yellowgreen" vlink="red"> 78 <body bgcolor="black" color="white" text="white" alink="red" link="yellow" vlink="yellowgreen">
25 <table style="background-color: $karenPurple$; width: 98vw; margin: 1; line-style: none; border-style: none; border-spacing: 0;"> 79 <table class="stuff">
26 <tr> 80 <tr class="stuffCell">
27 <td><a href="$home$"><img src="$logo$" alt="Not (Yet) (Another / A) Wiki." title="Not (Yet) (Another / A) Wiki."/></a></td> 81 <td class="stuffCell"><a href="$home$"><img src="$logo$" alt="Not (Yet) (Another / A) Wiki." title="Not (Yet) (Another / A) Wiki."/></a></td>
28 <td><p>&#x1f463; &nbsp; $trail$</p></td> 82 <td class="stuffCell"><p>&#x1f463; &nbsp; $trail$</p></td>
29 </tr> 83 </tr>
30 <tr> 84 <tr class="stuffCell">
31 <td rowspan=2 style="white-space:nowrap; vertical-align:top;">$menu$</td> 85 <td class="stuffCellMenu" rowspan=2>$menu$</td>
32 <td style="text-align: right;">$header$ &nbsp; plus login and register buttons &nbsp;</td> 86 <td class="stuffCellRight">$header$ &nbsp; plus login and register buttons &nbsp;</td>
33 </tr> 87 </tr>
34 <tr> 88 <tr class="stuffCell">
35 <td style="background-color: black; width: fit-content;"> 89 <td class="stuffCellBody">
36 <main class="contentBox" style="overflow-y: auto; overflow-x: hidden;"> 90 <main class="contentBox">
37 $body$ 91 $body$
38 </main> 92 </main>
39 </td> 93 </td>
40 </tr> 94 </tr>
41 <tr> 95 <tr class="stuffCell">
42 <td>$history$</td> 96 <td class="stuffCell">$history$</td>
43 <td style="text-align: right;">$footer$</td> 97 <td class="stuffCellRight">$footer$</td>
44 </tr> 98 </tr>
45 </table> 99 </table>
46 </body> 100 </body>
diff --git a/nYAW.png b/nYAW.png
index a843126..3d756a0 100644
--- a/nYAW.png
+++ b/nYAW.png
Binary files differ
diff --git a/nYAW.xcf b/nYAW.xcf
index 50f6400..369f57e 100644
--- a/nYAW.xcf
+++ b/nYAW.xcf
Binary files differ
diff --git a/notYetAnotherWiki.lua b/notYetAnotherWiki.lua
index bddf63a..88a69fe 100755
--- a/notYetAnotherWiki.lua
+++ b/notYetAnotherWiki.lua
@@ -1,77 +1,49 @@
1#!/usr/bin/env luajit 1#!/usr/bin/env luajit
2 2
3-- Read the README file for what this is all about. If there is no README or similar, then you can find the link to the source below. 3--[[ Read the README file for what this is all about.
4 If there is no README or similar, then you can find the link to the source below.
4 5
5local lunamark = require("lunamark") -- https://github.com/jgm/lunamark 6 Normally I define functions and globals at the top, but here I'm interleaving them.
7]]
6 8
7local opts = { 9local Lunamark = require("lunamark") -- https://github.com/jgm/lunamark
8 layout='compact', 10local Lpeg = require("lpeg") -- https://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html Lunamark uses this, so we can to.
9-- This list is copied from the lunamark source code, until I discover a way to discover it. The descriptions are useful to. 11local RE = require("re") -- Part of lpeg. https://www.inf.puc-rio.br/~roberto/lpeg/re.html
10 containers=false, -- Put sections in containers (e.g. div or section tags) 12
11 slides=false, -- Like containers, but do not nest them 13
12 startnum=true, -- Start number of an ordered list is significant 14---------------------------------------------------------------------------------
13 smart=false, -- Smart typography (quotes, dashes, ellipses) 15-- Some global data.
14 preserve_tabs=true, -- Don't expand tabs to spaces 16
15 notes=true, -- Footnotes 17local GlobalMetaData = {
16 inline_notes=true, -- Inline footnotes 18 dlr = '&dollar;', perc = '%',
17 definition_lists=true, -- Definition lists 19 devuanCinnabarDark = '#310202', devuanCinnabarLight = '#510505',
18 citations=true, -- Citations 20 devuanDarkPurpyDark = '#33313b', devuanDarkPurpyLight = '#3c3a45',
19 citation_nbsps=true, -- Turn spacing into non-breaking spaces in citations 21 devuanDeepSeaDark = '#132f40', devuanDeepSeaLight = '#1a4562',
20 fenced_code_blocks=true, -- Fenced code blocks 22 devuanSaphireDark = '#004489', devuanSaphireLight = '#00509f',
21 lua_metadata=true, -- Lua metadata 23 devuanDevuanDark = '#000000', devuanDevuanLight = '#ffffff',
22 pandoc_title_blocks=true, -- Pandoc style title blocks 24 -- HTML link colours. Naturally HTML5 deprecated the simple version, replacing it with less simple CSS.
23 hash_enumerators=true, -- may be used as ordered list enumerator 25 -- <body> has alink, link, vlink; CSS has active, link, visited, and hover.
24 require_blank_before_blockquote=false, 26 devuanDevuanalink = '#03a4ff', devuanDevuanlink = '#0076b6', devuanDevuanvlink = '#6aa4db', devuanDevuanhlink = '#03a4ff',
25 require_blank_before_header=false, 27 devuanSDevuanalink = '#98c3db', devuanSDevuanlink = '#ffffff', devuanSDevuanvlink = '#ffffff', devuanSDevuanhlink = '#98c3db',
26 require_blank_before_fenced_code_block=false, 28 karenPurple = '#8800ff', onefangPurple = '#cc00ff',
27 fancy_lists=true, -- Pandoc style fancy lists 29 PinkFloyd = '#AA00AA', DeepPurple = '#220022', -- From an ancient site of mine, which went from PinkFloyd to DeepPurple as a background gradient.
28 task_list=true, -- GitHub-Flavored Markdown task list 30 favicon = 'nYAW_icon.png', logo = 'nYAW.png',
29 strikeout=true, -- Strike-through with double tildes 31 footer = 'Powered by <a href="https://sledjhamr.org/cgit/notYetAnotherWiki/about/">notYetAnotherWiki</a> version 0.0. &nbsp;',
30 mark=true, -- Highlight with double equals
31 subscript=true, -- Subscripted text between tildes
32 superscript=true, -- Superscripted text between circumflexes
33 bracketed_spans=true, -- Spans with attributes
34 fenced_divs=true, -- Divs with attributes
35 raw_attribute=true, -- Raw pass-through on code elements
36 fenced_code_attributes=true, -- Fenced code block attributes
37 link_attributes=true, -- Link attributes
38 pipe_tables=true, -- PHP Markdown Extra pipe table support
39 table_captions=true, -- Table caption syntax extension
40 header_attributes=true, -- Header attributes
41 line_blocks=true, -- Line blocks
42 escaped_line_breaks=true, -- Pandoc-style escaped hard line breaks
43} 32}
44local writer = lunamark.writer.html5.new(opts) 33
45local template = '' 34local Files, Subs, xLinks = {}, {}, {}
35
36local Template = ''
46local h = io.open("default.template", 'r') 37local h = io.open("default.template", 'r')
47if nil ~= h then 38if nil ~= h then
48 template = h:read('*a') 39 Template = h:read('*a')
49 h:close() 40 h:close()
50else 41else
51 print('oops! No such file ' .. 'default.template') 42 print('oops! No such file ' .. 'default.template')
52end 43end
53-- Can override the various writer functions, there's something for each of the basic HTML elements.
54-- Override anything that's generic.
55local parse = lunamark.reader.markdown.new(writer, opts)
56
57
58
59-- Some global data.
60local globalData = {
61 ['s'] = '&nbsp;', ['_'] = '&nbsp;', ['dlr'] = '&dollar;',
62 ['devuanCinnabarDark'] = '#310202', ['devuanCinnabarLight'] = '#510505',
63 ['devuanDarkPurpyDark'] = '#33313b', ['devuanDarkPurpyLight'] = '#3c3a45',
64 ['devuanDeepSeaDark'] = '#132f40', ['devuanDeepSeaLight'] = '#1a4562',
65 ['devuanSaphireDark'] = '#004489', ['devuanSaphireLight'] = '#00509f',
66 ['karenPurple'] = '#8800ff', ['onefangPurple'] = '#cc00ff',
67 favicon = 'nYAW_icon.png', logo = 'nYAW.png',
68 header = '', home = '', history = '', footer = 'Powered by <a href="https://sledjhamr.org/cgit/notYetAnotherWiki/about/">notYetAnotherWiki</a> version 0.0. &nbsp;',
69 --menu = '',
70}
71local Files, Subs = {}, {}
72
73 44
74 45
46---------------------------------------------------------------------------------
75-- Useful functions, part 0. 47-- Useful functions, part 0.
76 48
77-- A simple table.subtable = subtable wont work, you end up with a reference so that changes to the later get applied to the former. 49-- A simple table.subtable = subtable wont work, you end up with a reference so that changes to the later get applied to the former.
@@ -87,6 +59,15 @@ local derefTable = function(t, strip)
87end 59end
88 60
89 61
62local writeString = function(base, body)
63 local a, e = io.open(base, 'w')
64 if nil == a then print('Could not open ' .. base .. ' - ' .. e) else
65 a:write(body)
66 a:close()
67 end
68end
69
70
90-- String together the bits array into a path string. Or the other way around. lol 71-- String together the bits array into a path string. Or the other way around. lol
91local stringBits = function(l) 72local stringBits = function(l)
92 local bits = {} 73 local bits = {}
@@ -115,14 +96,55 @@ local toFile = function(name, key, value)
115 end 96 end
116 Files[name].path = path 97 Files[name].path = path
117-- Files[name].body = '' 98-- Files[name].body = ''
99 if ("Foswiki" == bits[1]) or ("PmWiki" == bits[1]) then Files[name].ogWiki = bits[1] end
118 end 100 end
119 if nil ~= key then Files[name][key] = value end 101 if nil ~= key then Files[name][key] = value end
120 for i, v in ipairs{'metadata', 'bits', } do 102 for i, v in ipairs{'metadata', 'bits', } do
121 if nil == Files[name][v] then Files[name][v] = {} end 103 if nil == Files[name][v] then Files[name][v] = {} end
122 end 104 end
105 -- Open the files and do the initial cleanups.
106 local body = ''
107 if '.md' ~= string.sub(name, -3, -1) then
108 h = io.open(name .. '.md', 'r')
109 if nil ~= h then
110-- print('Parsing ' .. name .. '.md')
111 body = h:read('*a') ; h:close()
112 -- Deal with my typical double spaced sentence endings, and other things.
113 local result = RE.compile( [=[{~
114 (
115 {[.?!]{" "}} -> '%1&nbsp;' / -- '&nbsp;' gets turned into hex 0xA0 by parse(). So feed it another metadata token that gets translated to &nbsp;. Seems we now skip this issue.
116 {[\\]{['"|$]}} -> '%2 ' / -- Do the same for fixing the \' \" \| etc mess pandoc left.
117 {"[" {([^]])+} "]{.foswiki" {([^FG}])+} "FG}" } -> "<span style='color: %3;'>%2</span>" /
118 {"::: {."[A-Za-z_. ]+"}"} -> '' /
119 {":::"} -> '' /
120 {"-noComment-"} -> ' -- ' /
121 {"{#"[A-Za-z_]+"}"} -> '' /
122 .
123 )* ~}]=], { } ):match(body)
124 body = result
125-- {"<!--".*"-->"} -> '' /
126-- {"[$]"} -> '$dlr$' / -- Replace $, coz otherwise it confuses things later.
127 body = RE.gsub(body, '{[$]}', '$dlr$')
128-- {"[%]"} -> '$perc$' / -- Gotta be done after the %1's above. otherwise screws things up when included above.
129-- body = RE.gsub(body, '{[%]}', '$perc$') -- Coz otherwise stray % trip up the capture part.
130 end
131 Files[name].body = body
132 end
123end 133end
124local toSub = function(name, key, value) 134local toSub = function(name, key, value)
125 if nil == Subs[name] then Subs[name] = {} end 135 if nil == Subs[name] then
136 local bits, bit = stringBits(name)
137 local path = ''
138 Subs[name] = {}
139 table.insert(bits, bit)
140 Subs[name].bits = bits
141 Subs[name].bit = bit
142 for i, d in ipairs(bits) do
143 if '' ~= path then path = path .. '/' end
144 path = path .. d
145 end
146 Subs[name].path = path
147 end
126 if nil ~= key then Subs[name][key] = value end 148 if nil ~= key then Subs[name][key] = value end
127 for i, v in ipairs{'metadata', 'bits', 'files', 'subs'} do 149 for i, v in ipairs{'metadata', 'bits', 'files', 'subs'} do
128 if nil == Subs[name][v] then Subs[name][v] = {} end 150 if nil == Subs[name][v] then Subs[name][v] = {} end
@@ -131,32 +153,108 @@ end
131 153
132 154
133 155
156---------------------------------------------------------------------------------
134-- Actually start doing things. 157-- Actually start doing things.
135 158
136-- Create the base of everything.md here, so it gets picked up as usual in the file scan. 159-- Create the base of everything.md here, so it gets picked up as usual in the file scan.
137local body, h = '', io.open('everything.md', 'w') 160h = io.open('everything.md', 'w')
138h:write('# All the pages\n') 161if nil ~= h then
139h:close() 162 h:close()
163else
164 print("Can't open everything.md for writing.")
165end
140 166
141 167
142-- Scan the subdirectories looking for .md files. 168-- Scan the subdirectories looking for our files.
143local directory = arg[1] 169local Directory = arg[1]
144toSub('') 170toSub('')
145if nil == directory then directory = '.' end 171if nil == Directory then Directory = '.' end
146if '.' ~= directory then 172
147 for l in io.popen('find . -name "*.md" -type f,l -printf "%P\n"'):lines() do 173for l in io.popen('find -L ' .. Directory .. ' -name "*.HTM" -type f,l -printf "%P\n"'):lines() do
174-- print('pandoc converting ' .. l .. ' -> ' .. string.sub(l, 1, -4) .. 'md')
175 -- Open the HTM files and do the initial cleanups, then pandoc them.
176 h = io.open(l, 'r')
177 if nil ~= h then
178 local body = h:read('*a') ; h:close()
179 if 'Foswiki' == string.sub(l, 1, 7) then
180 -- Strip out the actual content.
181 local beg, en = RE.find(body, [['<div id="patternMainContents">']]) if nil ~= beg then body = string.sub(body, en + 1) end
182 beg, en = RE.find(body, [['<div class="patternContent">']]) if nil ~= beg then body = string.sub(body, en + 1) end
183 beg, en = RE.find(body, [['<div class="foswikiTopic">']]) if nil ~= beg then
184 if ' -- ' == string.sub(body, en + 1, en + 4) then
185 beg, en = RE.find(body, '[%nl]', en + 4)
186 body = string.sub(body, en + 1)
187 end
188 end
189 beg, en = RE.find(body, [['<div class="patternInfo">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end
190-- beg, en = RE.find(body, [['<div class="foswikiForm foswikiFormStep">']]) if nil ~= beg then body = string.sub(body, 1, en + 1) end
191 beg, en = RE.find(body, [['<div class="foswikiAttachments foswikiFormStep" style="overflow:auto">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end
192 beg, en = RE.find(body, [['<div class="foswikiSearchResultsPager">']]) if nil ~= beg then body = string.sub(body, 1, beg - 1) end
193 -- Some clean ups.
194 local result = RE.compile( [[{~
195 (
196 {'class="foswikiCurrentTopicLink"'} -> blank /
197 {'class="foswikiNewLink"'} -> blank /
198 {" -- "} -> '-noComment-' /
199-- {"-- " ([^%nl])* } -> blank /
200 {'<div class="foswikiTopic">'} -> blank /
201 {'rel="nofollow"'} -> blank / {"rel='nofollow'"} -> blank /
202 {"target='_blank'"} -> blank /
203 {"</div>" ([%nl])* } -> blank /
204 {'style="' ([^"])+ '"'} -> '' / {"style='" ([^'])+ "'"} -> '' /
205 .
206 )* ~}]], { blank = function(a) return '' end } ):match(body)
207 body = result
208-- body = RE.gsub(body, [=[{"<!-- ".*"-->"}]=], '') -- FIXME
209 writeString(l .. '_NEW', body)
210 elseif 'PmWiki' == string.sub(l, 1, 6) then
211 local beg, en = RE.find(body, [['<!--PageText-->']]) if nil ~= beg then body = string.sub(body, en + 2) end
212 beg, en = RE.find(body, [["div id='wikitext'>"]]) if nil ~= beg then body = string.sub(body, en + 2) end
213 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.
214 beg, en = RE.find(body, [['<!--HTMLFooter-->']]) if nil ~= beg then body = string.sub(body, 1, beg - 2) end
215 local result = RE.compile( [[{~
216 (
217 {"class='categorylink'"} -> blank /
218 {"class='createlink'"} -> blank /
219 {"class='createlinktext'"} -> blank /
220 {"class='escaped'"} -> blank /
221 {"class='diffmarkup'"} -> blank /
222 {"class='selflink'"} -> blank /
223 {"class='urllink'"} -> blank /
224 {"<div class='vspace'></div><hr /> <a class='wikilink' href='https://wiki.devuan.org?n=Profiles." .* ([%nl])* } -> blank /
225 {"<a class='selflink' href='https://wiki.devuan.org?n=Profiles." .* ([%nl])* } -> blank /
226 {"<div class='vspace'></div><hr />"} -> blank /
227 {"<div class='vspace'></div>"} -> blank /
228 {"class='wikilink'"} -> blank /
229 {'rel="nofollow"'} -> blank / {"rel='nofollow'"} -> blank /
230 {"target='_blank'"} -> blank /
231 {'style="' ([^"])+ '"'} -> '' / {"style='" ([^'])+ "'"} -> '' /
232 {"<span class='hlt " {([a-z])+} "'></span><pre" } -> "<pre class='%2'" /
233 .
234 )* ~}]], { blank = function(a) return '' end } ):match(body)
235 body = result
236 writeString(l .. '_NEW', body)
237 end
238 end
239
240 ok, rslt, status = os.execute('pandoc -f html -t commonmark_x --self-contained ' .. l .. '_NEW' .. ' >' .. string.sub(l, 1, -4) .. 'md')
241end
242
243if '.' ~= Directory then
244 for l in io.popen('find -L . -name "*.md" -type f,l -printf "%P\n"'):lines() do
148 toFile(string.gsub(l, '%.md$', '')) 245 toFile(string.gsub(l, '%.md$', ''))
149 end 246 end
150end 247end
248
151-- Can add in a distant directory to, for putting it's results in the current directory. 249-- Can add in a distant directory to, for putting it's results in the current directory.
152for l in io.popen('find ' .. directory .. ' -name "*.md" -type f,l -printf "%P\n"'):lines() do 250for l in io.popen('find -L ' .. Directory .. ' -name "*.md" -type f,l -printf "%P\n"'):lines() do
153 local n = string.gsub(l, '%.md$', '') 251 local n = string.gsub(l, '%.md$', '')
154 if nil == Files[n] then toFile(n) end 252 if nil == Files[n] then toFile(n) end
155end 253end
156 254
157 255
158-- Gotta figure out all the files and subs first. File and sub metadata comes along for the ride, coz we need them later. 256-- Gotta figure out all the files and subs first. File and sub metadata comes along for the ride, coz we need them later.
159local newMeta = {} 257local NewMeta = {}
160for name, file in pairs(Files) do 258for name, file in pairs(Files) do
161 local bitter, path = '', '' 259 local bitter, path = '', ''
162 local bits, bit = file.bits, file.bit 260 local bits, bit = file.bits, file.bit
@@ -169,7 +267,7 @@ for name, file in pairs(Files) do
169 for i, d in ipairs(bits) do 267 for i, d in ipairs(bits) do
170 if '' ~= path then path = path .. '/' end 268 if '' ~= path then path = path .. '/' end
171 path = path .. d 269 path = path .. d
172 toSub(path, 'bits', derefiTable(bits, true)) 270 toSub(path)
173 if i < ln then 271 if i < ln then
174 Subs[path].subs[bits[i + 1]] = bits[i + 1] 272 Subs[path].subs[bits[i + 1]] = bits[i + 1]
175 table.remove(Subs[path].bits, #bits) 273 table.remove(Subs[path].bits, #bits)
@@ -178,121 +276,45 @@ for name, file in pairs(Files) do
178 276
179 if '.md' == string.sub(name, -3, -1) then 277 if '.md' == string.sub(name, -3, -1) then
180 -- This is a metadata only file, no content, stash the matadata. 278 -- This is a metadata only file, no content, stash the matadata.
181 for l in io.open(name .. '.md'):lines() do 279 local h1 = io.open(name .. '.md')
182 for k, v in string.gmatch(l, "(%w+)%s*=%s*(.+)") do 280 if nil == h1 then print('Could not open ' .. name .. '.md') else
183 if nil == v then 281 for l in h1:lines() do
184 print(name .. ' ' .. k) 282 for k, v in string.gmatch(l, "(%w+)%s*=%s*(.+)") do
185 else 283 if nil == v then
186 metadata[k] = v 284 print(name .. ' ' .. k)
285 else
286 metadata[k] = v
287 end
187 end 288 end
188 end 289 end
189 end 290 end
190 if '.md' == name then toSub(path, 'metadata', metadata) 291 if '.md' == name then toSub(path, 'metadata', metadata)
191 elseif '/.md' == string.sub(name, -4, -1) then toSub(path, 'metadata', metadata) 292 elseif '/.md' == string.sub(name, -4, -1) then toSub(path, 'metadata', metadata)
192-- else toFile(string.sub(name, 1, -4), 'metadata', metadata) 293-- else toFile(string.sub(name, 1, -4), 'metadata', metadata)
193 else newMeta[string.sub(name, 1, -4)] = metadata 294 else NewMeta[string.sub(name, 1, -4)] = metadata -- Coz we can't add to Files here.
194 end 295 end
195 Files[name] = nil 296 Files[name] = nil
196 end 297 end
197end 298end
198 299
199-- FIXTHEM - Lua doesn't like modifying the thing you are pair()ing, like we want to do in the last loop. 300-- FIXED - Lua doesn't like modifying the thing you are pair()ing, like we want to do in the last loop.
200for name, file in pairs(newMeta) do 301for name, file in pairs(NewMeta) do
201 if nil == Files[name] then toFile(name) end 302 if nil == Files[name] then toFile(name) end
202 if nil == Files[name].metadata then Files[name].metadata = {} end
203 for k, v in pairs(file) do 303 for k, v in pairs(file) do
204 if nil == Files[name].metadata[k] then Files[name].metadata[k] = v end 304 if nil == Files[name].metadata[k] then Files[name].metadata[k] = v end
205 end 305 end
206end 306end
207 307
208-- Open the files and do the iniital cleanups. 308-- Fix up subs now we have all the file bits.
209for name, file in pairs(Files) do 309for name, file in pairs(Files) do
210 if '.md' ~= string.sub(name, -3, -1) then 310 if '.md' ~= string.sub(name, -3, -1) then
211-- print('Parsing ' .. name .. '.md') 311 table.insert(Subs[file.path].files, file.bit)
212 h = io.open(name .. '.md', 'r')
213 if nil ~= h then
214 body = h:read('*a') ; h:close()
215 local f0, f1, token
216 -- Deal with my typical double spaced sentence endings.
217 local result = ''
218 local start = 1
219 repeat
220 f0, f1, token = string.find(body, '([%.%?%!] )', start)
221 if fail ~= f0 then
222 result = result .. string.sub(body, start, f0)
223 if ' ' == string.sub(body, f1 + 1, f1 + 1) then
224 result = result .. '$s$ ' -- '&nbsp;' gets turned into hex 0xA0 by parse(). So feed it another metadata token that gets translated to &nbsp;.
225 else
226 result = result .. ' '
227 end
228 start = f1 + 1
229 end
230 until fail == f0
231 result = result .. string.sub(body, start)
232 -- Do the same for fixing the \' \" \| etc mess pandoc left that sed can't fix.
233 body = result
234 result = ''
235 start = 1
236 repeat
237 f0, f1, token = string.find(body, '(%\\[%"%\'%|%$])', start)
238 if fail ~= f0 then
239 result = result .. string.sub(body, start, f0 - 1)
240 start = f1
241 end
242 until fail == f0
243 result = result .. string.sub(body, start)
244 body = result
245 end
246 Files[name].body = body
247 table.insert(Subs[Files[name].path].files, Files[name].bit)
248 end
249end
250
251
252
253-- Figure out the original title and link for the original wiki.
254-- This functions assume the above file and sub scan has completed.
255local whichWiki = function(metadata)
256 local title, link = '', ''
257 if 'PmWiki' == metadata.ogWiki then
258 title = '[' .. metadata.ogBase .. '.' .. metadata.ogFile .. ']'
259 link = '(' .. metadata.ogURL .. '/?n=' .. metadata.ogBase .. '.' .. metadata.ogFile .. ')'
260 end
261 if 'Foswiki' == metadata.ogWiki then
262 title = '[' .. metadata.ogBase .. '/' .. metadata.ogFile .. ']'
263 link = '(' .. metadata.ogURL .. '/' .. metadata.ogBase .. '/' .. metadata.ogFile .. ')'
264 end
265 return title, link
266end
267
268
269-- Create an "everything" page, for URL links to every file.HTML.
270local bdy, h = Files['everything'].body, io.open('everything.md', 'a+')
271bdy = bdy .. '\n\n| page | converted | original page | last edited UTC | \n| ---- | --------- | ------- | --------------- | '
272pages = {}
273for name, file in pairs(Files) do
274 local metadata = derefTable(Files[name].metadata, true)
275 if 'everything' ~= name then
276 local ln, fw, pw, ts = 'DUNNO', '', '', ''
277 local title, link = whichWiki(metadata)
278 if 'PmWiki' == metadata.ogWiki then pw = 'PmWiki ' .. title .. link end
279 if 'Foswiki' == metadata.ogWiki then fw = 'Foswiki ' .. title .. link end
280 if nil ~= metadata.timestamp then ts = metadata.timestamp end
281 if nil ~= file.bit then ln = file.bit
282 end
283 table.insert(pages, '\n| ' .. name .. ' | [' .. ln .. '](<' .. name .. '.HTML>) | ' .. fw .. ' ' .. pw .. ' | ' .. ts .. ' |')
284 end 312 end
285end 313end
286table.sort(pages, function(a, b) return (string.lower(a) < string.lower(b)) end)
287for i, f in ipairs(pages) do
288 bdy = bdy .. f
289end
290h:write(bdy)
291h:close()
292toFile('everything', 'body', parse(bdy))
293 314
294 315
295 316
317---------------------------------------------------------------------------------
296-- These functions assume the above file and sub scan has completed. 318-- These functions assume the above file and sub scan has completed.
297 319
298-- Which page in this directory should we show? 320-- Which page in this directory should we show?
@@ -323,93 +345,246 @@ local whichPage = function(f)
323end 345end
324 346
325 347
348-- Figure out the original title and link for the original wiki.
349local whichWiki = function(metadata)
350 local title, link = '', ''
351 if 'PmWiki' == metadata.ogWiki then
352 title = metadata.ogBase .. '.' .. metadata.ogFile
353 link = metadata.ogURL .. '/?n=' .. metadata.ogBase .. '.' .. metadata.ogFile
354 end
355 if 'Foswiki' == metadata.ogWiki then
356 title = metadata.ogBase .. '/' .. metadata.ogFile
357 link = metadata.ogURL .. '/' .. metadata.ogBase .. '/' .. metadata.ogFile
358 end
359 return title, link
360end
361
362
326-- Calculate a link from the source directory to the destination directory. 363-- Calculate a link from the source directory to the destination directory.
327local linkFrom = function(source, dest) 364local linkFrom = function(source, dest)
365 -- Evil hacks!
366 if 'Profiles' == dest then dest = 'PmWiki/Profiles' end
367 if 'Onefang' == dest then dest = 'PmWiki/Onefang' end
368
369 if source == dest then return '' end
328 local depth = 0 370 local depth = 0
329 local link = '' 371 local lnk = ''
330 if source ~= dest then 372 if source ~= dest then
331 for i, v in ipairs(Subs[source].bits) do 373 if nil == Subs[source] then
332 if v ~= Subs[dest].bits[i] then 374-- print('!!!! No idea where to find source ' .. source)
333 depth = i 375 return 'DUNNO'
334 break 376 end
377 if nil == Subs[dest] then
378 if dest == Subs[source].bit then
379 return ''
380 else
381-- print('!!!! No idea where to find dest ' .. dest .. ' from ' .. Subs[source].path .. ' / ' .. Subs[source].bit)
382 return 'DUNNO'
335 end 383 end
336 end 384 end
385 local s = Subs[source].bits
386 local d = Subs[dest].bits
387 local sl = #s
388 local dl = #d
337 389
338 if #(Subs[dest].bits) >= #(Subs[source].bits) then 390 if 0 == dl then
339 depth = #(Subs[source].bits) 391 depth = sl
340 for i, v in ipairs(Subs[dest].bits) do 392 else
341 if i > depth then 393 for i, v in ipairs(s) do
342 if '' ~= link then link = link .. '/' end 394 if (nil == d[i]) or (v ~= d[i]) then
343 link = link .. Subs[dest].bits[i] 395 depth = i
396 break
344 end 397 end
345 end 398 end
346 if '' ~= link then link = link .. '/' end
347 else
348 depth = #(Subs[source].bits) - depth
349 depth = depth + 1
350 link = string.rep('../', depth)
351 end 399 end
400 -- depth is where they DON'T match.
401 local m = depth - 1
402 if 0 > m then m = 0 end
403 lnk = string.rep('../', sl - m)
404 if 0 ~= (m + 1) then lnk = lnk .. table.concat(d, '/', m + 1, dl) end
352 end 405 end
353 return link 406 return lnk
354end 407end
355 408
356 409
410
411---------------------------------------------------------------------------------
357-- More of this actually doing things nonsense. 412-- More of this actually doing things nonsense.
358 413
414-- Create an "everything" page, for URL links to every file.HTML.
415local Bdy = '# All the pages\n\n| page | converted | original page | last edited UTC | \n| ---- | --------- | ------- | --------------- | '
416Pages = {}
417for name, file in pairs(Files) do
418 local metadata = derefTable(Files[name].metadata, true)
419 if ('everything' ~= name) then
420 local ln, fw, pw, ts = 'DUNNO', '', '', ''
421 local title, link = whichWiki(metadata)
422 link = string.gsub(link, 'https://', 'HTTPS://') -- Prevent this one from being converted.
423 if 'PmWiki' == metadata.ogWiki then pw = 'PmWiki [' .. title .. '](' .. link .. ')' end
424 if 'Foswiki' == metadata.ogWiki then fw = 'Foswiki [' .. title .. '](' .. link .. ')' end
425 if nil ~= metadata.timestamp then ts = metadata.timestamp end
426 if nil ~= file.bit then ln = file.bit
427 end
428 table.insert(Pages, '\n| ' .. name .. ' | [' .. ln .. '](<' .. name .. '.HTML>) | ' .. fw .. ' ' .. pw .. ' | ' .. ts .. ' |')
429
430 -- Track our external links.
431 if (nil ~= metadata.ogBase) and (nil ~= metadata.ogFile) then
432 local n = metadata.ogBase
433 if 'PmWiki' == metadata.ogWiki then n = n .. '.' else n = n .. '/' end
434 xLinks[n .. metadata.ogFile] = file.path
435 end
436 end
437end
438table.sort(Pages, function(a, b) return (string.lower(a) < string.lower(b)) end)
439for i, f in ipairs(Pages) do
440 Bdy = Bdy .. f
441end
442h = io.open('everything.md', 'a+')
443if nil ~= h then
444 h:write(Bdy)
445 h:close()
446else
447 print("Can't open everything.md for writing.")
448end
449toFile('everything', 'body', Bdy)
450
451
359-- Loop through Subs, doing whichPage and inheritance. 452-- Loop through Subs, doing whichPage and inheritance.
453-- It gets to testing/even/deeper BEFORE it gets to testing/even sometimes. So sort them.
454SUBS = {}
360for name, sub in pairs(Subs) do 455for name, sub in pairs(Subs) do
456 table.insert(SUBS, sub)
457end
458table.sort(SUBS, function(a, b) return (string.lower(a.path) < string.lower(b.path)) end)
459for n, sub in pairs(SUBS) do
460 local name = sub.path
361 sub.whichPage = whichPage(name) 461 sub.whichPage = whichPage(name)
362 local metadata = sub.metadata 462 local metadata = sub.metadata
363 for i, s in pairs(sub.subs) do 463 for i, s in pairs(sub.subs) do
364 local nm = i 464 local nm = i
365 if '' ~= name then nm = name .. '/' .. i end 465 if '' ~= name then nm = name .. '/' .. i end
366 ss = Subs[nm]
367 for k, v in pairs(metadata) do 466 for k, v in pairs(metadata) do
368 if nil == ss.metadata[k] then 467 if nil == Subs[nm].metadata[k] then
369 if ('favicon' == k) or ('logo' == k) then 468 if ('favicon' == k) or ('logo' == k) then
370 ss.metadata[k] = linkFrom(nm, name) .. v 469 Subs[nm].metadata[k] = linkFrom(nm, name) .. v
371 else 470 else
372 ss.metadata[k] = v 471 if 'hidden' ~= k then -- Don't inherit hidden.
472 Subs[nm].metadata[k] = v
473 end
373 end 474 end
374 end 475 end
375 end 476 end
376 end 477 end
377end 478end
378 479
379-- Loop through the files we found and actually create their HTML files. 480-- Files inheritance.
380for name, file in pairs(Files) do 481for name, file in pairs(Files) do
381 local path, result = '', '' 482 if '' ~= file.body then
382 local body, metadata = Files[name].body, derefTable(Files[name].metadata, true) 483 local mdata = Subs[file.path].metadata
383 local bits, bit = Files[name].bits, Files[name].bit
384 local ln = #bits
385
386 path = table.concat(bits, '/', 1, ln)
387
388 if '' ~= body then
389 -- Inherit stuff from sub and global.
390 local mdata = Subs[path].metadata
391 for k, v in pairs(mdata) do 484 for k, v in pairs(mdata) do
392 if nil == file.metadata[k] then 485 if nil == file.metadata[k] then
393 file.metadata[k] = v 486 Files[name].metadata[k] = v
394 end 487 end
395 end 488 end
396 Files[name].metadata = file.metadata 489 end
397 metadata = derefTable(Files[name].metadata, true) 490end
398 for m, x in pairs(globalData) do if nil == metadata[m] then metadata[m] = x end end
399 491
400 if nil ~= metadata.ogURL then 492
401 local title, link = whichWiki(metadata) 493---------------------------------------------------------------------------------
402 body = body .. '\n\n---\n\n[Original page]' .. link .. ', maybe you can edit it.\n' 494-- Setup the lunarmark stuff.
495local LunamarkOpts = {
496 layout='compact',
497-- This list is copied from the lunamark source code, until I discover a way to discover it. The descriptions are useful to.
498 containers=false, -- Put sections in containers (e.g. div or section tags)
499 slides=false, -- Like containers, but do not nest them
500 startnum=true, -- Start number of an ordered list is significant
501 smart=false, -- Smart typography (quotes, dashes, ellipses)
502 preserve_tabs=true, -- Don't expand tabs to spaces
503 notes=true, -- Footnotes
504 inline_notes=true, -- Inline footnotes
505 definition_lists=true, -- Definition lists
506 citations=true, -- Citations
507 citation_nbsps=true, -- Turn spacing into non-breaking spaces in citations
508 fenced_code_blocks=true, -- Fenced code blocks
509 lua_metadata=true, -- Lua metadata
510 pandoc_title_blocks=true, -- Pandoc style title blocks
511 hash_enumerators=true, -- may be used as ordered list enumerator
512 require_blank_before_blockquote=false,
513 require_blank_before_header=false,
514 require_blank_before_fenced_code_block=false,
515 fancy_lists=true, -- Pandoc style fancy lists
516 task_list=true, -- GitHub-Flavored Markdown task list
517 strikeout=true, -- Strike-through with double tildes
518 mark=true, -- Highlight with double equals
519 subscript=true, -- Subscripted text between tildes
520 superscript=true, -- Superscripted text between circumflexes
521 bracketed_spans=true, -- Spans with attributes
522 fenced_divs=true, -- Divs with attributes
523 raw_attribute=true, -- Raw pass-through on code elements
524 fenced_code_attributes=true, -- Fenced code block attributes
525 link_attributes=true, -- Link attributes
526 pipe_tables=true, -- PHP Markdown Extra pipe table support
527 table_captions=true, -- Table caption syntax extension
528 header_attributes=true, -- Header attributes
529 line_blocks=true, -- Line blocks
530 escaped_line_breaks=true, -- Pandoc-style escaped hard line breaks
531}
532local Writer = Lunamark.writer.html5.new(LunamarkOpts)
533
534-- Can override the various writer functions, there's something for each of the basic HTML elements.
535local Context = {} -- Coz can't otherwise pass context through to the deeper Lunamark functions I'm overriding.
536-- Fix up the links.
537local OgWriterLink = Writer.link -- So we can call the original from within mine, we are just changing the URL.
538function Writer.link(lab, url, tit)
539 if ('https://wiki.devuan.org/' ~= url) and ('https://fos.wiki.devuan.org/' ~= url) then
540 local label = lab
541 local uri = url
542 if 'string' ~= type(lab) then label = type(lab) end
543 for i, p in ipairs{'https://wiki.devuan.org/?n=', 'https://wiki.devuan.org?n=', 'https://fos.wiki.devuan.org/'} do
544 if p == string.sub(url, 1, #p) then
545 local ur = string.sub(url, #p + 1)
546-- TODO - could probably replace some of this mess with RE.gsub() and friends. Meh, it works.
547 local f4, f5, tk1 = string.find(ur, '?', 1, true)
548 if fail ~= f4 then
549 local u = string.sub(ur, 1, f4 - 1)
550 ur = u
551 end
552 if nil == Context.path then
553 url = string.gsub(ur, '%.', '/', 1)
554 else
555 local xlnk = xLinks[string.gsub(ur, '%..*', '', 1)]
556 if nil == xlnk then xlnk = string.gsub(ur, '%..*', '', 1) end
557 if '' ~= Context.path then xlnk = linkFrom(Context.path, xlnk) end
558 if '/' == string.sub(xlnk, 1, 1) then xlnk = string.sub(xlnk, 2) end
559 if ('' ~= xlnk) and ('/' ~= string.sub(xlnk, -1)) then xlnk = xlnk .. '/' end
560 if 'DUNNO/' == xlnk then print('OOPS! Page not found - ' .. Context.path .. ' / ' .. Context.bit .. ' ' .. url .. ' -> ' .. xlnk .. ' ' .. string.gsub(ur, '.*%.', '', 1) .. '.HTML') end
561 url = xlnk .. string.gsub(ur, '.*%.', '', 1) .. '.HTML'
562 end
563 end
403 end 564 end
565 end
566 return OgWriterLink(lab, url, tit)
567end
568local Parse = Lunamark.reader.markdown.new(Writer, LunamarkOpts)
569
404 570
571---------------------------------------------------------------------------------
572-- Loop through the files we found and actually create their HTML files.
573for name, file in pairs(Files) do
574 local body, metadata = Files[name].body, derefTable(Files[name].metadata, true)
575 local bits, bit = Files[name].bits, Files[name].bit
576 local ln = #bits
577 local result = ''
578
579 if '' ~= body then
405 -- Figure out this pages trail links. 580 -- Figure out this pages trail links.
406 metadata.home = linkFrom(path, '') .. Subs[''].whichPage 581 metadata.home = linkFrom(file.path, '') .. Subs[''].whichPage
407 metadata.trail = '' 582 metadata.trail = ''
408 for i, b in ipairs(bits) do 583 for i, b in ipairs(bits) do
409 local p = table.concat(bits, '/', 1, i) 584 local p = table.concat(bits, '/', 1, i)
410 if i < #bits then 585 if i < #bits then
411 metadata.trail = metadata.trail .. '<a href="' .. linkFrom(path, p) .. Subs[p].whichPage .. '">' .. b .. '</a> &#x1f463; &nbsp; ' 586 metadata.trail = metadata.trail .. '<a href="' .. linkFrom(file.path, p) .. Subs[p].whichPage .. '">' .. b .. '</a> &#x1f463; &nbsp; '
412 linkFrom(path, table.concat(bits, '/', 1, i)) 587 linkFrom(file.path, table.concat(bits, '/', 1, i))
413 else 588 else
414 metadata.trail = metadata.trail .. b .. ' &nbsp; ' 589 metadata.trail = metadata.trail .. b .. ' &nbsp; '
415 end 590 end
@@ -418,28 +593,30 @@ for name, file in pairs(Files) do
418 -- Figure out this pages header links. 593 -- Figure out this pages header links.
419 metadata.header = '' 594 metadata.header = ''
420 subs = {} 595 subs = {}
421 for i, f in pairs(Subs[path].subs) do 596 for i, f in pairs(Subs[file.path].subs) do
422 table.insert(subs, f) 597 table.insert(subs, f)
423 end 598 end
424 table.sort(subs, function(a, b) return (string.lower(a) < string.lower(b)) end) 599 table.sort(subs, function(a, b) return (string.lower(a) < string.lower(b)) end)
425 for i, f in ipairs(subs) do 600 for i, f in ipairs(subs) do
426 local pth = path 601 local pth = file.path
427 if '' ~= path then pth = path .. '/' end 602 if '' ~= file.path then pth = file.path .. '/' end
428 metadata.header = metadata.header .. '<a href="' .. f .. '/' .. whichPage(pth .. f) .. '">' .. f .. '</a> &nbsp; ' 603 if 'true' ~= Subs[pth .. f].metadata.hidden then
604 metadata.header = metadata.header .. '<a href="' .. f .. '/' .. whichPage(pth .. f) .. '">' .. f .. '</a> &nbsp; '
605 end
429 end 606 end
430 607
431 -- Figure out this pages menu links. 608 -- Figure out this pages menu links.
432 metadata.menu = '' 609 metadata.menu = ''
433 if nil == metadata.title then metadata.title = bit end 610 if nil == metadata.title then metadata.title = bit end
434 if nil ~= Subs[path].files then table.sort(Subs[path].files, function(a, b) return (string.lower(a) < string.lower(b)) end) end 611 if nil ~= Subs[file.path].files then table.sort(Subs[file.path].files, function(a, b) return (string.lower(a) < string.lower(b)) end) end
435 for i, f in ipairs(Subs[path].files) do 612 for i, f in ipairs(Subs[file.path].files) do
436 local title, url = nil, nil 613 local title, url = nil, nil
437 if '' == path then 614 if '' == file.path then
438 title = Files[f].metadata.title 615 title = Files[f].metadata.title
439 url = Files[f].metadata.URL 616 url = Files[f].metadata.URL
440 else 617 else
441 title = Files[path .. '/' .. f].metadata.title 618 title = Files[file.path .. '/' .. f].metadata.title
442 url = Files[path .. '/' .. f].metadata.URL 619 url = Files[file.path .. '/' .. f].metadata.URL
443 end 620 end
444 if nil == title then title = f end 621 if nil == title then title = f end
445 if bit == f then metadata.menu = metadata.menu .. '<p>' .. title .. '</p>' 622 if bit == f then metadata.menu = metadata.menu .. '<p>' .. title .. '</p>'
@@ -451,42 +628,47 @@ for name, file in pairs(Files) do
451 end 628 end
452 629
453 -- Figure out this pages footer links. 630 -- Figure out this pages footer links.
454 if nil ~= metadata.pagehistory then metadata.history = '<p>Page&nbsp;<a href="' .. metadata.pagehistory .. '/' .. name .. '.md">history</a></p>' end 631 metadata.footer = GlobalMetaData.footer
632 if nil ~= metadata.pagehistory then metadata.history = '<p>Page&nbsp;<a href="' .. metadata.pagehistory .. '/' .. name .. '.md">history</a></p>' else metadata.history = '' end
455 if nil ~= metadata.sourcecode then metadata.footer = '<a href="' .. metadata.sourcecode .. '">source code</a> &nbsp; &nbsp; ' .. metadata.footer end 633 if nil ~= metadata.sourcecode then metadata.footer = '<a href="' .. metadata.sourcecode .. '">source code</a> &nbsp; &nbsp; ' .. metadata.footer end
456 if nil ~= metadata.feedatom then metadata.footer = '<a href="' .. metadata.feedatom .. '">atom feed</a> &nbsp; &nbsp; ' .. metadata.footer end 634 if nil ~= metadata.feedatom then metadata.footer = '<a href="' .. metadata.feedatom .. '">atom feed</a> &nbsp; &nbsp; ' .. metadata.footer end
457 if metadata.footer ~= globalData.footer then metadata.footer = 'Web site ' .. metadata.footer end 635 if metadata.footer ~= GlobalMetaData.footer then metadata.footer = 'Web site ' .. metadata.footer end
636 -- Add a link to the original page.
637 if nil ~= metadata.ogURL then
638 local title, link = whichWiki(metadata)
639 link = string.gsub(link, 'https://', 'HTTPS://') -- Prevent this one from being converted.
640 metadata.footer = '<a href="' .. link .. '">Original page</a>, maybe you can edit it. &nbsp; ' .. metadata.footer
641 end
458 metadata.footer = '<p>' .. metadata.footer .. '</p>' 642 metadata.footer = '<p>' .. metadata.footer .. '</p>'
459 643
460 -- Do our own metadata replacement, it's simple and works better. 644 -- Do our own metadata replacement, it's simple and works better.
461 local temp = template 645 local temp = Template
462 local start = 1
463 local f0, f1, token
464 -- Toss the body in first, so the scan can deal with it to. 646 -- Toss the body in first, so the scan can deal with it to.
465 f0, f1, token = string.find(temp, '%$(body)%$') 647 -- NOTE - this is where we actually parse the markup into HTML.
466 if fail ~= f0 then 648 Context = file
467 -- NOTE - this is where we actually parse the markup into HTML. 649 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.
468 temp = string.sub(temp, 1, f0 - 1) .. parse(body) .. string.sub(temp, f1 + 1) 650 bd = RE.gsub(bd, '{[%]}', '$perc$') -- Coz otherwise stray % trip up the capture part.
469 end 651 temp = RE.gsub(temp, '"$body$"', bd)
470 -- The actual metadata replacement scan. 652 -- The actual metadata replacement.
471 result = '' 653 result = RE.compile ('{~ ({[$][A-Za-z_]+[$]} -> meta / .)* ~}',
472 repeat 654 {
473 f0, f1, token = string.find(temp, '%$([%w_]+)%$', start) 655 meta = function(a)
474 if fail ~= f0 then 656 a = string.sub(a, 2, -2)
475 if nil ~= metadata[token] then result = result .. string.sub(temp, start, f0 - 1) .. metadata[token] end 657 local md = metadata[a]
476 start = f1 + 1 658 if nil == md then
659 md = GlobalMetaData[a]
660 if nil == md then
661 md = a
662 end
663 end
664 return md
477 end 665 end
478 until fail == f0 666 } ):match(temp)
479 result = result .. string.sub(temp, start)
480 667
481 -- Write the file. 668 -- Write the file.
482 if '' ~= result then 669 if '' ~= result then
483 local base = name .. '.HTML'
484-- print('From ' .. name .. '.md -> ' .. base) 670-- print('From ' .. name .. '.md -> ' .. base)
485 local a, e = io.open(base, 'w') 671 writeString(name .. '.HTML', result)
486 if nil == a then print('Could not open ' .. base .. ' - ' .. e) else
487 a:write(result)
488 a:close()
489 end
490 end 672 end
491 end 673 end
492end 674end
diff --git a/testing/index.md b/testing/index.md
index 276fcb1..ca62e7f 100644
--- a/testing/index.md
+++ b/testing/index.md
@@ -22,7 +22,9 @@ Also a \\ at the end of a line turns into a line break, though they get wrapped
22 22
23Just to double check. That's a single space. 23Just to double check. That's a single space.
24 24
25\ 25\ \$ \' \" \| %
26
27I'm 100% sure that % will get treated correctly now.
26 28
27## Strike out 29## Strike out
28 30
@@ -96,6 +98,21 @@ Autonumbering? Needs the extension. Doesn't matter, they get renumbered anyway
96 98
97Next code block. 99Next code block.
98 100
101
102~~~lua
103 a simple
104 indented code block
105 <a/>
106 *hi*
107
108 - one
109
110 Plus some extra text.
111~~~
112
113
114Next code block.
115
99~~~ 116~~~
100< 117<
101 > 118 >
@@ -121,5 +138,3 @@ print'The problem here is that I have to use CSS to style these things, coz cmar
121|cell 0,0 |cell 0,1 | 138|cell 0,0 |cell 0,1 |
122|cell 1,0 |[linky](https://sledjhamr.org) | 139|cell 1,0 |[linky](https://sledjhamr.org) |
123 140
124
125I'm 100% sure that % will get treated correctly now.