Custom writer: default to single quotes for strings

Makes the code more consistent and makes it easier to use double quotes
in strings, which is the usual quoting style used for HTML attributes.

Closes: #7487
This commit is contained in:
Albert Krewinkel 2022-01-31 10:21:00 +01:00
parent 0e5ab9760b
commit 46e5937628
No known key found for this signature in database
GPG key ID: 388DC0B21F631124
2 changed files with 84 additions and 84 deletions

View file

@ -14,7 +14,7 @@
-- syntax errors.
local pipe = pandoc.pipe
local stringify = (require "pandoc.utils").stringify
local stringify = (require 'pandoc.utils').stringify
-- The global variable PANDOC_DOCUMENT contains the full AST of
-- the document which is going to be written. It can be used to
@ -25,19 +25,19 @@ local meta = PANDOC_DOCUMENT.meta
-- `image_format` meta value.
local image_format = meta.image_format
and stringify(meta.image_format)
or "png"
or 'png'
local image_mime_type = ({
jpeg = "image/jpeg",
jpg = "image/jpeg",
gif = "image/gif",
png = "image/png",
svg = "image/svg+xml",
jpeg = 'image/jpeg',
jpg = 'image/jpeg',
gif = 'image/gif',
png = 'image/png',
svg = 'image/svg+xml',
})[image_format]
or error("unsupported image format `" .. image_format .. "`")
or error('unsupported image format `' .. image_format .. '`')
-- Character escaping
local function escape(s, in_attribute)
return s:gsub("[<>&\"']",
return s:gsub('[<>&"\']',
function(x)
if x == '<' then
return '&lt;'
@ -60,7 +60,7 @@ end
local function attributes(attr)
local attr_table = {}
for x,y in pairs(attr) do
if y and y ~= "" then
if y and y ~= '' then
table.insert(attr_table, ' ' .. x .. '="' .. escape(y,true) .. '"')
end
end
@ -72,7 +72,7 @@ local notes = {}
-- Blocksep is used to separate block elements.
function Blocksep()
return "\n\n"
return '\n\n'
end
-- This function is called once for the whole document. Parameters:
@ -106,31 +106,31 @@ function Str(s)
end
function Space()
return " "
return ' '
end
function SoftBreak()
return "\n"
return '\n'
end
function LineBreak()
return "<br/>"
return '<br/>'
end
function Emph(s)
return "<em>" .. s .. "</em>"
return '<em>' .. s .. '</em>'
end
function Strong(s)
return "<strong>" .. s .. "</strong>"
return '<strong>' .. s .. '</strong>'
end
function Subscript(s)
return "<sub>" .. s .. "</sub>"
return '<sub>' .. s .. '</sub>'
end
function Superscript(s)
return "<sup>" .. s .. "</sup>"
return '<sup>' .. s .. '</sup>'
end
function SmallCaps(s)
@ -142,33 +142,33 @@ function Strikeout(s)
end
function Link(s, tgt, tit, attr)
return "<a href='" .. escape(tgt,true) .. "' title='" ..
escape(tit,true) .. "'" .. attributes(attr) .. ">" .. s .. "</a>"
return '<a href="' .. escape(tgt,true) .. '" title="' ..
escape(tit,true) .. '"' .. attributes(attr) .. '>' .. s .. '</a>'
end
function Image(s, src, tit, attr)
return "<img src='" .. escape(src,true) .. "' title='" ..
escape(tit,true) .. "'/>"
return '<img src="' .. escape(src,true) .. '" title="' ..
escape(tit,true) .. '"/>'
end
function Code(s, attr)
return "<code" .. attributes(attr) .. ">" .. escape(s) .. "</code>"
return '<code' .. attributes(attr) .. '>' .. escape(s) .. '</code>'
end
function InlineMath(s)
return "\\(" .. escape(s) .. "\\)"
return '\\(' .. escape(s) .. '\\)'
end
function DisplayMath(s)
return "\\[" .. escape(s) .. "\\]"
return '\\[' .. escape(s) .. '\\]'
end
function SingleQuoted(s)
return "&lsquo;" .. s .. "&rsquo;"
return '&lsquo;' .. s .. '&rsquo;'
end
function DoubleQuoted(s)
return "&ldquo;" .. s .. "&rdquo;"
return '&ldquo;' .. s .. '&rdquo;'
end
function Note(s)
@ -184,11 +184,11 @@ function Note(s)
end
function Span(s, attr)
return "<span" .. attributes(attr) .. ">" .. s .. "</span>"
return '<span' .. attributes(attr) .. '>' .. s .. '</span>'
end
function RawInline(format, str)
if format == "html" then
if format == 'html' then
return str
else
return ''
@ -200,8 +200,8 @@ function Cite(s, cs)
for _,cit in ipairs(cs) do
table.insert(ids, cit.citationId)
end
return "<span class=\"cite\" data-citation-ids=\"" .. table.concat(ids, ",") ..
"\">" .. s .. "</span>"
return '<span class="cite" data-citation-ids="' .. table.concat(ids, ',') ..
'">' .. s .. '</span>'
end
function Plain(s)
@ -209,16 +209,16 @@ function Plain(s)
end
function Para(s)
return "<p>" .. s .. "</p>"
return '<p>' .. s .. '</p>'
end
-- lev is an integer, the header level.
function Header(lev, s, attr)
return "<h" .. lev .. attributes(attr) .. ">" .. s .. "</h" .. lev .. ">"
return '<h' .. lev .. attributes(attr) .. '>' .. s .. '</h' .. lev .. '>'
end
function BlockQuote(s)
return "<blockquote>\n" .. s .. "\n</blockquote>"
return '<blockquote>\n' .. s .. '\n</blockquote>'
end
function HorizontalRule()
@ -234,39 +234,39 @@ function CodeBlock(s, attr)
-- If code block has class 'dot', pipe the contents through dot
-- and base64, and include the base64-encoded png as a data: URL.
if attr.class and string.match(' ' .. attr.class .. ' ',' dot ') then
local img = pipe("base64", {}, pipe("dot", {"-T" .. image_format}, s))
local img = pipe('base64', {}, pipe('dot', {'-T' .. image_format}, s))
return '<img src="data:' .. image_mime_type .. ';base64,' .. img .. '"/>'
-- otherwise treat as code (one could pipe through a highlighter)
else
return "<pre><code" .. attributes(attr) .. ">" .. escape(s) ..
"</code></pre>"
return '<pre><code' .. attributes(attr) .. '>' .. escape(s) ..
'</code></pre>'
end
end
function BulletList(items)
local buffer = {}
for _, item in pairs(items) do
table.insert(buffer, "<li>" .. item .. "</li>")
table.insert(buffer, '<li>' .. item .. '</li>')
end
return "<ul>\n" .. table.concat(buffer, "\n") .. "\n</ul>"
return '<ul>\n' .. table.concat(buffer, '\n') .. '\n</ul>'
end
function OrderedList(items)
local buffer = {}
for _, item in pairs(items) do
table.insert(buffer, "<li>" .. item .. "</li>")
table.insert(buffer, '<li>' .. item .. '</li>')
end
return "<ol>\n" .. table.concat(buffer, "\n") .. "\n</ol>"
return '<ol>\n' .. table.concat(buffer, '\n') .. '\n</ol>'
end
function DefinitionList(items)
local buffer = {}
for _,item in pairs(items) do
local k, v = next(item)
table.insert(buffer, "<dt>" .. k .. "</dt>\n<dd>" ..
table.concat(v, "</dd>\n<dd>") .. "</dd>")
table.insert(buffer, '<dt>' .. k .. '</dt>\n<dd>' ..
table.concat(v, '</dd>\n<dd>') .. '</dd>')
end
return "<dl>\n" .. table.concat(buffer, "\n") .. "\n</dl>"
return '<dl>\n' .. table.concat(buffer, '\n') .. '\n</dl>'
end
-- Convert pandoc alignment to something HTML can use.
@ -303,13 +303,13 @@ function Table(caption, aligns, widths, headers, rows)
local function add(s)
table.insert(buffer, s)
end
add("<table>")
if caption ~= "" then
add("<caption>" .. escape(caption) .. "</caption>")
add('<table>')
if caption ~= '' then
add('<caption>' .. escape(caption) .. '</caption>')
end
if widths and widths[1] ~= 0 then
for _, w in pairs(widths) do
add('<col width="' .. string.format("%.0f%%", w * 100) .. '" />')
add('<col width="' .. string.format('%.0f%%', w * 100) .. '" />')
end
end
local header_row = {}
@ -317,7 +317,7 @@ function Table(caption, aligns, widths, headers, rows)
for i, h in pairs(headers) do
local align = html_align(aligns[i])
table.insert(header_row,'<th align="' .. align .. '">' .. h .. '</th>')
empty_header = empty_header and h == ""
empty_header = empty_header and h == ''
end
if not empty_header then
add('<tr class="header">')
@ -326,9 +326,9 @@ function Table(caption, aligns, widths, headers, rows)
end
add('</tr>')
end
local class = "even"
local class = 'even'
for _, row in pairs(rows) do
class = (class == "even" and "odd") or "even"
class = (class == 'even' and 'odd') or 'even'
add('<tr class="' .. class .. '">')
for i,c in pairs(row) do
add('<td align="' .. html_align(aligns[i]) .. '">' .. c .. '</td>')
@ -340,7 +340,7 @@ function Table(caption, aligns, widths, headers, rows)
end
function RawBlock(format, str)
if format == "html" then
if format == 'html' then
return str
else
return ''
@ -348,7 +348,7 @@ function RawBlock(format, str)
end
function Div(s, attr)
return "<div" .. attributes(attr) .. ">\n" .. s .. "</div>"
return '<div' .. attributes(attr) .. '>\n' .. s .. '</div>'
end
-- The following code will produce runtime warnings when you haven't defined
@ -358,6 +358,6 @@ local meta = {}
meta.__index =
function(_, key)
io.stderr:write(string.format("WARNING: Undefined function '%s'\n",key))
return function() return "" end
return function() return '' end
end
setmetatable(_G, meta)

View file

@ -5,7 +5,7 @@ John Grubers markdown test suite.</p>
<h1 id="headers">Headers</h1>
<h2 id="level-2-with-an-embedded-link">Level 2 with an <a href='/url' title=''>embedded link</a></h2>
<h2 id="level-2-with-an-embedded-link">Level 2 with an <a href="/url" title="">embedded link</a></h2>
<h3 id="level-3-with-emphasis">Level 3 with <em>emphasis</em></h3>
@ -525,7 +525,7 @@ Blah
<p>This is <strong>strong</strong>, and so <strong>is this</strong>.</p>
<p>An <em><a href='/url' title=''>emphasized link</a></em>.</p>
<p>An <em><a href="/url" title="">emphasized link</a></em>.</p>
<p><strong><em>This is strong and em.</em></strong></p>
@ -560,7 +560,7 @@ So is &lsquo;pine.&rsquo;</p>
<p>&lsquo;He said, &ldquo;I want to go.&rdquo;&rsquo; Were you alive in the
70s?</p>
<p>Here is some quoted &lsquo;<code>code</code>&rsquo; and a &ldquo;<a href='http://example.com/?foo=1&amp;bar=2' title=''>quoted link</a>&rdquo;.</p>
<p>Here is some quoted &lsquo;<code>code</code>&rsquo; and a &ldquo;<a href="http://example.com/?foo=1&amp;bar=2" title="">quoted link</a>&rdquo;.</p>
<p>Some dashes: one—two — three—four — five.</p>
@ -660,70 +660,70 @@ So is &lsquo;pine.&rsquo;</p>
<h2 id="explicit">Explicit</h2>
<p>Just a <a href='/url/' title=''>URL</a>.</p>
<p>Just a <a href="/url/" title="">URL</a>.</p>
<p><a href='/url/' title='title'>URL and title</a>.</p>
<p><a href="/url/" title="title">URL and title</a>.</p>
<p><a href='/url/' title='title preceded by two spaces'>URL and title</a>.</p>
<p><a href="/url/" title="title preceded by two spaces">URL and title</a>.</p>
<p><a href='/url/' title='title preceded by a tab'>URL and title</a>.</p>
<p><a href="/url/" title="title preceded by a tab">URL and title</a>.</p>
<p><a href='/url/' title='title with &quot;quotes&quot; in it'>URL and title</a></p>
<p><a href="/url/" title="title with &quot;quotes&quot; in it">URL and title</a></p>
<p><a href='/url/' title='title with single quotes'>URL and title</a></p>
<p><a href="/url/" title="title with single quotes">URL and title</a></p>
<p><a href='/url/with_underscore' title=''>with_underscore</a></p>
<p><a href="/url/with_underscore" title="">with_underscore</a></p>
<p><a href='mailto:nobody@nowhere.net' title=''>Email link</a></p>
<p><a href="mailto:nobody@nowhere.net" title="">Email link</a></p>
<p><a href='' title=''>Empty</a>.</p>
<p><a href="" title="">Empty</a>.</p>
<h2 id="reference">Reference</h2>
<p>Foo <a href='/url/' title=''>bar</a>.</p>
<p>Foo <a href="/url/" title="">bar</a>.</p>
<p>With <a href='/url/' title=''>embedded [brackets]</a>.</p>
<p>With <a href="/url/" title="">embedded [brackets]</a>.</p>
<p><a href='/url/' title=''>b</a> by itself should be a link.</p>
<p><a href="/url/" title="">b</a> by itself should be a link.</p>
<p>Indented <a href='/url' title=''>once</a>.</p>
<p>Indented <a href="/url" title="">once</a>.</p>
<p>Indented <a href='/url' title=''>twice</a>.</p>
<p>Indented <a href="/url" title="">twice</a>.</p>
<p>Indented <a href='/url' title=''>thrice</a>.</p>
<p>Indented <a href="/url" title="">thrice</a>.</p>
<p>This should [not][] be a link.</p>
<pre><code>[not]: /url</code></pre>
<p>Foo <a href='/url/' title='Title with &quot;quotes&quot; inside'>bar</a>.</p>
<p>Foo <a href="/url/" title="Title with &quot;quotes&quot; inside">bar</a>.</p>
<p>Foo <a href='/url/' title='Title with &quot;quote&quot; inside'>biz</a>.</p>
<p>Foo <a href="/url/" title="Title with &quot;quote&quot; inside">biz</a>.</p>
<h2 id="with-ampersands">With ampersands</h2>
<p>Heres a <a href='http://example.com/?foo=1&amp;bar=2' title=''>link with an ampersand in the URL</a>.</p>
<p>Heres a <a href="http://example.com/?foo=1&amp;bar=2" title="">link with an ampersand in the URL</a>.</p>
<p>Heres a link with an amersand in the link text: <a href='http://att.com/' title='AT&amp;T'>AT&amp;T</a>.</p>
<p>Heres a link with an amersand in the link text: <a href="http://att.com/" title="AT&amp;T">AT&amp;T</a>.</p>
<p>Heres an <a href='/script?foo=1&amp;bar=2' title=''>inline link</a>.</p>
<p>Heres an <a href="/script?foo=1&amp;bar=2" title="">inline link</a>.</p>
<p>Heres an <a href='/script?foo=1&amp;bar=2' title=''>inline link in pointy braces</a>.</p>
<p>Heres an <a href="/script?foo=1&amp;bar=2" title="">inline link in pointy braces</a>.</p>
<h2 id="autolinks">Autolinks</h2>
<p>With an ampersand: <a href='http://example.com/?foo=1&amp;bar=2' title='' class="uri">http://example.com/?foo=1&amp;bar=2</a></p>
<p>With an ampersand: <a href="http://example.com/?foo=1&amp;bar=2" title="" class="uri">http://example.com/?foo=1&amp;bar=2</a></p>
<ul>
<li>In a list?</li>
<li><a href='http://example.com/' title='' class="uri">http://example.com/</a></li>
<li><a href="http://example.com/" title="" class="uri">http://example.com/</a></li>
<li>It should.</li>
</ul>
<p>An e-mail address: <a href='mailto:nobody@nowhere.net' title='' class="email">nobody@nowhere.net</a></p>
<p>An e-mail address: <a href="mailto:nobody@nowhere.net" title="" class="email">nobody@nowhere.net</a></p>
<blockquote>
<p>Blockquoted: <a href='http://example.com/' title='' class="uri">http://example.com/</a></p>
<p>Blockquoted: <a href="http://example.com/" title="" class="uri">http://example.com/</a></p>
</blockquote>
<p>Auto-links should not occur here: <code>&lt;http://example.com/&gt;</code></p>
@ -740,7 +740,7 @@ So is &lsquo;pine.&rsquo;</p>
<img src="lalune.jpg" id="" alt="lalune"/><figcaption>lalune</figcaption>
</figure>
<p>Here is a movie <img src='movie.jpg' title=''/> icon.</p>
<p>Here is a movie <img src="movie.jpg" title=""/> icon.</p>
<hr/>
@ -774,7 +774,7 @@ footnote (as with list items).</p>
lazy and just indent the first line of each block. <a href="#fnref2">&#8617;</a></p></li>
<li id="fn3"><p>This
is <em>easier</em> to type. Inline notes may contain
<a href='http://google.com' title=''>links</a> and <code>]</code> verbatim characters,
<a href="http://google.com" title="">links</a> and <code>]</code> verbatim characters,
as well as [bracketed text]. <a href="#fnref3">&#8617;</a></p></li>
<li id="fn4"><p>In quote. <a href="#fnref4">&#8617;</a></p></li>
<li id="fn5"><p>In list. <a href="#fnref5">&#8617;</a></p></li>