summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorubq323 <ubq323@ubq323.website>2024-10-31 18:41:04 +0000
committerubq323 <ubq323@ubq323.website>2024-10-31 18:41:04 +0000
commitd5e53ee2a2b83adf91a0c3bbbc02c450b6747d59 (patch)
tree6d08a0aa3e8eaa341e402b5881735ba79094ddc4
parent664f471c774d6182efb0f9c4d4c9af9857b1bf52 (diff)
highlighting, better whitespace, make into a module
-rw-r--r--html.lua10
-rw-r--r--init.lua (renamed from garkup.lua)51
-rw-r--r--prose.lua19
3 files changed, 60 insertions, 20 deletions
diff --git a/html.lua b/html.lua
index 87ecc53..e265578 100644
--- a/html.lua
+++ b/html.lua
@@ -19,7 +19,9 @@ local html
local function fmt_tag(tag)
local attrs = tag.attrs and fmt_attrs(tag.attrs) or ""
local selfclosing = (tag.body == "")
- local sameline = type(tag.body) == "string" or (type(tag.body) == "table" and tag.body.tag)
+ local sameline = type(tag.body) == "string"
+ or (type(tag.body) == "table" and tag.body.tag)
+ or (type(tag.body) == "table" and #tag.body <= 1)
local maybenl = sameline and "" or "\n"
if selfclosing then
return ("<%s%s/>"):format(tag.tname,attrs)
@@ -70,9 +72,13 @@ html = function (x)
return safe( tostring(x) )
else
-- just a regular list
+ local nl = "\n"
+ if #x <= 2 then
+ nl = ""
+ end
local o = ""
for _,item in ipairs(x) do
- o = o .. tostring(html(item)) .. "\n"
+ o = o .. tostring(html(item)) .. nl
end
return safe(o)
end
diff --git a/garkup.lua b/init.lua
index 2469aa8..e393b13 100644
--- a/garkup.lua
+++ b/init.lua
@@ -1,9 +1,28 @@
-local html = require'html'
-local prose = require'prose'
+local html = require'garkup.html'
+local T = html.T
+local prose = require'garkup.prose'
-local function highlight(code)
- -- todo
- return html.T.pre(code)
+function empipe(prog, input)
+ local posix = require'posix'
+ local pipe = assert(posix.popen_pipeline({
+ function() io.write(input) end,
+ prog
+ }, "r"))
+ local output = ""
+ repeat
+ local next = assert(posix.unistd.read(pipe.fd, 8192))
+ output = output .. next
+ until #next == 0
+ assert(posix.pclose(pipe))
+ return output
+end
+
+function highlight(code, lang)
+ local highlighted = empipe(
+ {"highlight", "-f", "-S", lang, "--inline-css", "--enclose-pre"},
+ code
+ )
+ return html.safe(highlighted)
end
local function mode_code(S)
@@ -17,7 +36,7 @@ local function mode_code(S)
text = text .. line
end
end
- S:emit(highlight(text))
+ S:emit(highlight(text, lang))
end
local function mode_list(S)
@@ -25,13 +44,13 @@ local function mode_list(S)
for line in S:lines() do
if line:match("^%*") then
local content = line:gsub("^%*%s*","")
- table.insert(items, html.T.li(prose(S,content)))
+ table.insert(items, T.li(prose(S,content)))
else
S:unline(line)
break
end
end
- S:emit(html.T.ul(items))
+ S:emit(T.ul(items))
end
local function mode_heading(S)
@@ -57,7 +76,7 @@ local function mode_paragraphs(S)
local para = ""
local function finish()
if para:match("%S") then
- S:emit(html.T.p(prose(S,para)))
+ S:emit(T.p(prose(S,para)))
end
para = ""
end
@@ -87,12 +106,13 @@ end
local State = {}
function State.new(input)
return setmetatable({
- the_lines = split_lines(input)
+ the_lines = split_lines(input),
+ output = "",
}, {__index=State})
end
function State.emit(self, x)
- print(html.html(x))
+ self.output = self.output..tostring(html.html(x)).."\n"
end
function State.line(self)
return table.remove(self.the_lines, 1)
@@ -110,7 +130,14 @@ function State.toplevel(self)
while self:remaining() do
mode_paragraphs(self)
end
+ return self.output
+end
+
+local function garkup(text)
+ local S = State.new(text)
+ return S:toplevel(), S
end
-State.new(io.read"a"):toplevel()
+-- print(garkup(io.read"a")
+return garkup
diff --git a/prose.lua b/prose.lua
index ceadec0..99e298a 100644
--- a/prose.lua
+++ b/prose.lua
@@ -1,4 +1,5 @@
-local html = require'html'
+local html = require'garkup.html'
+local T = html.T
local extensions = {}
@@ -20,7 +21,7 @@ local function prose(S, text)
local function simple_sub(delim, tagname)
return {
"(%s)"..delim..'(.-)'..delim..'(%W)', -- wo wimple
- function(a,x,b) return a..emplace(html.T[tagname](x))..b end
+ function(a,x,b) return a..emplace(T[tagname](x))..b end
}
end
@@ -76,15 +77,21 @@ extensions.fn = function(S,text)
local n = #S.footnotes + 1
local link_id = "fnref_"..n
local note_id = "fn_"..n
- S.footnotes[n] = html.T.li({id=note_id}, {
+ S.footnotes[n] = true -- for nested footnotes
+ S.footnotes[n] = T.li({id=note_id}, {
prose(S,text), html.safe"&nbsp;",
- html.T.a({href="#"..link_id, role="doc-backlink"}, html.safe"&#x21a9;&#xfe0e;")})
- return html.T.sup({id=link_id}, html.T.a({href="#"..note_id, role='doc-noteref'}, '('..n..')'))
+ T.a({href="#"..link_id, role="doc-backlink"}, html.safe"&#x21a9;&#xfe0e;")})
+ return T.sup({id=link_id}, T.a({href="#"..note_id, role='doc-noteref'}, '('..n..')'))
end
extensions.fns = function(S)
if not S.footnotes then return "" end
- return {html.T.hr{}, html.T.ol(S.footnotes)}
+ return {T.hr"", T.ol(S.footnotes)}
+end
+
+extensions.meta = function(S,text)
+ local fn = assert(load(string.format("return {%s}", text),"meta", "t"))
+ S.meta = fn()
end
return prose