diff options
author | ubq323 <ubq323@ubq323.website> | 2024-10-31 18:41:04 +0000 |
---|---|---|
committer | ubq323 <ubq323@ubq323.website> | 2024-10-31 18:41:04 +0000 |
commit | d5e53ee2a2b83adf91a0c3bbbc02c450b6747d59 (patch) | |
tree | 6d08a0aa3e8eaa341e402b5881735ba79094ddc4 | |
parent | 664f471c774d6182efb0f9c4d4c9af9857b1bf52 (diff) |
highlighting, better whitespace, make into a module
-rw-r--r-- | html.lua | 10 | ||||
-rw-r--r-- | init.lua (renamed from garkup.lua) | 51 | ||||
-rw-r--r-- | prose.lua | 19 |
3 files changed, 60 insertions, 20 deletions
@@ -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 @@ -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 @@ -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" ", - html.T.a({href="#"..link_id, role="doc-backlink"}, html.safe"↩︎")}) - 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"↩︎")}) + 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 |