Skip to content

Commit

Permalink
add code link tests
Browse files Browse the repository at this point in the history
  • Loading branch information
dragonstyle committed Sep 12, 2023
1 parent cbca94e commit ea89420
Show file tree
Hide file tree
Showing 12 changed files with 410 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
title: Lipsum
author: Charles Teague
version: 1.0.0
quarto-required: ">=99.9.0"
contributes:
shortcodes:
- lipsum.lua

Original file line number Diff line number Diff line change
@@ -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."
]





Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@


local lipsum

-- 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
local endNumber = tonumber(bareVal)
if endNumber ~= nil then
paraEnd = endNumber
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
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
title: Unsplash
author: Charles Teague
version: 1.0.3
quarto-required: ">=1.3.0"
contributes:
shortcodes:
- unsplash.lua

Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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
}


23 changes: 23 additions & 0 deletions tests/docs/smoke-all/format/html/code-links-manual.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
title: Code Links Text
format:
html:
code-links:
- text: Hello World
href: https://www.charlesteague.com
toc: true
_quarto:
tests:
html:
ensureHtmlElements:
-
- ".quarto-code-links > ul > li:only-child"
---

## Section 1

{{< lipsum 1 >}}

## Section 2

{{< unsplash imgs/beach.jpg >}}
21 changes: 21 additions & 0 deletions tests/docs/smoke-all/format/html/code-links-root.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
title: Code Links Text
format: html
code-links:
- text: Hello World
href: https://www.charlesteague.com
_quarto:
tests:
html:
ensureHtmlElements:
-
- ".quarto-code-links > ul > li:only-child"
---

## Section 1

{{< lipsum 1 >}}

## Section 2

{{< unsplash imgs/sunset.jpg >}}
Loading

0 comments on commit ea89420

Please sign in to comment.