aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--README6
-rwxr-xr-xSuckIt152
-rwxr-xr-xSuckItClean13
-rw-r--r--TODO.md93
-rw-r--r--about/index.md2
-rw-r--r--default.template30
-rwxr-xr-xfeed-icon-14x14.pngbin0 -> 689 bytes
-rwxr-xr-xfeed-icon-28x28.pngbin0 -> 1737 bytes
-rw-r--r--help.md43
-rwxr-xr-xnotYetAnotherWiki.lua324
-rw-r--r--testing/index.md6
11 files changed, 445 insertions, 224 deletions
diff --git a/README b/README
index d1aa22c..954bc7a 100644
--- a/README
+++ b/README
@@ -59,13 +59,13 @@ the one system. They can chat about it, on the one system.
59 59
60## What does it do already? 60## What does it do already?
61 61
62Currently it'll scan the current directory and subdirectories looking for 62Currently it'll scan the current folder and sub folders looking for
63.md files in CommonMark syntax. This should cover some MarkDown 63.md files in CommonMark syntax. This should cover some MarkDown
64variations. Then it produces .HTML files converted from these .md files, 64variations. Then it produces .HTML files converted from these .md files,
65and links them all together into a web site. 65and links them all together into a web site.
66 66
67Any .md file that is just the beginning metadata block doesn't get 67Any .md file that is just the beginning metadata block doesn't get
68rendered into HTML, but is global metadata for this directory and subs, 68rendered into HTML, but is global metadata for this folder and subs,
69though the subs can override this with their own metadata.md files. 69though the subs can override this with their own metadata.md files.
70 70
71git is used to store the .md files, and provides edit history. Added on 71git is used to store the .md files, and provides edit history. Added on
@@ -73,7 +73,7 @@ the footer is links to cgit, which is used to store the files in git on
73your server. This provides acces to the source code, history, and ATOM 73your server. This provides acces to the source code, history, and ATOM
74feed for the site. 74feed for the site.
75 75
76It can also scan an external directory and merge that with the current 76It can also scan an external folder and merge that with the current
77one, but this isn't tested yet. 77one, but this isn't tested yet.
78 78
79## other stuff 79## other stuff
diff --git a/SuckIt b/SuckIt
index a544f48..38fe18e 100755
--- a/SuckIt
+++ b/SuckIt
@@ -4,14 +4,16 @@ TIMEFORMAT=" took %lR using %P%% CPU"
4time { 4time {
5pushd /opt/nyaw 5pushd /opt/nyaw
6 6
7rm -fr Foswiki/* 7#rm -fr Foswiki/*
8cp -r /opt/nyaw_EMPTY/Foswiki . 8cp -r /opt/nyaw_EMPTY/Foswiki .
9rm -fr PmWiki/* 9#rm -fr PmWiki/*
10cp -r /opt/nyaw_EMPTY/PmWiki . 10cp -r /opt/nyaw_EMPTY/PmWiki .
11rm -fr unsorted 11#rm -fr unsorted
12mkdir -p unsorted 12mkdir -p unsorted
13rm -fr users 13cp -r /opt/nyaw_EMPTY/unsorted .
14#rm -fr users/*
14mkdir -p users 15mkdir -p users
16cp -r /opt/nyaw_EMPTY/users .
15 17
16# Copy across things like images that where uploaded. 18# Copy across things like images that where uploaded.
17mkdir -p /opt/nyaw/Foswiki/pub/ 19mkdir -p /opt/nyaw/Foswiki/pub/
@@ -32,47 +34,62 @@ do
32 base=`echo "${line}" | cut -d '/' -f 1` 34 base=`echo "${line}" | cut -d '/' -f 1`
33 file=`echo "${line}" | cut -d '/' -f 2- | rev | cut -b 5- | rev` 35 file=`echo "${line}" | cut -d '/' -f 2- | rev | cut -b 5- | rev`
34 if [[ ! ${file} =~ (AdminGroup|AdminUser|AdminUserLeftBar|CommentPluginExamples|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 36 if [[ ! ${file} =~ (AdminGroup|AdminUser|AdminUserLeftBar|CommentPluginExamples|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
35 realURL=${ogWiki}/${base}/${file} 37 doit='false'
36 time=`date --rfc-3339=seconds -ur /opt/Foswiki/data/${base}/${file}.txt | cut -d '+' -f 1` 38 if [ ! -s ${ogWiki}/${base}/${file}.HTM ]; then
37 mkdir -p ${ogWiki}/${base} 39 echo "NEW /opt/Foswiki/data/${base}/${file}.txt"
38 mkdir -p ${ogWiki}/${base}/`dirname ${file}` 40 doit='true'
39 echo -e "ogWiki=${ogWiki}\nogURL=${ogURL}\nrealURL=${realURL}\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > ${ogWiki}/${base}/${file}.md.md 41 elif [ /opt/Foswiki/data/${base}/${file}.txt -nt ${ogWiki}/${base}/${file}.HTM ]; then
40 echo "downloading ${ogURL}/${base}/${file}?cover=print" 42 echo "NEWER /opt/Foswiki/data/${base}/${file}.txt"
41 # 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. 43 date --rfc-3339=seconds -ur /opt/Foswiki/data/${base}/${file}.txt
42 curl --silent --no-progress-meter ${ogURL}/${base}/${file}?cover=print -o ${ogWiki}/${base}/${file}.HTM 44 date --rfc-3339=seconds -ur ${ogWiki}/${base}/${file}.HTM
43 # Attempt to separate user profiles from user content. Doesn't work when people turn their profiles into content. 45 doit='true'
44 dest=""
45 if [[ "${base}" == "Main" ]]; then
46 dest="unsorted"
47 mkdir -p `dirname users/${file}`
48 sed -i -E ${ogWiki}/${base}/${file}.HTM -e "s%<a href=\"/System/UserForm\">UserForm</a>%%w users/${file}_fos.SED"
49 if [ -s users/${file}_fos.SED ]; then
50 dest="users"
51 fi
52 rm users/${file}_fos.SED >/dev/null 2>&1
53 rm -d `dirname users/${file}` >/dev/null 2>&1
54 fi 46 fi
55 # "Devuan" is only two pages that get sorted. "Sandbox" is a mixture of standard examples, stuff that was copied to PmWiki, and other things that should get unsorted. 47 if [[ ${doit} == "true" ]]; then
56 # Skipping anything with "<a href="/Main/UnknownUser">UnknownUser</a></span></div>". 48 realURL=${ogWiki}/${base}/${file}
57 if [[ "${base}" == "Sandbox" ]]; then 49 time=`date --rfc-3339=seconds -ur /opt/Foswiki/data/${base}/${file}.txt | cut -d '+' -f 1`
58 dest="unsorted" 50 mkdir -p ${ogWiki}/${base}
59 mkdir -p `dirname users/${file}` 51 mkdir -p ${ogWiki}/${base}/`dirname ${file}`
60 sed -i -E ${ogWiki}/${base}/${file}.HTM -e "s%<a href=\"/Main/UnknownUser\">UnknownUser</a></span></div>%%w users/${file}_fos.SED" 52 echo -e "ogWiki=${ogWiki}\nogURL=${ogURL}\nrealURL=${realURL}\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > ${ogWiki}/${base}/${file}.md.md
61 if [ -s users/${file}_fos.SED ]; then 53 echo "downloading ${ogURL}/${base}/${file}?cover=print"
62 dest="" 54 # 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.
55 curl --silent --no-progress-meter ${ogURL}/${base}/${file}?cover=print -o ${ogWiki}/${base}/${file}.HTM
56 # Attempt to separate user profiles from user content. Doesn't work when people turn their profiles into content.
57 dest=""
58 if [[ "${base}" == "Main" ]]; then
59 dest="unsorted"
60 if [ -L users/${file}_fos.md ]; then
61 dest='users'
62 fi
63 mkdir -p `dirname users/${file}`
64 sed -i -E ${ogWiki}/${base}/${file}.HTM -e "s%<a href=\"/System/UserForm\">UserForm</a>%%w users/${file}_fos.SED"
65 if [ -s users/${file}_fos.SED ]; then
66 dest="users"
67 fi
68 rm users/${file}_fos.SED >/dev/null 2>&1
69 rm -d `dirname users/${file}` >/dev/null 2>&1
70 fi
71 # "Devuan" is only two pages that get sorted. "Sandbox" is a mixture of standard examples, stuff that was copied to PmWiki, and other things that should get unsorted.
72 # Skipping anything with "<a href="/Main/UnknownUser">UnknownUser</a></span></div>".
73 if [[ "${base}" == "Sandbox" ]]; then
74 dest="unsorted"
75 mkdir -p `dirname users/${file}`
76 sed -i -E ${ogWiki}/${base}/${file}.HTM -e "s%<a href=\"/Main/UnknownUser\">UnknownUser</a></span></div>%%w users/${file}_fos.SED"
77 if [ -s users/${file}_fos.SED ]; then
78 dest=""
79 fi
80 rm users/${file}_fos.SED >/dev/null 2>&1
81 rm -d `dirname users/${file}` >/dev/null 2>&1
63 fi 82 fi
64 rm users/${file}_fos.SED >/dev/null 2>&1
65 rm -d `dirname users/${file}` >/dev/null 2>&1
66 fi
67 83
68 if [[ "${dest}" != "" ]]; then 84 if [[ "${dest}" != "" ]]; then
69 mkdir -p `dirname ${dest}/${file}` 85 mkdir -p `dirname ${dest}/${file}`
70 realURL=${dest}/${file} 86 realURL=${dest}/${file}
71 echo -e "ogWiki=${ogWiki}\nogURL=${ogURL}\nrealURL=${realURL}_fos\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > ${ogWiki}/${base}/${file}.md.md 87 echo -e "ogWiki=${ogWiki}\nogURL=${ogURL}\nrealURL=${realURL}_fos\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > ${ogWiki}/${base}/${file}.md.md
72 touch ${ogWiki}/${base}/${file}.md 88 touch ${ogWiki}/${base}/${file}.md
73 ln -sfr ${ogWiki}/${base}/${file}.md ${dest}/${file}_fos.md 89 ln -sfr ${ogWiki}/${base}/${file}.md ${dest}/${file}_fos.md
74 ln -sfr ${ogWiki}/${base}/${file}.md.md ${dest}/${file}_fos.md.md 90 ln -sfr ${ogWiki}/${base}/${file}.md.md ${dest}/${file}_fos.md.md
75 rm ${ogWiki}/${base}/${file}.md 91 rm ${ogWiki}/${base}/${file}.md
92 fi
76 fi 93 fi
77 fi 94 fi
78done 95done
@@ -95,23 +112,38 @@ do
95 base=`echo "${line}" | cut -d '.' -f 1` 112 base=`echo "${line}" | cut -d '.' -f 1`
96 file=`echo "${line}" | cut -d '.' -f 2` 113 file=`echo "${line}" | cut -d '.' -f 2`
97 if [[ "${base}" != "Site" ]]; then 114 if [[ "${base}" != "Site" ]]; then
98 realURL=${ogWiki}/${base}/${file} 115 doit='false'
99 time=`date --rfc-3339=seconds -ur /opt/pmwiki/wiki.d/${base}.${file} | cut -d '+' -f 1` 116 if [ ! -s ${ogWiki}/${base}/${file}.HTM ]; then
100 mkdir -p ${ogWiki}/${base} 117 echo "NEW /opt/pmwiki/wiki.d/${base}.${file} ${ogWiki}/${base}/${file}.HTM"
101 echo -e "ogWiki=${ogWiki}\nogURL=${ogURL}\nrealURL=${realURL}\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > ${ogWiki}/${base}/${file}.md.md 118 doit='true'
102# echo "downloading ${ogURL}/?n=${base}.${file}?action=markdown" 119 elif [ /opt/pmwiki/wiki.d/${base}.${file} -nt ${ogWiki}/${base}/${file}.HTM ]; then
103# curl --no-progress-meter ${ogURL}/?n=${base}.${file}?action=markdown -o ${ogWiki}/${base}/${file}.MARKDOWN 120 echo "NEWER /opt/pmwiki/wiki.d/${base}.${file}"
104 echo "downloading ${ogURL}/?n=${base}.${file}?action=print" 121 date --rfc-3339=seconds -ur /opt/pmwiki/wiki.d/${base}.${file}
105 curl --no-progress-meter ${ogURL}/?n=${base}.${file}?action=print -o ${ogWiki}/${base}/${file}.HTM 122 date --rfc-3339=seconds -ur ${ogWiki}/${base}/${file}.HTM
106 # Seems there's no way to tell user profiles apart from user content. Unless I can find a list of users somewhere. Don't think there is one. 123 doit='true'
107 if [[ "${base}" == "Profiles" ]]; then 124 fi
108 dest="unsorted" 125 if [[ ${doit} == "true" ]]; then
109 realURL=${dest}/${file} 126 realURL=${ogWiki}/${base}/${file}
110 echo -e "ogWiki=${ogWiki}\nogURL=${ogURL}\nrealURL=${realURL}_pm\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > ${ogWiki}/${base}/${file}.md.md 127 time=`date --rfc-3339=seconds -ur /opt/pmwiki/wiki.d/${base}.${file} | cut -d '+' -f 1`
111 touch ${ogWiki}/${base}/${file}.md 128 mkdir -p ${ogWiki}/${base}
112 ln -sfr ${ogWiki}/${base}/${file}.md ${dest}/${file}_pm.md 129 echo -e "ogWiki=${ogWiki}\nogURL=${ogURL}\nrealURL=${realURL}\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > ${ogWiki}/${base}/${file}.md.md
113 ln -sfr ${ogWiki}/${base}/${file}.md.md ${dest}/${file}_pm.md.md 130# echo "downloading ${ogURL}/?n=${base}.${file}?action=markdown"
114 rm ${ogWiki}/${base}/${file}.md 131# curl --no-progress-meter ${ogURL}/?n=${base}.${file}?action=markdown -o ${ogWiki}/${base}/${file}.MARKDOWN
132 echo "downloading ${ogURL}/?n=${base}.${file}?action=print"
133 curl --no-progress-meter ${ogURL}/?n=${base}.${file}?action=print -o ${ogWiki}/${base}/${file}.HTM
134 # Seems there's no way to tell user profiles apart from user content. Unless I can find a list of users somewhere. Don't think there is one.
135 if [[ "${base}" == "Profiles" ]]; then
136 dest="unsorted"
137 if [ -L users/${file}_pm.md ]; then
138 dest='users'
139 fi
140 realURL=${dest}/${file}
141 echo -e "ogWiki=${ogWiki}\nogURL=${ogURL}\nrealURL=${realURL}_pm\nogBase=${base}\nogFile=${file}\ntimestamp=${time}\n" > ${ogWiki}/${base}/${file}.md.md
142 touch ${ogWiki}/${base}/${file}.md
143 ln -sfr ${ogWiki}/${base}/${file}.md ${dest}/${file}_pm.md
144 ln -sfr ${ogWiki}/${base}/${file}.md.md ${dest}/${file}_pm.md.md
145 rm ${ogWiki}/${base}/${file}.md
146 fi
115 fi 147 fi
116 148
117# TODO - groups are PmWiki/Onefang and PmWiki/Tiki 149# TODO - groups are PmWiki/Onefang and PmWiki/Tiki
@@ -123,6 +155,8 @@ done
123 155
124 156
125time notYetAnotherWiki.lua 157time notYetAnotherWiki.lua
158# No idea why yet, but needs a second run to sort out everything. Shouldn't take long anyway.
159time notYetAnotherWiki.lua
126 160
127popd 161popd
128} 162}
diff --git a/SuckItClean b/SuckItClean
new file mode 100755
index 0000000..1b8a025
--- /dev/null
+++ b/SuckItClean
@@ -0,0 +1,13 @@
1#!/bin/bash
2
3TIMEFORMAT=" took %lR using %P%% CPU"
4time {
5pushd /opt/nyaw
6
7rm -fr Foswiki/*
8rm -fr PmWiki/*
9rm -fr unsorted
10rm -fr users/*
11popd
12./SuckIt
13}
diff --git a/TODO.md b/TODO.md
index acdcfe2..3453ba0 100644
--- a/TODO.md
+++ b/TODO.md
@@ -4,61 +4,53 @@ Make it perphekd!
4 4
5## Do these 5## Do these
6 6
7TOC 7Convert it to polygLua.
8 8
9- Lengthy headings need to be tamed. 9It's all a bit too fragile, fix what I can. Too many messes colliding.
10- Need a "go to top" linky after each heading now.
11 10
12Check the timestamps on the files, only update if source is newer than destination. Meh, it's already 600 times faster than the pandoc version. 11Flock it.
13 12
14- One quirk to watch for is if a URL path changes, the docs that have that URL need to be redone. 13Some sort of search system.
15- pandoc is a lot slower though, so do this for sure when dealing with that.
16- When scraping the web sites, they tend to be dynamically generated with no useful timestamp on them.
17- The web site scrape happens locally anyway, I can compare source file timestamps.
18 14
19Add atom feed for single page. Alas cgit only seems to have ATOM feed on the whole repo, not individual files. 15A member system, and edit / manage system for their pages.
20
21- git.devuan.org might have usable per page history.
22- However, once timestamps are sorted, I can use that code to generate (static?) RSS and ATOM feeds, and create page histories using diffs.
23
24Deal with complex directory trees.
25
26- /testing/even should display as even/deeper on the testing page, coz even/ has no files, but even/deeper does.
27- On the other hand, I could just create an empty page with the sub directories shown as usual.
28- Scanning /usr/share/doc on my super desktop with looots of software installed will be fun.
29- On the gripping hand, this is where we want empty directories to vanish.
30- 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.
31 16
32Fix up linky conversion. DONE, mostly. 17Fix up linky conversion. DONE, mostly.
33 18
34- This is the "page moved" problem, but now it's "page copied" and "page linked", a generic solution might work.
35- Need to deal with real file name versus title. Also symlink name not matching what it points to. 19- Need to deal with real file name versus title. Also symlink name not matching what it points to.
36- . Hmmm, might it be good policy to have a single canonical context for each page? The "real URL" .md.md thing?
37- . Loop through the manually placed symlinks, adjusting "real URL" as we go.
38- + What to do about mulitple symlinks pointing to the same page? Compare timestamps, most recent wins.
39 20
40FIXTHEM: If there's a single word and period at the beginning of a line, it gets turned into a list, or list item by lunamark at the final Parse stage. 21Use the default.template that comes with nYAW if none is availaable.
41 22
42Automate symlinks. 23"collapsing headings" I guess that means click on a heading to hide / show the content under that heading.
43 24
44- any .md.md file should be linked along with it's matching .md file if it's outside of Foswiki/ and PmWiki/. 25- 🙈
26- Should do that for the main content and the menu TOC.
27- Also allow editing just a section, a section being the bits between one heading and the next.
28- + 📝 ✒️✏️🖊️🖋 🖌️🖍️
29- + When someone starts editing, create pagename_draft.md and .HTML, and update those when they want to see a preview.
30- + Or pagename-heading_draft.md
31- + Use that draft.md file as a lock on editing that file / section.
32- + Have the hourly cron job remove any stale ones.
45 33
34Add ATOM feed for single page. Alas cgit only seems to have ATOM feed on the whole repo, not individual files.
35
36- However, once timestamps are sorted, I can use that code to generate RSS and ATOM feeds, and create page histories using diffs.
37- Instead of an hourly cron job to update everything, see if I can hook
38into Fos and Pm edit form's save function. So when they save in the
39original wiki, the nyaw version gets updated, diffed, and ATOMed / RSSed.
40- + Actually a BFI method might do the trick, stick with doing a full scan
41and only updating the stuff that needs it, likely that's only the page that just got saved.
42- git commit can have an arbitrary author / committer, so I can use that to make sure the person that actually made the change gets author / committer.
43- + There's also the email thing, but I don't want to spread email addresses around, not even sure we have them anyway.
44- Should also see if gitea can handle that, and if they want wiki content saved to git.
45
46Syntax highlighting in code blocks. The highlight package looks promising, already had it installed on my desktop.
46 47
47## Some ideas 48## Some ideas
48 49
49Mostly from something chomwitt deleted. 50Mostly from something chomwitt wrote -
50 51
51- A toolbar is mentioned, which is what I'm half way through creating with those hamburger / sunglasses icons, they are a bar of tools.
52- + "everything" and "unsorted" as toolbar icons.
53- + Maybe "users"?
54- Maybe tabs as well as a toolbar, for the list of sub directories.
55- Syntax highlighting in code blocks.
56- Allow default.template files in sub directories.
57- Might be useful to automatically convert anything looking like a URL into a linky.
58- "collapsing headings" I guess that means click on a heading to hide / show the content under that heading.
59- + Should do that for the main content and the menu TOC.
60- "validation", not sure exactly what that would validate. 52- "validation", not sure exactly what that would validate.
61- I'll just quote the entire rest - 53- I'll just quote some of the rest -
62 54
63~~~ 55~~~
64 !!! co-editing 56 !!! co-editing
@@ -67,19 +59,38 @@ Mostly from something chomwitt deleted.
67 ** for example search-completion to other workflows names-tags. 59 ** for example search-completion to other workflows names-tags.
68~~~ 60~~~
69 61
62- Allow default.template files in sub folders.
63- Might be useful to automatically convert anything looking like a URL into a linky.
64
65Automate symlinks.
66
67- any .md.md file should be linked along with it's matching .md file if it's outside of Foswiki/ and PmWiki/.
68
70 69
71## Try out 70## Try out
72 71
72lua-lpeg-patterns might be useful
73
74lua-luxio might be the wheel I'm reinventing?
75
76lua-wsapi-fcgi
77
73https://inclusive-components.design/tooltips-toggletips/ has some ideas about the "tooltip" HTML attribute, and what to do about it. A rabbit hole that ends in javascript, but might be useful up to that point. 78https://inclusive-components.design/tooltips-toggletips/ has some ideas about the "tooltip" HTML attribute, and what to do about it. A rabbit hole that ends in javascript, but might be useful up to that point.
74 79
75htmx 80htmx
76 81
77cgit has Lua 82cgit has Lua
78 83
84lua-gall for git stuff
85
86lua-lace for access control
87
88lua-unbound
89
79 90
80## User system 91## Member system
81 92
82Reuse the user system from SledjChisl. 93Reuse the member system from SledjChisl.
83 94
84levels - 95levels -
85 96
@@ -121,6 +132,6 @@ site, including configuration and modules. Likely this is the person
121that set the system up in the first place. 132that set the system up in the first place.
122 133
123Admin should have access to everything that shell level has, but there's always things need tweaking at some lower level. 134Admin should have access to everything that shell level has, but there's always things need tweaking at some lower level.
124Built in file browser might do the trick. Would be useful for content creators to to organise the content. Naturally should obey the permissions. 135Built in file browser might do the trick. Would be useful for content creators to organise the content. Naturally should obey the permissions.
125 136
126root level is whoever controls the server things are running on. They can do anything at all. 137root level is whoever controls the server things are running on. They can do anything at all.
diff --git a/about/index.md b/about/index.md
index 6086d85..3f15be7 100644
--- a/about/index.md
+++ b/about/index.md
@@ -1,5 +1,5 @@
1# notYetAnotherWiki is not another wiki, at least not yet. It'll be much more than that, eventually. 1# notYetAnotherWiki is not another wiki, at least not yet. It'll be much more than that, eventually.
2 2
3This is a new directory, an entire PR department can hang out here. 3This is a new folder, an entire PR department can hang out here.
4 4
5This would just be a duplicate of README, but for testing purposes. 5This would just be a duplicate of README, but for testing purposes.
diff --git a/default.template b/default.template
index a23bf89..baefad1 100644
--- a/default.template
+++ b/default.template
@@ -29,22 +29,20 @@
29 margin: 0; padding: 0; border: none; 29 margin: 0; padding: 0; border: none;
30 display: grid; 30 display: grid;
31// grid-template-areas: 31// grid-template-areas:
32// "logo tools" 32// "logo tools tools tools"
33// "logo head" 33// "logo head head head"
34// "menu body" 34// "menu body body body"
35// "history foot" 35// "history foot foot foot"
36// "nyaw ."; 36// "nyaw nyaw nyaw nyaw";
37 grid-template-columns: auto 1fr auto auto; 37 grid-template-columns: 1.4fr 8fr auto auto;
38 grid-template-rows: auto auto 1fr auto auto; 38 grid-template-rows: auto auto 1fr auto auto;
39// grid-auto-columns: minmax(auto, auto);
40// grid-auto-rows: minmax(auto, auto);
41 overflow-x: auto; overflow-y: auto; 39 overflow-x: auto; overflow-y: auto;
42 } 40 }
43 .boxLogo {grid-area: logo; grid-column: 1 / 1; grid-row: 1 / 2; height: min-content;} 41 .boxLogo {grid-area: logo; grid-column: 1 / 1; grid-row: 1 / 2; height: min-content;}
44 .boxTools {grid-area: tools; grid-column: 2 / 4; grid-row: 1 / 1; height: min-content;} 42 .boxTools {grid-area: tools; grid-column: 2 / 4; grid-row: 1 / 1; height: min-content;}
45 .boxHead {grid-area: head; grid-column: 2 / 4; grid-row: 2 / 2; height: min-content; text-align: right;} 43 .boxHead {grid-area: head; grid-column: 2 / 4; grid-row: 2 / 2; height: min-content; text-align: right;}
46 44
47 .boxMenu {grid-area: menu; grid-column: 1 / 1; grid-row: 3 / 3; height: min-content; width: min-content; vertical-align: top; padding: 4px;} 45 .boxMenu {grid-area: menu; grid-column: 1 / 1; grid-row: 3 / 3; height: min-content; vertical-align: top; padding: 4px; overflow-x: auto; overflow-y: auto;}
48 .boxBody {grid-area: body; grid-column: 2 / 4; grid-row: 3 / 3; vertical-align: top; 46 .boxBody {grid-area: body; grid-column: 2 / 4; grid-row: 3 / 3; vertical-align: top;
49 height: 100%; width: 100%; 47 height: 100%; width: 100%;
50 background: black; color: white; 48 background: black; color: white;
@@ -68,8 +66,8 @@
68 #modeToggleMenu:checked ~ .boxLogo {display: none;} 66 #modeToggleMenu:checked ~ .boxLogo {display: none;}
69 #modeToggleMenu:checked ~ .boxHead {display: none;} 67 #modeToggleMenu:checked ~ .boxHead {display: none;}
70// #modeToggleMenu:checked ~ .boxTools {display: none;} 68// #modeToggleMenu:checked ~ .boxTools {display: none;}
69// #modeToggleMenu:checked ~ .boxMenu {display: none; width: 0px; max-width: 0px; }
71 70
72 #modeToggleMenu:checked ~ .boxMenu {display: none;}
73 #modeToggleBody:checked ~ .boxBody {background: white; color: black;} 71 #modeToggleBody:checked ~ .boxBody {background: white; color: black;}
74 #modeToggleBody:checked ~ .boxBody a:active {color: $devuanDevuanalink$;} 72 #modeToggleBody:checked ~ .boxBody a:active {color: $devuanDevuanalink$;}
75 #modeToggleBody:checked ~ .boxBody a:link {color: $devuanDevuanlink$;} 73 #modeToggleBody:checked ~ .boxBody a:link {color: $devuanDevuanlink$;}
@@ -89,13 +87,19 @@
89 <a href="$home$"><img src="$logo$" alt="not (Yet) (Another / A) Wiki."/></a> 87 <a href="$home$"><img src="$logo$" alt="not (Yet) (Another / A) Wiki."/></a>
90 </nav></header></div> 88 </nav></header></div>
91 <div class="boxTools"><header><nav> 89 <div class="boxTools"><header><nav>
92 &nbsp; <b class="toolTip" title="🍔 hides / shows non content, reverse hamburger menu. 90 &nbsp; <a href="/help.HTML"><b class="toolTip" title="🍔 hides / shows non content, reverse hamburger menu.
93🕶 switches between dark and light themes. 91🕶 switches between dark and light themes.
92📚 shows the list of all pages.
93🔮 a folder of unsorted pages.
94👥 shows the list of users.
94🪵 will be for logging in, when I have written that bit. 95🪵 will be for logging in, when I have written that bit.
95🔍 will be the search, when I have written that bit. 96🔍 will be the search, when I have written that bit.
96👣 is a trail of the steps to get here.">❓</b> 97👣 is a trail of the steps to get here.">❓</b></a>
97 &nbsp; <b class="toolTip"><label for="modeToggleMenu" class='modeBtn'>&#127828;</label></b> 98 &nbsp; <b class="toolTip"><label for="modeToggleMenu" class='modeBtn'>&#127828;</label></b>
98 &nbsp; <b class="toolTip"><label for="modeToggleBody" class='modeBtn'>&#x1F576;</label></b> 99 &nbsp; <b class="toolTip"><label for="modeToggleBody" class='modeBtn'>&#x1F576;</label></b>
100 &nbsp; <a href="/everything.HTML"><b class="toolTip">&#128218;</b></a>
101 &nbsp; <a href="/unsorted/" ><b class="toolTip">&#128302;</b></a>
102 &nbsp; <a href="/users/" ><b class="toolTip">&#128101;</b></a>
99 &nbsp; <b class="toolTip">&#129717;</b> 103 &nbsp; <b class="toolTip">&#129717;</b>
100 &nbsp; <b class="toolTip">&#128269;</b> 104 &nbsp; <b class="toolTip">&#128269;</b>
101 <b> &nbsp; &#x1f463; $trail$ </b> 105 <b> &nbsp; &#x1f463; $trail$ </b>
diff --git a/feed-icon-14x14.png b/feed-icon-14x14.png
new file mode 100755
index 0000000..b3c949d
--- /dev/null
+++ b/feed-icon-14x14.png
Binary files differ
diff --git a/feed-icon-28x28.png b/feed-icon-28x28.png
new file mode 100755
index 0000000..d64c669
--- /dev/null
+++ b/feed-icon-28x28.png
Binary files differ
diff --git a/help.md b/help.md
new file mode 100644
index 0000000..bc4cc46
--- /dev/null
+++ b/help.md
@@ -0,0 +1,43 @@
1# How to use this wiki
2
3On the top left, is the logo, beside that is a toolbar of icons -
4
5- ❓ hover over this for help.
6- 🍔 hides or shows everything but the content and these icons, the reverse hamburger menu.
7- 🕶 switches between dark and light themes.
8- 📚 shows the list of all pages.
9- 🔮 a folder of unsorted pages.
10- 👥 shows the list of users.
11- 🪵 will be for logging in, when I have written that bit.
12- 🔍 will be the search, when I have written that bit.
13
14&#x1f463; is a trail of breadcrumbs, though I'm using a footsteps icon
15for this. Showing the footsteps you have followed to get to the current
16folder.
17
18On the top right of the pages is links to the sub folders of the current
19folder the current page is in.
20
21Down the left side is links to the pages in the current folder. Most of
22them will be symlinks to the converted pages from the Foswiki and PmWiki
23sub folders. Some will be links &#9757; to external sites. For the
24current page, links to the headings are also shown, those headings have
25their own icon 🔼to go back to the top.
26
27The bit you are reading is the badly converted content of the current
28page. At the bottom of each converted page is a link to the original,
29and if you are logged into that other system, you might be able to edit
30the page. Note that unconverted pages don't have these links to the
31originals.
32
33At the bottom is links to things like page history, web site source code,
34and the software I'm writing to do all of this. Or should be some day.
35
36
37
38# Under the hood
39
40Internally this wiki is made of the root folder and it's sub folders
41representing the structure of the wiki content. Each folder has it's own
42pages. Symlinks are used to copy or move pages around, with special
43folders for the original stuff from the other wikis.
diff --git a/notYetAnotherWiki.lua b/notYetAnotherWiki.lua
index 974fde6..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 = '&dollar;', perc = '%', 18 dlr = '&dollar;', 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',
@@ -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
@@ -531,7 +624,7 @@ end
531-- More of this actually doing things nonsense. 624-- More of this actually doing things nonsense.
532 625
533-- Create an "everything" page, for URL links to every file.HTML. 626-- Create an "everything" page, for URL links to every file.HTML.
534local 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| --------- | ------- | --------------- | '
535Pages = {} 628Pages = {}
536for name, file in pairs(Files) do 629for name, file in pairs(Files) do
537 local metadata = derefTable(Files[name].metadata, true) 630 local metadata = derefTable(Files[name].metadata, true)
@@ -544,7 +637,7 @@ for name, file in pairs(Files) do
544 if nil ~= metadata.timestamp then ts = metadata.timestamp end 637 if nil ~= metadata.timestamp then ts = metadata.timestamp end
545 if nil ~= file.bit then ln = file.bit 638 if nil ~= file.bit then ln = file.bit
546 end 639 end
547 table.insert(Pages, '\n| ' .. name .. ' | [' .. ln .. '](<' .. name .. '.HTML>) | ' .. fw .. ' ' .. pw .. ' | ' .. ts .. ' |') 640 table.insert(Pages, '\n| [' .. name .. '](<' .. name .. '.HTML>) | ' .. fw .. ' ' .. pw .. ' | ' .. ts .. ' |')
548 641
549 -- Track our external links. 642 -- Track our external links.
550 if (nil ~= metadata.ogBase) and (nil ~= metadata.ogFile) then 643 if (nil ~= metadata.ogBase) and (nil ~= metadata.ogFile) then
@@ -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
@@ -712,7 +805,9 @@ end
712 805
713function Writer.header(s, level) 806function Writer.header(s, level)
714 local text = Lunamark.util.rope_to_string(s) 807 local text = Lunamark.util.rope_to_string(s)
715 return '<h' .. level .. ' id="' .. RE.gsub(text, '{[ ]}', '_') .. '">' .. text .. ' <a style="font-size: 0.42em;" href="#top">👆</a></h' .. level .. '>' 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 .. '>'
716end 811end
717local 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.
718function Writer.link(lab, url, tit) 813function Writer.link(lab, url, tit)
@@ -759,7 +854,7 @@ for name, file in pairs(Files) do
759 local pth = file.path 854 local pth = file.path
760 if '' ~= file.path then pth = file.path .. '/' end 855 if '' ~= file.path then pth = file.path .. '/' end
761 if 'true' ~= Subs[pth .. f].metadata.hidden then 856 if 'true' ~= Subs[pth .. f].metadata.hidden then
762 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; '
763 end 858 end
764 end 859 end
765 860
@@ -788,31 +883,51 @@ for name, file in pairs(Files) do
788 local l = string.len(g) - string.len(h) 883 local l = string.len(g) - string.len(h)
789 g = h 884 g = h
790 h = RE.gsub(h, '{[ ]}', '&nbsp;') 885 h = RE.gsub(h, '{[ ]}', '&nbsp;')
886-- FIXME - Work around a bug in Lunamark?
887 g = RE.gsub(g, '{[\\]}', '')
888 h = RE.gsub(h, '{[\\]}', '')
791-- FIXME - if it's a linky, strip off the URL part. The Wiki audit has such things. 889-- FIXME - if it's a linky, strip off the URL part. The Wiki audit has such things.
792 metadata.menu = metadata.menu .. '<p>' .. string.rep('&nbsp;', l) .. '<a style="font-size: 0.80em;" href="#' .. RE.gsub(g, '{[ ]}', '_') .. '">' .. h .. '</a></p>' 890 metadata.menu = metadata.menu .. '<p>' .. string.rep('&nbsp;', l) .. '<a style="font-size: 0.80em;" href="#' .. RE.gsub(g, '{[ ]}', '_') .. '">' .. h .. '</a></p>'
793 end 891 end
794 else 892 else
795 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>'
796 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
797 end 903 end
798 end 904 end
799 end 905 end
800 906
801 -- Figure out this pages footer links. 907 -- Figure out this pages footer links.
908 local temp = ''
802 metadata.footer = '' 909 metadata.footer = ''
803 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
804 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
805 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
806 if metadata.footer ~= '' then metadata.footer = 'Web site ' .. metadata.footer end 921 if metadata.footer ~= '' then metadata.footer = 'Web site ' .. metadata.footer end
807 -- Add a link to the original page. 922 -- Add a link to the original page.
808 if nil ~= metadata.ogURL then 923 if nil ~= metadata.ogURL then
809 local title, link = whichWiki(metadata) 924 local title, link = whichWiki(metadata)
810 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.
811-- 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?
812 local edit = 'edit' 927 local edit = 'T'
813 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
814-- if 'Foswiki' == metadata.ogWiki then edit = 'edit' end 929-- if 'Foswiki' == metadata.ogWiki then edit = '' end
815 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
816 end 931 end
817 metadata.footer = '<p>' .. metadata.footer .. '</p>' 932 metadata.footer = '<p>' .. metadata.footer .. '</p>'
818 933
@@ -821,6 +936,7 @@ for name, file in pairs(Files) do
821 -- 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.
822 -- NOTE - this is where we actually parse the markup into HTML. 937 -- NOTE - this is where we actually parse the markup into HTML.
823 Context = file 938 Context = file
939 body = RE.gsub(body, '{[%nl]^1[%a]+}[.]^1 ', '%1$dot$ ') -- Coz otherwise stray . trip up the list detection.
824 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.
825 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.
826 temp = RE.gsub(temp, '"$body$"', bd) 942 temp = RE.gsub(temp, '"$body$"', bd)
diff --git a/testing/index.md b/testing/index.md
index 9866373..581d301 100644
--- a/testing/index.md
+++ b/testing/index.md
@@ -78,17 +78,17 @@ Autonumbering? Needs the extension. Doesn't matter, they get renumbered anyway
782. two 782. two
791. one 791. one
80 80
81Bug. If there's a single word and period at the beginning of a line, it gets turned into a list, or list item. 81Bug. If there's a single word and period at the beginning of a line, it gets turned into a list, or list item.
82 82
83<!-- Separate the lists. --> 83<!-- Separate the lists. -->
84 84
85Bug. If there's a single word and period at the beginning of a line, it gets turned into a list, or list item. 85Bug. If there's a single word and period at the beginning of a line, it gets turned into a list, or list item.
86 86
87~~~ 87~~~
88Bug. If there's a single word and period at the beginning of a line, it gets turned into a list, or list item. 88Bug. If there's a single word and period at the beginning of a line, it gets turned into a list, or list item.
89~~~ 89~~~
90 90
91Uncovering another bug, the stuff in a code block is in a different font. Ah, it's mono. lol 91The stuff in a code block is in a different font, it's mono. lol
92 92
93# images 93# images
94 94