-- for development: local p = quarto.log.warning ---Format string like in bash or python, ---e.g. f('Hello ${one}', {one = 'world'}) ---@param s string The string to format ---@param kwargs {[string]: string} A table with key-value replacemen pairs ---@return string local function f(s, kwargs) return (s:gsub('($%b{})', function(w) return kwargs[w:sub(3, -2)] or w end)) end ---Merge user provided options with defaults ---@param userOptions table ---@return string JSON string to pass to molstar 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 ---@return string local function wrapInlineDiv(options) return [[
]] end ---@return string 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, }