aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authordvs12025-01-25 03:14:10 +1000
committerdvs12025-01-25 03:14:10 +1000
commit5a671268340c107ee94f8244f01b6cb8ee9decd0 (patch)
tree6d9dc191d25efb486c46a7b1865ef19cb70df8ca
parentReplace cmark-gfm and lcmark with luamark. (diff)
downloadnotYetAnotherWiki-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.md2
-rwxr-xr-xSuckItFos9
-rwxr-xr-xSuckItPm12
-rw-r--r--TODO.md8
-rw-r--r--default.template1
-rwxr-xr-xnotYetAnotherWiki.lua206
6 files changed, 146 insertions, 92 deletions
diff --git a/.md.md b/.md.md
index 3c5cb8a..4a55e50 100644
--- a/.md.md
+++ b/.md.md
@@ -1,3 +1,5 @@
1favicon=nYAW_icon.png
2logo=nYAW.png
1sourcecode=https://sledjhamr.org/cgit/notYetAnotherWiki/ 3sourcecode=https://sledjhamr.org/cgit/notYetAnotherWiki/
2pagehistory=https://sledjhamr.org/cgit/notYetAnotherWiki/log 4pagehistory=https://sledjhamr.org/cgit/notYetAnotherWiki/log
3feedatom=https://sledjhamr.org/cgit/notYetAnotherWiki/atom 5feedatom=https://sledjhamr.org/cgit/notYetAnotherWiki/atom
diff --git a/SuckItFos b/SuckItFos
index 1e6e48d..0f6f8a8 100755
--- a/SuckItFos
+++ b/SuckItFos
@@ -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
66done 65done
67 66
68popd 67popd
diff --git a/SuckItPm b/SuckItPm
index fe7efb3..fd0b048 100755
--- a/SuckItPm
+++ b/SuckItPm
@@ -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
71done 69done
72 70
73popd 71popd
diff --git a/TODO.md b/TODO.md
index 60a2eca..84f62b8 100644
--- a/TODO.md
+++ b/TODO.md
@@ -6,26 +6,27 @@ Bugs -
6- /users/Plentyn/WebHome.HTML &nbsp; has that twisty thing which looks not simple to remove. 6- /users/Plentyn/WebHome.HTML &nbsp; has that twisty thing which looks not simple to remove.
7- /users/dunno/Devuan Cluster.HTML &nbsp; A very lengthy and complex document, I'll likely miss something, but chip away at the obvious. 7- /users/dunno/Devuan Cluster.HTML &nbsp; A very lengthy and complex document, I'll likely miss something, but chip away at the obvious.
8- /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. 8- /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.
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
11Check the timestamps on the files, only update if source is newer than destination. Meh, it's already 600 times faster than the pandoc version. 10Check 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
17Add atom feed for single page. Alas cgit only seems to have ATOM feed on the whole repo, not individual files. 17Add 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
21Deal with complex directory trees. 22Deal 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
31Extract title from Fos and Pm, maybe even pagetitle if possible. Title is pointless, both of them just use the file name. 32Extract 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
38Lua pattern matching sucks in general. Might be why people use lpeg instead. Try it.
39
37htmx 40htmx
38 41
39cgit has Lua 42cgit has Lua
40 43
41 44
42
43## User system 45## User system
44 46
45Reuse the user system from SledjChisl. 47Reuse 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. &nbsp;', 68 header = '', home = '', history = '', footer = 'Powered by <a href="https://sledjhamr.org/cgit/notYetAnotherWiki/about/">notYetAnotherWiki</a> version 0.0. &nbsp;',
69 --menu = '',
69} 70}
70local Sites, Files, Subs = {}, {}, {} 71local Files, Subs = {}, {}
71 72
72 73
73 74
@@ -86,7 +87,7 @@ local derefTable = function(t, strip)
86end 87end
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
90local stringBits = function(l) 91local 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.
104local toFile = function(name, key, value) 105local 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.
137local body, h = '', io.open('everything.md', 'w')
138h:write('# All the pages\n')
139h:close()
140
141
123-- Scan the subdirectories looking for .md files. 142-- Scan the subdirectories looking for .md files.
124local directory = arg[1] 143local directory = arg[1]
125toSub('') --Subs[''] = {files = {}, subs = {}, bits = {}} 144toSub('')
126if nil == directory then directory = '.' end 145if nil == directory then directory = '.' end
127if '.' ~= directory then 146if '.' ~= 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
136end 155end
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.
159local newMeta = {}
139for name, file in pairs(Files) do 160for 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
197end
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.
200for 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
206end
207
208-- Open the files and do the iniital cleanups.
209for 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
249end
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.
253local bdy, h = Files['everything'].body, io.open('everything.md', 'a+')
254bdy = bdy .. '\n\n| page | converted | Foswiki | PmWiki | \n| ---- | --------- | ------- | ------ | '
255for 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
210end 265end
266h:write(bdy)
267h:close()
268toFile('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.
337for 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
354end
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.
279for name, file in pairs(Files) do 357for 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> &#x1f463; &nbsp; '
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 .. ' &nbsp; '
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> &nbsp; '
338 metadata.header = metadata.header .. '<a href="' .. f .. '/' .. fl .. '">' .. f .. '</a> &nbsp; '
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> &#x1f463; &nbsp; '
369 linkFrom(path, table.concat(bits, '/', 1, i))
370 else
371 metadata.trail = metadata.trail .. b .. ' &nbsp; '
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&nbsp;<a href="' .. metadata.pagehistory .. '/' .. name .. '.md">history</a></p>' end 430 if nil ~= metadata.pagehistory then metadata.history = '<p>Page&nbsp;<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> &nbsp; &nbsp; ' .. metadata.footer end 431 if nil ~= metadata.sourcecode then metadata.footer = '<a href="' .. metadata.sourcecode .. '">source code</a> &nbsp; &nbsp; ' .. 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 = ''