|
|
|
local p = quarto.log.warning |
|
|
|
|
|
|
|
|
|
|
|
|
|
local function f(s, kwargs) |
|
return (s:gsub('($%b{})', function(w) return kwargs[w:sub(3, -2)] or w end)) |
|
end |
|
|
|
|
|
|
|
|
|
|
|
local function mergeOptions(url, userOptions) |
|
local defaultOptions = { |
|
text = url, |
|
width = 128, |
|
height = 128, |
|
colorDark = "#000000", |
|
colorLight = "#ffffff", |
|
} |
|
if userOptions == nil then |
|
return quarto.json.encode(defaultOptions) |
|
end |
|
|
|
for k, v in pairs(userOptions) do |
|
local value = pandoc.utils.stringify(v) |
|
if value == 'true' then value = true end |
|
if value == 'false' then value = false end |
|
defaultOptions[k] = value |
|
end |
|
|
|
return quarto.json.encode(defaultOptions) |
|
end |
|
|
|
|
|
|
|
local function wrapInlineDiv(options) |
|
return [[ |
|
<div id="${id}" class="qrcode"></div> |
|
<script type="text/javascript"> |
|
var qrcode = new QRCode("${id}", ]] |
|
.. options .. [[); |
|
</script> |
|
]] |
|
end |
|
|
|
|
|
local function wrapInlineTex(url, opts) |
|
return [[ |
|
\qrcode[]] .. opts .. [[]{]] .. url .. [[} |
|
]] |
|
end |
|
|
|
return { |
|
['qrcode'] = function(args, kwargs, _) |
|
if quarto.doc.is_format("html:js") then |
|
quarto.doc.add_html_dependency { |
|
name = 'qrcodejs', |
|
version = 'v1.0.0', |
|
scripts = { './assets/qrcode.js' }, |
|
} |
|
local url = pandoc.utils.stringify(args[1]) |
|
local id = 'qrcode' |
|
local maybeId = args[2] |
|
if maybeId ~= nil then |
|
id = pandoc.utils.stringify(maybeId) |
|
end |
|
local options = mergeOptions(url, kwargs) |
|
local text = wrapInlineDiv(options) |
|
return pandoc.RawBlock( |
|
'html', |
|
f(text, { id = id }) |
|
) |
|
elseif quarto.doc.is_format("pdf") then |
|
quarto.doc.use_latex_package("qrcode") |
|
local url = pandoc.utils.stringify(args[1]) |
|
local opts = "" |
|
for k, v in pairs(kwargs) do |
|
if string.match(k, "^pdf") then |
|
k = string.sub(k, 4) |
|
opts = opts .. k .. "=" .. v .. ", " |
|
end |
|
end |
|
for _, v in ipairs(args) do |
|
if string.match(v, "^pdf") then |
|
v = string.sub(v, 4) |
|
opts = opts .. v .. ", " |
|
end |
|
end |
|
if string.len(opts) then |
|
opts = string.sub(opts, 1, string.len(opts) - 2) |
|
end |
|
local text = wrapInlineTex(url, opts) |
|
return pandoc.RawBlock( |
|
'tex', |
|
text |
|
) |
|
end |
|
end, |
|
} |
|
|