summary refs log tree commit diff stats
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/allwords.lua17
-rw-r--r--lua/river.lua228
-rw-r--r--lua/sample-writer.lua324
3 files changed, 0 insertions, 569 deletions
diff --git a/lua/allwords.lua b/lua/allwords.lua deleted file mode 100644 index b87f08a..0000000 --- a/lua/allwords.lua +++ /dev/null
@@ -1,17 +0,0 @@
1function allwords ()
2 local line = io.read()
3 local pos = 1
4 return function ()
5 while line do
6 local s, e = string.find(line, "%w+", pos)
7 if s then
8 pos = e + 1
9 return string.sub(line, s, e)
10 else
11 line = io.read()
12 pos = 1
13 end
14 end
15 return nil
16 end
17end
diff --git a/lua/river.lua b/lua/river.lua deleted file mode 100644 index cd867af..0000000 --- a/lua/river.lua +++ /dev/null
@@ -1,228 +0,0 @@
1-- Pandoc River writer
2-- it takes out all formatting, leaving only a river of text
3-- running down the page: one word per line
4-- vim: fdm=marker
5-- invoke with: pandoc -t river.lua
6
7os.setlocale("en_US.UTF-8")
8
9local function flow(s)
10 return s:gsub("%s+", "\n")
11end
12
13local function nude(s)
14 -- Expand contractions
15 s = s:gsub("'%a+%s", function (x)
16 if x == "'ll" then
17 return " will "
18 elseif x == "'ve" then
19 return " have "
20 elseif x == "'re" then
21 return " are "
22 else
23 return x
24 end
25 end)
26 -- Get rid of quotes around words
27 s = s:gsub('"', ' ')
28 s = s:gsub("%s+'", ' ')
29 s = s:gsub("'%s+", ' ')
30 -- Remove HTML entities
31 s = s:gsub('&.-;', ' ')
32 s = s:gsub('%b<>', ' ')
33 -- Remove end-of-line backslashes
34 s = s:gsub('%s+\\$', ' ')
35 -- Remove dashes (not hyphens)
36 s = s:gsub('%-%-+', ' ')
37 s = s:gsub('%-%s', ' ')
38 -- Remove everything that is not letters or numbers
39 s = s:gsub('[%.!%?:;,%[%]%(%)<>]', ' ')
40 -- Remove extra spaces
41 s = s:gsub('%s+', ' ')
42 return s:lower()
43end
44
45-- This function is called once for the whole document. Parameters:
46-- body is a string, metadata is a table, variables is a table.
47-- One could use some kind of templating
48-- system here; this just gives you a simple standalone HTML file.
49function Doc(body, metadata, variables)
50 local buffer = ""
51 local function add(s)
52 buffer = buffer .. nude(s) .. "\n"
53 end
54 if metadata['title'] then
55 add(metadata['title'])
56 end
57 if metadata['subtitle'] then
58 add(metadata['subtitle'])
59 end
60 -- TODO: epigraph.content, epigraph.attrib, dedication, other metadata?
61 add(body)
62 return flow(buffer)
63end
64
65-- Remove all formatting {{{
66function Note(s)
67 return nude(s)
68end
69
70function Blocksep()
71 return "\n"
72end
73function Emph(s)
74 return nude(s)
75end
76
77function Strong(s)
78 return nude(s)
79end
80
81function Subscript(s)
82 return nude(s)
83end
84
85function Superscript(s)
86 return nude(s)
87end
88
89function SmallCaps(s)
90 return nude(s)
91end
92
93function Strikeout(s)
94 return nude(s)
95end
96
97function Code(s, attr)
98 return nude(s)
99end
100
101function CodeBlock(s, attr)
102 return nude(s)
103end
104
105function InlineMath(s)
106 return nude(s)
107end
108
109function DisplayMath(s)
110 return nude(s)
111end
112
113function Span(s, attr)
114 return nude(s)
115end
116
117function Cite(s)
118 return nude(s)
119end
120
121function Plain(s)
122 return nude(s)
123end
124
125-- Links only include the link text
126function Link(s, src, tit)
127 return nude(s)
128end
129
130-- Images have nothing to give us
131-- (but add a space just in case)
132function Image(s, src, tit)
133 return "\n"
134end
135
136function CaptionedImage(s, src, tit)
137 return "\n"
138end
139
140function Str(s)
141 return nude(s)
142end
143
144function Div(s, attr)
145 return nude(s)
146end
147
148function Space(s)
149 return "\n"
150end
151
152function LineBreak()
153 return "\n"
154end
155
156function Para(s)
157 return nude(s)
158end
159
160function Header(lev, s, attr)
161 return nude(s)
162end
163
164function BlockQuote(s)
165 return nude(s)
166end
167
168function HorizontalRule()
169 return "\n"
170end
171
172function BulletList(items)
173 local buffer = ""
174 for _, item in pairs(items) do
175 buffer = buffer .. nude(item) .. "\n"
176 end
177 return buffer .. "\n"
178end
179
180function OrderedList(items)
181 local buffer = ""
182 for _, item in pairs(items) do
183 buffer = buffer .. nude(item) .. "\n"
184 end
185 return buffer .. "\n"
186end
187
188function DefinitionList(items)
189 local buffer = ""
190 for _, item in pairs(items) do
191 for k, v in pairs(item) do
192 buffer = buffer .. nude(k) .. "\n" .. nude(v) .. "\n"
193 end
194 end
195 return buffer .. "\n"
196end
197
198function Table(caption, aligns, widths, headers, rows)
199 local buffer = ""
200 local function add(s)
201 buffer = buffer .. nude(s) .. "\n"
202 end
203 if caption ~= "" then
204 add(caption)
205 end
206 for _,h in pairs(headers) do
207 add(h)
208 end
209 for _, row in pairs(rows) do
210 for _, cell in pairs(row) do
211 add(cell)
212 end
213 end
214 return buffer
215end
216-- }}}
217
218-- The following code will produce runtime warnings when you haven't defined
219-- all of the functions you need for the custom writer, so it's useful
220-- to include when you're working on a writer.
221local meta = {}
222meta.__index =
223 function(_, key)
224 io.stderr:write(string.format("WARNING: Undefined function '%s'\n",key))
225 return function() return "" end
226 end
227setmetatable(_G, meta)
228
diff --git a/lua/sample-writer.lua b/lua/sample-writer.lua deleted file mode 100644 index a0c3c29..0000000 --- a/lua/sample-writer.lua +++ /dev/null
@@ -1,324 +0,0 @@
1-- This is a sample custom writer for pandoc. It produces output
2-- that is very similar to that of pandoc's HTML writer.
3-- There is one new feature: code blocks marked with class 'dot'
4-- are piped through graphviz and images are included in the HTML
5-- output using 'data:' URLs.
6--
7-- Invoke with: pandoc -t sample.lua
8--
9-- Note: you need not have lua installed on your system to use this
10-- custom writer. However, if you do have lua installed, you can
11-- use it to test changes to the script. 'lua sample.lua' will
12-- produce informative error messages if your code contains
13-- syntax errors.
14
15-- Character escaping
16local function escape(s, in_attribute)
17 return s:gsub("[<>&\"']",
18 function(x)
19 if x == '<' then
20 return '&lt;'
21 elseif x == '>' then
22 return '&gt;'
23 elseif x == '&' then
24 return '&amp;'
25 elseif x == '"' then
26 return '&quot;'
27 elseif x == "'" then
28 return '&#39;'
29 else
30 return x
31 end
32 end)
33end
34
35-- Helper function to convert an attributes table into
36-- a string that can be put into HTML tags.
37local function attributes(attr)
38 local attr_table = {}
39 for x,y in pairs(attr) do
40 if y and y ~= "" then
41 table.insert(attr_table, ' ' .. x .. '="' .. escape(y,true) .. '"')
42 end
43 end
44 return table.concat(attr_table)
45end
46
47-- Run cmd on a temporary file containing inp and return result.
48local function pipe(cmd, inp)
49 local tmp = os.tmpname()
50 local tmph = io.open(tmp, "w")
51 tmph:write(inp)
52 tmph:close()
53 local outh = io.popen(cmd .. " " .. tmp,"r")
54 local result = outh:read("*all")
55 outh:close()
56 os.remove(tmp)
57 return result
58end
59
60-- Table to store footnotes, so they can be included at the end.
61local notes = {}
62
63-- Blocksep is used to separate block elements.
64function Blocksep()
65 return "\n\n"
66end
67
68-- This function is called once for the whole document. Parameters:
69-- body is a string, metadata is a table, variables is a table.
70-- One could use some kind of templating
71-- system here; this just gives you a simple standalone HTML file.
72function Doc(body, metadata, variables)
73 local buffer = {}
74 local function add(s)
75 table.insert(buffer, s)
76 end
77 add('<!DOCTYPE html>')
78 add('<html>')
79 add('<head>')
80 add('<title>' .. (metadata['title'] or '') .. '</title>')
81 add('</head>')
82 add('<body>')
83 if metadata['title'] and metadata['title'] ~= "" then
84 add('<h1 class="title">' .. metadata['title'] .. '</h1>')
85 end
86 for _, author in pairs(metadata['author'] or {}) do
87 add('<h2 class="author">' .. author .. '</h2>')
88 end
89 if metadata['date'] and metadata['date'] ~= "" then
90 add('<h3 class="date">' .. metadata.date .. '</h3>')
91 end
92 add(body)
93 if #notes > 0 then
94 add('<ol class="footnotes">')
95 for _,note in pairs(notes) do
96 add(note)
97 end
98 add('</ol>')
99 end
100 add('</body>')
101 add('</html>')
102 return table.concat(buffer,'\n')
103end
104
105-- The functions that follow render corresponding pandoc elements.
106-- s is always a string, attr is always a table of attributes, and
107-- items is always an array of strings (the items in a list).
108-- Comments indicate the types of other variables.
109
110function Str(s)
111 return escape(s)
112end
113
114function Space()
115 return " "
116end
117
118function LineBreak()
119 return "<br/>"
120end
121
122function Emph(s)
123 return "<em>" .. s .. "</em>"
124end
125
126function Strong(s)
127 return "<strong>" .. s .. "</strong>"
128end
129
130function Subscript(s)
131 return "<sub>" .. s .. "</sub>"
132end
133
134function Superscript(s)
135 return "<sup>" .. s .. "</sup>"
136end
137
138function SmallCaps(s)
139 return '<span style="font-variant: small-caps;">' .. s .. '</span>'
140end
141
142function Strikeout(s)
143 return '<del>' .. s .. '</del>'
144end
145
146function Link(s, src, tit)
147 return "<a href='" .. escape(src,true) .. "' title='" ..
148 escape(tit,true) .. "'>" .. s .. "</a>"
149end
150
151function Image(s, src, tit)
152 return "<img src='" .. escape(src,true) .. "' title='" ..
153 escape(tit,true) .. "'/>"
154end
155
156function Code(s, attr)
157 return "<code" .. attributes(attr) .. ">" .. escape(s) .. "</code>"
158end
159
160function InlineMath(s)
161 return "\\(" .. escape(s) .. "\\)"
162end
163
164function DisplayMath(s)
165 return "\\[" .. escape(s) .. "\\]"
166end
167
168function Note(s)
169 local num = #notes + 1
170 -- insert the back reference right before the final closing tag.
171 s = string.gsub(s,
172 '(.*)</', '%1 <a href="#fnref' .. num .. '">&#8617;</a></')
173 -- add a list item with the note to the note table.
174 table.insert(notes, '<li id="fn' .. num .. '">' .. s .. '</li>')
175 -- return the footnote reference, linked to the note.
176 return '<a id="fnref' .. num .. '" href="#fn' .. num ..
177 '"><sup>' .. num .. '</sup></a>'
178end
179
180function Span(s, attr)
181 return "<span" .. attributes(attr) .. ">" .. s .. "</span>"
182end
183
184function Cite(s)
185 return "<span class=\"cite\">" .. s .. "</span>"
186end
187
188function Plain(s)
189 return s
190end
191
192function Para(s)
193 return "<p>" .. s .. "</p>"
194end
195
196-- lev is an integer, the header level.
197function Header(lev, s, attr)
198 return "<h" .. lev .. attributes(attr) .. ">" .. s .. "</h" .. lev .. ">"
199end
200
201function BlockQuote(s)
202 return "<blockquote>\n" .. s .. "\n</blockquote>"
203end
204
205function HorizontalRule()
206 return "<hr/>"
207end
208
209function CodeBlock(s, attr)
210 -- If code block has class 'dot', pipe the contents through dot
211 -- and base64, and include the base64-encoded png as a data: URL.
212 if attr.class and string.match(' ' .. attr.class .. ' ',' dot ') then
213 local png = pipe("base64", pipe("dot -Tpng", s))
214 return '<img src="data:image/png;base64,' .. png .. '"/>'
215 -- otherwise treat as code (one could pipe through a highlighter)
216 else
217 return "<pre><code" .. attributes(attr) .. ">" .. escape(s) ..
218 "</code></pre>"
219 end
220end
221
222function BulletList(items)
223 local buffer = {}
224 for _, item in pairs(items) do
225 table.insert(buffer, "<li>" .. item .. "</li>")
226 end
227 return "<ul>\n" .. table.concat(buffer, "\n") .. "\n</ul>"
228end
229
230function OrderedList(items)
231 local buffer = {}
232 for _, item in pairs(items) do
233 table.insert(buffer, "<li>" .. item .. "</li>")
234 end
235 return "<ol>\n" .. table.concat(buffer, "\n") .. "\n</ol>"
236end
237
238-- Revisit association list STackValue instance.
239function DefinitionList(items)
240 local buffer = {}
241 for _,item in pairs(items) do
242 for k, v in pairs(item) do
243 table.insert(buffer,"<dt>" .. k .. "</dt>\n<dd>" ..
244 table.concat(v,"</dd>\n<dd>") .. "</dd>")
245 end
246 end
247 return "<dl>\n" .. table.concat(buffer, "\n") .. "\n</dl>"
248end
249
250-- Convert pandoc alignment to something HTML can use.
251-- align is AlignLeft, AlignRight, AlignCenter, or AlignDefault.
252function html_align(align)
253 if align == 'AlignLeft' then
254 return 'left'
255 elseif align == 'AlignRight' then
256 return 'right'
257 elseif align == 'AlignCenter' then
258 return 'center'
259 else
260 return 'left'
261 end
262end
263
264-- Caption is a string, aligns is an array of strings,
265-- widths is an array of floats, headers is an array of
266-- strings, rows is an array of arrays of strings.
267function Table(caption, aligns, widths, headers, rows)
268 local buffer = {}
269 local function add(s)
270 table.insert(buffer, s)
271 end
272 add("<table>")
273 if caption ~= "" then
274 add("<caption>" .. caption .. "</caption>")
275 end
276 if widths and widths[1] ~= 0 then
277 for _, w in pairs(widths) do
278 add('<col width="' .. string.format("%d%%", w * 100) .. '" />')
279 end
280 end
281 local header_row = {}
282 local empty_header = true
283 for i, h in pairs(headers) do
284 local align = html_align(aligns[i])
285 table.insert(header_row,'<th align="' .. align .. '">' .. h .. '</th>')
286 empty_header = empty_header and h == ""
287 end
288 if empty_header then
289 head = ""
290 else
291 add('<tr class="header">')
292 for _,h in pairs(header_row) do
293 add(h)
294 end
295 add('</tr>')
296 end
297 local class = "even"
298 for _, row in pairs(rows) do
299 class = (class == "even" and "odd") or "even"
300 add('<tr class="' .. class .. '">')
301 for i,c in pairs(row) do
302 add('<td align="' .. html_align(aligns[i]) .. '">' .. c .. '</td>')
303 end
304 add('</tr>')
305 end
306 add('</table')
307 return table.concat(buffer,'\n')
308end
309
310function Div(s, attr)
311 return "<div" .. attributes(attr) .. ">\n" .. s .. "</div>"
312end
313
314-- The following code will produce runtime warnings when you haven't defined
315-- all of the functions you need for the custom writer, so it's useful
316-- to include when you're working on a writer.
317local meta = {}
318meta.__index =
319 function(_, key)
320 io.stderr:write(string.format("WARNING: Undefined function '%s'\n",key))
321 return function() return "" end
322 end
323setmetatable(_G, meta)
324