Spaces:
Running
Running
--[[ | |
MIT License | |
Copyright (c) 2023 Shafayet Khan Shafee | |
Permission is hereby granted, free of charge, to any person obtaining a copy | |
of this software and associated documentation files (the "Software"), to deal | |
in the Software without restriction, including without limitation the rights | |
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
copies of the Software, and to permit persons to whom the Software is | |
furnished to do so, subject to the following conditions: | |
The above copyright notice and this permission notice shall be included in all | |
copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
SOFTWARE. | |
]]-- | |
return { | |
['lof'] = function(args, kwargs, meta) | |
-- args and kwargs | |
local file_path = str(args[1]) | |
local extension = "." .. file_path:match("[^.]+$") | |
local dname = optional(str(kwargs["dname"]), "file") | |
local dfilename = dname .. extension | |
local btn_label = " " .. optional(str(kwargs["label"]), "Download") .. " " | |
local btn_type = optional(str(kwargs["type"]), "default") | |
local icon = optional(str(kwargs["icon"]), "download") | |
local class = " " .. optional(str(kwargs["class"]), "") | |
local rand = "dnldts" .. str(math.random(1, 65000)) | |
local id = optional(str(kwargs["id"]), rand) | |
-- reading files | |
local fh = io.open(file_path, "rb") | |
if not fh then | |
io.stderr:write("Cannot open file " .. | |
file_path .. | |
" | Javed Skipping adding buttons\n") | |
return pandoc.Null() | |
else | |
local contents = fh:read("*all") | |
fh:close() | |
-- creating dataURI object | |
local b64_encoded = b64.encode(contents) | |
local mimetype = puremagic.via_path(file_path) | |
local data_uri = 'data:' .. mimetype .. ";base64," .. b64_encoded | |
-- js code taken from | |
-- https://github.com/fmmattioni/downloadthis/blob/master/R/utils.R#L59 | |
local js = [[fetch('%s').then(res => res.blob()).then(blob => { | |
const downloadURL = window.URL.createObjectURL(blob); | |
const a = document.createElement('a'); | |
document.body.appendChild(a); | |
a.href = downloadURL; | |
a.download = '%s'; a.click(); | |
window.URL.revokeObjectURL(downloadURL); | |
document.body.removeChild(a); | |
});]] | |
local clicked = js:format(data_uri, dfilename) | |
-- creating button | |
local button = | |
"<button class=\"btn btn-" .. btn_type .. " downloadthis " .. | |
class .. "\"" .. | |
" id=\"" .. id .. "\"" .. | |
"><i class=\"bi bi-" .. icon .. "\"" .. "></i>" .. | |
btn_label .. | |
"</button>" | |
if quarto.doc.is_format("html:js") and quarto.doc.has_bootstrap() | |
then | |
ensureHtmlDeps() | |
return pandoc.RawInline('html', | |
"<a href=\"#" .. id .. "\"" .. | |
" onclick=\"" .. clicked .. "\">" .. button .. "</a>" | |
) | |
else | |
return pandoc.Null() | |
end | |
end | |
end | |
} | |