summaryrefslogtreecommitdiff
path: root/_extensions
diff options
context:
space:
mode:
Diffstat (limited to '_extensions')
-rw-r--r--_extensions/dragonstyle/lipsum/_extension.yml8
-rw-r--r--_extensions/dragonstyle/lipsum/lipsum.json24
-rw-r--r--_extensions/dragonstyle/lipsum/lipsum.lua89
-rw-r--r--_extensions/dragonstyle/unsplash/_extension.yml8
-rw-r--r--_extensions/dragonstyle/unsplash/style.css25
-rw-r--r--_extensions/dragonstyle/unsplash/unsplash.lua193
-rw-r--r--_extensions/pandoc-ext/diagram/_extension.yaml6
l---------_extensions/pandoc-ext/diagram/pandoc-filter-diagram.rust1
8 files changed, 354 insertions, 0 deletions
diff --git a/_extensions/dragonstyle/lipsum/_extension.yml b/_extensions/dragonstyle/lipsum/_extension.yml
new file mode 100644
index 0000000..485128f
--- /dev/null
+++ b/_extensions/dragonstyle/lipsum/_extension.yml
@@ -0,0 +1,8 @@
+title: Lipsum
+author: Charles Teague
+version: 1.0.2
+quarto-required: ">=1.3.0"
+contributes:
+ shortcodes:
+ - lipsum.lua
+
diff --git a/_extensions/dragonstyle/lipsum/lipsum.json b/_extensions/dragonstyle/lipsum/lipsum.json
new file mode 100644
index 0000000..22d6de3
--- /dev/null
+++ b/_extensions/dragonstyle/lipsum/lipsum.json
@@ -0,0 +1,24 @@
+[
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sagittis posuere ligula sit amet lacinia. Duis dignissim pellentesque magna, rhoncus congue sapien finibus mollis. Ut eu sem laoreet, vehicula ipsum in, convallis erat. Vestibulum magna sem, blandit pulvinar augue sit amet, auctor malesuada sapien. Nullam faucibus leo eget eros hendrerit, non laoreet ipsum lacinia. Curabitur cursus diam elit, non tempus ante volutpat a. Quisque hendrerit blandit purus non fringilla. Integer sit amet elit viverra ante dapibus semper. Vestibulum viverra rutrum enim, at luctus enim posuere eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.",
+ "Nunc ac dignissim magna. Vestibulum vitae egestas elit. Proin feugiat leo quis ante condimentum, eu ornare mauris feugiat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris cursus laoreet ex, dignissim bibendum est posuere iaculis. Suspendisse et maximus elit. In fringilla gravida ornare. Aenean id lectus pulvinar, sagittis felis nec, rutrum risus. Nam vel neque eu arcu blandit fringilla et in quam. Aliquam luctus est sit amet vestibulum eleifend. Phasellus elementum sagittis molestie. Proin tempor lorem arcu, at condimentum purus volutpat eu. Fusce et pellentesque ligula. Pellentesque id tellus at erat luctus fringilla. Suspendisse potenti.",
+ "Etiam maximus accumsan gravida. Maecenas at nunc dignissim, euismod enim ac, bibendum ipsum. Maecenas vehicula velit in nisl aliquet ultricies. Nam eget massa interdum, maximus arcu vel, pretium erat. Maecenas sit amet tempor purus, vitae aliquet nunc. Vivamus cursus urna velit, eleifend dictum magna laoreet ut. Duis eu erat mollis, blandit magna id, tincidunt ipsum. Integer massa nibh, commodo eu ex vel, venenatis efficitur ligula. Integer convallis lacus elit, maximus eleifend lacus ornare ac. Vestibulum scelerisque viverra urna id lacinia. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean eget enim at diam bibendum tincidunt eu non purus. Nullam id magna ultrices, sodales metus viverra, tempus turpis.",
+ "Duis ornare ex ac iaculis pretium. Maecenas sagittis odio id erat pharetra, sit amet consectetur quam sollicitudin. Vivamus pharetra quam purus, nec sagittis risus pretium at. Nullam feugiat, turpis ac accumsan interdum, sem tellus blandit neque, id vulputate diam quam semper nisl. Donec sit amet enim at neque porttitor aliquet. Phasellus facilisis nulla eget placerat eleifend. Vestibulum non egestas eros, eget lobortis ipsum. Nulla rutrum massa eget enim aliquam, id porttitor erat luctus. Nunc sagittis quis eros eu sagittis. Pellentesque dictum, erat at pellentesque sollicitudin, justo augue pulvinar metus, quis rutrum est mi nec felis. Vestibulum efficitur mi lorem, at elementum purus tincidunt a. Aliquam finibus enim magna, vitae pellentesque erat faucibus at. Nulla mauris tellus, imperdiet id lobortis et, dignissim condimentum ipsum. Morbi nulla orci, varius at aliquet sed, facilisis id tortor. Donec ut urna nisi.",
+ "Aenean placerat luctus tortor vitae molestie. Nulla at aliquet nulla. Sed efficitur tellus orci, sed fringilla lectus laoreet eget. Vivamus maximus quam sit amet arcu dignissim, sed accumsan massa ullamcorper. Sed iaculis tincidunt feugiat. Nulla in est at nunc ultricies dictum ut vitae nunc. Aenean convallis vel diam at malesuada. Suspendisse arcu libero, vehicula tempus ultrices a, placerat sit amet tortor. Sed dictum id nulla commodo mattis. Aliquam mollis, nunc eu tristique faucibus, purus lacus tincidunt nulla, ac pretium lorem nunc ut enim. Curabitur eget mattis nisl, vitae sodales augue. Nam felis massa, bibendum sit amet nulla vel, vulputate rutrum lacus. Aenean convallis odio pharetra nulla mattis consequat.",
+ "Ut ut condimentum augue, nec eleifend nisl. Sed facilisis egestas odio ac pretium. Pellentesque consequat magna sed venenatis sagittis. Vivamus feugiat lobortis magna vitae accumsan. Pellentesque euismod malesuada hendrerit. Ut non mauris non arcu condimentum sodales vitae vitae dolor. Nullam dapibus, velit eget lacinia rutrum, ipsum justo malesuada odio, et lobortis sapien magna vel lacus. Nulla purus neque, hendrerit non malesuada eget, mattis vel erat. Suspendisse potenti.",
+ "Nullam dapibus cursus dolor sit amet consequat. Nulla facilisi. Curabitur vel nulla non magna lacinia tincidunt. Duis porttitor quam leo, et blandit velit efficitur ut. Etiam auctor tincidunt porttitor. Phasellus sed accumsan mi. Fusce ut erat dui. Suspendisse eu augue eget turpis condimentum finibus eu non lorem. Donec finibus eros eu ante condimentum, sed pharetra sapien sagittis. Phasellus non dolor ac ante mollis auctor nec et sapien. Pellentesque vulputate at nisi eu tincidunt. Vestibulum at dolor aliquam, hendrerit purus eu, eleifend massa. Morbi consectetur eros id tincidunt gravida. Fusce ut enim quis orci hendrerit lacinia sed vitae enim.",
+ "Nulla eget cursus ipsum. Vivamus porttitor leo diam, sed volutpat lectus facilisis sit amet. Maecenas et pulvinar metus. Ut at dignissim tellus. In in tincidunt elit. Etiam vulputate lobortis arcu, vel faucibus leo lobortis ac. Aliquam erat volutpat. In interdum orci ac est euismod euismod. Nunc eleifend tristique risus, at lacinia odio commodo in. Sed aliquet ligula odio, sed tempor neque ultricies sit amet.",
+ "Etiam quis tortor luctus, pellentesque ante a, finibus dolor. Phasellus in nibh et magna pulvinar malesuada. Ut nisl ex, sagittis at sollicitudin et, sollicitudin id nunc. In id porta urna. Proin porta dolor dolor, vel dapibus nisi lacinia in. Pellentesque ante mauris, ornare non euismod a, fermentum ut sapien. Proin sed vehicula enim. Aliquam tortor odio, vestibulum vitae odio in, tempor molestie justo. Praesent maximus lacus nec leo maximus blandit.",
+ "Maecenas turpis velit, ultricies non elementum vel, luctus nec nunc. Nulla a diam interdum, faucibus sapien viverra, finibus metus. Donec non tortor diam. In ut elit aliquet, bibendum sem et, aliquam tortor. Donec congue, sem at rhoncus ultrices, nunc augue cursus erat, quis porttitor mauris libero ut ex. Nullam quis leo urna. Donec faucibus ligula eget pellentesque interdum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean rhoncus interdum erat ut ultricies. Aenean tempus ex non elit suscipit, quis dignissim enim efficitur. Proin laoreet enim massa, vitae laoreet nulla mollis quis.",
+ "Vestibulum ultrices, tortor at mattis porta, odio nisi rutrum nulla, sit amet tincidunt eros quam facilisis tellus. Fusce eleifend lectus in elementum lacinia. Nam auctor nunc in massa ullamcorper, sit amet auctor ante accumsan. Nam ut varius metus. Curabitur eget tristique leo. Cras finibus euismod erat eget elementum. Integer vel placerat ex. Ut id eros quis lectus lacinia venenatis hendrerit vel ante.",
+ "Etiam congue quam eget velit convallis, eu sagittis orci vestibulum. Vestibulum at massa turpis. Curabitur ornare ex sed purus vulputate, vitae porta augue rhoncus. Phasellus auctor suscipit purus, vel ultricies nunc. Nunc eleifend nulla ac purus volutpat, id fringilla felis aliquet. Duis vitae porttitor nibh, in rhoncus risus. Vestibulum a est vitae est tristique vehicula. Proin mollis justo id est tempus hendrerit. Praesent suscipit placerat congue. Aliquam eu elit gravida, consequat augue non, ultricies sapien. Nunc ultricies viverra ante, sit amet vehicula ante volutpat id. Etiam tempus purus vitae tellus mollis viverra. Donec at ornare mauris. Aliquam sodales hendrerit ornare. Suspendisse accumsan lacinia sapien, sit amet imperdiet dui molestie ut.",
+ "Etiam non efficitur urna, quis elementum nisi. Mauris posuere a augue vel gravida. Praesent luctus erat et ex iaculis interdum. Nulla vestibulum quam ac nunc consequat vulputate. Nullam iaculis lobortis sem sit amet fringilla. Aliquam semper, metus ut blandit semper, nulla velit fermentum sapien, fermentum ultrices dolor sapien sed leo. Vestibulum molestie faucibus magna, at feugiat nulla ullamcorper a. Aliquam erat volutpat. Praesent scelerisque magna a justo maximus, sit amet suscipit mauris tempor. Nulla nec dolor eget ipsum pellentesque lobortis a in ipsum. Morbi turpis turpis, fringilla a eleifend maximus, viverra nec neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",
+ "Duis urna urna, pellentesque eu urna ut, malesuada bibendum dolor. Suspendisse potenti. Vivamus ornare, arcu quis molestie ultrices, magna est accumsan augue, auctor vulputate erat quam quis neque. Nullam scelerisque odio vel ultricies facilisis. Ut porta arcu non magna sagittis lacinia. Cras ornare vulputate lectus a tristique. Pellentesque ac arcu congue, rhoncus mi id, dignissim ligula.",
+ "Praesent ornare dolor turpis, sed tincidunt nisl pretium eget. Curabitur sed iaculis ex, vitae tristique sapien. Quisque nec ex dolor. Quisque ut nisl a libero egestas molestie. Nulla vel porta nulla. Phasellus id pretium arcu. Etiam sed mi pellentesque nibh scelerisque elementum sed at urna. Ut congue molestie nibh, sit amet pretium ligula consectetur eu. Integer consectetur augue justo, at placerat erat posuere at. Ut elementum urna lectus, vitae bibendum neque pulvinar quis. Suspendisse vulputate cursus eros id maximus. Duis pulvinar facilisis massa, et condimentum est viverra congue. Curabitur ornare convallis nisl. Morbi dictum scelerisque turpis quis pellentesque. Etiam lectus risus, luctus lobortis risus ut, rutrum vulputate justo. Nulla facilisi.",
+ "Proin sodales neque erat, varius cursus diam tincidunt sit amet. Etiam scelerisque fringilla nisl eu venenatis. Donec sem ipsum, scelerisque ac venenatis quis, hendrerit vel mauris. Praesent semper erat sit amet purus condimentum, sit amet auctor mi feugiat. In hac habitasse platea dictumst. Nunc ac mauris in massa feugiat bibendum id in dui. Praesent accumsan urna at lacinia aliquet. Proin ultricies eu est quis pellentesque. In vel lorem at nisl rhoncus cursus eu quis mi. In eu rutrum ante, quis placerat justo. Etiam euismod nibh nibh, sed elementum nunc imperdiet in. Praesent gravida nunc vel odio lacinia, at tempus nisl placerat. Aenean id ipsum sed est sagittis hendrerit non in tortor.",
+ "In vehicula magna vel scelerisque eleifend. Nunc euismod luctus nisi, ut convallis nisl placerat eget. Etiam ornare, leo faucibus mollis fermentum, lacus diam eleifend augue, non ullamcorper lacus nunc vel dui. Vestibulum porttitor quam elit, fermentum bibendum quam tempor non. Nullam feugiat, mi sit amet mattis placerat, lectus ipsum volutpat lectus, vitae eleifend est augue ac nunc. Quisque ullamcorper neque eu luctus pulvinar. Morbi dictum dignissim turpis, ut aliquet enim rutrum nec. Nulla facilisi. Nullam aliquam malesuada purus in auctor. Nam ac suscipit enim. Integer nec volutpat tellus, quis lobortis felis. Fusce rutrum, sem sed dictum lobortis, mauris magna pellentesque augue, vitae facilisis sem tellus ut mi."
+]
+
+
+
+
+
diff --git a/_extensions/dragonstyle/lipsum/lipsum.lua b/_extensions/dragonstyle/lipsum/lipsum.lua
new file mode 100644
index 0000000..57e53e8
--- /dev/null
+++ b/_extensions/dragonstyle/lipsum/lipsum.lua
@@ -0,0 +1,89 @@
+
+
+local lipsum
+
+math.randomseed(os.time())
+
+
+-- reads a file
+local function read_file(path)
+ local file = io.open(path, "rb")
+ if not file then return nil end
+ local content = file:read "*a"
+ file:close()
+ return content
+end
+
+-- read lipsum data
+function readLipsum()
+ if lipsum == nil then
+ local file = quarto.utils.resolve_path("lipsum.json")
+ local fileContents = read_file(file)
+ if fileContents ~= nil then
+ local json = quarto.json.decode(fileContents)
+ lipsum = json
+ else
+ quarto.log.error("Unable to read lipsum data file.")
+ lipsum = {}
+ end
+ end
+ return lipsum
+end
+
+local rangePattern = '(%d+)%-(%d+)'
+local barePattern = '^(%d+)$'
+
+return {
+ ['lipsum'] = function(args, kwargs, meta)
+
+ local paraStart = 1
+ local paraEnd = 5
+
+ if args[1] ~= nil then
+ -- a range is specified, like 1-5, 2-3, 5-1
+ local range = pandoc.utils.stringify(args[1])
+ local _,_,startRange,endRange = range:find(rangePattern)
+ if startRange and endRange then
+
+ local startNumber = tonumber(startRange)
+ if startNumber ~= nil then
+ paraStart = startNumber
+ end
+
+ local endNumber = tonumber(endRange)
+ if endNumber ~= nil then
+ paraEnd = endNumber
+ end
+ else
+ -- a number of paragraphs is specified, like 10
+ local _,_,bareVal = range:find(barePattern)
+ if bareVal then
+ paraStart = math.random(1, 17)
+ local endNumber = tonumber(bareVal)
+ if endNumber ~= nil then
+ paraEnd = paraStart + endNumber - 1
+ end
+ end
+ end
+ end
+
+ local paras = readLipsum();
+ local outputParas = {}
+
+ local count = paraEnd - paraStart + 1
+ if paraStart > paraEnd then
+ count = paraStart - paraEnd + 1
+ end
+
+ for i=1,count do
+ local paraIdx = i + (paraStart - 1)
+ if paraStart > paraEnd then
+ paraIdx = (paraStart + 1) - i
+ end
+ local outIdx = ((paraIdx-1)%(#paras-1))+1
+ outputParas[i] = pandoc.Para(paras[outIdx])
+ end
+
+ return outputParas
+ end
+}
diff --git a/_extensions/dragonstyle/unsplash/_extension.yml b/_extensions/dragonstyle/unsplash/_extension.yml
new file mode 100644
index 0000000..f22a6d2
--- /dev/null
+++ b/_extensions/dragonstyle/unsplash/_extension.yml
@@ -0,0 +1,8 @@
+title: Unsplash
+author: Charles Teague
+version: 1.0.3
+quarto-required: ">=1.3.0"
+contributes:
+ shortcodes:
+ - unsplash.lua
+
diff --git a/_extensions/dragonstyle/unsplash/style.css b/_extensions/dragonstyle/unsplash/style.css
new file mode 100644
index 0000000..42f9620
--- /dev/null
+++ b/_extensions/dragonstyle/unsplash/style.css
@@ -0,0 +1,25 @@
+.unsplash-container {
+ overflow: hidden;
+ margin-bottom: 1em;
+}
+
+.unsplash-container img {
+ object-fit: cover;
+ width: 100%;
+}
+
+.unsplash-container.float-right {
+ float: right;
+ padding-left: 0.75em;
+}
+
+.unsplash-container.float-left {
+ float: left;
+ padding-right: 0.75em;
+}
+
+.unsplash-container.float-center {
+ float: center;
+ padding-left: 0.75em;
+ padding-right: 0.75em;
+} \ No newline at end of file
diff --git a/_extensions/dragonstyle/unsplash/unsplash.lua b/_extensions/dragonstyle/unsplash/unsplash.lua
new file mode 100644
index 0000000..fd87ab2
--- /dev/null
+++ b/_extensions/dragonstyle/unsplash/unsplash.lua
@@ -0,0 +1,193 @@
+
+local mimeImgExts = {
+ ["image/jpeg"]="jpg",
+ ["image/gif"]="gif",
+ ["image/vnd.microsoft.icon"]="ico",
+ ["image/avif"]="avif",
+ ["image/bmp"]="bmp",
+ ["image/png"]="png",
+ ["image/svg+xml"]="svg",
+ ["image/tiff"]="tif",
+ ["image/webp"]="webp",
+}
+
+local function file_exists(name)
+ local f = io.open(name, 'r')
+ if f ~= nil then
+ io.close(f)
+ return true
+ else
+ return false
+ end
+end
+
+local function write_file(path, contents, mode)
+ pandoc.system.make_directory(pandoc.path.directory(path), true)
+ mode = mode or "a"
+ local file = io.open(path, mode)
+ if file then
+ file:write(contents)
+ file:close()
+ return true
+ else
+ return false
+ end
+end
+
+
+
+
+return {
+ ['unsplash'] = function(args, kwargs, meta)
+
+
+ -- positional == keywords
+ -- {{< unsplash cat >}}
+ -- {{< unsplash keywords="cats" height="300" width="300"}}
+
+ -- TODO: use the real api to download a copy of the image using rest
+ -- TODO: ping the download url
+ -- TODO: Generate a stable name for the image
+ -- TODO: Make this a format resource instead of media bag, so images become stable
+ -- TODO: generate more complete information from REST endpoint to credit author
+
+ local height = nil
+ local width = nil
+ local keywords = nil
+ local classes = nil
+ local float = nil
+
+ -- the filename
+ local filename
+ if args[1] ~= nil then
+ filename = pandoc.utils.stringify(args[1])
+ local stem = pandoc.path.split_extension(pandoc.path.filename(filename))
+ keywords = stem
+ end
+
+ -- height
+ if kwargs['height'] ~= nil and #kwargs['height'] > 0 then
+ height = pandoc.utils.stringify(kwargs['height'])
+ end
+
+ -- width
+ if kwargs['width'] ~= nil and #kwargs['width'] > 0 then
+ width = pandoc.utils.stringify(kwargs['width'])
+ end
+
+ -- keywords
+ if kwargs['keywords'] ~= nil and #kwargs['keywords'] > 0 then
+ keywords = pandoc.utils.stringify(kwargs['keywords'])
+ end
+
+ -- classes
+ if kwargs['class'] ~= nil and #kwargs['class'] > 0 then
+ classes = pandoc.utils.stringify(kwargs['class'])
+ end
+
+ -- classes
+ if kwargs['float'] ~= nil and #kwargs['float'] > 0 then
+ float = pandoc.utils.stringify(kwargs['float'])
+ end
+
+
+ -- form the unsplash URL that will be used
+ local url = "https://source.unsplash.com/random"
+ if width and height then
+ url = url .. "/" .. tostring(width) .. '×' .. tostring(height)
+ end
+ if keywords ~= nil then
+ url = url .. '/?' .. keywords
+ end
+
+ -- deal with the height and width
+
+ local imgContainer = function (imgEl)
+
+ -- HTML formats use a container to implement sizing, so
+ -- apply classes and so on to that container
+ if quarto.doc.is_format("html") then
+
+
+ quarto.doc.add_html_dependency({
+ name = "unsplash-styles",
+ version = "1.0.0",
+ stylesheets = {"style.css"}
+ })
+
+ local style = ""
+ if height then
+ style = style .. 'height: ' .. height .. '; '
+ end
+ if width then
+ style = style .. 'width: ' .. width .. '; '
+ end
+
+ local divAttrRaw = {}
+ if style ~= "" then
+ divAttrRaw['style'] = style
+ end
+
+ local clz = pandoc.List({'unsplash-container'})
+ if float then
+ clz:insert('float-' .. float)
+ end
+
+ if classes ~= nil then
+ for token in string.gmatch(classes, "[^%s]+") do
+ clz:insert(token)
+ end
+ end
+
+ local divAttr = pandoc.Attr("", clz, divAttrRaw)
+ local div = pandoc.Div(imgEl, divAttr)
+
+ return div
+
+ else
+
+ -- Non-HTML formats just return the raw image with
+ -- any options set on that
+
+ if height then
+ imgEl.attr.attributes['height'] = height
+ end
+ if width then
+ imgEl.attr.attributes['width'] = width
+ end
+
+ if classes ~= nil then
+ for clz in string.gmatch(classes, "[^%s]+") do
+ imgEl.attr.classes:insert(clz)
+ end
+ end
+
+ return imgEl
+
+ end
+ end
+
+ if filename ~= nil and file_exists(filename) then
+ return imgContainer(pandoc.Image("", filename))
+ elseif filename ~= nil then
+ -- read the image
+ local _imgMt, imgContents = pandoc.mediabag.fetch(url)
+ write_file(filename, imgContents, "wb")
+ return imgContainer(pandoc.Image("", filename))
+ else
+ -- read the image
+ local imgMt, imgContents = pandoc.mediabag.fetch(url)
+
+ -- place it in media bag and link to it
+ if imgContents ~= nil then
+ local tmpFileName = pandoc.path.filename(os.tmpname()) ..'.' .. mimeImgExts[imgMt]
+ pandoc.mediabag.insert(tmpFileName, imgMt, imgContents)
+ return imgContainer(pandoc.Image("", tmpFileName))
+ end
+ end
+
+
+ end
+}
+
+
diff --git a/_extensions/pandoc-ext/diagram/_extension.yaml b/_extensions/pandoc-ext/diagram/_extension.yaml
new file mode 100644
index 0000000..3f8aaf0
--- /dev/null
+++ b/_extensions/pandoc-ext/diagram/_extension.yaml
@@ -0,0 +1,6 @@
+name: diagram
+author: Jonas Smedegaard <dr@jones.dk>
+version: 0.0.1
+contributes:
+ filters:
+ - pandoc-filter-diagram.rust
diff --git a/_extensions/pandoc-ext/diagram/pandoc-filter-diagram.rust b/_extensions/pandoc-ext/diagram/pandoc-filter-diagram.rust
new file mode 120000
index 0000000..dca1dbf
--- /dev/null
+++ b/_extensions/pandoc-ext/diagram/pandoc-filter-diagram.rust
@@ -0,0 +1 @@
+/usr/bin/pandoc-filter-diagram \ No newline at end of file