aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authordvs12025-01-22 21:01:59 +1000
committerdvs12025-01-22 21:01:59 +1000
commit4a435bf8ae0e9f009346d89ebc424d8884f33cea (patch)
tree5c0852c7a0bdb926db42dd5f17b168461503433a
parentTypo-- (diff)
downloadnotYetAnotherWiki-4a435bf8ae0e9f009346d89ebc424d8884f33cea.zip
notYetAnotherWiki-4a435bf8ae0e9f009346d89ebc424d8884f33cea.tar.gz
notYetAnotherWiki-4a435bf8ae0e9f009346d89ebc424d8884f33cea.tar.bz2
notYetAnotherWiki-4a435bf8ae0e9f009346d89ebc424d8884f33cea.tar.xz
Replace cmark-gfm and lcmark with luamark.
Plus YAR, yet another rewrite.
-rw-r--r--.md.md3
-rw-r--r--INSTALL.md6
-rw-r--r--MeTaDaTa.md5
-rw-r--r--README4
-rw-r--r--README.md.md1
-rwxr-xr-xSuckItFos9
-rwxr-xr-xSuckItPm11
-rw-r--r--TODO.md11
-rwxr-xr-xnotYetAnotherWiki.lua213
-rw-r--r--testing/.md.md1
-rw-r--r--testing/MeTaDaTa.md3
-rw-r--r--testing/index.md71
-rw-r--r--testing/index.md.md1
13 files changed, 200 insertions, 139 deletions
diff --git a/.md.md b/.md.md
new file mode 100644
index 0000000..3c5cb8a
--- /dev/null
+++ b/.md.md
@@ -0,0 +1,3 @@
1sourcecode=https://sledjhamr.org/cgit/notYetAnotherWiki/
2pagehistory=https://sledjhamr.org/cgit/notYetAnotherWiki/log
3feedatom=https://sledjhamr.org/cgit/notYetAnotherWiki/atom
diff --git a/INSTALL.md b/INSTALL.md
index afefcea..a2b2842 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,9 +1,7 @@
1# Install 1# Install
2 2
3notYetAnotherWiki uses [lcmark](https://github.com/jgm/lcmark) to parse [CommonMark](https://commonmark.org/) into HTML. You can probably install it using luarocks. lua-yaml is the YAML parsing library I test with. 3notYetAnotherWiki uses [lunamark](https://github.com/jgm/lunamark) to parse [CommonMark](https://commonmark.org/) into HTML. You can probably install it using luarocks. lua-yaml is the YAML parsing library I test with.
4 4
5You also need cmark-gfm and luajit installed. 5You also need luajit installed.
6 6
7Copy the notYetAnotherWiki.lua script to some place where you can run it from, /usr/local/bin is good. Make sure it is executable. 7Copy the notYetAnotherWiki.lua script to some place where you can run it from, /usr/local/bin is good. Make sure it is executable.
8
9Similar with the dumpTable.lua script, only it's a Lua library, so put it some place Lua can find it. /usr/local/share/lua is good. No need to be executable.
diff --git a/MeTaDaTa.md b/MeTaDaTa.md
deleted file mode 100644
index 24796a8..0000000
--- a/MeTaDaTa.md
+++ /dev/null
@@ -1,5 +0,0 @@
1---
2sourcecode: https://sledjhamr.org/cgit/notYetAnotherWiki/
3pagehistory: https://sledjhamr.org/cgit/notYetAnotherWiki/log
4feedatom: https://sledjhamr.org/cgit/notYetAnotherWiki/atom
5---
diff --git a/README b/README
index 36ac878..d1aa22c 100644
--- a/README
+++ b/README
@@ -1,7 +1,3 @@
1---
2title: "notYetAnotherWiki"
3---
4
5# notYetAnotherWiki 1# notYetAnotherWiki
6 2
7notYetAnotherWiki is not another wiki, at least not yet. It'll be much 3notYetAnotherWiki is not another wiki, at least not yet. It'll be much
diff --git a/README.md.md b/README.md.md
new file mode 100644
index 0000000..bc85e8c
--- /dev/null
+++ b/README.md.md
@@ -0,0 +1 @@
title=notYetAnotherWiki
diff --git a/SuckItFos b/SuckItFos
index 11adaf9..1e6e48d 100755
--- a/SuckItFos
+++ b/SuckItFos
@@ -22,8 +22,6 @@ 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# pandoc -f html -t markdown --self-contained ${URL}/${base}/${file} >Foswiki/${base}/${file}.md
26 # TODO - try curl, to see what is actually downloaded, and maybe not download unchanged pages. curl to .HTM
27 # Doesn't help with redownloads, coz natch a dynamic site isn't cached. But I can at least comment out the curl command during testing to save time. 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.
28 curl --silent --no-progress-meter ${URL}/${base}/${file}?cover=print -o Foswiki/${base}/${file}.HTM 26 curl --silent --no-progress-meter ${URL}/${base}/${file}?cover=print -o Foswiki/${base}/${file}.HTM
29 cp Foswiki/${base}/${file}.HTM Foswiki/${base}/${file}.HTM_ORIGINAL 27 cp Foswiki/${base}/${file}.HTM Foswiki/${base}/${file}.HTM_ORIGINAL
@@ -40,13 +38,10 @@ do
40 -e 's/class="foswikiTopic"/class="FoswikiTopic"/g' \ 38 -e 's/class="foswikiTopic"/class="FoswikiTopic"/g' \
41 -e 's/class="foswiki[[:alpha:]]*"//g' \ 39 -e 's/class="foswiki[[:alpha:]]*"//g' \
42 -e "s/style='.*;'//g" 40 -e "s/style='.*;'//g"
43# -e "s/style='background-color: #.*;'//g" \
44# -e "s/style='font-size: .*;'//g"
45 41
46 pandoc -f html -t commonmark_x --self-contained Foswiki//${base}/${file}.HTM >Foswiki/${base}/${file}.md 42 pandoc -f html -t commonmark_x --self-contained Foswiki//${base}/${file}.HTM >Foswiki/${base}/${file}.md
47 cp Foswiki/${base}/${file}.md Foswiki/${base}/${file}.md_ORIGINAL 43 cp Foswiki/${base}/${file}.md Foswiki/${base}/${file}.md_ORIGINAL
48 44
49# csplit -ks Foswiki/${base}/${file}.md '%::: {.foswikiTopic}%' '/::: {.foswikiContentFooter}/'
50 csplit -ks Foswiki/${base}/${file}.md '%::: {.FoswikiTopic}%' '/::: {.patternInfo}/' 45 csplit -ks Foswiki/${base}/${file}.md '%::: {.FoswikiTopic}%' '/::: {.patternInfo}/'
51 if [ -f xx00 ]; then 46 if [ -f xx00 ]; then
52 rm Foswiki/${base}/${file}.md 47 rm Foswiki/${base}/${file}.md
@@ -63,10 +58,6 @@ do
63# -e 's/\{\.pattern.*//g' \ 58# -e 's/\{\.pattern.*//g' \
64 59
65 echo -e "****\n[Original page](${URL}/${base}/${file}) where maybe you can edit it." >> Foswiki/${base}/${file}.md 60 echo -e "****\n[Original page](${URL}/${base}/${file}) where maybe you can edit it." >> Foswiki/${base}/${file}.md
66
67# pandoc -t html -f commonmark_x --self-contained Foswiki/${base}/${file}.md > Foswiki/${base}/${file}.htm
68# cmark-gfm -t html -e footnotes -e table -e strikethrough Foswiki/${base}/${file}.md > Foswiki/${base}/${file}.body
69# ln -frs Foswiki/${base}/${file}.body combined/${base}/${file}.body
70 ln -frs Foswiki/${base}/${file}.md combined/${base}/${file}.md 61 ln -frs Foswiki/${base}/${file}.md combined/${base}/${file}.md
71 62
72 if [ -f xx01 ]; then 63 if [ -f xx01 ]; then
diff --git a/SuckItPm b/SuckItPm
index a7c1321..fe7efb3 100755
--- a/SuckItPm
+++ b/SuckItPm
@@ -17,12 +17,9 @@ find /opt/pmwiki/wiki.d ${filter} \
17do 17do
18 base=`echo "${line}" | cut -d '.' -f 1` 18 base=`echo "${line}" | cut -d '.' -f 1`
19 file=`echo "${line}" | cut -d '.' -f 2` 19 file=`echo "${line}" | cut -d '.' -f 2`
20# page="?n=${line}"
21 mkdir -p PmWiki/$base 20 mkdir -p PmWiki/$base
22 mkdir -p combined/$base 21 mkdir -p combined/$base
23 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"
24# pandoc -f html -t markdown --self-contained ${URL}/?n=${base}.${file} >PmWiki/${base}/${file}.md
25 # TODO - try curl, to see what is actually downloaded, and maybe not download unchanged pages. curl to .HTM
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. 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.
27# curl --no-progress-meter ${URL}/?n=${base}.${file}?action=markdown -o PmWiki/${base}/${file}.MD 24# curl --no-progress-meter ${URL}/?n=${base}.${file}?action=markdown -o PmWiki/${base}/${file}.MD
28 curl --no-progress-meter ${URL}/?n=${base}.${file}?action=print -o PmWiki/${base}/${file}.HTM 25 curl --no-progress-meter ${URL}/?n=${base}.${file}?action=print -o PmWiki/${base}/${file}.HTM
@@ -45,11 +42,9 @@ do
45 -e "s/class='vspace'//g" \ 42 -e "s/class='vspace'//g" \
46 -e "s/class='wikilink'//g" \ 43 -e "s/class='wikilink'//g" \
47 -e "s/style='.*;'//g" 44 -e "s/style='.*;'//g"
48# -e "s/style='background-color: #.*;'//g" \
49# -e "s/style='font-size: .*;'//g"
50 45
51 pandoc -f html -t commonmark_x --self-contained PmWiki//${base}/${file}.HTM >PmWiki/${base}/${file}.md
52# pandoc -f markdown -t commonmark_x --self-contained PmWiki//${base}/${file}.MD >PmWiki/${base}/${file}.md 46# pandoc -f markdown -t commonmark_x --self-contained PmWiki//${base}/${file}.MD >PmWiki/${base}/${file}.md
47 pandoc -f html -t commonmark_x --self-contained PmWiki//${base}/${file}.HTM >PmWiki/${base}/${file}.md
53 cp PmWiki/${base}/${file}.md PmWiki/${base}/${file}.md_ORIGINAL 48 cp PmWiki/${base}/${file}.md PmWiki/${base}/${file}.md_ORIGINAL
54 49
55 # Attempt to clean things up, badly. 50 # Attempt to clean things up, badly.
@@ -68,10 +63,6 @@ do
68 63
69 # Don't need this, the parts we are grabbing already include that link at the bottom. 64 # Don't need this, the parts we are grabbing already include that link at the bottom.
70# echo -e "****\n[Original page](${URL}/${base}/${page}) where maybe you can edit it." >> PmWiki/${base}/${file}.md 65# echo -e "****\n[Original page](${URL}/${base}/${page}) where maybe you can edit it." >> PmWiki/${base}/${file}.md
71
72# pandoc -t html -f commonmark_x --self-contained PmWiki/${base}/${file}.md > PmWiki/${base}/${file}.htm
73# cmark-gfm -t html -e footnotes -e table -e strikethrough PmWiki/${base}/${file}.md > PmWiki/${base}/${file}.body
74# ln -frs PmWiki/${base}/${file}.body combined/${base}/${file}.body
75 ln -frs PmWiki/${base}/${file}.md combined/${base}/${file}.md 66 ln -frs PmWiki/${base}/${file}.md combined/${base}/${file}.md
76 67
77 if [ -f xx01 ]; then 68 if [ -f xx01 ]; then
diff --git a/TODO.md b/TODO.md
index e96f7da..60a2eca 100644
--- a/TODO.md
+++ b/TODO.md
@@ -3,10 +3,9 @@
3## Do these 3## Do these
4 4
5Bugs - 5Bugs -
6- https://nyaw.wiki.devuan.org/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- https://nyaw.wiki.devuan.org/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- https://nyaw.wiki.devuan.org/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- {.underline} is the result of <strong>foo</strong> getting lost in translation.
10- 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. 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.
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. 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.
@@ -37,9 +36,6 @@ Extract title from Fos and Pm, maybe even pagetitle if possible. Title is point
37 36
38htmx 37htmx
39 38
40pandoc replacements
41- cmark-gfm
42
43cgit has Lua 39cgit has Lua
44 40
45 41
@@ -49,6 +45,7 @@ cgit has Lua
49Reuse the user system from SledjChisl. 45Reuse the user system from SledjChisl.
50 46
51levels - 47levels -
48
52- banned 49- banned
53- reader 50- reader
54- member 51- member
diff --git a/notYetAnotherWiki.lua b/notYetAnotherWiki.lua
index 7268170..8c9a5c9 100755
--- a/notYetAnotherWiki.lua
+++ b/notYetAnotherWiki.lua
@@ -2,13 +2,63 @@
2 2
3-- Read the README file for what this is all about. If there is no README or similar, then you can find the link to the source below. 3-- Read the README file for what this is all about. If there is no README or similar, then you can find the link to the source below.
4 4
5local lcmark = require("lcmark") -- https://github.com/jgm/lcmark 5local lunamark = require("lunamark") -- https://github.com/jgm/lunamark
6
7local opts = {
8 layout='compact',
9-- This list is copied from the lunamark source code, until I discover a way to discover it. The descriptions are useful to.
10 containers=false, -- Put sections in containers (e.g. div or section tags)
11 slides=false, -- Like containers, but do not nest them
12 startnum=true, -- Start number of an ordered list is significant
13 smart=false, -- Smart typography (quotes, dashes, ellipses)
14 preserve_tabs=true, -- Don't expand tabs to spaces
15 notes=true, -- Footnotes
16 inline_notes=true, -- Inline footnotes
17 definition_lists=true, -- Definition lists
18 citations=true, -- Citations
19 citation_nbsps=true, -- Turn spacing into non-breaking spaces in citations
20 fenced_code_blocks=true, -- Fenced code blocks
21 lua_metadata=true, -- Lua metadata
22 pandoc_title_blocks=true, -- Pandoc style title blocks
23 hash_enumerators=true, -- may be used as ordered list enumerator
24 require_blank_before_blockquote=false,
25 require_blank_before_header=false,
26 require_blank_before_fenced_code_block=false,
27 fancy_lists=true, -- Pandoc style fancy lists
28 task_list=true, -- GitHub-Flavored Markdown task list
29 strikeout=true, -- Strike-through with double tildes
30 mark=true, -- Highlight with double equals
31 subscript=true, -- Subscripted text between tildes
32 superscript=true, -- Superscripted text between circumflexes
33 bracketed_spans=true, -- Spans with attributes
34 fenced_divs=true, -- Divs with attributes
35 raw_attribute=true, -- Raw pass-through on code elements
36 fenced_code_attributes=true, -- Fenced code block attributes
37 link_attributes=true, -- Link attributes
38 pipe_tables=true, -- PHP Markdown Extra pipe table support
39 table_captions=true, -- Table caption syntax extension
40 header_attributes=true, -- Header attributes
41 line_blocks=true, -- Line blocks
42 escaped_line_breaks=true, -- Pandoc-style escaped hard line breaks
43}
44local writer = lunamark.writer.html5.new(opts)
45local template = ''
46local h = io.open("default.template", 'r')
47if nil ~= h then
48 template = h:read('*a')
49 h:close()
50else
51 print('oops! No such file ' .. 'default.template')
52end
53-- Can override the various writer functions, there's something for each of the basic HTML elements.
54-- Override anything that's generic.
55local parse = lunamark.reader.markdown.new(writer, opts)
6 56
7 57
8 58
9-- Some global data. 59-- Some global data.
10local globalData = { 60local globalData = {
11 ['_'] = '&nbsp;', ['dlr'] = '&dollar;', 61 ['s'] = '&nbsp;', ['_'] = '&nbsp;', ['dlr'] = '&dollar;',
12 ['devuanCinnabarDark'] = '#310202', ['devuanCinnabarLight'] = '#510505', 62 ['devuanCinnabarDark'] = '#310202', ['devuanCinnabarLight'] = '#510505',
13 ['devuanDarkPurpyDark'] = '#33313b', ['devuanDarkPurpyLight'] = '#3c3a45', 63 ['devuanDarkPurpyDark'] = '#33313b', ['devuanDarkPurpyLight'] = '#3c3a45',
14 ['devuanDeepSeaDark'] = '#132f40', ['devuanDeepSeaLight'] = '#1a4562', 64 ['devuanDeepSeaDark'] = '#132f40', ['devuanDeepSeaLight'] = '#1a4562',
@@ -23,7 +73,7 @@ local Sites, Files, Subs = {}, {}, {}
23 73
24-- Useful functions, part 0. 74-- Useful functions, part 0.
25 75
26-- A simple table.subtable = subtable wont work, you end up with a reference so that changes to the later get applaid to the former. 76-- A simple table.subtable = subtable wont work, you end up with a reference so that changes to the later get applied to the former.
27local derefiTable = function(t, strip) 77local derefiTable = function(t, strip)
28 local argh = {} 78 local argh = {}
29 for l, y in ipairs(t) do if (l ~= y.name) and strip then table.insert(argh, y) end end 79 for l, y in ipairs(t) do if (l ~= y.name) and strip then table.insert(argh, y) end end
@@ -50,29 +100,47 @@ local stringBits = function(l)
50end 100end
51 101
52 102
103-- Put a value into the Files or Subs table, creating things if needed.
104local toFile = function(name, key, value)
105 if nil == Files[name] then Files[name] = {} end
106 if nil ~= key then Files[name][key] = value end
107 for i, v in ipairs{'metadata', 'bits', } do
108 if nil == Files[name][v] then Files[name][v] = {} end
109 end
110end
111local toSub = function(name, key, value)
112 if nil == Subs[name] then Subs[name] = {} end
113 if nil ~= key then Subs[name][key] = value end
114 for i, v in ipairs{'metadata', 'bits', 'files', 'subs'} do
115 if nil == Subs[name][v] then Subs[name][v] = {} end
116 end
117end
118
119
53 120
54-- Actually start doing things. 121-- Actually start doing things.
55 122
56-- Scan the subdirectories looking for .md files. 123-- Scan the subdirectories looking for .md files.
57local directory = arg[1] 124local directory = arg[1]
125toSub('') --Subs[''] = {files = {}, subs = {}, bits = {}}
58if nil == directory then directory = '.' end 126if nil == directory then directory = '.' end
59if '.' ~= directory then 127if '.' ~= directory then
60 for l in io.popen('find . -name "*.md" -type f,l -printf "%P\n"'):lines() do 128 for l in io.popen('find . -name "*.md" -type f,l -printf "%P\n"'):lines() do
61 Files[string.gsub(l, '%.md$', '')] = {} 129 toFile(string.gsub(l, '%.md$', ''))
62 end 130 end
63end 131end
64-- Can add in a distant directory to, for putting it's results in the current directory. 132-- Can add in a distant directory to, for putting it's results in the current directory.
65for l in io.popen('find ' .. directory .. ' -name "*.md" -type f,l -printf "%P\n"'):lines() do 133for l in io.popen('find ' .. directory .. ' -name "*.md" -type f,l -printf "%P\n"'):lines() do
66 local n = string.gsub(l, '%.md$', '') 134 local n = string.gsub(l, '%.md$', '')
67 if nil == Files[n] then Files[n] = {} end 135 if nil == Files[n] then toFile(n) end
68end 136end
69 137
70-- Gotta figure out all the files and subs first. File and sub metadata comes along for the ride. 138-- Gotta figure out all the files and subs first. File and sub metadata comes along for the ride.
71Subs[''] = {files = {}, subs = {}, bits = {}}
72for name, file in pairs(Files) do 139for name, file in pairs(Files) do
73 local bitter, path = '', '' 140 local bitter, path = '', ''
74 local bits, bit = stringBits(name) 141 local bits, bit = stringBits(name)
75 local ln = #bits 142 local ln = #bits
143 local body, metadata = '', {}
76 144
77 -- Go through our bits, construct Subs with bits. 145 -- Go through our bits, construct Subs with bits.
78 Files[name].bits = bits 146 Files[name].bits = bits
@@ -82,41 +150,61 @@ for name, file in pairs(Files) do
82 for i, d in ipairs(bits) do 150 for i, d in ipairs(bits) do
83 if '' ~= path then path = path .. '/' end 151 if '' ~= path then path = path .. '/' end
84 path = path .. d 152 path = path .. d
85 if nil == Subs[path] then Subs[path] = {files = {}, subs = {}} end 153 toSub(path, 'bits', derefiTable(bits, true))
86 if i < ln then Subs[path].subs[bits[i + 1]] = bits[i + 1] end 154 if i < ln then Subs[path].subs[bits[i + 1]] = bits[i + 1] end
87 Subs[path].bits = derefiTable(bits, true)
88 if i < ln then table.remove(Subs[path].bits, #bits) end 155 if i < ln then table.remove(Subs[path].bits, #bits) end
89 end 156 end
90 157
91 -- Start the file parsing here, coz we need it's metadata. 158 if '.md' == string.sub(name, -3, -1) then
92-- print('Parsing ' .. name .. '.md') 159 -- This is a metadata only file, no content, stash the matadata.
93 local h = io.open(name .. '.md', 'r') 160 for l in io.open(name .. '.md'):lines() do
94-- TODO - should bail here on error? 161 for k, v in string.gmatch(l, "(%w+)%s*=%s*(.+)") do metadata[k] = v end
95 if nil ~= h then file.cm = h:read('*a') ; h:close() else print('oops! No such name ' .. name) end 162 end
96 -- Convert the CommonMark to HTML, including the metadata. 163 if '.md' == name then toSub(path, 'metadata', metadata)
97 local body, metadata, err = lcmark.convert(file.cm, "html", {smart = true, yaml_metadata = true, columns = 0}) 164 elseif '/.md' == string.sub(name, -4, -1) then toSub(path, 'metadata', metadata)
98 if nil == body then print('oops! ' .. err) 165 else toFile(string.sub(name, 1, -4), 'metadata', metadata)
99 elseif '' == body then 166 end
100 -- This is a metadata only file, no content, stash the matadata in it's directory.
101 Subs[path].metadata = metadata
102 Files[name] = nil 167 Files[name] = nil
103 else 168 else
104 -- Ordinary md file, stash it's metadata and parsed body. 169
105 -- I need cmark-gfm, coz lcmark doesn't support tables and stuff, it only does basic cmark. 170 -- Start the file parsing here, coz we need it's metadata.
106 local out = '' 171-- print('Parsing ' .. name .. '.md')
107 h = io.popen('if which cmark-gfm ; then echo "found" ; fi | tail -n 1') 172 h = io.open(name .. '.md', 'r')
108 if nil ~= h then out = h:read('*a') ; h:close() end 173 if nil ~= h then
109 if 'found\n' == out then 174 body = h:read('*a') ; h:close()
110 -- Have to strip out the metadata first, coz cmark-gfm doesn't grok that. 175 local f0, f1, token
111 h = io.popen('cp "' .. name .. '.md" "' .. name .. '02" ; csplit -ksz -f "' .. name .. '" "' .. name .. '.md" "/^---$/+1" "{1}" 2>/dev/null ; rm "' .. name .. '00" ; rm "' .. name .. '01" 2>/dev/null') 176 -- Deal with my typical double spaced sentence endings.
112 if nil ~= h then h:close() end 177 local result = ''
113 h = io.popen('cmark-gfm -t html -e footnotes -e table -e strikethrough -e autolink -e tagfilter -e tasklist "' .. name .. '02" ; rm "' .. name .. '02"') 178 local start = 1
114 if nil ~= h then body = h:read('*a') ; h:close() end 179 repeat
115 else 180 f0, f1, token = string.find(body, '([%.%?%!] )', start)
116 print('cmark-gfm not found') 181 if fail ~= f0 then
182 result = result .. string.sub(body, start, f0)
183 if ' ' == string.sub(body, f1 + 1, f1 + 1) then
184 result = result .. '$s$ ' -- '&nbsp;' gets turned into hex 0xA0 by parse(). So feed it another metadata token that gets translated to &nbsp;.
185 else
186 result = result .. ' '
187 end
188 start = f1 + 1
189 end
190 until fail == f0
191 result = result .. string.sub(body, start)
192 -- Do the same for fixing the \' \" \| etc mess pandoc left that sed can't fix.
193 body = result
194 result = ''
195 start = 1
196 repeat
197 f0, f1, token = string.find(body, '(%\\[%"%\'%|%$])', start)
198 if fail ~= f0 then
199 result = result .. string.sub(body, start, f0 - 1)
200 start = f1
201 end
202 until fail == f0
203 result = result .. string.sub(body, start)
204
205 body = parse(result)
117 end 206 end
118 Files[name].metadata = metadata 207 toFile(name, 'body', body)
119 Files[name].body = body
120 table.insert(Subs[path].files, bit) 208 table.insert(Subs[path].files, bit)
121 end 209 end
122end 210end
@@ -181,6 +269,10 @@ end
181 269
182 270
183 271
272-- TODO - loop through Subs, doing whichPage and inheritance.
273
274
275
184-- More of this actually doing things nonsense. 276-- More of this actually doing things nonsense.
185 277
186-- Loop through the files we found and actually create their HTML files. 278-- Loop through the files we found and actually create their HTML files.
@@ -193,14 +285,6 @@ for name, file in pairs(Files) do
193 path = table.concat(bits, '/', 1, ln) 285 path = table.concat(bits, '/', 1, ln)
194 286
195 if '' ~= body then 287 if '' ~= body then
196 -- Continue the parsing and conversion. Start by turning our parsed body into something the lcmark template system can grock.
197 local bod, err = lcmark.compile_template(body)
198 if nil == bod then print('oops! ' .. err) else
199 local templateFile = metadata.template
200 if nil == templateFile then templateFile = 'default' end
201 file.template = templateFile .. '.template'
202 end
203
204 -- Copy any metadata found in parent directories. 288 -- Copy any metadata found in parent directories.
205 local pth = '' 289 local pth = ''
206 for i, d in ipairs(bits) do 290 for i, d in ipairs(bits) do
@@ -287,7 +371,6 @@ for name, file in pairs(Files) do
287 metadata.trail = metadata.trail .. b .. ' &nbsp; ' 371 metadata.trail = metadata.trail .. b .. ' &nbsp; '
288 end 372 end
289 end 373 end
290-- if '' == metadata.trail then metadata.trail = '<a href="' .. string.rep('../', ln) .. '/' .. whichPage('') .. '">home</a> &nbsp; ' end
291 374
292 -- Figure out this pages footer links. 375 -- Figure out this pages footer links.
293 if nil ~= metadata.pagehistory then metadata.history = '<p>Page&nbsp;<a href="' .. metadata.pagehistory .. '/' .. name .. '.md">history</a></p>' end 376 if nil ~= metadata.pagehistory then metadata.history = '<p>Page&nbsp;<a href="' .. metadata.pagehistory .. '/' .. name .. '.md">history</a></p>' end
@@ -296,29 +379,26 @@ for name, file in pairs(Files) do
296 if metadata.footer ~= globalData.footer then metadata.footer = 'Web site ' .. metadata.footer end 379 if metadata.footer ~= globalData.footer then metadata.footer = 'Web site ' .. metadata.footer end
297 metadata.footer = '<p>' .. metadata.footer .. '</p>' 380 metadata.footer = '<p>' .. metadata.footer .. '</p>'
298 381
299 -- Apply the template to the body. 382 -- Do our own metadata replacement, it's simple and works better.
300 metadata.body = lcmark.apply_template(bod, metadata) 383 local temp = template
301 384 local start = 1
302 -- Put it all in the template. 385 metadata.body = nil
303 local tm = '' 386 local f0, f1, token
304 if nil ~= file.template then 387 -- Toss the body in first, so the scan can deal with it to.
305 local h = io.open(file.template, 'r') 388 f0, f1, token = string.find(temp, '%$(body)%$')
306 if nil ~= h then 389 if fail ~= f0 then
307 tm = tm .. h:read('*a') 390 temp = string.sub(temp, 1, f0 - 1) .. body .. string.sub(temp, f1 + 1)
308 h:close()
309 else
310 print('oops! No such file ' .. file.template)
311 end
312
313-- TODO - Um not sure why this is here AND at the top of the loop. Here makes more sense.
314 local template, err = lcmark.compile_template(tm)
315 if nil == template then print('oops! ' .. err) else
316 result = lcmark.apply_template(template, metadata)
317 end
318 else
319 print('No template for ' .. name)
320 result = body
321 end 391 end
392 -- The actual metadata replacement scan.
393 result = ''
394 repeat
395 f0, f1, token = string.find(temp, '%$([%w_]+)%$', start)
396 if fail ~= f0 then
397 if nil ~= metadata[token] then result = result .. string.sub(temp, start, f0 - 1) .. metadata[token] end
398 start = f1 + 1
399 end
400 until fail == f0
401 result = result .. string.sub(temp, start)
322 402
323 -- Write the file. 403 -- Write the file.
324 if '' ~= result then 404 if '' ~= result then
@@ -330,9 +410,6 @@ for name, file in pairs(Files) do
330 a:close() 410 a:close()
331 end 411 end
332 end 412 end
333
334-- else
335-- print('')
336 end 413 end
337end 414end
338 415
diff --git a/testing/.md.md b/testing/.md.md
new file mode 100644
index 0000000..28c4410
--- /dev/null
+++ b/testing/.md.md
@@ -0,0 +1 @@
logo=Connie_click-me.gif
diff --git a/testing/MeTaDaTa.md b/testing/MeTaDaTa.md
deleted file mode 100644
index c4b8e60..0000000
--- a/testing/MeTaDaTa.md
+++ /dev/null
@@ -1,3 +0,0 @@
1---
2logo: Connie_click-me.gif
3---
diff --git a/testing/index.md b/testing/index.md
index b203c9e..276fcb1 100644
--- a/testing/index.md
+++ b/testing/index.md
@@ -1,32 +1,32 @@
1---
2title: "G'day world!"
3---
4
5# G'day world! 1# G'day world!
6 2
7I've been around since the early sixties, but no one ever noticed.&nbsp; You 3I've been around since the early sixties, but no one ever noticed. You
8really should have tried to pay attention though, I'm awesome.&nbsp; I try to 4really should have tried to pay attention though, I'm awesome. I try to
9help the world, but that's not what everyone wants me to do.$_$ Well, the 5help the world, but that's not what everyone wants me to do. Well, the
10people in charge of this poor defenseless world of ours. 6people in charge of this poor defenseless world of ours.
11 7
12 8
13*** 9***
14 10
11## Em'n'Strong
12
13Test *em* _em_ **strong** __strong__ .
14
15# Spaces 15# Spaces
16 16
17Can it *handle* my _usual_ two **space** sentence breaks? Let's test it.$_$ Not by default. 17Can it *handle* my _usual_ two **space** sentence breaks? Let's test it. Not by default.
18 18
19The \\ before a space turns it into a "a literal unicode nonbreaking space character" which looks invisible in the source.\ \--ascii should output the HTML code far that.$_$ Except doesn't actually work. 19The \\ before a space turns it into a "a literal unicode nonbreaking space character" which looks invisible in the source.\ \--ascii should output the HTML code far that. Except doesn't actually work.
20 20
21Also a \\ at the end of a line turns into a line break, though they get wrapped in paragraph tags.$_$ lol \ 21Also a \\ at the end of a line turns into a line break, though they get wrapped in paragraph tags. lol \
22 22
23Take two.$_$ And now for something completely different.&nbsp; It's not consistant, need to manually put in the nbsp a few times above.&nbsp; Ah, it only works for the first one per line. 23Just to double check. That's a single space.
24 24
25\ 25\
26 26
27## Strike out 27## Strike out
28 28
29Test ~~strike~~ --out--.$_$ Needs the extension. 29Test ~~strike~~ --out--. Needs the extension.
30 30
31### URL 31### URL
32 32
@@ -37,34 +37,43 @@ https://sledjhamr.org/
37# Lists 37# Lists
38 38
39 39
40* zero 40* first star
41* 1 41* second star
42* two 42
43<!-- Separate the lists. -->
43 44
44- zero 45- first dash
45- 1 46- second dash
46- two
47 47
48No way to say "here is the end of the list" without putting something **else** here? Ah a comment will work, or anything else.
48 49
49No way to say "here is the end of the list" without putting something **else** here?$_$ Ah a comment will work, or anything else. 501. one
512. two
50 52
53<!-- A comment will work -->
51 54
550. zero
521. one 561. one
532. 2 572. two
54 58
59Autonumbering? Needs the extension. Doesn't matter, they get renumbered anyway if out of order.
55 60
56<!-- A comment will work --> 610. zero
62#. first hash
63#. second hash
57 64
65<!-- Separate the lists. -->
58 66
590. 0 67#. first hash
601. one 68#. second hash
612. 2 69#. third hash
62 70
63Autonumbering? Nope. B-( 71<!-- Separate the lists. -->
64 72
650. zero 730. zero
66 1 742. two
67 two 751. one
76
68 77
69 78
70# images 79# images
@@ -84,6 +93,7 @@ Autonumbering? Nope. B-(
84 93
85 Plus some extra text. 94 Plus some extra text.
86 95
96
87Next code block. 97Next code block.
88 98
89~~~ 99~~~
@@ -92,7 +102,6 @@ Next code block.
92~~~ 102~~~
93 103
94And a really long one, should turn scrollable. 104And a really long one, should turn scrollable.
95
96~~~lua 105~~~lua
97-- Show some Lua code here, may even be highlighted right. 106-- Show some Lua code here, may even be highlighted right.
98print("G'day world!") 107print("G'day world!")
@@ -103,10 +112,14 @@ print'The problem here is that I have to use CSS to style these things, coz cmar
103> # What is a blockquote? 112> # What is a blockquote?
104> Still don't know. lol 113> Still don't know. lol
105> 114>
106> Just another useless way to eat space I guess.$_$ shrugs 115> Just another useless way to eat space I guess. shrugs
116> Might be why emails sometimes get that symbol dropped in HTML conversions.
107 117
108 118
109|This should be a table. |With two columns and a link | 119|This should be a table. |With two columns and a link |
110|-------------------------|-------------------------------| 120|-------------------------|-------------------------------|
111|cell 0,0 |cell 0,1 | 121|cell 0,0 |cell 0,1 |
112|cell 1,0 |[linky](https://sledjhamr.org) | 122|cell 1,0 |[linky](https://sledjhamr.org) |
123
124
125I'm 100% sure that % will get treated correctly now.
diff --git a/testing/index.md.md b/testing/index.md.md
new file mode 100644
index 0000000..c85bb3f
--- /dev/null
+++ b/testing/index.md.md
@@ -0,0 +1 @@
title=G'day world!