diff options
author | dvs1 | 2025-01-25 03:14:10 +1000 |
---|---|---|
committer | dvs1 | 2025-01-25 03:14:10 +1000 |
commit | 5a671268340c107ee94f8244f01b6cb8ee9decd0 (patch) | |
tree | 6d9dc191d25efb486c46a7b1865ef19cb70df8ca | |
parent | Replace cmark-gfm and lcmark with luamark. (diff) | |
download | notYetAnotherWiki-5a671268340c107ee94f8244f01b6cb8ee9decd0.zip notYetAnotherWiki-5a671268340c107ee94f8244f01b6cb8ee9decd0.tar.gz notYetAnotherWiki-5a671268340c107ee94f8244f01b6cb8ee9decd0.tar.bz2 notYetAnotherWiki-5a671268340c107ee94f8244f01b6cb8ee9decd0.tar.xz |
YAR see description for details.
New everything page, lists all the pages and where they came from, with
links.
Now we know where the page came from, type and URL.
Rejigged how metadata works.
Do our own metadata substitution.
Fixed up a bunch of bugs.
General cleanups.
-rw-r--r-- | .md.md | 2 | ||||
-rwxr-xr-x | SuckItFos | 9 | ||||
-rwxr-xr-x | SuckItPm | 12 | ||||
-rw-r--r-- | TODO.md | 8 | ||||
-rw-r--r-- | default.template | 1 | ||||
-rwxr-xr-x | notYetAnotherWiki.lua | 206 |
6 files changed, 146 insertions, 92 deletions
@@ -1,3 +1,5 @@ | |||
1 | favicon=nYAW_icon.png | ||
2 | logo=nYAW.png | ||
1 | sourcecode=https://sledjhamr.org/cgit/notYetAnotherWiki/ | 3 | sourcecode=https://sledjhamr.org/cgit/notYetAnotherWiki/ |
2 | pagehistory=https://sledjhamr.org/cgit/notYetAnotherWiki/log | 4 | pagehistory=https://sledjhamr.org/cgit/notYetAnotherWiki/log |
3 | feedatom=https://sledjhamr.org/cgit/notYetAnotherWiki/atom | 5 | feedatom=https://sledjhamr.org/cgit/notYetAnotherWiki/atom |
@@ -22,6 +22,7 @@ do | |||
22 | mkdir -p combined/$base | 22 | mkdir -p combined/$base |
23 | mkdir -p combined/${base}/`dirname ${file}` | 23 | mkdir -p combined/${base}/`dirname ${file}` |
24 | echo "Converting ${URL}/${base}/${file}?cover=print -> Foswiki/${base}/${file}.md" | 24 | echo "Converting ${URL}/${base}/${file}?cover=print -> Foswiki/${base}/${file}.md" |
25 | echo -e "ogWiki=Foswiki\nogURL=${URL}/${base}/${file}\n" > Foswiki/${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 | # 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 --silent --no-progress-meter ${URL}/${base}/${file}?cover=print -o Foswiki/${base}/${file}.HTM | 27 | curl --silent --no-progress-meter ${URL}/${base}/${file}?cover=print -o Foswiki/${base}/${file}.HTM |
27 | cp Foswiki/${base}/${file}.HTM Foswiki/${base}/${file}.HTM_ORIGINAL | 28 | cp Foswiki/${base}/${file}.HTM Foswiki/${base}/${file}.HTM_ORIGINAL |
@@ -47,6 +48,9 @@ do | |||
47 | rm Foswiki/${base}/${file}.md | 48 | rm Foswiki/${base}/${file}.md |
48 | mv xx00 Foswiki/${base}/${file}.md | 49 | mv xx00 Foswiki/${base}/${file}.md |
49 | fi | 50 | fi |
51 | if [ -f xx01 ]; then | ||
52 | rm xx01 | ||
53 | fi | ||
50 | 54 | ||
51 | # Attempt to clean things up, badly. | 55 | # Attempt to clean things up, badly. |
52 | sed -i -E Foswiki/${base}/${file}.md \ | 56 | sed -i -E Foswiki/${base}/${file}.md \ |
@@ -57,12 +61,7 @@ do | |||
57 | # -e 's/\{\.pattern.*\}//g' \ | 61 | # -e 's/\{\.pattern.*\}//g' \ |
58 | # -e 's/\{\.pattern.*//g' \ | 62 | # -e 's/\{\.pattern.*//g' \ |
59 | 63 | ||
60 | echo -e "****\n[Original page](${URL}/${base}/${file}) where maybe you can edit it." >> Foswiki/${base}/${file}.md | ||
61 | ln -frs Foswiki/${base}/${file}.md combined/${base}/${file}.md | 64 | ln -frs Foswiki/${base}/${file}.md combined/${base}/${file}.md |
62 | |||
63 | if [ -f xx01 ]; then | ||
64 | rm xx01 | ||
65 | fi | ||
66 | done | 65 | done |
67 | 66 | ||
68 | popd | 67 | popd |
@@ -20,6 +20,7 @@ do | |||
20 | mkdir -p PmWiki/$base | 20 | mkdir -p PmWiki/$base |
21 | mkdir -p combined/$base | 21 | mkdir -p combined/$base |
22 | echo "Converting ${URL}/?n=${base}.${file}?action=print -> PmWiki/${base}/${file}.md" | 22 | echo "Converting ${URL}/?n=${base}.${file}?action=print -> PmWiki/${base}/${file}.md" |
23 | echo -e "ogWiki=PmWiki\nogURL=${URL}/?n=${base}.${file}\n" > PmWiki/${base}/${file}.md.md | ||
23 | # 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. | 24 | # 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. |
24 | # curl --no-progress-meter ${URL}/?n=${base}.${file}?action=markdown -o PmWiki/${base}/${file}.MD | 25 | # curl --no-progress-meter ${URL}/?n=${base}.${file}?action=markdown -o PmWiki/${base}/${file}.MD |
25 | curl --no-progress-meter ${URL}/?n=${base}.${file}?action=print -o PmWiki/${base}/${file}.HTM | 26 | curl --no-progress-meter ${URL}/?n=${base}.${file}?action=print -o PmWiki/${base}/${file}.HTM |
@@ -29,6 +30,9 @@ do | |||
29 | rm PmWiki/${base}/${file}.HTM | 30 | rm PmWiki/${base}/${file}.HTM |
30 | mv xx00 PmWiki/${base}/${file}.HTM | 31 | mv xx00 PmWiki/${base}/${file}.HTM |
31 | fi | 32 | fi |
33 | if [ -f xx01 ]; then | ||
34 | rm xx01 | ||
35 | fi | ||
32 | sed -i -E PmWiki/${base}/${file}.HTM \ | 36 | sed -i -E PmWiki/${base}/${file}.HTM \ |
33 | -e "s/rel='nofollow'//g" \ | 37 | -e "s/rel='nofollow'//g" \ |
34 | -e "s/target='_blank'//g" \ | 38 | -e "s/target='_blank'//g" \ |
@@ -53,7 +57,6 @@ do | |||
53 | -e 's/\{#.*\}//g' \ | 57 | -e 's/\{#.*\}//g' \ |
54 | -e '/^:::/d' \ | 58 | -e '/^:::/d' \ |
55 | # -e '/\[Site$/d' \ | 59 | # -e '/\[Site$/d' \ |
56 | # -e '/^Page last modified on /d' \ | ||
57 | # -e '/^\[\]/d' \ | 60 | # -e '/^\[\]/d' \ |
58 | # -e "s/\`<a id='trailstart'>\`\{=html\}\`<\/a>\`\{=html\}//g" \ | 61 | # -e "s/\`<a id='trailstart'>\`\{=html\}\`<\/a>\`\{=html\}//g" \ |
59 | # -e "s/^\`<img /<img /g" \ | 62 | # -e "s/^\`<img /<img /g" \ |
@@ -61,13 +64,8 @@ do | |||
61 | # -e "s/^\`\`\`//g" \ | 64 | # -e "s/^\`\`\`//g" \ |
62 | # -e "s/\`\{=html\}//g" | 65 | # -e "s/\`\{=html\}//g" |
63 | 66 | ||
64 | # Don't need this, the parts we are grabbing already include that link at the bottom. | ||
65 | # echo -e "****\n[Original page](${URL}/${base}/${page}) where maybe you can edit it." >> PmWiki/${base}/${file}.md | ||
66 | ln -frs PmWiki/${base}/${file}.md combined/${base}/${file}.md | 67 | ln -frs PmWiki/${base}/${file}.md combined/${base}/${file}.md |
67 | 68 | ln -frs PmWiki/${base}/${file}.md.md combined/${base}/${file}.md.md | |
68 | if [ -f xx01 ]; then | ||
69 | rm xx01 | ||
70 | fi | ||
71 | done | 69 | done |
72 | 70 | ||
73 | popd | 71 | popd |
@@ -6,26 +6,27 @@ Bugs - | |||
6 | - /users/Plentyn/WebHome.HTML has that twisty thing which looks not simple to remove. | 6 | - /users/Plentyn/WebHome.HTML has that twisty thing which looks not simple to remove. |
7 | - /users/dunno/Devuan Cluster.HTML A very lengthy and complex document, I'll likely miss something, but chip away at the obvious. | 7 | - /users/dunno/Devuan Cluster.HTML A very lengthy and complex document, I'll likely miss something, but chip away at the obvious. |
8 | - /users/Debdog.HTML pandoc can't handle the background table cell colours in the "Background colours" table, which is kinda the point of it. | 8 | - /users/Debdog.HTML pandoc can't handle the background table cell colours in the "Background colours" table, which is kinda the point of it. |
9 | - PmWiki in it's current config needs that ?n=foo.bar nonsense for the Original page link. Which I'm currently neatly sidestepping, the scraped page has a similar thing. | ||
10 | 9 | ||
11 | Check the timestamps on the files, only update if source is newer than destination. Meh, it's already 600 times faster than the pandoc version. | 10 | Check the timestamps on the files, only update if source is newer than destination. Meh, it's already 600 times faster than the pandoc version. |
11 | |||
12 | - One quirk to watch for is if a URL path changes, the docs that have that URL need to be redone. | 12 | - One quirk to watch for is if a URL path changes, the docs that have that URL need to be redone. |
13 | - pandoc is a lot slower though, so do this for sure when dealing with that. | 13 | - pandoc is a lot slower though, so do this for sure when dealing with that. |
14 | - When scraping the web sites, they tend to be dynamically generated with no useful timestamp on them. | 14 | - When scraping the web sites, they tend to be dynamically generated with no useful timestamp on them. |
15 | - The web site scrape happens locally anyway, I can compare source file timestamps. | 15 | - The web site scrape happens locally anyway, I can compare source file timestamps. |
16 | 16 | ||
17 | Add atom feed for single page. Alas cgit only seems to have ATOM feed on the whole repo, not individual files. | 17 | Add atom feed for single page. Alas cgit only seems to have ATOM feed on the whole repo, not individual files. |
18 | |||
18 | - git.devuan.org might have usable per page history. | 19 | - git.devuan.org might have usable per page history. |
19 | - However, once timestamps are sorted, I can use that code to generate RSS and ATOM feeds, and create page histories using diffs. | 20 | - However, once timestamps are sorted, I can use that code to generate RSS and ATOM feeds, and create page histories using diffs. |
20 | 21 | ||
21 | Deal with complex directory trees. | 22 | Deal with complex directory trees. |
23 | |||
22 | - /testing/even should display as even/deeper on the testing page, coz even/ has no files, but even/deeper does. | 24 | - /testing/even should display as even/deeper on the testing page, coz even/ has no files, but even/deeper does. |
23 | - On the other hand, I could just create an empty page with the sub directories shown as usual. | 25 | - On the other hand, I could just create an empty page with the sub directories shown as usual. |
24 | - Scanning /usr/share/doc on my super desktop with looots of software installed will be fun. | 26 | - Scanning /usr/share/doc on my super desktop with looots of software installed will be fun. |
25 | - On the gripping hand, this is where we want empty directories to vanish. | 27 | - On the gripping hand, this is where we want empty directories to vanish. |
26 | 28 | ||
27 | 29 | ||
28 | |||
29 | ## Maybe not | 30 | ## Maybe not |
30 | 31 | ||
31 | Extract title from Fos and Pm, maybe even pagetitle if possible. Title is pointless, both of them just use the file name. | 32 | Extract title from Fos and Pm, maybe even pagetitle if possible. Title is pointless, both of them just use the file name. |
@@ -34,12 +35,13 @@ Extract title from Fos and Pm, maybe even pagetitle if possible. Title is point | |||
34 | 35 | ||
35 | ## Try out | 36 | ## Try out |
36 | 37 | ||
38 | Lua pattern matching sucks in general. Might be why people use lpeg instead. Try it. | ||
39 | |||
37 | htmx | 40 | htmx |
38 | 41 | ||
39 | cgit has Lua | 42 | cgit has Lua |
40 | 43 | ||
41 | 44 | ||
42 | |||
43 | ## User system | 45 | ## User system |
44 | 46 | ||
45 | Reuse the user system from SledjChisl. | 47 | Reuse the user system from SledjChisl. |
diff --git a/default.template b/default.template index 9f2490b..bedfdcf 100644 --- a/default.template +++ b/default.template | |||
@@ -2,7 +2,6 @@ | |||
2 | <html> | 2 | <html> |
3 | <head> | 3 | <head> |
4 | <meta charset="utf-8"> | 4 | <meta charset="utf-8"> |
5 | <meta name="generator" contents="lcmark"> | ||
6 | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> | 5 | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> |
7 | <title>$title$</title> | 6 | <title>$title$</title> |
8 | <link rel="icon" type="image/png" href="$favicon$" /> | 7 | <link rel="icon" type="image/png" href="$favicon$" /> |
diff --git a/notYetAnotherWiki.lua b/notYetAnotherWiki.lua index 8c9a5c9..dc64fa2 100755 --- a/notYetAnotherWiki.lua +++ b/notYetAnotherWiki.lua | |||
@@ -64,10 +64,11 @@ local globalData = { | |||
64 | ['devuanDeepSeaDark'] = '#132f40', ['devuanDeepSeaLight'] = '#1a4562', | 64 | ['devuanDeepSeaDark'] = '#132f40', ['devuanDeepSeaLight'] = '#1a4562', |
65 | ['devuanSaphireDark'] = '#004489', ['devuanSaphireLight'] = '#00509f', | 65 | ['devuanSaphireDark'] = '#004489', ['devuanSaphireLight'] = '#00509f', |
66 | ['karenPurple'] = '#8800ff', ['onefangPurple'] = '#cc00ff', | 66 | ['karenPurple'] = '#8800ff', ['onefangPurple'] = '#cc00ff', |
67 | favicon = 'nYAW_icon.png', logo = 'nYAW.png', header = '', home = '', --menu = '', | 67 | favicon = 'nYAW_icon.png', logo = 'nYAW.png', |
68 | history = '', footer = 'Powered by <a href="https://sledjhamr.org/cgit/notYetAnotherWiki/about/">notYetAnotherWiki</a> version 0.0. ', | 68 | header = '', home = '', history = '', footer = 'Powered by <a href="https://sledjhamr.org/cgit/notYetAnotherWiki/about/">notYetAnotherWiki</a> version 0.0. ', |
69 | --menu = '', | ||
69 | } | 70 | } |
70 | local Sites, Files, Subs = {}, {}, {} | 71 | local Files, Subs = {}, {} |
71 | 72 | ||
72 | 73 | ||
73 | 74 | ||
@@ -86,7 +87,7 @@ local derefTable = function(t, strip) | |||
86 | end | 87 | end |
87 | 88 | ||
88 | 89 | ||
89 | -- String together the bits array into a path string. | 90 | -- String together the bits array into a path string. Or the other way around. lol |
90 | local stringBits = function(l) | 91 | local stringBits = function(l) |
91 | local bits = {} | 92 | local bits = {} |
92 | local last = 1 | 93 | local last = 1 |
@@ -102,7 +103,19 @@ end | |||
102 | 103 | ||
103 | -- Put a value into the Files or Subs table, creating things if needed. | 104 | -- Put a value into the Files or Subs table, creating things if needed. |
104 | local toFile = function(name, key, value) | 105 | local toFile = function(name, key, value) |
105 | if nil == Files[name] then Files[name] = {} end | 106 | if nil == Files[name] then |
107 | local bits, bit = stringBits(name) | ||
108 | local path = '' | ||
109 | Files[name] = {} | ||
110 | Files[name].bits = bits | ||
111 | Files[name].bit = bit | ||
112 | for i, d in ipairs(bits) do | ||
113 | if '' ~= path then path = path .. '/' end | ||
114 | path = path .. d | ||
115 | end | ||
116 | Files[name].path = path | ||
117 | -- Files[name].body = '' | ||
118 | end | ||
106 | if nil ~= key then Files[name][key] = value end | 119 | if nil ~= key then Files[name][key] = value end |
107 | for i, v in ipairs{'metadata', 'bits', } do | 120 | for i, v in ipairs{'metadata', 'bits', } do |
108 | if nil == Files[name][v] then Files[name][v] = {} end | 121 | if nil == Files[name][v] then Files[name][v] = {} end |
@@ -120,9 +133,15 @@ end | |||
120 | 133 | ||
121 | -- Actually start doing things. | 134 | -- Actually start doing things. |
122 | 135 | ||
136 | -- Create the base of everything.md here, so it gets picked up as usual in the file scan. | ||
137 | local body, h = '', io.open('everything.md', 'w') | ||
138 | h:write('# All the pages\n') | ||
139 | h:close() | ||
140 | |||
141 | |||
123 | -- Scan the subdirectories looking for .md files. | 142 | -- Scan the subdirectories looking for .md files. |
124 | local directory = arg[1] | 143 | local directory = arg[1] |
125 | toSub('') --Subs[''] = {files = {}, subs = {}, bits = {}} | 144 | toSub('') |
126 | if nil == directory then directory = '.' end | 145 | if nil == directory then directory = '.' end |
127 | if '.' ~= directory then | 146 | if '.' ~= directory then |
128 | for l in io.popen('find . -name "*.md" -type f,l -printf "%P\n"'):lines() do | 147 | for l in io.popen('find . -name "*.md" -type f,l -printf "%P\n"'):lines() do |
@@ -135,39 +154,60 @@ for l in io.popen('find ' .. directory .. ' -name "*.md" -type f,l -printf "%P\n | |||
135 | if nil == Files[n] then toFile(n) end | 154 | if nil == Files[n] then toFile(n) end |
136 | end | 155 | end |
137 | 156 | ||
138 | -- Gotta figure out all the files and subs first. File and sub metadata comes along for the ride. | 157 | |
158 | -- Gotta figure out all the files and subs first. File and sub metadata comes along for the ride, coz we need them later. | ||
159 | local newMeta = {} | ||
139 | for name, file in pairs(Files) do | 160 | for name, file in pairs(Files) do |
140 | local bitter, path = '', '' | 161 | local bitter, path = '', '' |
141 | local bits, bit = stringBits(name) | 162 | local bits, bit = file.bits, file.bit |
142 | local ln = #bits | 163 | local ln = #bits |
143 | local body, metadata = '', {} | 164 | local body, metadata = '', {} |
144 | 165 | ||
145 | -- Go through our bits, construct Subs with bits. | 166 | -- Go through our bits, construct Subs with bits. |
146 | Files[name].bits = bits | ||
147 | Files[name].bit = bit | ||
148 | if ln > 0 then bitter = bits[1] end | 167 | if ln > 0 then bitter = bits[1] end |
149 | if '' ~= bitter then Subs[''].subs[bitter] = bitter end -- "bitter end" was entirely by accident, I'm keeping it. B-) | 168 | if '' ~= bitter then Subs[''].subs[bitter] = bitter end -- "bitter end" was entirely by accident, I'm keeping it. B-) |
150 | for i, d in ipairs(bits) do | 169 | for i, d in ipairs(bits) do |
151 | if '' ~= path then path = path .. '/' end | 170 | if '' ~= path then path = path .. '/' end |
152 | path = path .. d | 171 | path = path .. d |
153 | toSub(path, 'bits', derefiTable(bits, true)) | 172 | toSub(path, 'bits', derefiTable(bits, true)) |
154 | if i < ln then Subs[path].subs[bits[i + 1]] = bits[i + 1] end | 173 | if i < ln then |
155 | if i < ln then table.remove(Subs[path].bits, #bits) end | 174 | Subs[path].subs[bits[i + 1]] = bits[i + 1] |
175 | table.remove(Subs[path].bits, #bits) | ||
176 | end | ||
156 | end | 177 | end |
157 | 178 | ||
158 | if '.md' == string.sub(name, -3, -1) then | 179 | if '.md' == string.sub(name, -3, -1) then |
159 | -- This is a metadata only file, no content, stash the matadata. | 180 | -- This is a metadata only file, no content, stash the matadata. |
160 | for l in io.open(name .. '.md'):lines() do | 181 | for l in io.open(name .. '.md'):lines() do |
161 | for k, v in string.gmatch(l, "(%w+)%s*=%s*(.+)") do metadata[k] = v end | 182 | for k, v in string.gmatch(l, "(%w+)%s*=%s*(.+)") do |
183 | if nil == v then | ||
184 | print(name .. ' ' .. k) | ||
185 | else | ||
186 | metadata[k] = v | ||
187 | end | ||
188 | end | ||
162 | end | 189 | end |
163 | if '.md' == name then toSub(path, 'metadata', metadata) | 190 | if '.md' == name then toSub(path, 'metadata', metadata) |
164 | elseif '/.md' == string.sub(name, -4, -1) then toSub(path, 'metadata', metadata) | 191 | elseif '/.md' == string.sub(name, -4, -1) then toSub(path, 'metadata', metadata) |
165 | else toFile(string.sub(name, 1, -4), 'metadata', metadata) | 192 | -- else toFile(string.sub(name, 1, -4), 'metadata', metadata) |
193 | else newMeta[string.sub(name, 1, -4)] = metadata | ||
166 | end | 194 | end |
167 | Files[name] = nil | 195 | Files[name] = nil |
168 | else | 196 | end |
197 | end | ||
169 | 198 | ||
170 | -- Start the file parsing here, coz we need it's metadata. | 199 | -- FIXTHEM - Lua doesn't like modifying the thing you are pair()ing, like we want to do in the last loop. |
200 | for name, file in pairs(newMeta) do | ||
201 | 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 | ||
204 | if nil == Files[name].metadata[k] then Files[name].metadata[k] = v end | ||
205 | end | ||
206 | end | ||
207 | |||
208 | -- Open the files and do the iniital cleanups. | ||
209 | for name, file in pairs(Files) do | ||
210 | if '.md' ~= string.sub(name, -3, -1) then | ||
171 | -- print('Parsing ' .. name .. '.md') | 211 | -- print('Parsing ' .. name .. '.md') |
172 | h = io.open(name .. '.md', 'r') | 212 | h = io.open(name .. '.md', 'r') |
173 | if nil ~= h then | 213 | if nil ~= h then |
@@ -201,13 +241,31 @@ for name, file in pairs(Files) do | |||
201 | end | 241 | end |
202 | until fail == f0 | 242 | until fail == f0 |
203 | result = result .. string.sub(body, start) | 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 | ||
249 | end | ||
204 | 250 | ||
205 | body = parse(result) | 251 | -- Create an "everything" page, for URL links to every file.HTML. |
252 | -- TODO - sort the list of pages. | ||
253 | local bdy, h = Files['everything'].body, io.open('everything.md', 'a+') | ||
254 | bdy = bdy .. '\n\n| page | converted | Foswiki | PmWiki | \n| ---- | --------- | ------- | ------ | ' | ||
255 | for name, file in pairs(Files) do | ||
256 | local metadata = derefTable(Files[name].metadata, true) | ||
257 | if 'everything' ~= name then | ||
258 | local ln, fw, pw = 'DUNNO', '', '' | ||
259 | if 'PmWiki' == metadata.ogWiki then pw = '[' .. metadata.ogURL .. '](' .. metadata.ogURL .. ')' end | ||
260 | if 'Foswiki' == metadata.ogWiki then fw = '[' .. metadata.ogURL .. '](' .. metadata.ogURL .. ')' end | ||
261 | if nil ~= file.bit then ln = file.bit | ||
206 | end | 262 | end |
207 | toFile(name, 'body', body) | 263 | bdy = bdy .. '\n| ' .. name .. ' | [' .. ln .. '](<' .. name .. '.HTML>) | ' .. fw .. ' | ' .. pw .. ' |' |
208 | table.insert(Subs[path].files, bit) | ||
209 | end | 264 | end |
210 | end | 265 | end |
266 | h:write(bdy) | ||
267 | h:close() | ||
268 | toFile('everything', 'body', parse(bdy)) | ||
211 | 269 | ||
212 | 270 | ||
213 | 271 | ||
@@ -252,16 +310,20 @@ local linkFrom = function(source, dest) | |||
252 | break | 310 | break |
253 | end | 311 | end |
254 | end | 312 | end |
255 | depth = #(Subs[source].bits) - depth | 313 | |
256 | depth = depth + 1 | 314 | if #(Subs[dest].bits) >= #(Subs[source].bits) then |
257 | link = string.rep('../', depth) | 315 | depth = #(Subs[source].bits) |
258 | if (0 == depth) or (depth > #(Subs[dest].bits)) then | ||
259 | for i, v in ipairs(Subs[dest].bits) do | 316 | for i, v in ipairs(Subs[dest].bits) do |
260 | if i >= depth then | 317 | if i > depth then |
261 | if '' ~= link then link = link .. '/' end | 318 | if '' ~= link then link = link .. '/' end |
262 | link = link .. Subs[dest].bits[i] | 319 | link = link .. Subs[dest].bits[i] |
263 | end | 320 | end |
264 | end | 321 | end |
322 | if '' ~= link then link = link .. '/' end | ||
323 | else | ||
324 | depth = #(Subs[source].bits) - depth | ||
325 | depth = depth + 1 | ||
326 | link = string.rep('../', depth) | ||
265 | end | 327 | end |
266 | end | 328 | end |
267 | return link | 329 | return link |
@@ -269,12 +331,28 @@ end | |||
269 | 331 | ||
270 | 332 | ||
271 | 333 | ||
272 | -- TODO - loop through Subs, doing whichPage and inheritance. | ||
273 | |||
274 | |||
275 | |||
276 | -- More of this actually doing things nonsense. | 334 | -- More of this actually doing things nonsense. |
277 | 335 | ||
336 | -- Loop through Subs, doing whichPage and inheritance. | ||
337 | for name, sub in pairs(Subs) do | ||
338 | sub.whichPage = whichPage(name) | ||
339 | local metadata = sub.metadata | ||
340 | for i, s in pairs(sub.subs) do | ||
341 | local nm = i | ||
342 | if '' ~= name then nm = name .. '/' .. i end | ||
343 | ss = Subs[nm] | ||
344 | for k, v in pairs(metadata) do | ||
345 | if nil == ss.metadata[k] then | ||
346 | if ('favicon' == k) or ('logo' == k) then | ||
347 | ss.metadata[k] = linkFrom(nm, name) .. v | ||
348 | else | ||
349 | ss.metadata[k] = v | ||
350 | end | ||
351 | end | ||
352 | end | ||
353 | end | ||
354 | end | ||
355 | |||
278 | -- Loop through the files we found and actually create their HTML files. | 356 | -- Loop through the files we found and actually create their HTML files. |
279 | for name, file in pairs(Files) do | 357 | for name, file in pairs(Files) do |
280 | local path, result = '', '' | 358 | local path, result = '', '' |
@@ -285,42 +363,31 @@ for name, file in pairs(Files) do | |||
285 | path = table.concat(bits, '/', 1, ln) | 363 | path = table.concat(bits, '/', 1, ln) |
286 | 364 | ||
287 | if '' ~= body then | 365 | if '' ~= body then |
288 | -- Copy any metadata found in parent directories. | 366 | -- Inherit stuff from sub and global. |
289 | local pth = '' | 367 | local mdata = Subs[path].metadata |
290 | for i, d in ipairs(bits) do | 368 | for k, v in pairs(mdata) do |
291 | if '' ~= pth then pth = pth .. '/' end | 369 | if nil == file.metadata[k] then |
292 | pth = pth .. d | 370 | file.metadata[k] = v |
293 | if nil ~= Subs[pth] then | ||
294 | if nil ~= Subs[pth].metadata then | ||
295 | for m, x in pairs(Subs[pth].metadata) do | ||
296 | if nil == metadata[m] then | ||
297 | metadata[m] = x | ||
298 | end | ||
299 | end | ||
300 | end | ||
301 | end | 371 | end |
302 | end | 372 | end |
303 | -- Root directory needs to be handled separately, for now. | 373 | Files[name].metadata = file.metadata |
304 | if nil ~= Subs[''].metadata then | 374 | metadata = derefTable(Files[name].metadata, true) |
305 | for m, x in pairs(Subs[''].metadata) do if nil == metadata[m] then metadata[m] = x end end | ||
306 | end | ||
307 | |||
308 | for m, x in pairs(globalData) do if nil == metadata[m] then metadata[m] = x end end | 375 | for m, x in pairs(globalData) do if nil == metadata[m] then metadata[m] = x end end |
309 | 376 | ||
310 | -- Inherit these images from most recent parent directory that defines them. | 377 | if nil ~= metadata.ogURL then |
311 | for n, y in ipairs{'favicon', 'logo'} do | 378 | body = body .. '\n\n---\n\n[Original page](' .. metadata.ogURL .. '), maybe you can edit it.\n' |
312 | local pith = '' | 379 | end |
313 | if nil ~= metadata[y] then | 380 | |
314 | local pth, found = '', false | 381 | -- Figure out this pages trail links. |
315 | if (nil ~= Subs[''].metadata) and (nil ~= Subs[''].metadata[y]) then pith = '' ; found = true end | 382 | metadata.home = linkFrom(path, '') .. Subs[''].whichPage |
316 | for m, x in ipairs(bits) do | 383 | metadata.trail = '' |
317 | if '' ~= pth then pth = pth .. '/' end | 384 | for i, b in ipairs(bits) do |
318 | pth = pth .. x | 385 | local p = table.concat(bits, '/', 1, i) |
319 | if (nil ~= Subs[pth].metadata) and (nil ~= Subs[pth].metadata[y]) then pith = pth ; found = true end | 386 | if i < #bits then |
320 | end | 387 | metadata.trail = metadata.trail .. '<a href="' .. linkFrom(path, p) .. Subs[p].whichPage .. '">' .. b .. '</a> 👣 ' |
321 | if found then metadata[y] = linkFrom(path, pith) .. metadata[y] | 388 | linkFrom(path, table.concat(bits, '/', 1, i)) |
322 | else metadata[y] = linkFrom(path, pith) .. globalData[y] | 389 | else |
323 | end | 390 | metadata.trail = metadata.trail .. b .. ' ' |
324 | end | 391 | end |
325 | end | 392 | end |
326 | 393 | ||
@@ -334,8 +401,7 @@ for name, file in pairs(Files) do | |||
334 | for i, f in ipairs(subs) do | 401 | for i, f in ipairs(subs) do |
335 | local pth = path | 402 | local pth = path |
336 | if '' ~= path then pth = path .. '/' end | 403 | if '' ~= path then pth = path .. '/' end |
337 | local fl = whichPage(pth .. f) | 404 | metadata.header = metadata.header .. '<a href="' .. f .. '/' .. whichPage(pth .. f) .. '">' .. f .. '</a> ' |
338 | metadata.header = metadata.header .. '<a href="' .. f .. '/' .. fl .. '">' .. f .. '</a> ' | ||
339 | end | 405 | end |
340 | 406 | ||
341 | -- Figure out this pages menu links. | 407 | -- Figure out this pages menu links. |
@@ -360,18 +426,6 @@ for name, file in pairs(Files) do | |||
360 | end | 426 | end |
361 | end | 427 | end |
362 | 428 | ||
363 | -- Figure out this pages trail links. | ||
364 | metadata.home = linkFrom(path, '') .. whichPage('') | ||
365 | metadata.trail = '' | ||
366 | for i, b in ipairs(bits) do | ||
367 | if i < #bits then | ||
368 | metadata.trail = metadata.trail .. '<a href="' .. linkFrom(path, table.concat(bits, '/', 1, i)) .. whichPage(b) .. '">' .. b .. '</a> 👣 ' | ||
369 | linkFrom(path, table.concat(bits, '/', 1, i)) | ||
370 | else | ||
371 | metadata.trail = metadata.trail .. b .. ' ' | ||
372 | end | ||
373 | end | ||
374 | |||
375 | -- Figure out this pages footer links. | 429 | -- Figure out this pages footer links. |
376 | if nil ~= metadata.pagehistory then metadata.history = '<p>Page <a href="' .. metadata.pagehistory .. '/' .. name .. '.md">history</a></p>' end | 430 | if nil ~= metadata.pagehistory then metadata.history = '<p>Page <a href="' .. metadata.pagehistory .. '/' .. name .. '.md">history</a></p>' end |
377 | if nil ~= metadata.sourcecode then metadata.footer = '<a href="' .. metadata.sourcecode .. '">source code</a> ' .. metadata.footer end | 431 | if nil ~= metadata.sourcecode then metadata.footer = '<a href="' .. metadata.sourcecode .. '">source code</a> ' .. metadata.footer end |
@@ -382,12 +436,12 @@ for name, file in pairs(Files) do | |||
382 | -- Do our own metadata replacement, it's simple and works better. | 436 | -- Do our own metadata replacement, it's simple and works better. |
383 | local temp = template | 437 | local temp = template |
384 | local start = 1 | 438 | local start = 1 |
385 | metadata.body = nil | ||
386 | local f0, f1, token | 439 | local f0, f1, token |
387 | -- Toss the body in first, so the scan can deal with it to. | 440 | -- Toss the body in first, so the scan can deal with it to. |
388 | f0, f1, token = string.find(temp, '%$(body)%$') | 441 | f0, f1, token = string.find(temp, '%$(body)%$') |
389 | if fail ~= f0 then | 442 | if fail ~= f0 then |
390 | temp = string.sub(temp, 1, f0 - 1) .. body .. string.sub(temp, f1 + 1) | 443 | -- NOTE - this is where we actually parse the markup into HTML. |
444 | temp = string.sub(temp, 1, f0 - 1) .. parse(body) .. string.sub(temp, f1 + 1) | ||
391 | end | 445 | end |
392 | -- The actual metadata replacement scan. | 446 | -- The actual metadata replacement scan. |
393 | result = '' | 447 | result = '' |