Adding test awesome and full
This commit is contained in:
parent
4235904abe
commit
62c425778b
85 changed files with 30704 additions and 2 deletions
1
.domains
Normal file
1
.domains
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
pages.polarolouis.fr
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -4,3 +4,4 @@
|
||||||
.httr-oauth
|
.httr-oauth
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.quarto
|
.quarto
|
||||||
|
/.quarto/
|
||||||
|
|
|
||||||
7
_extensions/quarto-ext/fontawesome/_extension.yml
Normal file
7
_extensions/quarto-ext/fontawesome/_extension.yml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
title: Font Awesome support
|
||||||
|
author: Carlos Scheidegger
|
||||||
|
version: 1.1.0
|
||||||
|
quarto-required: ">=1.2.269"
|
||||||
|
contributes:
|
||||||
|
shortcodes:
|
||||||
|
- fontawesome.lua
|
||||||
7971
_extensions/quarto-ext/fontawesome/assets/css/all.css
vendored
Normal file
7971
_extensions/quarto-ext/fontawesome/assets/css/all.css
vendored
Normal file
File diff suppressed because it is too large
Load diff
30
_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css
vendored
Normal file
30
_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
.fa-tiny {
|
||||||
|
font-size: 0.5em;
|
||||||
|
}
|
||||||
|
.fa-scriptsize {
|
||||||
|
font-size: 0.7em;
|
||||||
|
}
|
||||||
|
.fa-footnotesize {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
.fa-small {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
.fa-normalsize {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
.fa-large {
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
.fa-Large {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
.fa-LARGE {
|
||||||
|
font-size: 1.75em;
|
||||||
|
}
|
||||||
|
.fa-huge {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
.fa-Huge {
|
||||||
|
font-size: 2.5em;
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
84
_extensions/quarto-ext/fontawesome/fontawesome.lua
Normal file
84
_extensions/quarto-ext/fontawesome/fontawesome.lua
Normal file
|
|
@ -0,0 +1,84 @@
|
||||||
|
local function ensureLatexDeps()
|
||||||
|
quarto.doc.use_latex_package("fontawesome5")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ensureHtmlDeps()
|
||||||
|
quarto.doc.add_html_dependency({
|
||||||
|
name = 'fontawesome6',
|
||||||
|
version = '0.1.0',
|
||||||
|
stylesheets = {'assets/css/all.css', 'assets/css/latex-fontsize.css'}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local function isEmpty(s)
|
||||||
|
return s == nil or s == ''
|
||||||
|
end
|
||||||
|
|
||||||
|
local function isValidSize(size)
|
||||||
|
local validSizes = {
|
||||||
|
"tiny",
|
||||||
|
"scriptsize",
|
||||||
|
"footnotesize",
|
||||||
|
"small",
|
||||||
|
"normalsize",
|
||||||
|
"large",
|
||||||
|
"Large",
|
||||||
|
"LARGE",
|
||||||
|
"huge",
|
||||||
|
"Huge"
|
||||||
|
}
|
||||||
|
for _, v in ipairs(validSizes) do
|
||||||
|
if v == size then
|
||||||
|
return size
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
["fa"] = function(args, kwargs)
|
||||||
|
|
||||||
|
local group = "solid"
|
||||||
|
local icon = pandoc.utils.stringify(args[1])
|
||||||
|
if #args > 1 then
|
||||||
|
group = icon
|
||||||
|
icon = pandoc.utils.stringify(args[2])
|
||||||
|
end
|
||||||
|
|
||||||
|
local title = pandoc.utils.stringify(kwargs["title"])
|
||||||
|
if not isEmpty(title) then
|
||||||
|
title = " title=\"" .. title .. "\""
|
||||||
|
end
|
||||||
|
|
||||||
|
local label = pandoc.utils.stringify(kwargs["label"])
|
||||||
|
if isEmpty(label) then
|
||||||
|
label = " aria-label=\"" .. icon .. "\""
|
||||||
|
else
|
||||||
|
label = " aria-label=\"" .. label .. "\""
|
||||||
|
end
|
||||||
|
|
||||||
|
local size = pandoc.utils.stringify(kwargs["size"])
|
||||||
|
|
||||||
|
-- detect html (excluding epub which won't handle fa)
|
||||||
|
if quarto.doc.is_format("html:js") then
|
||||||
|
ensureHtmlDeps()
|
||||||
|
if not isEmpty(size) then
|
||||||
|
size = " fa-" .. size
|
||||||
|
end
|
||||||
|
return pandoc.RawInline(
|
||||||
|
'html',
|
||||||
|
"<i class=\"fa-" .. group .. " fa-" .. icon .. size .. "\"" .. title .. label .. "></i>"
|
||||||
|
)
|
||||||
|
-- detect pdf / beamer / latex / etc
|
||||||
|
elseif quarto.doc.is_format("pdf") then
|
||||||
|
ensureLatexDeps()
|
||||||
|
if isEmpty(isValidSize(size)) then
|
||||||
|
return pandoc.RawInline('tex', "\\faIcon{" .. icon .. "}")
|
||||||
|
else
|
||||||
|
return pandoc.RawInline('tex', "{\\" .. size .. "\\faIcon{" .. icon .. "}}")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return pandoc.Null()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
6
_extensions/schochastics/academicons/_extension.yml
Normal file
6
_extensions/schochastics/academicons/_extension.yml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
title: Support for academicons
|
||||||
|
author: David Schoch
|
||||||
|
version: 0.3.0
|
||||||
|
contributes:
|
||||||
|
shortcodes:
|
||||||
|
- academicons.lua
|
||||||
82
_extensions/schochastics/academicons/academicons.lua
Normal file
82
_extensions/schochastics/academicons/academicons.lua
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
-- function ensureLatexDeps()
|
||||||
|
-- quarto.doc.useLatexPackage("academicons")
|
||||||
|
-- end
|
||||||
|
|
||||||
|
local function ensureHtmlDeps()
|
||||||
|
quarto.doc.addHtmlDependency({
|
||||||
|
name = "academicons",
|
||||||
|
version = "1.9.2",
|
||||||
|
stylesheets = { "assets/css/all.css", "assets/css/size.css" }
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local function isEmpty(s)
|
||||||
|
return s == nil or s == ''
|
||||||
|
end
|
||||||
|
|
||||||
|
local function isValidSize(size)
|
||||||
|
local validSizes = {
|
||||||
|
"tiny", "scriptsize", "footnotesize", "small", "normalsize",
|
||||||
|
"large", "Large", "LARGE", "huge", "Huge",
|
||||||
|
"1x", "2x", "3x", "4x", "5x", "6x", "7x", "8x", "9x", "10x",
|
||||||
|
"2xs", "xs", "sm", "lg", "xl", "2xl"
|
||||||
|
}
|
||||||
|
for _, v in ipairs(validSizes) do
|
||||||
|
if v == size then
|
||||||
|
return " ai-" .. size
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
["ai"] = function(args, kwargs)
|
||||||
|
local group = ""
|
||||||
|
local icon = pandoc.utils.stringify(args[1])
|
||||||
|
if #args > 1 then
|
||||||
|
group = icon
|
||||||
|
icon = pandoc.utils.stringify(args[2])
|
||||||
|
end
|
||||||
|
|
||||||
|
local size = isValidSize(pandoc.utils.stringify(kwargs["size"]))
|
||||||
|
local color = pandoc.utils.stringify(kwargs["color"])
|
||||||
|
if not isEmpty(color) then
|
||||||
|
color = " style=\"color:" .. color .. "\""
|
||||||
|
--else
|
||||||
|
-- color = " style=\"color:" .. "black" .. "\""
|
||||||
|
end
|
||||||
|
|
||||||
|
local title = pandoc.utils.stringify(kwargs["title"])
|
||||||
|
if not isEmpty(title) then
|
||||||
|
title = " title=\"" .. title .. "\""
|
||||||
|
end
|
||||||
|
|
||||||
|
-- detect html (excluding epub)
|
||||||
|
if quarto.doc.isFormat("html:js") then
|
||||||
|
ensureHtmlDeps()
|
||||||
|
if isEmpty(size) then
|
||||||
|
local csize = pandoc.utils.stringify(kwargs["size"])
|
||||||
|
if (isEmpty(csize)) then
|
||||||
|
csize = ""
|
||||||
|
else
|
||||||
|
csize = " style=\"font-size:" .. csize .. "\""
|
||||||
|
end
|
||||||
|
return pandoc.RawInline(
|
||||||
|
'html',
|
||||||
|
"<i class=\"ai " .. group .. " ai-" .. icon .. "\"" .. title .. color .. csize .. "></i>"
|
||||||
|
)
|
||||||
|
else
|
||||||
|
return pandoc.RawInline(
|
||||||
|
'html',
|
||||||
|
"<i class=\"ai " .. group .. " ai-" .. icon .. size .. "\"" .. title .. color .. "></i>"
|
||||||
|
)
|
||||||
|
end
|
||||||
|
-- detect pdf / beamer / latex / etc
|
||||||
|
-- elseif quarto.doc.isFormat("pdf") then
|
||||||
|
-- ensureLatexDeps()
|
||||||
|
-- return pandoc.RawInline('tex', "\\aiIcon{" .. icon .. "}")
|
||||||
|
else
|
||||||
|
return pandoc.Null()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
738
_extensions/schochastics/academicons/assets/css/all.css
Executable file
738
_extensions/schochastics/academicons/assets/css/all.css
Executable file
|
|
@ -0,0 +1,738 @@
|
||||||
|
/*
|
||||||
|
* Academicons 1.9.4 by James Walsh (https://github.com/jpswalsh) and Katja Bercic (https://github.com/katjabercic)
|
||||||
|
* Fonts generated using FontForge - https://fontforge.org
|
||||||
|
* Square icons designed to be used alongside Font Awesome square icons - https://fortawesome.github.io/Font-Awesome/
|
||||||
|
* Licenses - Font: SIL OFL 1.1, CSS: MIT License
|
||||||
|
*/
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Academicons';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: block;
|
||||||
|
src: url('../webfonts/academicons.eot');
|
||||||
|
src: url('../webfonts/academicons.eot') format('embedded-opentype'),
|
||||||
|
url('../webfonts/academicons.ttf') format('truetype'),
|
||||||
|
url('../webfonts/academicons.woff') format('woff'),
|
||||||
|
url('../webfonts/academicons.svg') format('svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai {
|
||||||
|
font-family: 'Academicons';
|
||||||
|
font-weight: 400;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
display: inline-block;
|
||||||
|
font-style: normal;
|
||||||
|
font-variant: normal;
|
||||||
|
text-rendering: auto;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-academia:before {
|
||||||
|
content: "\e9af";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-academia-square:before {
|
||||||
|
content: "\e93d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acclaim:before {
|
||||||
|
content: "\e92e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acclaim-square:before {
|
||||||
|
content: "\e93a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acm:before {
|
||||||
|
content: "\e93c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acm-square:before {
|
||||||
|
content: "\e95d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acmdl:before {
|
||||||
|
content: "\e96a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acmdl-square:before {
|
||||||
|
content: "\e9d3";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ads:before {
|
||||||
|
content: "\e9cb";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ads-square:before {
|
||||||
|
content: "\e94a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-africarxiv:before {
|
||||||
|
content: "\e91b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-africarxiv-square:before {
|
||||||
|
content: "\e90b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-archive:before {
|
||||||
|
content: "\e955";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-archive-square:before {
|
||||||
|
content: "\e956";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-arxiv:before {
|
||||||
|
content: "\e974";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-arxiv-square:before {
|
||||||
|
content: "\e9a6";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-biorxiv:before {
|
||||||
|
content: "\e9a2";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-biorxiv-square:before {
|
||||||
|
content: "\e98b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ceur:before {
|
||||||
|
content: "\e96d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ceur-square:before {
|
||||||
|
content: "\e92f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ciencia-vitae:before {
|
||||||
|
content: "\e912";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ciencia-vitae-square:before {
|
||||||
|
content: "\e913";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-clarivate:before {
|
||||||
|
content: "\e924";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-clarivate-square:before {
|
||||||
|
content: "\e925";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-closed-access:before {
|
||||||
|
content: "\e942";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-closed-access-square:before {
|
||||||
|
content: "\e943";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-conversation:before {
|
||||||
|
content: "\e94c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-conversation-square:before {
|
||||||
|
content: "\e915";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-coursera:before {
|
||||||
|
content: "\e95f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-coursera-square:before {
|
||||||
|
content: "\e97f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-crossref:before {
|
||||||
|
content: "\e918";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-crossref-square:before {
|
||||||
|
content: "\e919";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-cv:before {
|
||||||
|
content: "\e9a5";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-cv-square:before {
|
||||||
|
content: "\e90a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-datacite:before {
|
||||||
|
content: "\e91c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-datacite-square:before {
|
||||||
|
content: "\e91d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dataverse:before {
|
||||||
|
content: "\e9f7";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dataverse-square:before {
|
||||||
|
content: "\e9e4";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dblp:before {
|
||||||
|
content: "\e94f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dblp-square:before {
|
||||||
|
content: "\e93f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-depsy:before {
|
||||||
|
content: "\e97a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-depsy-square:before {
|
||||||
|
content: "\e94b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-doi:before {
|
||||||
|
content: "\e97e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-doi-square:before {
|
||||||
|
content: "\e98f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dryad:before {
|
||||||
|
content: "\e97c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dryad-square:before {
|
||||||
|
content: "\e98c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-elsevier:before {
|
||||||
|
content: "\e961";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-elsevier-square:before {
|
||||||
|
content: "\e910";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-figshare:before {
|
||||||
|
content: "\e981";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-figshare-square:before {
|
||||||
|
content: "\e9e7";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-google-scholar:before {
|
||||||
|
content: "\e9d4";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-google-scholar-square:before {
|
||||||
|
content: "\e9f9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-hal:before {
|
||||||
|
content: "\e92c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-hal-square:before {
|
||||||
|
content: "\e92d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-hypothesis:before {
|
||||||
|
content: "\e95a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-hypothesis-square:before {
|
||||||
|
content: "\e95b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ideas-repec:before {
|
||||||
|
content: "\e9ed";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ideas-repec-square:before {
|
||||||
|
content: "\e9f8";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ieee:before {
|
||||||
|
content: "\e929";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ieee-square:before {
|
||||||
|
content: "\e9b9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-impactstory:before {
|
||||||
|
content: "\e9cf";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-impactstory-square:before {
|
||||||
|
content: "\e9aa";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inaturalist:before {
|
||||||
|
content: "\e900";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inaturalist-square:before {
|
||||||
|
content: "\e901";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inpn:before {
|
||||||
|
content: "\e902";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inpn-square:before {
|
||||||
|
content: "\e903";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inspire:before {
|
||||||
|
content: "\e9e9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inspire-square:before {
|
||||||
|
content: "\e9fe";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-isidore:before {
|
||||||
|
content: "\e936";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-isidore-square:before {
|
||||||
|
content: "\e954";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-isni:before {
|
||||||
|
content: "\e957";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-isni-square:before {
|
||||||
|
content: "\e958";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-jstor:before {
|
||||||
|
content: "\e938";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-jstor-square:before {
|
||||||
|
content: "\e944";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-lattes:before {
|
||||||
|
content: "\e9b3";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-lattes-square:before {
|
||||||
|
content: "\e99c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mathoverflow:before {
|
||||||
|
content: "\e9f6";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mathoverflow-square:before {
|
||||||
|
content: "\e97b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mendeley:before {
|
||||||
|
content: "\e9f0";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mendeley-square:before {
|
||||||
|
content: "\e9f3";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-moodle:before {
|
||||||
|
content: "\e907";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-moodle-square:before {
|
||||||
|
content: "\e908";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mtmt:before {
|
||||||
|
content: "\e950";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mtmt-square:before {
|
||||||
|
content: "\e951";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-nakala:before {
|
||||||
|
content: "\e940";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-nakala-square:before {
|
||||||
|
content: "\e941";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-obp:before {
|
||||||
|
content: "\e92a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-obp-square:before {
|
||||||
|
content: "\e92b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-access:before {
|
||||||
|
content: "\e939";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-access-square:before {
|
||||||
|
content: "\e9f4";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-data:before {
|
||||||
|
content: "\e966";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-data-square:before {
|
||||||
|
content: "\e967";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-materials:before {
|
||||||
|
content: "\e968";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-materials-square:before {
|
||||||
|
content: "\e969";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-openedition:before {
|
||||||
|
content: "\e946";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-openedition-square:before {
|
||||||
|
content: "\e947";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-orcid:before {
|
||||||
|
content: "\e9d9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-orcid-square:before {
|
||||||
|
content: "\e9c3";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-osf:before {
|
||||||
|
content: "\e9ef";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-osf-square:before {
|
||||||
|
content: "\e931";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-overleaf:before {
|
||||||
|
content: "\e914";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-overleaf-square:before {
|
||||||
|
content: "\e98d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-philpapers:before {
|
||||||
|
content: "\e98a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-philpapers-square:before {
|
||||||
|
content: "\e96f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-piazza:before {
|
||||||
|
content: "\e99a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-piazza-square:before {
|
||||||
|
content: "\e90c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-preregistered:before {
|
||||||
|
content: "\e906";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-preregistered-square:before {
|
||||||
|
content: "\e96b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-protocols:before {
|
||||||
|
content: "\e952";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-protocols-square:before {
|
||||||
|
content: "\e953";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-psyarxiv:before {
|
||||||
|
content: "\e90e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-psyarxiv-square:before {
|
||||||
|
content: "\e90f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-publons:before {
|
||||||
|
content: "\e937";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-publons-square:before {
|
||||||
|
content: "\e94e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pubmed:before {
|
||||||
|
content: "\e99f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pubmed-square:before {
|
||||||
|
content: "\e97d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pubpeer:before {
|
||||||
|
content: "\e922";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pubpeer-square:before {
|
||||||
|
content: "\e923";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-researcherid:before {
|
||||||
|
content: "\e91a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-researcherid-square:before {
|
||||||
|
content: "\e95c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-researchgate:before {
|
||||||
|
content: "\e95e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-researchgate-square:before {
|
||||||
|
content: "\e99e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ror:before {
|
||||||
|
content: "\e948";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ror-square:before {
|
||||||
|
content: "\e949";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-sci-hub:before {
|
||||||
|
content: "\e959";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-sci-hub-square:before {
|
||||||
|
content: "\e905";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-scirate:before {
|
||||||
|
content: "\e98e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-scirate-square:before {
|
||||||
|
content: "\e99d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-scopus:before {
|
||||||
|
content: "\e91e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-scopus-square:before {
|
||||||
|
content: "\e91f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-semantic-scholar:before {
|
||||||
|
content: "\e96e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-semantic-scholar-square:before {
|
||||||
|
content: "\e96c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-springer:before {
|
||||||
|
content: "\e928";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-springer-square:before {
|
||||||
|
content: "\e99b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ssrn:before {
|
||||||
|
content: "\e916";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ssrn-square:before {
|
||||||
|
content: "\e917";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stackoverflow:before {
|
||||||
|
content: "\e920";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stackoverflow-square:before {
|
||||||
|
content: "\e921";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-viaf:before {
|
||||||
|
content: "\e933";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-viaf-square:before {
|
||||||
|
content: "\e934";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-wiley:before {
|
||||||
|
content: "\e926";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-wiley-square:before {
|
||||||
|
content: "\e927";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-zenodo:before {
|
||||||
|
content: "\e911";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-zotero:before {
|
||||||
|
content: "\e962";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-zotero-square:before {
|
||||||
|
content: "\e932";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Duplication of the FontAwesome style classes using 'ai' in place of 'fa'. */
|
||||||
|
.ai-lg {
|
||||||
|
font-size: 1.33333em;
|
||||||
|
line-height: 0.75em;
|
||||||
|
vertical-align: -.0667em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-xs {
|
||||||
|
font-size: .75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-sm {
|
||||||
|
font-size: .875em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-1x {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-2x {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-3x {
|
||||||
|
font-size: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-4x {
|
||||||
|
font-size: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-5x {
|
||||||
|
font-size: 5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-6x {
|
||||||
|
font-size: 6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-7x {
|
||||||
|
font-size: 7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-8x {
|
||||||
|
font-size: 8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-9x {
|
||||||
|
font-size: 9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-10x {
|
||||||
|
font-size: 10em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-fw {
|
||||||
|
text-align: center;
|
||||||
|
width: 1.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ul {
|
||||||
|
list-style-type: none;
|
||||||
|
margin-left: 2.5em;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ul>li {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-li {
|
||||||
|
left: -2em;
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
width: 2em;
|
||||||
|
line-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-border {
|
||||||
|
border: solid 0.08em #eee;
|
||||||
|
border-radius: .1em;
|
||||||
|
padding: .2em .25em .15em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pull-left {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pull-right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai.ai-pull-left {
|
||||||
|
margin-right: .3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai.ai-pull-right {
|
||||||
|
margin-right: .3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stack {
|
||||||
|
display: inline-block;
|
||||||
|
height: 2em;
|
||||||
|
line-height: 2em;
|
||||||
|
position: relative;
|
||||||
|
vertical-align: middle;
|
||||||
|
width: 2.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stack-1x,
|
||||||
|
.ai-stack-2x {
|
||||||
|
left: 0;
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stack-1x {
|
||||||
|
line-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stack-2x {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inverse {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
115
_extensions/schochastics/academicons/assets/css/size.css
Normal file
115
_extensions/schochastics/academicons/assets/css/size.css
Normal file
|
|
@ -0,0 +1,115 @@
|
||||||
|
.ai-tiny {
|
||||||
|
font-size: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-scriptsize {
|
||||||
|
font-size: 0.7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-footnotesize {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-small {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-normalsize {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-large {
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-Large {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-LARGE {
|
||||||
|
font-size: 1.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-huge {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-Huge {
|
||||||
|
font-size: 2.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-1x {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-2x {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-3x {
|
||||||
|
font-size: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-4x {
|
||||||
|
font-size: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-5x {
|
||||||
|
font-size: 5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-6x {
|
||||||
|
font-size: 6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-7x {
|
||||||
|
font-size: 7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-8x {
|
||||||
|
font-size: 8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-9x {
|
||||||
|
font-size: 9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-10x {
|
||||||
|
font-size: 10em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-2xs {
|
||||||
|
font-size: 0.625em;
|
||||||
|
line-height: 0.1em;
|
||||||
|
vertical-align: 0.225em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-xs {
|
||||||
|
font-size: 0.75em;
|
||||||
|
line-height: 0.08333em;
|
||||||
|
vertical-align: 0.125em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-sm {
|
||||||
|
font-size: 0.875em;
|
||||||
|
line-height: 0.07143em;
|
||||||
|
vertical-align: 0.05357em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-lg {
|
||||||
|
font-size: 1.25em;
|
||||||
|
line-height: 0.05em;
|
||||||
|
vertical-align: -0.075em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-xl {
|
||||||
|
font-size: 1.5em;
|
||||||
|
line-height: 0.04167em;
|
||||||
|
vertical-align: -0.125em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-2xl {
|
||||||
|
font-size: 2em;
|
||||||
|
line-height: 0.03125em;
|
||||||
|
vertical-align: -0.1875em;
|
||||||
|
}
|
||||||
Binary file not shown.
1859
_extensions/schochastics/academicons/assets/webfonts/academicons.svg
Normal file
1859
_extensions/schochastics/academicons/assets/webfonts/academicons.svg
Normal file
File diff suppressed because it is too large
Load diff
|
After Width: | Height: | Size: 379 KiB |
Binary file not shown.
Binary file not shown.
17
_freeze/posts/test/execute-results/html.json
Normal file
17
_freeze/posts/test/execute-results/html.json
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"hash": "c012323418d359ef5990e2738afb5670",
|
||||||
|
"result": {
|
||||||
|
"engine": "knitr",
|
||||||
|
"markdown": "---\ntitle: A test post\n---\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(ggplot2)\n```\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nvec <- rnorm(n = 10000)\n\nggplot(as.data.frame(vec)) + aes(x=vec) +\ngeom_histogram() + theme_minimal()\n```\n\n::: {.cell-output .cell-output-stderr}\n\n```\n`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.\n```\n\n\n:::\n\n::: {.cell-output-display}\n{width=672}\n:::\n:::",
|
||||||
|
"supporting": [
|
||||||
|
"test_files"
|
||||||
|
],
|
||||||
|
"filters": [
|
||||||
|
"rmarkdown/pagebreak.lua"
|
||||||
|
],
|
||||||
|
"includes": {},
|
||||||
|
"engineDependencies": {},
|
||||||
|
"preserve": {},
|
||||||
|
"postProcess": true
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
_freeze/posts/test/figure-html/unnamed-chunk-2-1.png
Normal file
BIN
_freeze/posts/test/figure-html/unnamed-chunk-2-1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
7
_freeze/site_libs/clipboard/clipboard.min.js
vendored
Normal file
7
_freeze/site_libs/clipboard/clipboard.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
_freeze/site_libs/quarto-listing/list.min.js
vendored
Normal file
2
_freeze/site_libs/quarto-listing/list.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
243
_freeze/site_libs/quarto-listing/quarto-listing.js
Normal file
243
_freeze/site_libs/quarto-listing/quarto-listing.js
Normal file
|
|
@ -0,0 +1,243 @@
|
||||||
|
const kProgressiveAttr = "data-src";
|
||||||
|
let categoriesLoaded = false;
|
||||||
|
|
||||||
|
window.quartoListingCategory = (category) => {
|
||||||
|
if (categoriesLoaded) {
|
||||||
|
activateCategory(category);
|
||||||
|
setCategoryHash(category);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window["quarto-listing-loaded"] = () => {
|
||||||
|
// Process any existing hash
|
||||||
|
const hash = getHash();
|
||||||
|
|
||||||
|
if (hash) {
|
||||||
|
// If there is a category, switch to that
|
||||||
|
if (hash.category) {
|
||||||
|
activateCategory(hash.category);
|
||||||
|
}
|
||||||
|
// Paginate a specific listing
|
||||||
|
const listingIds = Object.keys(window["quarto-listings"]);
|
||||||
|
for (const listingId of listingIds) {
|
||||||
|
const page = hash[getListingPageKey(listingId)];
|
||||||
|
if (page) {
|
||||||
|
showPage(listingId, page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const listingIds = Object.keys(window["quarto-listings"]);
|
||||||
|
for (const listingId of listingIds) {
|
||||||
|
// The actual list
|
||||||
|
const list = window["quarto-listings"][listingId];
|
||||||
|
|
||||||
|
// Update the handlers for pagination events
|
||||||
|
refreshPaginationHandlers(listingId);
|
||||||
|
|
||||||
|
// Render any visible items that need it
|
||||||
|
renderVisibleProgressiveImages(list);
|
||||||
|
|
||||||
|
// Whenever the list is updated, we also need to
|
||||||
|
// attach handlers to the new pagination elements
|
||||||
|
// and refresh any newly visible items.
|
||||||
|
list.on("updated", function () {
|
||||||
|
renderVisibleProgressiveImages(list);
|
||||||
|
setTimeout(() => refreshPaginationHandlers(listingId));
|
||||||
|
|
||||||
|
// Show or hide the no matching message
|
||||||
|
toggleNoMatchingMessage(list);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||||
|
// Attach click handlers to categories
|
||||||
|
const categoryEls = window.document.querySelectorAll(
|
||||||
|
".quarto-listing-category .category"
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const categoryEl of categoryEls) {
|
||||||
|
const category = categoryEl.getAttribute("data-category");
|
||||||
|
categoryEl.onclick = () => {
|
||||||
|
activateCategory(category);
|
||||||
|
setCategoryHash(category);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attach a click handler to the category title
|
||||||
|
// (there should be only one, but since it is a class name, handle N)
|
||||||
|
const categoryTitleEls = window.document.querySelectorAll(
|
||||||
|
".quarto-listing-category-title"
|
||||||
|
);
|
||||||
|
for (const categoryTitleEl of categoryTitleEls) {
|
||||||
|
categoryTitleEl.onclick = () => {
|
||||||
|
activateCategory("");
|
||||||
|
setCategoryHash("");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
categoriesLoaded = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
function toggleNoMatchingMessage(list) {
|
||||||
|
const selector = `#${list.listContainer.id} .listing-no-matching`;
|
||||||
|
const noMatchingEl = window.document.querySelector(selector);
|
||||||
|
if (noMatchingEl) {
|
||||||
|
if (list.visibleItems.length === 0) {
|
||||||
|
noMatchingEl.classList.remove("d-none");
|
||||||
|
} else {
|
||||||
|
if (!noMatchingEl.classList.contains("d-none")) {
|
||||||
|
noMatchingEl.classList.add("d-none");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setCategoryHash(category) {
|
||||||
|
setHash({ category });
|
||||||
|
}
|
||||||
|
|
||||||
|
function setPageHash(listingId, page) {
|
||||||
|
const currentHash = getHash() || {};
|
||||||
|
currentHash[getListingPageKey(listingId)] = page;
|
||||||
|
setHash(currentHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getListingPageKey(listingId) {
|
||||||
|
return `${listingId}-page`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshPaginationHandlers(listingId) {
|
||||||
|
const listingEl = window.document.getElementById(listingId);
|
||||||
|
const paginationEls = listingEl.querySelectorAll(
|
||||||
|
".pagination li.page-item:not(.disabled) .page.page-link"
|
||||||
|
);
|
||||||
|
for (const paginationEl of paginationEls) {
|
||||||
|
paginationEl.onclick = (sender) => {
|
||||||
|
setPageHash(listingId, sender.target.getAttribute("data-i"));
|
||||||
|
showPage(listingId, sender.target.getAttribute("data-i"));
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderVisibleProgressiveImages(list) {
|
||||||
|
// Run through the visible items and render any progressive images
|
||||||
|
for (const item of list.visibleItems) {
|
||||||
|
const itemEl = item.elm;
|
||||||
|
if (itemEl) {
|
||||||
|
const progressiveImgs = itemEl.querySelectorAll(
|
||||||
|
`img[${kProgressiveAttr}]`
|
||||||
|
);
|
||||||
|
for (const progressiveImg of progressiveImgs) {
|
||||||
|
const srcValue = progressiveImg.getAttribute(kProgressiveAttr);
|
||||||
|
if (srcValue) {
|
||||||
|
progressiveImg.setAttribute("src", srcValue);
|
||||||
|
}
|
||||||
|
progressiveImg.removeAttribute(kProgressiveAttr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getHash() {
|
||||||
|
// Hashes are of the form
|
||||||
|
// #name:value|name1:value1|name2:value2
|
||||||
|
const currentUrl = new URL(window.location);
|
||||||
|
const hashRaw = currentUrl.hash ? currentUrl.hash.slice(1) : undefined;
|
||||||
|
return parseHash(hashRaw);
|
||||||
|
}
|
||||||
|
|
||||||
|
const kAnd = "&";
|
||||||
|
const kEquals = "=";
|
||||||
|
|
||||||
|
function parseHash(hash) {
|
||||||
|
if (!hash) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const hasValuesStrs = hash.split(kAnd);
|
||||||
|
const hashValues = hasValuesStrs
|
||||||
|
.map((hashValueStr) => {
|
||||||
|
const vals = hashValueStr.split(kEquals);
|
||||||
|
if (vals.length === 2) {
|
||||||
|
return { name: vals[0], value: vals[1] };
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter((value) => {
|
||||||
|
return value !== undefined;
|
||||||
|
});
|
||||||
|
|
||||||
|
const hashObj = {};
|
||||||
|
hashValues.forEach((hashValue) => {
|
||||||
|
hashObj[hashValue.name] = decodeURIComponent(hashValue.value);
|
||||||
|
});
|
||||||
|
return hashObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeHash(obj) {
|
||||||
|
return Object.keys(obj)
|
||||||
|
.map((key) => {
|
||||||
|
return `${key}${kEquals}${obj[key]}`;
|
||||||
|
})
|
||||||
|
.join(kAnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setHash(obj) {
|
||||||
|
const hash = makeHash(obj);
|
||||||
|
window.history.pushState(null, null, `#${hash}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showPage(listingId, page) {
|
||||||
|
const list = window["quarto-listings"][listingId];
|
||||||
|
if (list) {
|
||||||
|
list.show((page - 1) * list.page + 1, list.page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function activateCategory(category) {
|
||||||
|
// Deactivate existing categories
|
||||||
|
const activeEls = window.document.querySelectorAll(
|
||||||
|
".quarto-listing-category .category.active"
|
||||||
|
);
|
||||||
|
for (const activeEl of activeEls) {
|
||||||
|
activeEl.classList.remove("active");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Activate this category
|
||||||
|
const categoryEl = window.document.querySelector(
|
||||||
|
`.quarto-listing-category .category[data-category='${category}'`
|
||||||
|
);
|
||||||
|
if (categoryEl) {
|
||||||
|
categoryEl.classList.add("active");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter the listings to this category
|
||||||
|
filterListingCategory(category);
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterListingCategory(category) {
|
||||||
|
const listingIds = Object.keys(window["quarto-listings"]);
|
||||||
|
for (const listingId of listingIds) {
|
||||||
|
const list = window["quarto-listings"][listingId];
|
||||||
|
if (list) {
|
||||||
|
if (category === "") {
|
||||||
|
// resets the filter
|
||||||
|
list.filter();
|
||||||
|
} else {
|
||||||
|
// filter to this category
|
||||||
|
list.filter(function (item) {
|
||||||
|
const itemValues = item.values();
|
||||||
|
if (itemValues.categories !== null) {
|
||||||
|
const categories = itemValues.categories.split(",");
|
||||||
|
return categories.includes(category);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,6 +8,8 @@ website:
|
||||||
left:
|
left:
|
||||||
- href: index.qmd
|
- href: index.qmd
|
||||||
text: Home
|
text: Home
|
||||||
|
- href: posts.qmd
|
||||||
|
text: Posts
|
||||||
- href: about.qmd
|
- href: about.qmd
|
||||||
text: About me
|
text: About me
|
||||||
right:
|
right:
|
||||||
|
|
|
||||||
0
docs/.nojekyll
Normal file
0
docs/.nojekyll
Normal file
571
docs/about.html
Normal file
571
docs/about.html
Normal file
|
|
@ -0,0 +1,571 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="generator" content="quarto-1.5.57">
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||||||
|
|
||||||
|
|
||||||
|
<title>About me – Louis Lacoste</title>
|
||||||
|
<style>
|
||||||
|
code{white-space: pre-wrap;}
|
||||||
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||||
|
div.column{flex: auto; overflow-x: auto;}
|
||||||
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||||
|
ul.task-list{list-style: none;}
|
||||||
|
ul.task-list li input[type="checkbox"] {
|
||||||
|
width: 0.8em;
|
||||||
|
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="site_libs/quarto-nav/quarto-nav.js"></script>
|
||||||
|
<script src="site_libs/quarto-nav/headroom.min.js"></script>
|
||||||
|
<script src="site_libs/clipboard/clipboard.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/fuse.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/quarto-search.js"></script>
|
||||||
|
<meta name="quarto:offset" content="./">
|
||||||
|
<script src="site_libs/quarto-html/quarto.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/popper.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/anchor.min.js"></script>
|
||||||
|
<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
|
||||||
|
<script src="site_libs/bootstrap/bootstrap.min.js"></script>
|
||||||
|
<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
|
||||||
|
<script id="quarto-search-options" type="application/json">{
|
||||||
|
"location": "navbar",
|
||||||
|
"copy-button": false,
|
||||||
|
"collapse-after": 3,
|
||||||
|
"panel-placement": "end",
|
||||||
|
"type": "overlay",
|
||||||
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
|
"language": {
|
||||||
|
"search-no-results-text": "No results",
|
||||||
|
"search-matching-documents-text": "matching documents",
|
||||||
|
"search-copy-link-title": "Copy link to search",
|
||||||
|
"search-hide-matches-text": "Hide additional matches",
|
||||||
|
"search-more-match-text": "more match in this document",
|
||||||
|
"search-more-matches-text": "more matches in this document",
|
||||||
|
"search-clear-button-title": "Clear",
|
||||||
|
"search-text-placeholder": "",
|
||||||
|
"search-detached-cancel-button-title": "Cancel",
|
||||||
|
"search-submit-button-title": "Submit",
|
||||||
|
"search-label": "Search"
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="nav-fixed">
|
||||||
|
|
||||||
|
<div id="quarto-search-results"></div>
|
||||||
|
<header id="quarto-header" class="headroom fixed-top">
|
||||||
|
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
|
||||||
|
<div class="navbar-container container-fluid">
|
||||||
|
<div class="navbar-brand-container mx-auto">
|
||||||
|
<a class="navbar-brand" href="./index.html">
|
||||||
|
<span class="navbar-title">Louis Lacoste</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="quarto-search" class="" title="Search"></div>
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./index.html">
|
||||||
|
<span class="menu-text">Home</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" href="./about.html" aria-current="page">
|
||||||
|
<span class="menu-text">About me</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./interests.html">
|
||||||
|
<span class="menu-text">Personnal interests</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
|
<div class="quarto-navbar-tools">
|
||||||
|
</div>
|
||||||
|
</div> <!-- /container-fluid -->
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<!-- content -->
|
||||||
|
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
|
||||||
|
<!-- sidebar -->
|
||||||
|
<!-- margin-sidebar -->
|
||||||
|
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar zindex-bottom">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- main -->
|
||||||
|
<main class="content" id="quarto-document-content">
|
||||||
|
|
||||||
|
<header id="title-block-header" class="quarto-title-block default">
|
||||||
|
<div class="quarto-title">
|
||||||
|
<h1 class="title">About me</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="quarto-title-meta">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</header>
|
||||||
|
|
||||||
|
|
||||||
|
<p>I’m a 24 years old PhD student in Applied Mathematics at MIA Paris-Saclay.</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</main> <!-- /main -->
|
||||||
|
<script id="quarto-html-after-body" type="application/javascript">
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
const toggleBodyColorMode = (bsSheetEl) => {
|
||||||
|
const mode = bsSheetEl.getAttribute("data-mode");
|
||||||
|
const bodyEl = window.document.querySelector("body");
|
||||||
|
if (mode === "dark") {
|
||||||
|
bodyEl.classList.add("quarto-dark");
|
||||||
|
bodyEl.classList.remove("quarto-light");
|
||||||
|
} else {
|
||||||
|
bodyEl.classList.add("quarto-light");
|
||||||
|
bodyEl.classList.remove("quarto-dark");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const toggleBodyColorPrimary = () => {
|
||||||
|
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
|
||||||
|
if (bsSheetEl) {
|
||||||
|
toggleBodyColorMode(bsSheetEl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toggleBodyColorPrimary();
|
||||||
|
const icon = "";
|
||||||
|
const anchorJS = new window.AnchorJS();
|
||||||
|
anchorJS.options = {
|
||||||
|
placement: 'right',
|
||||||
|
icon: icon
|
||||||
|
};
|
||||||
|
anchorJS.add('.anchored');
|
||||||
|
const isCodeAnnotation = (el) => {
|
||||||
|
for (const clz of el.classList) {
|
||||||
|
if (clz.startsWith('code-annotation-')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const onCopySuccess = function(e) {
|
||||||
|
// button target
|
||||||
|
const button = e.trigger;
|
||||||
|
// don't keep focus
|
||||||
|
button.blur();
|
||||||
|
// flash "checked"
|
||||||
|
button.classList.add('code-copy-button-checked');
|
||||||
|
var currentTitle = button.getAttribute("title");
|
||||||
|
button.setAttribute("title", "Copied!");
|
||||||
|
let tooltip;
|
||||||
|
if (window.bootstrap) {
|
||||||
|
button.setAttribute("data-bs-toggle", "tooltip");
|
||||||
|
button.setAttribute("data-bs-placement", "left");
|
||||||
|
button.setAttribute("data-bs-title", "Copied!");
|
||||||
|
tooltip = new bootstrap.Tooltip(button,
|
||||||
|
{ trigger: "manual",
|
||||||
|
customClass: "code-copy-button-tooltip",
|
||||||
|
offset: [0, -8]});
|
||||||
|
tooltip.show();
|
||||||
|
}
|
||||||
|
setTimeout(function() {
|
||||||
|
if (tooltip) {
|
||||||
|
tooltip.hide();
|
||||||
|
button.removeAttribute("data-bs-title");
|
||||||
|
button.removeAttribute("data-bs-toggle");
|
||||||
|
button.removeAttribute("data-bs-placement");
|
||||||
|
}
|
||||||
|
button.setAttribute("title", currentTitle);
|
||||||
|
button.classList.remove('code-copy-button-checked');
|
||||||
|
}, 1000);
|
||||||
|
// clear code selection
|
||||||
|
e.clearSelection();
|
||||||
|
}
|
||||||
|
const getTextToCopy = function(trigger) {
|
||||||
|
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
||||||
|
for (const childEl of codeEl.children) {
|
||||||
|
if (isCodeAnnotation(childEl)) {
|
||||||
|
childEl.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return codeEl.innerText;
|
||||||
|
}
|
||||||
|
const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
|
||||||
|
text: getTextToCopy
|
||||||
|
});
|
||||||
|
clipboard.on('success', onCopySuccess);
|
||||||
|
if (window.document.getElementById('quarto-embedded-source-code-modal')) {
|
||||||
|
// For code content inside modals, clipBoardJS needs to be initialized with a container option
|
||||||
|
// TODO: Check when it could be a function (https://github.com/zenorocha/clipboard.js/issues/860)
|
||||||
|
const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
|
||||||
|
text: getTextToCopy,
|
||||||
|
container: window.document.getElementById('quarto-embedded-source-code-modal')
|
||||||
|
});
|
||||||
|
clipboardModal.on('success', onCopySuccess);
|
||||||
|
}
|
||||||
|
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
|
||||||
|
var mailtoRegex = new RegExp(/^mailto:/);
|
||||||
|
var filterRegex = new RegExp('/' + window.location.host + '/');
|
||||||
|
var isInternal = (href) => {
|
||||||
|
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
|
||||||
|
}
|
||||||
|
// Inspect non-navigation links and adorn them if external
|
||||||
|
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
|
||||||
|
for (var i=0; i<links.length; i++) {
|
||||||
|
const link = links[i];
|
||||||
|
if (!isInternal(link.href)) {
|
||||||
|
// undo the damage that might have been done by quarto-nav.js in the case of
|
||||||
|
// links that we want to consider external
|
||||||
|
if (link.dataset.originalHref !== undefined) {
|
||||||
|
link.href = link.dataset.originalHref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
|
||||||
|
const config = {
|
||||||
|
allowHTML: true,
|
||||||
|
maxWidth: 500,
|
||||||
|
delay: 100,
|
||||||
|
arrow: false,
|
||||||
|
appendTo: function(el) {
|
||||||
|
return el.parentElement;
|
||||||
|
},
|
||||||
|
interactive: true,
|
||||||
|
interactiveBorder: 10,
|
||||||
|
theme: 'quarto',
|
||||||
|
placement: 'bottom-start',
|
||||||
|
};
|
||||||
|
if (contentFn) {
|
||||||
|
config.content = contentFn;
|
||||||
|
}
|
||||||
|
if (onTriggerFn) {
|
||||||
|
config.onTrigger = onTriggerFn;
|
||||||
|
}
|
||||||
|
if (onUntriggerFn) {
|
||||||
|
config.onUntrigger = onUntriggerFn;
|
||||||
|
}
|
||||||
|
window.tippy(el, config);
|
||||||
|
}
|
||||||
|
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
||||||
|
for (var i=0; i<noterefs.length; i++) {
|
||||||
|
const ref = noterefs[i];
|
||||||
|
tippyHover(ref, function() {
|
||||||
|
// use id or data attribute instead here
|
||||||
|
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
|
||||||
|
try { href = new URL(href).hash; } catch {}
|
||||||
|
const id = href.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
|
return note.innerHTML;
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const xrefs = window.document.querySelectorAll('a.quarto-xref');
|
||||||
|
const processXRef = (id, note) => {
|
||||||
|
// Strip column container classes
|
||||||
|
const stripColumnClz = (el) => {
|
||||||
|
el.classList.remove("page-full", "page-columns");
|
||||||
|
if (el.children) {
|
||||||
|
for (const child of el.children) {
|
||||||
|
stripColumnClz(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stripColumnClz(note)
|
||||||
|
if (id === null || id.startsWith('sec-')) {
|
||||||
|
// Special case sections, only their first couple elements
|
||||||
|
const container = document.createElement("div");
|
||||||
|
if (note.children && note.children.length > 2) {
|
||||||
|
container.appendChild(note.children[0].cloneNode(true));
|
||||||
|
for (let i = 1; i < note.children.length; i++) {
|
||||||
|
const child = note.children[i];
|
||||||
|
if (child.tagName === "P" && child.innerText === "") {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
container.appendChild(child.cloneNode(true));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(container);
|
||||||
|
}
|
||||||
|
return container.innerHTML
|
||||||
|
} else {
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Remove any anchor links if they are present
|
||||||
|
const anchorLink = note.querySelector('a.anchorjs-link');
|
||||||
|
if (anchorLink) {
|
||||||
|
anchorLink.remove();
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
// TODO in 1.5, we should make sure this works without a callout special case
|
||||||
|
if (note.classList.contains("callout")) {
|
||||||
|
return note.outerHTML;
|
||||||
|
} else {
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i=0; i<xrefs.length; i++) {
|
||||||
|
const xref = xrefs[i];
|
||||||
|
tippyHover(xref, undefined, function(instance) {
|
||||||
|
instance.disable();
|
||||||
|
let url = xref.getAttribute('href');
|
||||||
|
let hash = undefined;
|
||||||
|
if (url.startsWith('#')) {
|
||||||
|
hash = url;
|
||||||
|
} else {
|
||||||
|
try { hash = new URL(url).hash; } catch {}
|
||||||
|
}
|
||||||
|
if (hash) {
|
||||||
|
const id = hash.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
try {
|
||||||
|
const html = processXRef(id, note.cloneNode(true));
|
||||||
|
instance.setContent(html);
|
||||||
|
} finally {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch this
|
||||||
|
fetch(url.split('#')[0])
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
const html = processXRef(id, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch a full url (with no hash to target)
|
||||||
|
// This is a special case and we should probably do some content thinning / targeting
|
||||||
|
fetch(url)
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.querySelector('main.content');
|
||||||
|
if (note !== null) {
|
||||||
|
// This should only happen for chapter cross references
|
||||||
|
// (since there is no id in the URL)
|
||||||
|
// remove the first header
|
||||||
|
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
|
||||||
|
note.children[0].remove();
|
||||||
|
}
|
||||||
|
const html = processXRef(null, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, function(instance) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let selectedAnnoteEl;
|
||||||
|
const selectorForAnnotation = ( cell, annotation) => {
|
||||||
|
let cellAttr = 'data-code-cell="' + cell + '"';
|
||||||
|
let lineAttr = 'data-code-annotation="' + annotation + '"';
|
||||||
|
const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
|
||||||
|
return selector;
|
||||||
|
}
|
||||||
|
const selectCodeLines = (annoteEl) => {
|
||||||
|
const doc = window.document;
|
||||||
|
const targetCell = annoteEl.getAttribute("data-target-cell");
|
||||||
|
const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
|
||||||
|
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
|
||||||
|
const lines = annoteSpan.getAttribute("data-code-lines").split(",");
|
||||||
|
const lineIds = lines.map((line) => {
|
||||||
|
return targetCell + "-" + line;
|
||||||
|
})
|
||||||
|
let top = null;
|
||||||
|
let height = null;
|
||||||
|
let parent = null;
|
||||||
|
if (lineIds.length > 0) {
|
||||||
|
//compute the position of the single el (top and bottom and make a div)
|
||||||
|
const el = window.document.getElementById(lineIds[0]);
|
||||||
|
top = el.offsetTop;
|
||||||
|
height = el.offsetHeight;
|
||||||
|
parent = el.parentElement.parentElement;
|
||||||
|
if (lineIds.length > 1) {
|
||||||
|
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
|
||||||
|
const bottom = lastEl.offsetTop + lastEl.offsetHeight;
|
||||||
|
height = bottom - top;
|
||||||
|
}
|
||||||
|
if (top !== null && height !== null && parent !== null) {
|
||||||
|
// cook up a div (if necessary) and position it
|
||||||
|
let div = window.document.getElementById("code-annotation-line-highlight");
|
||||||
|
if (div === null) {
|
||||||
|
div = window.document.createElement("div");
|
||||||
|
div.setAttribute("id", "code-annotation-line-highlight");
|
||||||
|
div.style.position = 'absolute';
|
||||||
|
parent.appendChild(div);
|
||||||
|
}
|
||||||
|
div.style.top = top - 2 + "px";
|
||||||
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
|
if (gutterDiv === null) {
|
||||||
|
gutterDiv = window.document.createElement("div");
|
||||||
|
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
|
||||||
|
gutterDiv.style.position = 'absolute';
|
||||||
|
const codeCell = window.document.getElementById(targetCell);
|
||||||
|
const gutter = codeCell.querySelector('.code-annotation-gutter');
|
||||||
|
gutter.appendChild(gutterDiv);
|
||||||
|
}
|
||||||
|
gutterDiv.style.top = top - 2 + "px";
|
||||||
|
gutterDiv.style.height = height + 4 + "px";
|
||||||
|
}
|
||||||
|
selectedAnnoteEl = annoteEl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const unselectCodeLines = () => {
|
||||||
|
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
|
||||||
|
elementsIds.forEach((elId) => {
|
||||||
|
const div = window.document.getElementById(elId);
|
||||||
|
if (div) {
|
||||||
|
div.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
selectedAnnoteEl = undefined;
|
||||||
|
};
|
||||||
|
// Handle positioning of the toggle
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
throttle(() => {
|
||||||
|
elRect = undefined;
|
||||||
|
if (selectedAnnoteEl) {
|
||||||
|
selectCodeLines(selectedAnnoteEl);
|
||||||
|
}
|
||||||
|
}, 10)
|
||||||
|
);
|
||||||
|
function throttle(fn, ms) {
|
||||||
|
let throttle = false;
|
||||||
|
let timer;
|
||||||
|
return (...args) => {
|
||||||
|
if(!throttle) { // first call gets through
|
||||||
|
fn.apply(this, args);
|
||||||
|
throttle = true;
|
||||||
|
} else { // all the others get throttled
|
||||||
|
if(timer) clearTimeout(timer); // cancel #2
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
fn.apply(this, args);
|
||||||
|
timer = throttle = false;
|
||||||
|
}, ms);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Attach click handler to the DT
|
||||||
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
|
for (const annoteDlNode of annoteDls) {
|
||||||
|
annoteDlNode.addEventListener('click', (event) => {
|
||||||
|
const clickedEl = event.target;
|
||||||
|
if (clickedEl !== selectedAnnoteEl) {
|
||||||
|
unselectCodeLines();
|
||||||
|
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
|
||||||
|
if (activeEl) {
|
||||||
|
activeEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
selectCodeLines(clickedEl);
|
||||||
|
clickedEl.classList.add('code-annotation-active');
|
||||||
|
} else {
|
||||||
|
// Unselect the line
|
||||||
|
unselectCodeLines();
|
||||||
|
clickedEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const findCites = (el) => {
|
||||||
|
const parentEl = el.parentElement;
|
||||||
|
if (parentEl) {
|
||||||
|
const cites = parentEl.dataset.cites;
|
||||||
|
if (cites) {
|
||||||
|
return {
|
||||||
|
el,
|
||||||
|
cites: cites.split(' ')
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return findCites(el.parentElement)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
|
||||||
|
for (var i=0; i<bibliorefs.length; i++) {
|
||||||
|
const ref = bibliorefs[i];
|
||||||
|
const citeInfo = findCites(ref);
|
||||||
|
if (citeInfo) {
|
||||||
|
tippyHover(citeInfo.el, function() {
|
||||||
|
var popup = window.document.createElement('div');
|
||||||
|
citeInfo.cites.forEach(function(cite) {
|
||||||
|
var citeDiv = window.document.createElement('div');
|
||||||
|
citeDiv.classList.add('hanging-indent');
|
||||||
|
citeDiv.classList.add('csl-entry');
|
||||||
|
var biblioDiv = window.document.getElementById('ref-' + cite);
|
||||||
|
if (biblioDiv) {
|
||||||
|
citeDiv.innerHTML = biblioDiv.innerHTML;
|
||||||
|
}
|
||||||
|
popup.appendChild(citeDiv);
|
||||||
|
});
|
||||||
|
return popup.innerHTML;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div> <!-- /content -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body></html>
|
||||||
570
docs/biblio.html
Normal file
570
docs/biblio.html
Normal file
|
|
@ -0,0 +1,570 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="generator" content="quarto-1.5.57">
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||||||
|
|
||||||
|
|
||||||
|
<title>Bibliography – Louis Lacoste</title>
|
||||||
|
<style>
|
||||||
|
code{white-space: pre-wrap;}
|
||||||
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||||
|
div.column{flex: auto; overflow-x: auto;}
|
||||||
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||||
|
ul.task-list{list-style: none;}
|
||||||
|
ul.task-list li input[type="checkbox"] {
|
||||||
|
width: 0.8em;
|
||||||
|
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="site_libs/quarto-nav/quarto-nav.js"></script>
|
||||||
|
<script src="site_libs/quarto-nav/headroom.min.js"></script>
|
||||||
|
<script src="site_libs/clipboard/clipboard.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/fuse.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/quarto-search.js"></script>
|
||||||
|
<meta name="quarto:offset" content="./">
|
||||||
|
<script src="site_libs/quarto-html/quarto.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/popper.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/anchor.min.js"></script>
|
||||||
|
<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
|
||||||
|
<script src="site_libs/bootstrap/bootstrap.min.js"></script>
|
||||||
|
<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
|
||||||
|
<script id="quarto-search-options" type="application/json">{
|
||||||
|
"location": "navbar",
|
||||||
|
"copy-button": false,
|
||||||
|
"collapse-after": 3,
|
||||||
|
"panel-placement": "end",
|
||||||
|
"type": "overlay",
|
||||||
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
|
"language": {
|
||||||
|
"search-no-results-text": "No results",
|
||||||
|
"search-matching-documents-text": "matching documents",
|
||||||
|
"search-copy-link-title": "Copy link to search",
|
||||||
|
"search-hide-matches-text": "Hide additional matches",
|
||||||
|
"search-more-match-text": "more match in this document",
|
||||||
|
"search-more-matches-text": "more matches in this document",
|
||||||
|
"search-clear-button-title": "Clear",
|
||||||
|
"search-text-placeholder": "",
|
||||||
|
"search-detached-cancel-button-title": "Cancel",
|
||||||
|
"search-submit-button-title": "Submit",
|
||||||
|
"search-label": "Search"
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="nav-fixed">
|
||||||
|
|
||||||
|
<div id="quarto-search-results"></div>
|
||||||
|
<header id="quarto-header" class="headroom fixed-top">
|
||||||
|
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
|
||||||
|
<div class="navbar-container container-fluid">
|
||||||
|
<div class="navbar-brand-container mx-auto">
|
||||||
|
<a class="navbar-brand" href="./index.html">
|
||||||
|
<span class="navbar-title">Louis Lacoste</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="quarto-search" class="" title="Search"></div>
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./index.html">
|
||||||
|
<span class="menu-text">Home</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./about.html">
|
||||||
|
<span class="menu-text">About me</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./interests.html">
|
||||||
|
<span class="menu-text">Personnal interests</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
|
<div class="quarto-navbar-tools">
|
||||||
|
</div>
|
||||||
|
</div> <!-- /container-fluid -->
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<!-- content -->
|
||||||
|
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
|
||||||
|
<!-- sidebar -->
|
||||||
|
<!-- margin-sidebar -->
|
||||||
|
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar zindex-bottom">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- main -->
|
||||||
|
<main class="content" id="quarto-document-content">
|
||||||
|
|
||||||
|
<header id="title-block-header" class="quarto-title-block default">
|
||||||
|
<div class="quarto-title">
|
||||||
|
<h1 class="title">Bibliography</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="quarto-title-meta">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</header>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</main> <!-- /main -->
|
||||||
|
<script id="quarto-html-after-body" type="application/javascript">
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
const toggleBodyColorMode = (bsSheetEl) => {
|
||||||
|
const mode = bsSheetEl.getAttribute("data-mode");
|
||||||
|
const bodyEl = window.document.querySelector("body");
|
||||||
|
if (mode === "dark") {
|
||||||
|
bodyEl.classList.add("quarto-dark");
|
||||||
|
bodyEl.classList.remove("quarto-light");
|
||||||
|
} else {
|
||||||
|
bodyEl.classList.add("quarto-light");
|
||||||
|
bodyEl.classList.remove("quarto-dark");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const toggleBodyColorPrimary = () => {
|
||||||
|
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
|
||||||
|
if (bsSheetEl) {
|
||||||
|
toggleBodyColorMode(bsSheetEl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toggleBodyColorPrimary();
|
||||||
|
const icon = "";
|
||||||
|
const anchorJS = new window.AnchorJS();
|
||||||
|
anchorJS.options = {
|
||||||
|
placement: 'right',
|
||||||
|
icon: icon
|
||||||
|
};
|
||||||
|
anchorJS.add('.anchored');
|
||||||
|
const isCodeAnnotation = (el) => {
|
||||||
|
for (const clz of el.classList) {
|
||||||
|
if (clz.startsWith('code-annotation-')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const onCopySuccess = function(e) {
|
||||||
|
// button target
|
||||||
|
const button = e.trigger;
|
||||||
|
// don't keep focus
|
||||||
|
button.blur();
|
||||||
|
// flash "checked"
|
||||||
|
button.classList.add('code-copy-button-checked');
|
||||||
|
var currentTitle = button.getAttribute("title");
|
||||||
|
button.setAttribute("title", "Copied!");
|
||||||
|
let tooltip;
|
||||||
|
if (window.bootstrap) {
|
||||||
|
button.setAttribute("data-bs-toggle", "tooltip");
|
||||||
|
button.setAttribute("data-bs-placement", "left");
|
||||||
|
button.setAttribute("data-bs-title", "Copied!");
|
||||||
|
tooltip = new bootstrap.Tooltip(button,
|
||||||
|
{ trigger: "manual",
|
||||||
|
customClass: "code-copy-button-tooltip",
|
||||||
|
offset: [0, -8]});
|
||||||
|
tooltip.show();
|
||||||
|
}
|
||||||
|
setTimeout(function() {
|
||||||
|
if (tooltip) {
|
||||||
|
tooltip.hide();
|
||||||
|
button.removeAttribute("data-bs-title");
|
||||||
|
button.removeAttribute("data-bs-toggle");
|
||||||
|
button.removeAttribute("data-bs-placement");
|
||||||
|
}
|
||||||
|
button.setAttribute("title", currentTitle);
|
||||||
|
button.classList.remove('code-copy-button-checked');
|
||||||
|
}, 1000);
|
||||||
|
// clear code selection
|
||||||
|
e.clearSelection();
|
||||||
|
}
|
||||||
|
const getTextToCopy = function(trigger) {
|
||||||
|
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
||||||
|
for (const childEl of codeEl.children) {
|
||||||
|
if (isCodeAnnotation(childEl)) {
|
||||||
|
childEl.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return codeEl.innerText;
|
||||||
|
}
|
||||||
|
const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
|
||||||
|
text: getTextToCopy
|
||||||
|
});
|
||||||
|
clipboard.on('success', onCopySuccess);
|
||||||
|
if (window.document.getElementById('quarto-embedded-source-code-modal')) {
|
||||||
|
// For code content inside modals, clipBoardJS needs to be initialized with a container option
|
||||||
|
// TODO: Check when it could be a function (https://github.com/zenorocha/clipboard.js/issues/860)
|
||||||
|
const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
|
||||||
|
text: getTextToCopy,
|
||||||
|
container: window.document.getElementById('quarto-embedded-source-code-modal')
|
||||||
|
});
|
||||||
|
clipboardModal.on('success', onCopySuccess);
|
||||||
|
}
|
||||||
|
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
|
||||||
|
var mailtoRegex = new RegExp(/^mailto:/);
|
||||||
|
var filterRegex = new RegExp('/' + window.location.host + '/');
|
||||||
|
var isInternal = (href) => {
|
||||||
|
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
|
||||||
|
}
|
||||||
|
// Inspect non-navigation links and adorn them if external
|
||||||
|
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
|
||||||
|
for (var i=0; i<links.length; i++) {
|
||||||
|
const link = links[i];
|
||||||
|
if (!isInternal(link.href)) {
|
||||||
|
// undo the damage that might have been done by quarto-nav.js in the case of
|
||||||
|
// links that we want to consider external
|
||||||
|
if (link.dataset.originalHref !== undefined) {
|
||||||
|
link.href = link.dataset.originalHref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
|
||||||
|
const config = {
|
||||||
|
allowHTML: true,
|
||||||
|
maxWidth: 500,
|
||||||
|
delay: 100,
|
||||||
|
arrow: false,
|
||||||
|
appendTo: function(el) {
|
||||||
|
return el.parentElement;
|
||||||
|
},
|
||||||
|
interactive: true,
|
||||||
|
interactiveBorder: 10,
|
||||||
|
theme: 'quarto',
|
||||||
|
placement: 'bottom-start',
|
||||||
|
};
|
||||||
|
if (contentFn) {
|
||||||
|
config.content = contentFn;
|
||||||
|
}
|
||||||
|
if (onTriggerFn) {
|
||||||
|
config.onTrigger = onTriggerFn;
|
||||||
|
}
|
||||||
|
if (onUntriggerFn) {
|
||||||
|
config.onUntrigger = onUntriggerFn;
|
||||||
|
}
|
||||||
|
window.tippy(el, config);
|
||||||
|
}
|
||||||
|
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
||||||
|
for (var i=0; i<noterefs.length; i++) {
|
||||||
|
const ref = noterefs[i];
|
||||||
|
tippyHover(ref, function() {
|
||||||
|
// use id or data attribute instead here
|
||||||
|
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
|
||||||
|
try { href = new URL(href).hash; } catch {}
|
||||||
|
const id = href.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
|
return note.innerHTML;
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const xrefs = window.document.querySelectorAll('a.quarto-xref');
|
||||||
|
const processXRef = (id, note) => {
|
||||||
|
// Strip column container classes
|
||||||
|
const stripColumnClz = (el) => {
|
||||||
|
el.classList.remove("page-full", "page-columns");
|
||||||
|
if (el.children) {
|
||||||
|
for (const child of el.children) {
|
||||||
|
stripColumnClz(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stripColumnClz(note)
|
||||||
|
if (id === null || id.startsWith('sec-')) {
|
||||||
|
// Special case sections, only their first couple elements
|
||||||
|
const container = document.createElement("div");
|
||||||
|
if (note.children && note.children.length > 2) {
|
||||||
|
container.appendChild(note.children[0].cloneNode(true));
|
||||||
|
for (let i = 1; i < note.children.length; i++) {
|
||||||
|
const child = note.children[i];
|
||||||
|
if (child.tagName === "P" && child.innerText === "") {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
container.appendChild(child.cloneNode(true));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(container);
|
||||||
|
}
|
||||||
|
return container.innerHTML
|
||||||
|
} else {
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Remove any anchor links if they are present
|
||||||
|
const anchorLink = note.querySelector('a.anchorjs-link');
|
||||||
|
if (anchorLink) {
|
||||||
|
anchorLink.remove();
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
// TODO in 1.5, we should make sure this works without a callout special case
|
||||||
|
if (note.classList.contains("callout")) {
|
||||||
|
return note.outerHTML;
|
||||||
|
} else {
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i=0; i<xrefs.length; i++) {
|
||||||
|
const xref = xrefs[i];
|
||||||
|
tippyHover(xref, undefined, function(instance) {
|
||||||
|
instance.disable();
|
||||||
|
let url = xref.getAttribute('href');
|
||||||
|
let hash = undefined;
|
||||||
|
if (url.startsWith('#')) {
|
||||||
|
hash = url;
|
||||||
|
} else {
|
||||||
|
try { hash = new URL(url).hash; } catch {}
|
||||||
|
}
|
||||||
|
if (hash) {
|
||||||
|
const id = hash.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
try {
|
||||||
|
const html = processXRef(id, note.cloneNode(true));
|
||||||
|
instance.setContent(html);
|
||||||
|
} finally {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch this
|
||||||
|
fetch(url.split('#')[0])
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
const html = processXRef(id, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch a full url (with no hash to target)
|
||||||
|
// This is a special case and we should probably do some content thinning / targeting
|
||||||
|
fetch(url)
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.querySelector('main.content');
|
||||||
|
if (note !== null) {
|
||||||
|
// This should only happen for chapter cross references
|
||||||
|
// (since there is no id in the URL)
|
||||||
|
// remove the first header
|
||||||
|
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
|
||||||
|
note.children[0].remove();
|
||||||
|
}
|
||||||
|
const html = processXRef(null, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, function(instance) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let selectedAnnoteEl;
|
||||||
|
const selectorForAnnotation = ( cell, annotation) => {
|
||||||
|
let cellAttr = 'data-code-cell="' + cell + '"';
|
||||||
|
let lineAttr = 'data-code-annotation="' + annotation + '"';
|
||||||
|
const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
|
||||||
|
return selector;
|
||||||
|
}
|
||||||
|
const selectCodeLines = (annoteEl) => {
|
||||||
|
const doc = window.document;
|
||||||
|
const targetCell = annoteEl.getAttribute("data-target-cell");
|
||||||
|
const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
|
||||||
|
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
|
||||||
|
const lines = annoteSpan.getAttribute("data-code-lines").split(",");
|
||||||
|
const lineIds = lines.map((line) => {
|
||||||
|
return targetCell + "-" + line;
|
||||||
|
})
|
||||||
|
let top = null;
|
||||||
|
let height = null;
|
||||||
|
let parent = null;
|
||||||
|
if (lineIds.length > 0) {
|
||||||
|
//compute the position of the single el (top and bottom and make a div)
|
||||||
|
const el = window.document.getElementById(lineIds[0]);
|
||||||
|
top = el.offsetTop;
|
||||||
|
height = el.offsetHeight;
|
||||||
|
parent = el.parentElement.parentElement;
|
||||||
|
if (lineIds.length > 1) {
|
||||||
|
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
|
||||||
|
const bottom = lastEl.offsetTop + lastEl.offsetHeight;
|
||||||
|
height = bottom - top;
|
||||||
|
}
|
||||||
|
if (top !== null && height !== null && parent !== null) {
|
||||||
|
// cook up a div (if necessary) and position it
|
||||||
|
let div = window.document.getElementById("code-annotation-line-highlight");
|
||||||
|
if (div === null) {
|
||||||
|
div = window.document.createElement("div");
|
||||||
|
div.setAttribute("id", "code-annotation-line-highlight");
|
||||||
|
div.style.position = 'absolute';
|
||||||
|
parent.appendChild(div);
|
||||||
|
}
|
||||||
|
div.style.top = top - 2 + "px";
|
||||||
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
|
if (gutterDiv === null) {
|
||||||
|
gutterDiv = window.document.createElement("div");
|
||||||
|
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
|
||||||
|
gutterDiv.style.position = 'absolute';
|
||||||
|
const codeCell = window.document.getElementById(targetCell);
|
||||||
|
const gutter = codeCell.querySelector('.code-annotation-gutter');
|
||||||
|
gutter.appendChild(gutterDiv);
|
||||||
|
}
|
||||||
|
gutterDiv.style.top = top - 2 + "px";
|
||||||
|
gutterDiv.style.height = height + 4 + "px";
|
||||||
|
}
|
||||||
|
selectedAnnoteEl = annoteEl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const unselectCodeLines = () => {
|
||||||
|
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
|
||||||
|
elementsIds.forEach((elId) => {
|
||||||
|
const div = window.document.getElementById(elId);
|
||||||
|
if (div) {
|
||||||
|
div.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
selectedAnnoteEl = undefined;
|
||||||
|
};
|
||||||
|
// Handle positioning of the toggle
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
throttle(() => {
|
||||||
|
elRect = undefined;
|
||||||
|
if (selectedAnnoteEl) {
|
||||||
|
selectCodeLines(selectedAnnoteEl);
|
||||||
|
}
|
||||||
|
}, 10)
|
||||||
|
);
|
||||||
|
function throttle(fn, ms) {
|
||||||
|
let throttle = false;
|
||||||
|
let timer;
|
||||||
|
return (...args) => {
|
||||||
|
if(!throttle) { // first call gets through
|
||||||
|
fn.apply(this, args);
|
||||||
|
throttle = true;
|
||||||
|
} else { // all the others get throttled
|
||||||
|
if(timer) clearTimeout(timer); // cancel #2
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
fn.apply(this, args);
|
||||||
|
timer = throttle = false;
|
||||||
|
}, ms);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Attach click handler to the DT
|
||||||
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
|
for (const annoteDlNode of annoteDls) {
|
||||||
|
annoteDlNode.addEventListener('click', (event) => {
|
||||||
|
const clickedEl = event.target;
|
||||||
|
if (clickedEl !== selectedAnnoteEl) {
|
||||||
|
unselectCodeLines();
|
||||||
|
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
|
||||||
|
if (activeEl) {
|
||||||
|
activeEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
selectCodeLines(clickedEl);
|
||||||
|
clickedEl.classList.add('code-annotation-active');
|
||||||
|
} else {
|
||||||
|
// Unselect the line
|
||||||
|
unselectCodeLines();
|
||||||
|
clickedEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const findCites = (el) => {
|
||||||
|
const parentEl = el.parentElement;
|
||||||
|
if (parentEl) {
|
||||||
|
const cites = parentEl.dataset.cites;
|
||||||
|
if (cites) {
|
||||||
|
return {
|
||||||
|
el,
|
||||||
|
cites: cites.split(' ')
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return findCites(el.parentElement)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
|
||||||
|
for (var i=0; i<bibliorefs.length; i++) {
|
||||||
|
const ref = bibliorefs[i];
|
||||||
|
const citeInfo = findCites(ref);
|
||||||
|
if (citeInfo) {
|
||||||
|
tippyHover(citeInfo.el, function() {
|
||||||
|
var popup = window.document.createElement('div');
|
||||||
|
citeInfo.cites.forEach(function(cite) {
|
||||||
|
var citeDiv = window.document.createElement('div');
|
||||||
|
citeDiv.classList.add('hanging-indent');
|
||||||
|
citeDiv.classList.add('csl-entry');
|
||||||
|
var biblioDiv = window.document.getElementById('ref-' + cite);
|
||||||
|
if (biblioDiv) {
|
||||||
|
citeDiv.innerHTML = biblioDiv.innerHTML;
|
||||||
|
}
|
||||||
|
popup.appendChild(citeDiv);
|
||||||
|
});
|
||||||
|
return popup.innerHTML;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div> <!-- /content -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body></html>
|
||||||
591
docs/index.html
Normal file
591
docs/index.html
Normal file
|
|
@ -0,0 +1,591 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="generator" content="quarto-1.5.57">
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||||||
|
|
||||||
|
|
||||||
|
<title>Site perso – Louis Lacoste</title>
|
||||||
|
<style>
|
||||||
|
code{white-space: pre-wrap;}
|
||||||
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||||
|
div.column{flex: auto; overflow-x: auto;}
|
||||||
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||||
|
ul.task-list{list-style: none;}
|
||||||
|
ul.task-list li input[type="checkbox"] {
|
||||||
|
width: 0.8em;
|
||||||
|
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="site_libs/quarto-nav/quarto-nav.js"></script>
|
||||||
|
<script src="site_libs/quarto-nav/headroom.min.js"></script>
|
||||||
|
<script src="site_libs/clipboard/clipboard.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/fuse.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/quarto-search.js"></script>
|
||||||
|
<meta name="quarto:offset" content="./">
|
||||||
|
<script src="site_libs/quarto-html/quarto.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/popper.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
|
||||||
|
<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
|
||||||
|
<script src="site_libs/bootstrap/bootstrap.min.js"></script>
|
||||||
|
<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
|
||||||
|
<link href="site_libs/quarto-contrib/academicons-1.9.2/all.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/quarto-contrib/academicons-1.9.2/size.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/quarto-contrib/fontawesome6-0.1.0/all.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/quarto-contrib/fontawesome6-0.1.0/latex-fontsize.css" rel="stylesheet">
|
||||||
|
<script id="quarto-search-options" type="application/json">{
|
||||||
|
"location": "navbar",
|
||||||
|
"copy-button": false,
|
||||||
|
"collapse-after": 3,
|
||||||
|
"panel-placement": "end",
|
||||||
|
"type": "overlay",
|
||||||
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
|
"language": {
|
||||||
|
"search-no-results-text": "No results",
|
||||||
|
"search-matching-documents-text": "matching documents",
|
||||||
|
"search-copy-link-title": "Copy link to search",
|
||||||
|
"search-hide-matches-text": "Hide additional matches",
|
||||||
|
"search-more-match-text": "more match in this document",
|
||||||
|
"search-more-matches-text": "more matches in this document",
|
||||||
|
"search-clear-button-title": "Clear",
|
||||||
|
"search-text-placeholder": "",
|
||||||
|
"search-detached-cancel-button-title": "Cancel",
|
||||||
|
"search-submit-button-title": "Submit",
|
||||||
|
"search-label": "Search"
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="nav-fixed">
|
||||||
|
|
||||||
|
<div id="quarto-search-results"></div>
|
||||||
|
<header id="quarto-header" class="headroom fixed-top">
|
||||||
|
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
|
||||||
|
<div class="navbar-container container-fluid">
|
||||||
|
<div class="navbar-brand-container mx-auto">
|
||||||
|
<a class="navbar-brand" href="./index.html">
|
||||||
|
<span class="navbar-title">Louis Lacoste</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="quarto-search" class="" title="Search"></div>
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" href="./index.html" aria-current="page">
|
||||||
|
<span class="menu-text">Home</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./posts.html">
|
||||||
|
<span class="menu-text">Posts</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./about.html">
|
||||||
|
<span class="menu-text">About me</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./interests.html">
|
||||||
|
<span class="menu-text">Personnal interests</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
|
<div class="quarto-navbar-tools">
|
||||||
|
</div>
|
||||||
|
</div> <!-- /container-fluid -->
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<!-- content -->
|
||||||
|
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
|
||||||
|
<!-- sidebar -->
|
||||||
|
<!-- margin-sidebar -->
|
||||||
|
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
|
||||||
|
<nav id="TOC" role="doc-toc" class="toc-active">
|
||||||
|
<h2 id="toc-title">On this page</h2>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#my-github-contributions" id="toc-my-github-contributions" class="nav-link active" data-scroll-target="#my-github-contributions">My Github contributions</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<!-- main -->
|
||||||
|
<div class="quarto-about-trestles">
|
||||||
|
<div class="about-entity">
|
||||||
|
<img src="media/photo.jpg" class="about-image
|
||||||
|
round " style="height: 12em; width: 12em;">
|
||||||
|
<header id="title-block-header" class="quarto-title-block default">
|
||||||
|
<div class="quarto-title">
|
||||||
|
<h1 class="title">Site perso</h1>
|
||||||
|
</div>
|
||||||
|
<div class="quarto-title-meta">
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="about-links">
|
||||||
|
<a href="mailto:louis.lacoste@agroparistech.fr" class="about-link" rel="" target="_blank">
|
||||||
|
<i class="bi bi-envelope"></i>
|
||||||
|
<span class="about-link-text">Email</span>
|
||||||
|
</a>
|
||||||
|
<a href="https://orcid.org/0009-0004-0178-9821" class="about-link" rel="" target="_blank">
|
||||||
|
<span class="about-link-text"><i class="ai ai-orcid"></i> ORCID</span>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/Polarolouis" class="about-link" rel="" target="_blank">
|
||||||
|
<span class="about-link-text"><i class="fa-brands fa-github" aria-label="github"></i> Github</span>
|
||||||
|
</a>
|
||||||
|
<a href="https://gitea.polarolouis.fr/polarolouis/cv-latex/raw/branch/main/cv.pdf" class="about-link" rel="" target="">
|
||||||
|
<span class="about-link-text"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> CV</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="about-contents"><main class="content" id="quarto-document-content">
|
||||||
|
|
||||||
|
<p>Will update later</p>
|
||||||
|
<section id="my-github-contributions" class="level1">
|
||||||
|
<h1>My Github contributions</h1>
|
||||||
|
<!-- replace x.x.x with actual version -->
|
||||||
|
<script src="https://unpkg.com/@codersrank/activity@0.9.14/codersrank-activity.min.js"></script>
|
||||||
|
<p><codersrank-activity username="YOUR_USERNAME"></codersrank-activity></p>
|
||||||
|
|
||||||
|
|
||||||
|
</section>
|
||||||
|
</main></div>
|
||||||
|
</div>
|
||||||
|
<!-- /main -->
|
||||||
|
<script id="quarto-html-after-body" type="application/javascript">
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
const toggleBodyColorMode = (bsSheetEl) => {
|
||||||
|
const mode = bsSheetEl.getAttribute("data-mode");
|
||||||
|
const bodyEl = window.document.querySelector("body");
|
||||||
|
if (mode === "dark") {
|
||||||
|
bodyEl.classList.add("quarto-dark");
|
||||||
|
bodyEl.classList.remove("quarto-light");
|
||||||
|
} else {
|
||||||
|
bodyEl.classList.add("quarto-light");
|
||||||
|
bodyEl.classList.remove("quarto-dark");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const toggleBodyColorPrimary = () => {
|
||||||
|
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
|
||||||
|
if (bsSheetEl) {
|
||||||
|
toggleBodyColorMode(bsSheetEl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toggleBodyColorPrimary();
|
||||||
|
const isCodeAnnotation = (el) => {
|
||||||
|
for (const clz of el.classList) {
|
||||||
|
if (clz.startsWith('code-annotation-')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const onCopySuccess = function(e) {
|
||||||
|
// button target
|
||||||
|
const button = e.trigger;
|
||||||
|
// don't keep focus
|
||||||
|
button.blur();
|
||||||
|
// flash "checked"
|
||||||
|
button.classList.add('code-copy-button-checked');
|
||||||
|
var currentTitle = button.getAttribute("title");
|
||||||
|
button.setAttribute("title", "Copied!");
|
||||||
|
let tooltip;
|
||||||
|
if (window.bootstrap) {
|
||||||
|
button.setAttribute("data-bs-toggle", "tooltip");
|
||||||
|
button.setAttribute("data-bs-placement", "left");
|
||||||
|
button.setAttribute("data-bs-title", "Copied!");
|
||||||
|
tooltip = new bootstrap.Tooltip(button,
|
||||||
|
{ trigger: "manual",
|
||||||
|
customClass: "code-copy-button-tooltip",
|
||||||
|
offset: [0, -8]});
|
||||||
|
tooltip.show();
|
||||||
|
}
|
||||||
|
setTimeout(function() {
|
||||||
|
if (tooltip) {
|
||||||
|
tooltip.hide();
|
||||||
|
button.removeAttribute("data-bs-title");
|
||||||
|
button.removeAttribute("data-bs-toggle");
|
||||||
|
button.removeAttribute("data-bs-placement");
|
||||||
|
}
|
||||||
|
button.setAttribute("title", currentTitle);
|
||||||
|
button.classList.remove('code-copy-button-checked');
|
||||||
|
}, 1000);
|
||||||
|
// clear code selection
|
||||||
|
e.clearSelection();
|
||||||
|
}
|
||||||
|
const getTextToCopy = function(trigger) {
|
||||||
|
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
||||||
|
for (const childEl of codeEl.children) {
|
||||||
|
if (isCodeAnnotation(childEl)) {
|
||||||
|
childEl.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return codeEl.innerText;
|
||||||
|
}
|
||||||
|
const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
|
||||||
|
text: getTextToCopy
|
||||||
|
});
|
||||||
|
clipboard.on('success', onCopySuccess);
|
||||||
|
if (window.document.getElementById('quarto-embedded-source-code-modal')) {
|
||||||
|
// For code content inside modals, clipBoardJS needs to be initialized with a container option
|
||||||
|
// TODO: Check when it could be a function (https://github.com/zenorocha/clipboard.js/issues/860)
|
||||||
|
const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
|
||||||
|
text: getTextToCopy,
|
||||||
|
container: window.document.getElementById('quarto-embedded-source-code-modal')
|
||||||
|
});
|
||||||
|
clipboardModal.on('success', onCopySuccess);
|
||||||
|
}
|
||||||
|
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
|
||||||
|
var mailtoRegex = new RegExp(/^mailto:/);
|
||||||
|
var filterRegex = new RegExp('/' + window.location.host + '/');
|
||||||
|
var isInternal = (href) => {
|
||||||
|
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
|
||||||
|
}
|
||||||
|
// Inspect non-navigation links and adorn them if external
|
||||||
|
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
|
||||||
|
for (var i=0; i<links.length; i++) {
|
||||||
|
const link = links[i];
|
||||||
|
if (!isInternal(link.href)) {
|
||||||
|
// undo the damage that might have been done by quarto-nav.js in the case of
|
||||||
|
// links that we want to consider external
|
||||||
|
if (link.dataset.originalHref !== undefined) {
|
||||||
|
link.href = link.dataset.originalHref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
|
||||||
|
const config = {
|
||||||
|
allowHTML: true,
|
||||||
|
maxWidth: 500,
|
||||||
|
delay: 100,
|
||||||
|
arrow: false,
|
||||||
|
appendTo: function(el) {
|
||||||
|
return el.parentElement;
|
||||||
|
},
|
||||||
|
interactive: true,
|
||||||
|
interactiveBorder: 10,
|
||||||
|
theme: 'quarto',
|
||||||
|
placement: 'bottom-start',
|
||||||
|
};
|
||||||
|
if (contentFn) {
|
||||||
|
config.content = contentFn;
|
||||||
|
}
|
||||||
|
if (onTriggerFn) {
|
||||||
|
config.onTrigger = onTriggerFn;
|
||||||
|
}
|
||||||
|
if (onUntriggerFn) {
|
||||||
|
config.onUntrigger = onUntriggerFn;
|
||||||
|
}
|
||||||
|
window.tippy(el, config);
|
||||||
|
}
|
||||||
|
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
||||||
|
for (var i=0; i<noterefs.length; i++) {
|
||||||
|
const ref = noterefs[i];
|
||||||
|
tippyHover(ref, function() {
|
||||||
|
// use id or data attribute instead here
|
||||||
|
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
|
||||||
|
try { href = new URL(href).hash; } catch {}
|
||||||
|
const id = href.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
|
return note.innerHTML;
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const xrefs = window.document.querySelectorAll('a.quarto-xref');
|
||||||
|
const processXRef = (id, note) => {
|
||||||
|
// Strip column container classes
|
||||||
|
const stripColumnClz = (el) => {
|
||||||
|
el.classList.remove("page-full", "page-columns");
|
||||||
|
if (el.children) {
|
||||||
|
for (const child of el.children) {
|
||||||
|
stripColumnClz(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stripColumnClz(note)
|
||||||
|
if (id === null || id.startsWith('sec-')) {
|
||||||
|
// Special case sections, only their first couple elements
|
||||||
|
const container = document.createElement("div");
|
||||||
|
if (note.children && note.children.length > 2) {
|
||||||
|
container.appendChild(note.children[0].cloneNode(true));
|
||||||
|
for (let i = 1; i < note.children.length; i++) {
|
||||||
|
const child = note.children[i];
|
||||||
|
if (child.tagName === "P" && child.innerText === "") {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
container.appendChild(child.cloneNode(true));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(container);
|
||||||
|
}
|
||||||
|
return container.innerHTML
|
||||||
|
} else {
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Remove any anchor links if they are present
|
||||||
|
const anchorLink = note.querySelector('a.anchorjs-link');
|
||||||
|
if (anchorLink) {
|
||||||
|
anchorLink.remove();
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
// TODO in 1.5, we should make sure this works without a callout special case
|
||||||
|
if (note.classList.contains("callout")) {
|
||||||
|
return note.outerHTML;
|
||||||
|
} else {
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i=0; i<xrefs.length; i++) {
|
||||||
|
const xref = xrefs[i];
|
||||||
|
tippyHover(xref, undefined, function(instance) {
|
||||||
|
instance.disable();
|
||||||
|
let url = xref.getAttribute('href');
|
||||||
|
let hash = undefined;
|
||||||
|
if (url.startsWith('#')) {
|
||||||
|
hash = url;
|
||||||
|
} else {
|
||||||
|
try { hash = new URL(url).hash; } catch {}
|
||||||
|
}
|
||||||
|
if (hash) {
|
||||||
|
const id = hash.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
try {
|
||||||
|
const html = processXRef(id, note.cloneNode(true));
|
||||||
|
instance.setContent(html);
|
||||||
|
} finally {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch this
|
||||||
|
fetch(url.split('#')[0])
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
const html = processXRef(id, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch a full url (with no hash to target)
|
||||||
|
// This is a special case and we should probably do some content thinning / targeting
|
||||||
|
fetch(url)
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.querySelector('main.content');
|
||||||
|
if (note !== null) {
|
||||||
|
// This should only happen for chapter cross references
|
||||||
|
// (since there is no id in the URL)
|
||||||
|
// remove the first header
|
||||||
|
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
|
||||||
|
note.children[0].remove();
|
||||||
|
}
|
||||||
|
const html = processXRef(null, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, function(instance) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let selectedAnnoteEl;
|
||||||
|
const selectorForAnnotation = ( cell, annotation) => {
|
||||||
|
let cellAttr = 'data-code-cell="' + cell + '"';
|
||||||
|
let lineAttr = 'data-code-annotation="' + annotation + '"';
|
||||||
|
const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
|
||||||
|
return selector;
|
||||||
|
}
|
||||||
|
const selectCodeLines = (annoteEl) => {
|
||||||
|
const doc = window.document;
|
||||||
|
const targetCell = annoteEl.getAttribute("data-target-cell");
|
||||||
|
const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
|
||||||
|
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
|
||||||
|
const lines = annoteSpan.getAttribute("data-code-lines").split(",");
|
||||||
|
const lineIds = lines.map((line) => {
|
||||||
|
return targetCell + "-" + line;
|
||||||
|
})
|
||||||
|
let top = null;
|
||||||
|
let height = null;
|
||||||
|
let parent = null;
|
||||||
|
if (lineIds.length > 0) {
|
||||||
|
//compute the position of the single el (top and bottom and make a div)
|
||||||
|
const el = window.document.getElementById(lineIds[0]);
|
||||||
|
top = el.offsetTop;
|
||||||
|
height = el.offsetHeight;
|
||||||
|
parent = el.parentElement.parentElement;
|
||||||
|
if (lineIds.length > 1) {
|
||||||
|
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
|
||||||
|
const bottom = lastEl.offsetTop + lastEl.offsetHeight;
|
||||||
|
height = bottom - top;
|
||||||
|
}
|
||||||
|
if (top !== null && height !== null && parent !== null) {
|
||||||
|
// cook up a div (if necessary) and position it
|
||||||
|
let div = window.document.getElementById("code-annotation-line-highlight");
|
||||||
|
if (div === null) {
|
||||||
|
div = window.document.createElement("div");
|
||||||
|
div.setAttribute("id", "code-annotation-line-highlight");
|
||||||
|
div.style.position = 'absolute';
|
||||||
|
parent.appendChild(div);
|
||||||
|
}
|
||||||
|
div.style.top = top - 2 + "px";
|
||||||
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
|
if (gutterDiv === null) {
|
||||||
|
gutterDiv = window.document.createElement("div");
|
||||||
|
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
|
||||||
|
gutterDiv.style.position = 'absolute';
|
||||||
|
const codeCell = window.document.getElementById(targetCell);
|
||||||
|
const gutter = codeCell.querySelector('.code-annotation-gutter');
|
||||||
|
gutter.appendChild(gutterDiv);
|
||||||
|
}
|
||||||
|
gutterDiv.style.top = top - 2 + "px";
|
||||||
|
gutterDiv.style.height = height + 4 + "px";
|
||||||
|
}
|
||||||
|
selectedAnnoteEl = annoteEl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const unselectCodeLines = () => {
|
||||||
|
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
|
||||||
|
elementsIds.forEach((elId) => {
|
||||||
|
const div = window.document.getElementById(elId);
|
||||||
|
if (div) {
|
||||||
|
div.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
selectedAnnoteEl = undefined;
|
||||||
|
};
|
||||||
|
// Handle positioning of the toggle
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
throttle(() => {
|
||||||
|
elRect = undefined;
|
||||||
|
if (selectedAnnoteEl) {
|
||||||
|
selectCodeLines(selectedAnnoteEl);
|
||||||
|
}
|
||||||
|
}, 10)
|
||||||
|
);
|
||||||
|
function throttle(fn, ms) {
|
||||||
|
let throttle = false;
|
||||||
|
let timer;
|
||||||
|
return (...args) => {
|
||||||
|
if(!throttle) { // first call gets through
|
||||||
|
fn.apply(this, args);
|
||||||
|
throttle = true;
|
||||||
|
} else { // all the others get throttled
|
||||||
|
if(timer) clearTimeout(timer); // cancel #2
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
fn.apply(this, args);
|
||||||
|
timer = throttle = false;
|
||||||
|
}, ms);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Attach click handler to the DT
|
||||||
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
|
for (const annoteDlNode of annoteDls) {
|
||||||
|
annoteDlNode.addEventListener('click', (event) => {
|
||||||
|
const clickedEl = event.target;
|
||||||
|
if (clickedEl !== selectedAnnoteEl) {
|
||||||
|
unselectCodeLines();
|
||||||
|
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
|
||||||
|
if (activeEl) {
|
||||||
|
activeEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
selectCodeLines(clickedEl);
|
||||||
|
clickedEl.classList.add('code-annotation-active');
|
||||||
|
} else {
|
||||||
|
// Unselect the line
|
||||||
|
unselectCodeLines();
|
||||||
|
clickedEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const findCites = (el) => {
|
||||||
|
const parentEl = el.parentElement;
|
||||||
|
if (parentEl) {
|
||||||
|
const cites = parentEl.dataset.cites;
|
||||||
|
if (cites) {
|
||||||
|
return {
|
||||||
|
el,
|
||||||
|
cites: cites.split(' ')
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return findCites(el.parentElement)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
|
||||||
|
for (var i=0; i<bibliorefs.length; i++) {
|
||||||
|
const ref = bibliorefs[i];
|
||||||
|
const citeInfo = findCites(ref);
|
||||||
|
if (citeInfo) {
|
||||||
|
tippyHover(citeInfo.el, function() {
|
||||||
|
var popup = window.document.createElement('div');
|
||||||
|
citeInfo.cites.forEach(function(cite) {
|
||||||
|
var citeDiv = window.document.createElement('div');
|
||||||
|
citeDiv.classList.add('hanging-indent');
|
||||||
|
citeDiv.classList.add('csl-entry');
|
||||||
|
var biblioDiv = window.document.getElementById('ref-' + cite);
|
||||||
|
if (biblioDiv) {
|
||||||
|
citeDiv.innerHTML = biblioDiv.innerHTML;
|
||||||
|
}
|
||||||
|
popup.appendChild(citeDiv);
|
||||||
|
});
|
||||||
|
return popup.innerHTML;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div> <!-- /content -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body></html>
|
||||||
570
docs/interests.html
Normal file
570
docs/interests.html
Normal file
|
|
@ -0,0 +1,570 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="generator" content="quarto-1.5.57">
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||||||
|
|
||||||
|
|
||||||
|
<title>Personnal interests – Louis Lacoste</title>
|
||||||
|
<style>
|
||||||
|
code{white-space: pre-wrap;}
|
||||||
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||||
|
div.column{flex: auto; overflow-x: auto;}
|
||||||
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||||
|
ul.task-list{list-style: none;}
|
||||||
|
ul.task-list li input[type="checkbox"] {
|
||||||
|
width: 0.8em;
|
||||||
|
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="site_libs/quarto-nav/quarto-nav.js"></script>
|
||||||
|
<script src="site_libs/quarto-nav/headroom.min.js"></script>
|
||||||
|
<script src="site_libs/clipboard/clipboard.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/fuse.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/quarto-search.js"></script>
|
||||||
|
<meta name="quarto:offset" content="./">
|
||||||
|
<script src="site_libs/quarto-html/quarto.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/popper.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/anchor.min.js"></script>
|
||||||
|
<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
|
||||||
|
<script src="site_libs/bootstrap/bootstrap.min.js"></script>
|
||||||
|
<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
|
||||||
|
<script id="quarto-search-options" type="application/json">{
|
||||||
|
"location": "navbar",
|
||||||
|
"copy-button": false,
|
||||||
|
"collapse-after": 3,
|
||||||
|
"panel-placement": "end",
|
||||||
|
"type": "overlay",
|
||||||
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
|
"language": {
|
||||||
|
"search-no-results-text": "No results",
|
||||||
|
"search-matching-documents-text": "matching documents",
|
||||||
|
"search-copy-link-title": "Copy link to search",
|
||||||
|
"search-hide-matches-text": "Hide additional matches",
|
||||||
|
"search-more-match-text": "more match in this document",
|
||||||
|
"search-more-matches-text": "more matches in this document",
|
||||||
|
"search-clear-button-title": "Clear",
|
||||||
|
"search-text-placeholder": "",
|
||||||
|
"search-detached-cancel-button-title": "Cancel",
|
||||||
|
"search-submit-button-title": "Submit",
|
||||||
|
"search-label": "Search"
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="nav-fixed">
|
||||||
|
|
||||||
|
<div id="quarto-search-results"></div>
|
||||||
|
<header id="quarto-header" class="headroom fixed-top">
|
||||||
|
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
|
||||||
|
<div class="navbar-container container-fluid">
|
||||||
|
<div class="navbar-brand-container mx-auto">
|
||||||
|
<a class="navbar-brand" href="./index.html">
|
||||||
|
<span class="navbar-title">Louis Lacoste</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="quarto-search" class="" title="Search"></div>
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./index.html">
|
||||||
|
<span class="menu-text">Home</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./about.html">
|
||||||
|
<span class="menu-text">About me</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" href="./interests.html" aria-current="page">
|
||||||
|
<span class="menu-text">Personnal interests</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
|
<div class="quarto-navbar-tools">
|
||||||
|
</div>
|
||||||
|
</div> <!-- /container-fluid -->
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<!-- content -->
|
||||||
|
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
|
||||||
|
<!-- sidebar -->
|
||||||
|
<!-- margin-sidebar -->
|
||||||
|
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar zindex-bottom">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- main -->
|
||||||
|
<main class="content" id="quarto-document-content">
|
||||||
|
|
||||||
|
<header id="title-block-header" class="quarto-title-block default">
|
||||||
|
<div class="quarto-title">
|
||||||
|
<h1 class="title">Personnal interests</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="quarto-title-meta">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</header>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</main> <!-- /main -->
|
||||||
|
<script id="quarto-html-after-body" type="application/javascript">
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
const toggleBodyColorMode = (bsSheetEl) => {
|
||||||
|
const mode = bsSheetEl.getAttribute("data-mode");
|
||||||
|
const bodyEl = window.document.querySelector("body");
|
||||||
|
if (mode === "dark") {
|
||||||
|
bodyEl.classList.add("quarto-dark");
|
||||||
|
bodyEl.classList.remove("quarto-light");
|
||||||
|
} else {
|
||||||
|
bodyEl.classList.add("quarto-light");
|
||||||
|
bodyEl.classList.remove("quarto-dark");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const toggleBodyColorPrimary = () => {
|
||||||
|
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
|
||||||
|
if (bsSheetEl) {
|
||||||
|
toggleBodyColorMode(bsSheetEl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toggleBodyColorPrimary();
|
||||||
|
const icon = "";
|
||||||
|
const anchorJS = new window.AnchorJS();
|
||||||
|
anchorJS.options = {
|
||||||
|
placement: 'right',
|
||||||
|
icon: icon
|
||||||
|
};
|
||||||
|
anchorJS.add('.anchored');
|
||||||
|
const isCodeAnnotation = (el) => {
|
||||||
|
for (const clz of el.classList) {
|
||||||
|
if (clz.startsWith('code-annotation-')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const onCopySuccess = function(e) {
|
||||||
|
// button target
|
||||||
|
const button = e.trigger;
|
||||||
|
// don't keep focus
|
||||||
|
button.blur();
|
||||||
|
// flash "checked"
|
||||||
|
button.classList.add('code-copy-button-checked');
|
||||||
|
var currentTitle = button.getAttribute("title");
|
||||||
|
button.setAttribute("title", "Copied!");
|
||||||
|
let tooltip;
|
||||||
|
if (window.bootstrap) {
|
||||||
|
button.setAttribute("data-bs-toggle", "tooltip");
|
||||||
|
button.setAttribute("data-bs-placement", "left");
|
||||||
|
button.setAttribute("data-bs-title", "Copied!");
|
||||||
|
tooltip = new bootstrap.Tooltip(button,
|
||||||
|
{ trigger: "manual",
|
||||||
|
customClass: "code-copy-button-tooltip",
|
||||||
|
offset: [0, -8]});
|
||||||
|
tooltip.show();
|
||||||
|
}
|
||||||
|
setTimeout(function() {
|
||||||
|
if (tooltip) {
|
||||||
|
tooltip.hide();
|
||||||
|
button.removeAttribute("data-bs-title");
|
||||||
|
button.removeAttribute("data-bs-toggle");
|
||||||
|
button.removeAttribute("data-bs-placement");
|
||||||
|
}
|
||||||
|
button.setAttribute("title", currentTitle);
|
||||||
|
button.classList.remove('code-copy-button-checked');
|
||||||
|
}, 1000);
|
||||||
|
// clear code selection
|
||||||
|
e.clearSelection();
|
||||||
|
}
|
||||||
|
const getTextToCopy = function(trigger) {
|
||||||
|
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
||||||
|
for (const childEl of codeEl.children) {
|
||||||
|
if (isCodeAnnotation(childEl)) {
|
||||||
|
childEl.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return codeEl.innerText;
|
||||||
|
}
|
||||||
|
const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
|
||||||
|
text: getTextToCopy
|
||||||
|
});
|
||||||
|
clipboard.on('success', onCopySuccess);
|
||||||
|
if (window.document.getElementById('quarto-embedded-source-code-modal')) {
|
||||||
|
// For code content inside modals, clipBoardJS needs to be initialized with a container option
|
||||||
|
// TODO: Check when it could be a function (https://github.com/zenorocha/clipboard.js/issues/860)
|
||||||
|
const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
|
||||||
|
text: getTextToCopy,
|
||||||
|
container: window.document.getElementById('quarto-embedded-source-code-modal')
|
||||||
|
});
|
||||||
|
clipboardModal.on('success', onCopySuccess);
|
||||||
|
}
|
||||||
|
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
|
||||||
|
var mailtoRegex = new RegExp(/^mailto:/);
|
||||||
|
var filterRegex = new RegExp('/' + window.location.host + '/');
|
||||||
|
var isInternal = (href) => {
|
||||||
|
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
|
||||||
|
}
|
||||||
|
// Inspect non-navigation links and adorn them if external
|
||||||
|
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
|
||||||
|
for (var i=0; i<links.length; i++) {
|
||||||
|
const link = links[i];
|
||||||
|
if (!isInternal(link.href)) {
|
||||||
|
// undo the damage that might have been done by quarto-nav.js in the case of
|
||||||
|
// links that we want to consider external
|
||||||
|
if (link.dataset.originalHref !== undefined) {
|
||||||
|
link.href = link.dataset.originalHref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
|
||||||
|
const config = {
|
||||||
|
allowHTML: true,
|
||||||
|
maxWidth: 500,
|
||||||
|
delay: 100,
|
||||||
|
arrow: false,
|
||||||
|
appendTo: function(el) {
|
||||||
|
return el.parentElement;
|
||||||
|
},
|
||||||
|
interactive: true,
|
||||||
|
interactiveBorder: 10,
|
||||||
|
theme: 'quarto',
|
||||||
|
placement: 'bottom-start',
|
||||||
|
};
|
||||||
|
if (contentFn) {
|
||||||
|
config.content = contentFn;
|
||||||
|
}
|
||||||
|
if (onTriggerFn) {
|
||||||
|
config.onTrigger = onTriggerFn;
|
||||||
|
}
|
||||||
|
if (onUntriggerFn) {
|
||||||
|
config.onUntrigger = onUntriggerFn;
|
||||||
|
}
|
||||||
|
window.tippy(el, config);
|
||||||
|
}
|
||||||
|
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
||||||
|
for (var i=0; i<noterefs.length; i++) {
|
||||||
|
const ref = noterefs[i];
|
||||||
|
tippyHover(ref, function() {
|
||||||
|
// use id or data attribute instead here
|
||||||
|
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
|
||||||
|
try { href = new URL(href).hash; } catch {}
|
||||||
|
const id = href.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
|
return note.innerHTML;
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const xrefs = window.document.querySelectorAll('a.quarto-xref');
|
||||||
|
const processXRef = (id, note) => {
|
||||||
|
// Strip column container classes
|
||||||
|
const stripColumnClz = (el) => {
|
||||||
|
el.classList.remove("page-full", "page-columns");
|
||||||
|
if (el.children) {
|
||||||
|
for (const child of el.children) {
|
||||||
|
stripColumnClz(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stripColumnClz(note)
|
||||||
|
if (id === null || id.startsWith('sec-')) {
|
||||||
|
// Special case sections, only their first couple elements
|
||||||
|
const container = document.createElement("div");
|
||||||
|
if (note.children && note.children.length > 2) {
|
||||||
|
container.appendChild(note.children[0].cloneNode(true));
|
||||||
|
for (let i = 1; i < note.children.length; i++) {
|
||||||
|
const child = note.children[i];
|
||||||
|
if (child.tagName === "P" && child.innerText === "") {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
container.appendChild(child.cloneNode(true));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(container);
|
||||||
|
}
|
||||||
|
return container.innerHTML
|
||||||
|
} else {
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Remove any anchor links if they are present
|
||||||
|
const anchorLink = note.querySelector('a.anchorjs-link');
|
||||||
|
if (anchorLink) {
|
||||||
|
anchorLink.remove();
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
// TODO in 1.5, we should make sure this works without a callout special case
|
||||||
|
if (note.classList.contains("callout")) {
|
||||||
|
return note.outerHTML;
|
||||||
|
} else {
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i=0; i<xrefs.length; i++) {
|
||||||
|
const xref = xrefs[i];
|
||||||
|
tippyHover(xref, undefined, function(instance) {
|
||||||
|
instance.disable();
|
||||||
|
let url = xref.getAttribute('href');
|
||||||
|
let hash = undefined;
|
||||||
|
if (url.startsWith('#')) {
|
||||||
|
hash = url;
|
||||||
|
} else {
|
||||||
|
try { hash = new URL(url).hash; } catch {}
|
||||||
|
}
|
||||||
|
if (hash) {
|
||||||
|
const id = hash.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
try {
|
||||||
|
const html = processXRef(id, note.cloneNode(true));
|
||||||
|
instance.setContent(html);
|
||||||
|
} finally {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch this
|
||||||
|
fetch(url.split('#')[0])
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
const html = processXRef(id, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch a full url (with no hash to target)
|
||||||
|
// This is a special case and we should probably do some content thinning / targeting
|
||||||
|
fetch(url)
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.querySelector('main.content');
|
||||||
|
if (note !== null) {
|
||||||
|
// This should only happen for chapter cross references
|
||||||
|
// (since there is no id in the URL)
|
||||||
|
// remove the first header
|
||||||
|
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
|
||||||
|
note.children[0].remove();
|
||||||
|
}
|
||||||
|
const html = processXRef(null, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, function(instance) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let selectedAnnoteEl;
|
||||||
|
const selectorForAnnotation = ( cell, annotation) => {
|
||||||
|
let cellAttr = 'data-code-cell="' + cell + '"';
|
||||||
|
let lineAttr = 'data-code-annotation="' + annotation + '"';
|
||||||
|
const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
|
||||||
|
return selector;
|
||||||
|
}
|
||||||
|
const selectCodeLines = (annoteEl) => {
|
||||||
|
const doc = window.document;
|
||||||
|
const targetCell = annoteEl.getAttribute("data-target-cell");
|
||||||
|
const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
|
||||||
|
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
|
||||||
|
const lines = annoteSpan.getAttribute("data-code-lines").split(",");
|
||||||
|
const lineIds = lines.map((line) => {
|
||||||
|
return targetCell + "-" + line;
|
||||||
|
})
|
||||||
|
let top = null;
|
||||||
|
let height = null;
|
||||||
|
let parent = null;
|
||||||
|
if (lineIds.length > 0) {
|
||||||
|
//compute the position of the single el (top and bottom and make a div)
|
||||||
|
const el = window.document.getElementById(lineIds[0]);
|
||||||
|
top = el.offsetTop;
|
||||||
|
height = el.offsetHeight;
|
||||||
|
parent = el.parentElement.parentElement;
|
||||||
|
if (lineIds.length > 1) {
|
||||||
|
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
|
||||||
|
const bottom = lastEl.offsetTop + lastEl.offsetHeight;
|
||||||
|
height = bottom - top;
|
||||||
|
}
|
||||||
|
if (top !== null && height !== null && parent !== null) {
|
||||||
|
// cook up a div (if necessary) and position it
|
||||||
|
let div = window.document.getElementById("code-annotation-line-highlight");
|
||||||
|
if (div === null) {
|
||||||
|
div = window.document.createElement("div");
|
||||||
|
div.setAttribute("id", "code-annotation-line-highlight");
|
||||||
|
div.style.position = 'absolute';
|
||||||
|
parent.appendChild(div);
|
||||||
|
}
|
||||||
|
div.style.top = top - 2 + "px";
|
||||||
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
|
if (gutterDiv === null) {
|
||||||
|
gutterDiv = window.document.createElement("div");
|
||||||
|
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
|
||||||
|
gutterDiv.style.position = 'absolute';
|
||||||
|
const codeCell = window.document.getElementById(targetCell);
|
||||||
|
const gutter = codeCell.querySelector('.code-annotation-gutter');
|
||||||
|
gutter.appendChild(gutterDiv);
|
||||||
|
}
|
||||||
|
gutterDiv.style.top = top - 2 + "px";
|
||||||
|
gutterDiv.style.height = height + 4 + "px";
|
||||||
|
}
|
||||||
|
selectedAnnoteEl = annoteEl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const unselectCodeLines = () => {
|
||||||
|
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
|
||||||
|
elementsIds.forEach((elId) => {
|
||||||
|
const div = window.document.getElementById(elId);
|
||||||
|
if (div) {
|
||||||
|
div.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
selectedAnnoteEl = undefined;
|
||||||
|
};
|
||||||
|
// Handle positioning of the toggle
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
throttle(() => {
|
||||||
|
elRect = undefined;
|
||||||
|
if (selectedAnnoteEl) {
|
||||||
|
selectCodeLines(selectedAnnoteEl);
|
||||||
|
}
|
||||||
|
}, 10)
|
||||||
|
);
|
||||||
|
function throttle(fn, ms) {
|
||||||
|
let throttle = false;
|
||||||
|
let timer;
|
||||||
|
return (...args) => {
|
||||||
|
if(!throttle) { // first call gets through
|
||||||
|
fn.apply(this, args);
|
||||||
|
throttle = true;
|
||||||
|
} else { // all the others get throttled
|
||||||
|
if(timer) clearTimeout(timer); // cancel #2
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
fn.apply(this, args);
|
||||||
|
timer = throttle = false;
|
||||||
|
}, ms);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Attach click handler to the DT
|
||||||
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
|
for (const annoteDlNode of annoteDls) {
|
||||||
|
annoteDlNode.addEventListener('click', (event) => {
|
||||||
|
const clickedEl = event.target;
|
||||||
|
if (clickedEl !== selectedAnnoteEl) {
|
||||||
|
unselectCodeLines();
|
||||||
|
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
|
||||||
|
if (activeEl) {
|
||||||
|
activeEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
selectCodeLines(clickedEl);
|
||||||
|
clickedEl.classList.add('code-annotation-active');
|
||||||
|
} else {
|
||||||
|
// Unselect the line
|
||||||
|
unselectCodeLines();
|
||||||
|
clickedEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const findCites = (el) => {
|
||||||
|
const parentEl = el.parentElement;
|
||||||
|
if (parentEl) {
|
||||||
|
const cites = parentEl.dataset.cites;
|
||||||
|
if (cites) {
|
||||||
|
return {
|
||||||
|
el,
|
||||||
|
cites: cites.split(' ')
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return findCites(el.parentElement)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
|
||||||
|
for (var i=0; i<bibliorefs.length; i++) {
|
||||||
|
const ref = bibliorefs[i];
|
||||||
|
const citeInfo = findCites(ref);
|
||||||
|
if (citeInfo) {
|
||||||
|
tippyHover(citeInfo.el, function() {
|
||||||
|
var popup = window.document.createElement('div');
|
||||||
|
citeInfo.cites.forEach(function(cite) {
|
||||||
|
var citeDiv = window.document.createElement('div');
|
||||||
|
citeDiv.classList.add('hanging-indent');
|
||||||
|
citeDiv.classList.add('csl-entry');
|
||||||
|
var biblioDiv = window.document.getElementById('ref-' + cite);
|
||||||
|
if (biblioDiv) {
|
||||||
|
citeDiv.innerHTML = biblioDiv.innerHTML;
|
||||||
|
}
|
||||||
|
popup.appendChild(citeDiv);
|
||||||
|
});
|
||||||
|
return popup.innerHTML;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div> <!-- /content -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body></html>
|
||||||
8
docs/listings.json
Normal file
8
docs/listings.json
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"listing": "/posts.html",
|
||||||
|
"items": [
|
||||||
|
"/posts/test.html"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
BIN
docs/media/photo.jpg
Normal file
BIN
docs/media/photo.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
663
docs/posts.html
Normal file
663
docs/posts.html
Normal file
|
|
@ -0,0 +1,663 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="generator" content="quarto-1.5.57">
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||||||
|
|
||||||
|
|
||||||
|
<title>Posts – Louis Lacoste</title>
|
||||||
|
<style>
|
||||||
|
code{white-space: pre-wrap;}
|
||||||
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||||
|
div.column{flex: auto; overflow-x: auto;}
|
||||||
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||||
|
ul.task-list{list-style: none;}
|
||||||
|
ul.task-list li input[type="checkbox"] {
|
||||||
|
width: 0.8em;
|
||||||
|
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="site_libs/quarto-nav/quarto-nav.js"></script>
|
||||||
|
<script src="site_libs/quarto-nav/headroom.min.js"></script>
|
||||||
|
<script src="site_libs/clipboard/clipboard.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/fuse.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-search/quarto-search.js"></script>
|
||||||
|
<meta name="quarto:offset" content="./">
|
||||||
|
<script src="site_libs/quarto-listing/list.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-listing/quarto-listing.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/quarto.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/popper.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
|
||||||
|
<script src="site_libs/quarto-html/anchor.min.js"></script>
|
||||||
|
<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
|
||||||
|
<script src="site_libs/bootstrap/bootstrap.min.js"></script>
|
||||||
|
<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
|
||||||
|
<link href="site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
|
||||||
|
<script id="quarto-search-options" type="application/json">{
|
||||||
|
"location": "navbar",
|
||||||
|
"copy-button": false,
|
||||||
|
"collapse-after": 3,
|
||||||
|
"panel-placement": "end",
|
||||||
|
"type": "overlay",
|
||||||
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
|
"language": {
|
||||||
|
"search-no-results-text": "No results",
|
||||||
|
"search-matching-documents-text": "matching documents",
|
||||||
|
"search-copy-link-title": "Copy link to search",
|
||||||
|
"search-hide-matches-text": "Hide additional matches",
|
||||||
|
"search-more-match-text": "more match in this document",
|
||||||
|
"search-more-matches-text": "more matches in this document",
|
||||||
|
"search-clear-button-title": "Clear",
|
||||||
|
"search-text-placeholder": "",
|
||||||
|
"search-detached-cancel-button-title": "Cancel",
|
||||||
|
"search-submit-button-title": "Submit",
|
||||||
|
"search-label": "Search"
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||||
|
const listingTargetEl = window.document.querySelector('#listing-listing .list');
|
||||||
|
if (!listingTargetEl) {
|
||||||
|
// No listing discovered, do not attach.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
valueNames: ['listing-title','listing-author','listing-image','listing-description','listing-categories',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }],
|
||||||
|
|
||||||
|
searchColumns: ["listing-title","listing-author","listing-image","listing-description","listing-categories"],
|
||||||
|
};
|
||||||
|
|
||||||
|
window['quarto-listings'] = window['quarto-listings'] || {};
|
||||||
|
window['quarto-listings']['listing-listing'] = new List('listing-listing', options);
|
||||||
|
|
||||||
|
if (window['quarto-listing-loaded']) {
|
||||||
|
window['quarto-listing-loaded']();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener('hashchange',() => {
|
||||||
|
if (window['quarto-listing-loaded']) {
|
||||||
|
window['quarto-listing-loaded']();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js" type="text/javascript"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
const typesetMath = (el) => {
|
||||||
|
if (window.MathJax) {
|
||||||
|
// MathJax Typeset
|
||||||
|
window.MathJax.typeset([el]);
|
||||||
|
} else if (window.katex) {
|
||||||
|
// KaTeX Render
|
||||||
|
var mathElements = el.getElementsByClassName("math");
|
||||||
|
var macros = [];
|
||||||
|
for (var i = 0; i < mathElements.length; i++) {
|
||||||
|
var texText = mathElements[i].firstChild;
|
||||||
|
if (mathElements[i].tagName == "SPAN") {
|
||||||
|
window.katex.render(texText.data, mathElements[i], {
|
||||||
|
displayMode: mathElements[i].classList.contains('display'),
|
||||||
|
throwOnError: false,
|
||||||
|
macros: macros,
|
||||||
|
fleqn: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.Quarto = {
|
||||||
|
typesetMath
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="nav-fixed">
|
||||||
|
|
||||||
|
<div id="quarto-search-results"></div>
|
||||||
|
<header id="quarto-header" class="headroom fixed-top">
|
||||||
|
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
|
||||||
|
<div class="navbar-container container-fluid">
|
||||||
|
<div class="navbar-brand-container mx-auto">
|
||||||
|
<a class="navbar-brand" href="./index.html">
|
||||||
|
<span class="navbar-title">Louis Lacoste</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="quarto-search" class="" title="Search"></div>
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./index.html">
|
||||||
|
<span class="menu-text">Home</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" href="./posts.html" aria-current="page">
|
||||||
|
<span class="menu-text">Posts</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./about.html">
|
||||||
|
<span class="menu-text">About me</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="./interests.html">
|
||||||
|
<span class="menu-text">Personnal interests</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
|
<div class="quarto-navbar-tools">
|
||||||
|
</div>
|
||||||
|
</div> <!-- /container-fluid -->
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<!-- content -->
|
||||||
|
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
|
||||||
|
<!-- sidebar -->
|
||||||
|
<!-- margin-sidebar -->
|
||||||
|
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
|
||||||
|
|
||||||
|
<h5 class="quarto-listing-category-title">Categories</h5><div class="quarto-listing-category category-default"><div class="category" data-category="">All <span class="quarto-category-count">(1)</span></div></div></div>
|
||||||
|
<!-- main -->
|
||||||
|
<main class="content" id="quarto-document-content">
|
||||||
|
|
||||||
|
<header id="title-block-header" class="quarto-title-block default">
|
||||||
|
<div class="quarto-title">
|
||||||
|
<h1 class="title">Posts</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="quarto-title-meta">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</header>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="quarto-listing quarto-listing-container-grid" id="listing-listing">
|
||||||
|
<div class="list grid quarto-listing-cols-3">
|
||||||
|
<div class="g-col-1" data-index="0" data-listing-file-modified-sort="1729765182636" data-listing-reading-time-sort="1" data-listing-word-count-sort="10">
|
||||||
|
<a href="./posts/test.html" class="quarto-grid-link">
|
||||||
|
<div class="quarto-grid-item card h-100 card-left">
|
||||||
|
<p class="card-img-top"><img src="posts/test_files/figure-html/unnamed-chunk-2-1.png" style="height: 150px;" class="thumbnail-image card-img"/></p>
|
||||||
|
<div class="card-body post-contents">
|
||||||
|
<h5 class="no-anchor card-title listing-title">
|
||||||
|
A test post
|
||||||
|
</h5>
|
||||||
|
<div class="card-text listing-description">
|
||||||
|
|
||||||
|
<div class="sourceCode cell-code" id="cb1"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu">library</span>(ggplot2)</span></code></pre></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="card-attribution card-text-small start">
|
||||||
|
<div class="listing-author">
|
||||||
|
Louis Lacoste
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="listing-no-matching d-none">
|
||||||
|
No matching items
|
||||||
|
</div>
|
||||||
|
</div></main> <!-- /main -->
|
||||||
|
<script id="quarto-html-after-body" type="application/javascript">
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
const toggleBodyColorMode = (bsSheetEl) => {
|
||||||
|
const mode = bsSheetEl.getAttribute("data-mode");
|
||||||
|
const bodyEl = window.document.querySelector("body");
|
||||||
|
if (mode === "dark") {
|
||||||
|
bodyEl.classList.add("quarto-dark");
|
||||||
|
bodyEl.classList.remove("quarto-light");
|
||||||
|
} else {
|
||||||
|
bodyEl.classList.add("quarto-light");
|
||||||
|
bodyEl.classList.remove("quarto-dark");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const toggleBodyColorPrimary = () => {
|
||||||
|
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
|
||||||
|
if (bsSheetEl) {
|
||||||
|
toggleBodyColorMode(bsSheetEl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toggleBodyColorPrimary();
|
||||||
|
const icon = "";
|
||||||
|
const anchorJS = new window.AnchorJS();
|
||||||
|
anchorJS.options = {
|
||||||
|
placement: 'right',
|
||||||
|
icon: icon
|
||||||
|
};
|
||||||
|
anchorJS.add('.anchored');
|
||||||
|
const isCodeAnnotation = (el) => {
|
||||||
|
for (const clz of el.classList) {
|
||||||
|
if (clz.startsWith('code-annotation-')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const onCopySuccess = function(e) {
|
||||||
|
// button target
|
||||||
|
const button = e.trigger;
|
||||||
|
// don't keep focus
|
||||||
|
button.blur();
|
||||||
|
// flash "checked"
|
||||||
|
button.classList.add('code-copy-button-checked');
|
||||||
|
var currentTitle = button.getAttribute("title");
|
||||||
|
button.setAttribute("title", "Copied!");
|
||||||
|
let tooltip;
|
||||||
|
if (window.bootstrap) {
|
||||||
|
button.setAttribute("data-bs-toggle", "tooltip");
|
||||||
|
button.setAttribute("data-bs-placement", "left");
|
||||||
|
button.setAttribute("data-bs-title", "Copied!");
|
||||||
|
tooltip = new bootstrap.Tooltip(button,
|
||||||
|
{ trigger: "manual",
|
||||||
|
customClass: "code-copy-button-tooltip",
|
||||||
|
offset: [0, -8]});
|
||||||
|
tooltip.show();
|
||||||
|
}
|
||||||
|
setTimeout(function() {
|
||||||
|
if (tooltip) {
|
||||||
|
tooltip.hide();
|
||||||
|
button.removeAttribute("data-bs-title");
|
||||||
|
button.removeAttribute("data-bs-toggle");
|
||||||
|
button.removeAttribute("data-bs-placement");
|
||||||
|
}
|
||||||
|
button.setAttribute("title", currentTitle);
|
||||||
|
button.classList.remove('code-copy-button-checked');
|
||||||
|
}, 1000);
|
||||||
|
// clear code selection
|
||||||
|
e.clearSelection();
|
||||||
|
}
|
||||||
|
const getTextToCopy = function(trigger) {
|
||||||
|
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
||||||
|
for (const childEl of codeEl.children) {
|
||||||
|
if (isCodeAnnotation(childEl)) {
|
||||||
|
childEl.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return codeEl.innerText;
|
||||||
|
}
|
||||||
|
const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
|
||||||
|
text: getTextToCopy
|
||||||
|
});
|
||||||
|
clipboard.on('success', onCopySuccess);
|
||||||
|
if (window.document.getElementById('quarto-embedded-source-code-modal')) {
|
||||||
|
// For code content inside modals, clipBoardJS needs to be initialized with a container option
|
||||||
|
// TODO: Check when it could be a function (https://github.com/zenorocha/clipboard.js/issues/860)
|
||||||
|
const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
|
||||||
|
text: getTextToCopy,
|
||||||
|
container: window.document.getElementById('quarto-embedded-source-code-modal')
|
||||||
|
});
|
||||||
|
clipboardModal.on('success', onCopySuccess);
|
||||||
|
}
|
||||||
|
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
|
||||||
|
var mailtoRegex = new RegExp(/^mailto:/);
|
||||||
|
var filterRegex = new RegExp('/' + window.location.host + '/');
|
||||||
|
var isInternal = (href) => {
|
||||||
|
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
|
||||||
|
}
|
||||||
|
// Inspect non-navigation links and adorn them if external
|
||||||
|
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
|
||||||
|
for (var i=0; i<links.length; i++) {
|
||||||
|
const link = links[i];
|
||||||
|
if (!isInternal(link.href)) {
|
||||||
|
// undo the damage that might have been done by quarto-nav.js in the case of
|
||||||
|
// links that we want to consider external
|
||||||
|
if (link.dataset.originalHref !== undefined) {
|
||||||
|
link.href = link.dataset.originalHref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
|
||||||
|
const config = {
|
||||||
|
allowHTML: true,
|
||||||
|
maxWidth: 500,
|
||||||
|
delay: 100,
|
||||||
|
arrow: false,
|
||||||
|
appendTo: function(el) {
|
||||||
|
return el.parentElement;
|
||||||
|
},
|
||||||
|
interactive: true,
|
||||||
|
interactiveBorder: 10,
|
||||||
|
theme: 'quarto',
|
||||||
|
placement: 'bottom-start',
|
||||||
|
};
|
||||||
|
if (contentFn) {
|
||||||
|
config.content = contentFn;
|
||||||
|
}
|
||||||
|
if (onTriggerFn) {
|
||||||
|
config.onTrigger = onTriggerFn;
|
||||||
|
}
|
||||||
|
if (onUntriggerFn) {
|
||||||
|
config.onUntrigger = onUntriggerFn;
|
||||||
|
}
|
||||||
|
window.tippy(el, config);
|
||||||
|
}
|
||||||
|
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
||||||
|
for (var i=0; i<noterefs.length; i++) {
|
||||||
|
const ref = noterefs[i];
|
||||||
|
tippyHover(ref, function() {
|
||||||
|
// use id or data attribute instead here
|
||||||
|
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
|
||||||
|
try { href = new URL(href).hash; } catch {}
|
||||||
|
const id = href.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
|
return note.innerHTML;
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const xrefs = window.document.querySelectorAll('a.quarto-xref');
|
||||||
|
const processXRef = (id, note) => {
|
||||||
|
// Strip column container classes
|
||||||
|
const stripColumnClz = (el) => {
|
||||||
|
el.classList.remove("page-full", "page-columns");
|
||||||
|
if (el.children) {
|
||||||
|
for (const child of el.children) {
|
||||||
|
stripColumnClz(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stripColumnClz(note)
|
||||||
|
if (id === null || id.startsWith('sec-')) {
|
||||||
|
// Special case sections, only their first couple elements
|
||||||
|
const container = document.createElement("div");
|
||||||
|
if (note.children && note.children.length > 2) {
|
||||||
|
container.appendChild(note.children[0].cloneNode(true));
|
||||||
|
for (let i = 1; i < note.children.length; i++) {
|
||||||
|
const child = note.children[i];
|
||||||
|
if (child.tagName === "P" && child.innerText === "") {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
container.appendChild(child.cloneNode(true));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(container);
|
||||||
|
}
|
||||||
|
return container.innerHTML
|
||||||
|
} else {
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Remove any anchor links if they are present
|
||||||
|
const anchorLink = note.querySelector('a.anchorjs-link');
|
||||||
|
if (anchorLink) {
|
||||||
|
anchorLink.remove();
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
// TODO in 1.5, we should make sure this works without a callout special case
|
||||||
|
if (note.classList.contains("callout")) {
|
||||||
|
return note.outerHTML;
|
||||||
|
} else {
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i=0; i<xrefs.length; i++) {
|
||||||
|
const xref = xrefs[i];
|
||||||
|
tippyHover(xref, undefined, function(instance) {
|
||||||
|
instance.disable();
|
||||||
|
let url = xref.getAttribute('href');
|
||||||
|
let hash = undefined;
|
||||||
|
if (url.startsWith('#')) {
|
||||||
|
hash = url;
|
||||||
|
} else {
|
||||||
|
try { hash = new URL(url).hash; } catch {}
|
||||||
|
}
|
||||||
|
if (hash) {
|
||||||
|
const id = hash.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
try {
|
||||||
|
const html = processXRef(id, note.cloneNode(true));
|
||||||
|
instance.setContent(html);
|
||||||
|
} finally {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch this
|
||||||
|
fetch(url.split('#')[0])
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
const html = processXRef(id, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch a full url (with no hash to target)
|
||||||
|
// This is a special case and we should probably do some content thinning / targeting
|
||||||
|
fetch(url)
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.querySelector('main.content');
|
||||||
|
if (note !== null) {
|
||||||
|
// This should only happen for chapter cross references
|
||||||
|
// (since there is no id in the URL)
|
||||||
|
// remove the first header
|
||||||
|
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
|
||||||
|
note.children[0].remove();
|
||||||
|
}
|
||||||
|
const html = processXRef(null, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, function(instance) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let selectedAnnoteEl;
|
||||||
|
const selectorForAnnotation = ( cell, annotation) => {
|
||||||
|
let cellAttr = 'data-code-cell="' + cell + '"';
|
||||||
|
let lineAttr = 'data-code-annotation="' + annotation + '"';
|
||||||
|
const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
|
||||||
|
return selector;
|
||||||
|
}
|
||||||
|
const selectCodeLines = (annoteEl) => {
|
||||||
|
const doc = window.document;
|
||||||
|
const targetCell = annoteEl.getAttribute("data-target-cell");
|
||||||
|
const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
|
||||||
|
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
|
||||||
|
const lines = annoteSpan.getAttribute("data-code-lines").split(",");
|
||||||
|
const lineIds = lines.map((line) => {
|
||||||
|
return targetCell + "-" + line;
|
||||||
|
})
|
||||||
|
let top = null;
|
||||||
|
let height = null;
|
||||||
|
let parent = null;
|
||||||
|
if (lineIds.length > 0) {
|
||||||
|
//compute the position of the single el (top and bottom and make a div)
|
||||||
|
const el = window.document.getElementById(lineIds[0]);
|
||||||
|
top = el.offsetTop;
|
||||||
|
height = el.offsetHeight;
|
||||||
|
parent = el.parentElement.parentElement;
|
||||||
|
if (lineIds.length > 1) {
|
||||||
|
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
|
||||||
|
const bottom = lastEl.offsetTop + lastEl.offsetHeight;
|
||||||
|
height = bottom - top;
|
||||||
|
}
|
||||||
|
if (top !== null && height !== null && parent !== null) {
|
||||||
|
// cook up a div (if necessary) and position it
|
||||||
|
let div = window.document.getElementById("code-annotation-line-highlight");
|
||||||
|
if (div === null) {
|
||||||
|
div = window.document.createElement("div");
|
||||||
|
div.setAttribute("id", "code-annotation-line-highlight");
|
||||||
|
div.style.position = 'absolute';
|
||||||
|
parent.appendChild(div);
|
||||||
|
}
|
||||||
|
div.style.top = top - 2 + "px";
|
||||||
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
|
if (gutterDiv === null) {
|
||||||
|
gutterDiv = window.document.createElement("div");
|
||||||
|
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
|
||||||
|
gutterDiv.style.position = 'absolute';
|
||||||
|
const codeCell = window.document.getElementById(targetCell);
|
||||||
|
const gutter = codeCell.querySelector('.code-annotation-gutter');
|
||||||
|
gutter.appendChild(gutterDiv);
|
||||||
|
}
|
||||||
|
gutterDiv.style.top = top - 2 + "px";
|
||||||
|
gutterDiv.style.height = height + 4 + "px";
|
||||||
|
}
|
||||||
|
selectedAnnoteEl = annoteEl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const unselectCodeLines = () => {
|
||||||
|
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
|
||||||
|
elementsIds.forEach((elId) => {
|
||||||
|
const div = window.document.getElementById(elId);
|
||||||
|
if (div) {
|
||||||
|
div.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
selectedAnnoteEl = undefined;
|
||||||
|
};
|
||||||
|
// Handle positioning of the toggle
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
throttle(() => {
|
||||||
|
elRect = undefined;
|
||||||
|
if (selectedAnnoteEl) {
|
||||||
|
selectCodeLines(selectedAnnoteEl);
|
||||||
|
}
|
||||||
|
}, 10)
|
||||||
|
);
|
||||||
|
function throttle(fn, ms) {
|
||||||
|
let throttle = false;
|
||||||
|
let timer;
|
||||||
|
return (...args) => {
|
||||||
|
if(!throttle) { // first call gets through
|
||||||
|
fn.apply(this, args);
|
||||||
|
throttle = true;
|
||||||
|
} else { // all the others get throttled
|
||||||
|
if(timer) clearTimeout(timer); // cancel #2
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
fn.apply(this, args);
|
||||||
|
timer = throttle = false;
|
||||||
|
}, ms);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Attach click handler to the DT
|
||||||
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
|
for (const annoteDlNode of annoteDls) {
|
||||||
|
annoteDlNode.addEventListener('click', (event) => {
|
||||||
|
const clickedEl = event.target;
|
||||||
|
if (clickedEl !== selectedAnnoteEl) {
|
||||||
|
unselectCodeLines();
|
||||||
|
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
|
||||||
|
if (activeEl) {
|
||||||
|
activeEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
selectCodeLines(clickedEl);
|
||||||
|
clickedEl.classList.add('code-annotation-active');
|
||||||
|
} else {
|
||||||
|
// Unselect the line
|
||||||
|
unselectCodeLines();
|
||||||
|
clickedEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const findCites = (el) => {
|
||||||
|
const parentEl = el.parentElement;
|
||||||
|
if (parentEl) {
|
||||||
|
const cites = parentEl.dataset.cites;
|
||||||
|
if (cites) {
|
||||||
|
return {
|
||||||
|
el,
|
||||||
|
cites: cites.split(' ')
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return findCites(el.parentElement)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
|
||||||
|
for (var i=0; i<bibliorefs.length; i++) {
|
||||||
|
const ref = bibliorefs[i];
|
||||||
|
const citeInfo = findCites(ref);
|
||||||
|
if (citeInfo) {
|
||||||
|
tippyHover(citeInfo.el, function() {
|
||||||
|
var popup = window.document.createElement('div');
|
||||||
|
citeInfo.cites.forEach(function(cite) {
|
||||||
|
var citeDiv = window.document.createElement('div');
|
||||||
|
citeDiv.classList.add('hanging-indent');
|
||||||
|
citeDiv.classList.add('csl-entry');
|
||||||
|
var biblioDiv = window.document.getElementById('ref-' + cite);
|
||||||
|
if (biblioDiv) {
|
||||||
|
citeDiv.innerHTML = biblioDiv.innerHTML;
|
||||||
|
}
|
||||||
|
popup.appendChild(citeDiv);
|
||||||
|
});
|
||||||
|
return popup.innerHTML;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div> <!-- /content -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body></html>
|
||||||
642
docs/posts/test.html
Normal file
642
docs/posts/test.html
Normal file
|
|
@ -0,0 +1,642 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="generator" content="quarto-1.5.57">
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||||||
|
|
||||||
|
<meta name="author" content="Louis Lacoste">
|
||||||
|
|
||||||
|
<title>A test post – Louis Lacoste</title>
|
||||||
|
<style>
|
||||||
|
code{white-space: pre-wrap;}
|
||||||
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
||||||
|
div.column{flex: auto; overflow-x: auto;}
|
||||||
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
||||||
|
ul.task-list{list-style: none;}
|
||||||
|
ul.task-list li input[type="checkbox"] {
|
||||||
|
width: 0.8em;
|
||||||
|
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
/* CSS for syntax highlighting */
|
||||||
|
pre > code.sourceCode { white-space: pre; position: relative; }
|
||||||
|
pre > code.sourceCode > span { line-height: 1.25; }
|
||||||
|
pre > code.sourceCode > span:empty { height: 1.2em; }
|
||||||
|
.sourceCode { overflow: visible; }
|
||||||
|
code.sourceCode > span { color: inherit; text-decoration: inherit; }
|
||||||
|
div.sourceCode { margin: 1em 0; }
|
||||||
|
pre.sourceCode { margin: 0; }
|
||||||
|
@media screen {
|
||||||
|
div.sourceCode { overflow: auto; }
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
pre > code.sourceCode { white-space: pre-wrap; }
|
||||||
|
pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; }
|
||||||
|
}
|
||||||
|
pre.numberSource code
|
||||||
|
{ counter-reset: source-line 0; }
|
||||||
|
pre.numberSource code > span
|
||||||
|
{ position: relative; left: -4em; counter-increment: source-line; }
|
||||||
|
pre.numberSource code > span > a:first-child::before
|
||||||
|
{ content: counter(source-line);
|
||||||
|
position: relative; left: -1em; text-align: right; vertical-align: baseline;
|
||||||
|
border: none; display: inline-block;
|
||||||
|
-webkit-touch-callout: none; -webkit-user-select: none;
|
||||||
|
-khtml-user-select: none; -moz-user-select: none;
|
||||||
|
-ms-user-select: none; user-select: none;
|
||||||
|
padding: 0 4px; width: 4em;
|
||||||
|
}
|
||||||
|
pre.numberSource { margin-left: 3em; padding-left: 4px; }
|
||||||
|
div.sourceCode
|
||||||
|
{ }
|
||||||
|
@media screen {
|
||||||
|
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="../site_libs/quarto-nav/quarto-nav.js"></script>
|
||||||
|
<script src="../site_libs/quarto-nav/headroom.min.js"></script>
|
||||||
|
<script src="../site_libs/clipboard/clipboard.min.js"></script>
|
||||||
|
<script src="../site_libs/quarto-search/autocomplete.umd.js"></script>
|
||||||
|
<script src="../site_libs/quarto-search/fuse.min.js"></script>
|
||||||
|
<script src="../site_libs/quarto-search/quarto-search.js"></script>
|
||||||
|
<meta name="quarto:offset" content="../">
|
||||||
|
<script src="../site_libs/quarto-html/quarto.js"></script>
|
||||||
|
<script src="../site_libs/quarto-html/popper.min.js"></script>
|
||||||
|
<script src="../site_libs/quarto-html/tippy.umd.min.js"></script>
|
||||||
|
<script src="../site_libs/quarto-html/anchor.min.js"></script>
|
||||||
|
<link href="../site_libs/quarto-html/tippy.css" rel="stylesheet">
|
||||||
|
<link href="../site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
|
||||||
|
<script src="../site_libs/bootstrap/bootstrap.min.js"></script>
|
||||||
|
<link href="../site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
|
||||||
|
<link href="../site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
|
||||||
|
<script id="quarto-search-options" type="application/json">{
|
||||||
|
"location": "navbar",
|
||||||
|
"copy-button": false,
|
||||||
|
"collapse-after": 3,
|
||||||
|
"panel-placement": "end",
|
||||||
|
"type": "overlay",
|
||||||
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
|
"language": {
|
||||||
|
"search-no-results-text": "No results",
|
||||||
|
"search-matching-documents-text": "matching documents",
|
||||||
|
"search-copy-link-title": "Copy link to search",
|
||||||
|
"search-hide-matches-text": "Hide additional matches",
|
||||||
|
"search-more-match-text": "more match in this document",
|
||||||
|
"search-more-matches-text": "more matches in this document",
|
||||||
|
"search-clear-button-title": "Clear",
|
||||||
|
"search-text-placeholder": "",
|
||||||
|
"search-detached-cancel-button-title": "Cancel",
|
||||||
|
"search-submit-button-title": "Submit",
|
||||||
|
"search-label": "Search"
|
||||||
|
}
|
||||||
|
}</script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="../styles.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="nav-fixed">
|
||||||
|
|
||||||
|
<div id="quarto-search-results"></div>
|
||||||
|
<header id="quarto-header" class="headroom fixed-top quarto-banner">
|
||||||
|
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
|
||||||
|
<div class="navbar-container container-fluid">
|
||||||
|
<div class="navbar-brand-container mx-auto">
|
||||||
|
<a class="navbar-brand" href="../index.html">
|
||||||
|
<span class="navbar-title">Louis Lacoste</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="quarto-search" class="" title="Search"></div>
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="../index.html">
|
||||||
|
<span class="menu-text">Home</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="../posts.html">
|
||||||
|
<span class="menu-text">Posts</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="../about.html">
|
||||||
|
<span class="menu-text">About me</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="../interests.html">
|
||||||
|
<span class="menu-text">Personnal interests</span></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
|
<div class="quarto-navbar-tools">
|
||||||
|
</div>
|
||||||
|
</div> <!-- /container-fluid -->
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<!-- content -->
|
||||||
|
<header id="title-block-header" class="quarto-title-block default page-columns page-full">
|
||||||
|
<div class="quarto-title-banner page-columns page-full">
|
||||||
|
<div class="quarto-title column-body">
|
||||||
|
<h1 class="title">A test post</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="quarto-title-meta-author">
|
||||||
|
<div class="quarto-title-meta-heading">Author</div>
|
||||||
|
<div class="quarto-title-meta-heading">Affiliation</div>
|
||||||
|
|
||||||
|
<div class="quarto-title-meta-contents">
|
||||||
|
<p class="author">Louis Lacoste <a href="mailto:louis.lacoste@agroparistech.fr" class="quarto-title-author-email"><i class="bi bi-envelope"></i></a> <a href="https://orcid.org/0009-0004-0178-9821" class="quarto-title-author-orcid"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMjA4MDI1MjA2ODExOTk0QzkzNTEzRjZEQTg1NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozM0NDOEJGNEZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozM0NDOEJGM0ZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZDN0YxMTc0MDcyMDY4MTE5NUZFRDc5MUM2MUUwNEREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU3Q0QyMDgwMjUyMDY4MTE5OTRDOTM1MTNGNkRBODU3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+84NovQAAAR1JREFUeNpiZEADy85ZJgCpeCB2QJM6AMQLo4yOL0AWZETSqACk1gOxAQN+cAGIA4EGPQBxmJA0nwdpjjQ8xqArmczw5tMHXAaALDgP1QMxAGqzAAPxQACqh4ER6uf5MBlkm0X4EGayMfMw/Pr7Bd2gRBZogMFBrv01hisv5jLsv9nLAPIOMnjy8RDDyYctyAbFM2EJbRQw+aAWw/LzVgx7b+cwCHKqMhjJFCBLOzAR6+lXX84xnHjYyqAo5IUizkRCwIENQQckGSDGY4TVgAPEaraQr2a4/24bSuoExcJCfAEJihXkWDj3ZAKy9EJGaEo8T0QSxkjSwORsCAuDQCD+QILmD1A9kECEZgxDaEZhICIzGcIyEyOl2RkgwAAhkmC+eAm0TAAAAABJRU5ErkJggg=="></a></p>
|
||||||
|
</div>
|
||||||
|
<div class="quarto-title-meta-contents">
|
||||||
|
<p class="affiliation">
|
||||||
|
MIA Paris-Saclay, INRAE, AgroParisTech, Université Paris-Saclay
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="quarto-title-meta">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</header><div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
|
||||||
|
<!-- sidebar -->
|
||||||
|
<!-- margin-sidebar -->
|
||||||
|
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar zindex-bottom">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- main -->
|
||||||
|
<main class="content quarto-banner-title-block" id="quarto-document-content">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="cell">
|
||||||
|
<div class="sourceCode cell-code" id="cb1"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">library</span>(ggplot2)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="cell">
|
||||||
|
<div class="sourceCode cell-code" id="cb2"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>vec <span class="ot"><-</span> <span class="fu">rnorm</span>(<span class="at">n =</span> <span class="dv">10000</span>)</span>
|
||||||
|
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a></span>
|
||||||
|
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="fu">ggplot</span>(<span class="fu">as.data.frame</span>(vec)) <span class="sc">+</span> <span class="fu">aes</span>(<span class="at">x=</span>vec) <span class="sc">+</span></span>
|
||||||
|
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="fu">geom_histogram</span>() <span class="sc">+</span> <span class="fu">theme_minimal</span>()</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
|
||||||
|
<div class="cell-output cell-output-stderr">
|
||||||
|
<pre><code>`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</code></pre>
|
||||||
|
</div>
|
||||||
|
<div class="cell-output-display">
|
||||||
|
<div>
|
||||||
|
<figure class="figure">
|
||||||
|
<p><img src="test_files/figure-html/unnamed-chunk-2-1.png" class="img-fluid figure-img" width="672"></p>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</main> <!-- /main -->
|
||||||
|
<script id="quarto-html-after-body" type="application/javascript">
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
const toggleBodyColorMode = (bsSheetEl) => {
|
||||||
|
const mode = bsSheetEl.getAttribute("data-mode");
|
||||||
|
const bodyEl = window.document.querySelector("body");
|
||||||
|
if (mode === "dark") {
|
||||||
|
bodyEl.classList.add("quarto-dark");
|
||||||
|
bodyEl.classList.remove("quarto-light");
|
||||||
|
} else {
|
||||||
|
bodyEl.classList.add("quarto-light");
|
||||||
|
bodyEl.classList.remove("quarto-dark");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const toggleBodyColorPrimary = () => {
|
||||||
|
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
|
||||||
|
if (bsSheetEl) {
|
||||||
|
toggleBodyColorMode(bsSheetEl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toggleBodyColorPrimary();
|
||||||
|
const icon = "";
|
||||||
|
const anchorJS = new window.AnchorJS();
|
||||||
|
anchorJS.options = {
|
||||||
|
placement: 'right',
|
||||||
|
icon: icon
|
||||||
|
};
|
||||||
|
anchorJS.add('.anchored');
|
||||||
|
const isCodeAnnotation = (el) => {
|
||||||
|
for (const clz of el.classList) {
|
||||||
|
if (clz.startsWith('code-annotation-')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const onCopySuccess = function(e) {
|
||||||
|
// button target
|
||||||
|
const button = e.trigger;
|
||||||
|
// don't keep focus
|
||||||
|
button.blur();
|
||||||
|
// flash "checked"
|
||||||
|
button.classList.add('code-copy-button-checked');
|
||||||
|
var currentTitle = button.getAttribute("title");
|
||||||
|
button.setAttribute("title", "Copied!");
|
||||||
|
let tooltip;
|
||||||
|
if (window.bootstrap) {
|
||||||
|
button.setAttribute("data-bs-toggle", "tooltip");
|
||||||
|
button.setAttribute("data-bs-placement", "left");
|
||||||
|
button.setAttribute("data-bs-title", "Copied!");
|
||||||
|
tooltip = new bootstrap.Tooltip(button,
|
||||||
|
{ trigger: "manual",
|
||||||
|
customClass: "code-copy-button-tooltip",
|
||||||
|
offset: [0, -8]});
|
||||||
|
tooltip.show();
|
||||||
|
}
|
||||||
|
setTimeout(function() {
|
||||||
|
if (tooltip) {
|
||||||
|
tooltip.hide();
|
||||||
|
button.removeAttribute("data-bs-title");
|
||||||
|
button.removeAttribute("data-bs-toggle");
|
||||||
|
button.removeAttribute("data-bs-placement");
|
||||||
|
}
|
||||||
|
button.setAttribute("title", currentTitle);
|
||||||
|
button.classList.remove('code-copy-button-checked');
|
||||||
|
}, 1000);
|
||||||
|
// clear code selection
|
||||||
|
e.clearSelection();
|
||||||
|
}
|
||||||
|
const getTextToCopy = function(trigger) {
|
||||||
|
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
||||||
|
for (const childEl of codeEl.children) {
|
||||||
|
if (isCodeAnnotation(childEl)) {
|
||||||
|
childEl.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return codeEl.innerText;
|
||||||
|
}
|
||||||
|
const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
|
||||||
|
text: getTextToCopy
|
||||||
|
});
|
||||||
|
clipboard.on('success', onCopySuccess);
|
||||||
|
if (window.document.getElementById('quarto-embedded-source-code-modal')) {
|
||||||
|
// For code content inside modals, clipBoardJS needs to be initialized with a container option
|
||||||
|
// TODO: Check when it could be a function (https://github.com/zenorocha/clipboard.js/issues/860)
|
||||||
|
const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
|
||||||
|
text: getTextToCopy,
|
||||||
|
container: window.document.getElementById('quarto-embedded-source-code-modal')
|
||||||
|
});
|
||||||
|
clipboardModal.on('success', onCopySuccess);
|
||||||
|
}
|
||||||
|
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
|
||||||
|
var mailtoRegex = new RegExp(/^mailto:/);
|
||||||
|
var filterRegex = new RegExp('/' + window.location.host + '/');
|
||||||
|
var isInternal = (href) => {
|
||||||
|
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
|
||||||
|
}
|
||||||
|
// Inspect non-navigation links and adorn them if external
|
||||||
|
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
|
||||||
|
for (var i=0; i<links.length; i++) {
|
||||||
|
const link = links[i];
|
||||||
|
if (!isInternal(link.href)) {
|
||||||
|
// undo the damage that might have been done by quarto-nav.js in the case of
|
||||||
|
// links that we want to consider external
|
||||||
|
if (link.dataset.originalHref !== undefined) {
|
||||||
|
link.href = link.dataset.originalHref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
|
||||||
|
const config = {
|
||||||
|
allowHTML: true,
|
||||||
|
maxWidth: 500,
|
||||||
|
delay: 100,
|
||||||
|
arrow: false,
|
||||||
|
appendTo: function(el) {
|
||||||
|
return el.parentElement;
|
||||||
|
},
|
||||||
|
interactive: true,
|
||||||
|
interactiveBorder: 10,
|
||||||
|
theme: 'quarto',
|
||||||
|
placement: 'bottom-start',
|
||||||
|
};
|
||||||
|
if (contentFn) {
|
||||||
|
config.content = contentFn;
|
||||||
|
}
|
||||||
|
if (onTriggerFn) {
|
||||||
|
config.onTrigger = onTriggerFn;
|
||||||
|
}
|
||||||
|
if (onUntriggerFn) {
|
||||||
|
config.onUntrigger = onUntriggerFn;
|
||||||
|
}
|
||||||
|
window.tippy(el, config);
|
||||||
|
}
|
||||||
|
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
||||||
|
for (var i=0; i<noterefs.length; i++) {
|
||||||
|
const ref = noterefs[i];
|
||||||
|
tippyHover(ref, function() {
|
||||||
|
// use id or data attribute instead here
|
||||||
|
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
|
||||||
|
try { href = new URL(href).hash; } catch {}
|
||||||
|
const id = href.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
|
return note.innerHTML;
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const xrefs = window.document.querySelectorAll('a.quarto-xref');
|
||||||
|
const processXRef = (id, note) => {
|
||||||
|
// Strip column container classes
|
||||||
|
const stripColumnClz = (el) => {
|
||||||
|
el.classList.remove("page-full", "page-columns");
|
||||||
|
if (el.children) {
|
||||||
|
for (const child of el.children) {
|
||||||
|
stripColumnClz(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stripColumnClz(note)
|
||||||
|
if (id === null || id.startsWith('sec-')) {
|
||||||
|
// Special case sections, only their first couple elements
|
||||||
|
const container = document.createElement("div");
|
||||||
|
if (note.children && note.children.length > 2) {
|
||||||
|
container.appendChild(note.children[0].cloneNode(true));
|
||||||
|
for (let i = 1; i < note.children.length; i++) {
|
||||||
|
const child = note.children[i];
|
||||||
|
if (child.tagName === "P" && child.innerText === "") {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
container.appendChild(child.cloneNode(true));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(container);
|
||||||
|
}
|
||||||
|
return container.innerHTML
|
||||||
|
} else {
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Remove any anchor links if they are present
|
||||||
|
const anchorLink = note.querySelector('a.anchorjs-link');
|
||||||
|
if (anchorLink) {
|
||||||
|
anchorLink.remove();
|
||||||
|
}
|
||||||
|
if (window.Quarto?.typesetMath) {
|
||||||
|
window.Quarto.typesetMath(note);
|
||||||
|
}
|
||||||
|
// TODO in 1.5, we should make sure this works without a callout special case
|
||||||
|
if (note.classList.contains("callout")) {
|
||||||
|
return note.outerHTML;
|
||||||
|
} else {
|
||||||
|
return note.innerHTML;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i=0; i<xrefs.length; i++) {
|
||||||
|
const xref = xrefs[i];
|
||||||
|
tippyHover(xref, undefined, function(instance) {
|
||||||
|
instance.disable();
|
||||||
|
let url = xref.getAttribute('href');
|
||||||
|
let hash = undefined;
|
||||||
|
if (url.startsWith('#')) {
|
||||||
|
hash = url;
|
||||||
|
} else {
|
||||||
|
try { hash = new URL(url).hash; } catch {}
|
||||||
|
}
|
||||||
|
if (hash) {
|
||||||
|
const id = hash.replace(/^#\/?/, "");
|
||||||
|
const note = window.document.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
try {
|
||||||
|
const html = processXRef(id, note.cloneNode(true));
|
||||||
|
instance.setContent(html);
|
||||||
|
} finally {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch this
|
||||||
|
fetch(url.split('#')[0])
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.getElementById(id);
|
||||||
|
if (note !== null) {
|
||||||
|
const html = processXRef(id, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if we can fetch a full url (with no hash to target)
|
||||||
|
// This is a special case and we should probably do some content thinning / targeting
|
||||||
|
fetch(url)
|
||||||
|
.then(res => res.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const htmlDoc = parser.parseFromString(html, "text/html");
|
||||||
|
const note = htmlDoc.querySelector('main.content');
|
||||||
|
if (note !== null) {
|
||||||
|
// This should only happen for chapter cross references
|
||||||
|
// (since there is no id in the URL)
|
||||||
|
// remove the first header
|
||||||
|
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
|
||||||
|
note.children[0].remove();
|
||||||
|
}
|
||||||
|
const html = processXRef(null, note);
|
||||||
|
instance.setContent(html);
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
instance.enable();
|
||||||
|
instance.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, function(instance) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let selectedAnnoteEl;
|
||||||
|
const selectorForAnnotation = ( cell, annotation) => {
|
||||||
|
let cellAttr = 'data-code-cell="' + cell + '"';
|
||||||
|
let lineAttr = 'data-code-annotation="' + annotation + '"';
|
||||||
|
const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
|
||||||
|
return selector;
|
||||||
|
}
|
||||||
|
const selectCodeLines = (annoteEl) => {
|
||||||
|
const doc = window.document;
|
||||||
|
const targetCell = annoteEl.getAttribute("data-target-cell");
|
||||||
|
const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
|
||||||
|
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
|
||||||
|
const lines = annoteSpan.getAttribute("data-code-lines").split(",");
|
||||||
|
const lineIds = lines.map((line) => {
|
||||||
|
return targetCell + "-" + line;
|
||||||
|
})
|
||||||
|
let top = null;
|
||||||
|
let height = null;
|
||||||
|
let parent = null;
|
||||||
|
if (lineIds.length > 0) {
|
||||||
|
//compute the position of the single el (top and bottom and make a div)
|
||||||
|
const el = window.document.getElementById(lineIds[0]);
|
||||||
|
top = el.offsetTop;
|
||||||
|
height = el.offsetHeight;
|
||||||
|
parent = el.parentElement.parentElement;
|
||||||
|
if (lineIds.length > 1) {
|
||||||
|
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
|
||||||
|
const bottom = lastEl.offsetTop + lastEl.offsetHeight;
|
||||||
|
height = bottom - top;
|
||||||
|
}
|
||||||
|
if (top !== null && height !== null && parent !== null) {
|
||||||
|
// cook up a div (if necessary) and position it
|
||||||
|
let div = window.document.getElementById("code-annotation-line-highlight");
|
||||||
|
if (div === null) {
|
||||||
|
div = window.document.createElement("div");
|
||||||
|
div.setAttribute("id", "code-annotation-line-highlight");
|
||||||
|
div.style.position = 'absolute';
|
||||||
|
parent.appendChild(div);
|
||||||
|
}
|
||||||
|
div.style.top = top - 2 + "px";
|
||||||
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
|
if (gutterDiv === null) {
|
||||||
|
gutterDiv = window.document.createElement("div");
|
||||||
|
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
|
||||||
|
gutterDiv.style.position = 'absolute';
|
||||||
|
const codeCell = window.document.getElementById(targetCell);
|
||||||
|
const gutter = codeCell.querySelector('.code-annotation-gutter');
|
||||||
|
gutter.appendChild(gutterDiv);
|
||||||
|
}
|
||||||
|
gutterDiv.style.top = top - 2 + "px";
|
||||||
|
gutterDiv.style.height = height + 4 + "px";
|
||||||
|
}
|
||||||
|
selectedAnnoteEl = annoteEl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const unselectCodeLines = () => {
|
||||||
|
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
|
||||||
|
elementsIds.forEach((elId) => {
|
||||||
|
const div = window.document.getElementById(elId);
|
||||||
|
if (div) {
|
||||||
|
div.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
selectedAnnoteEl = undefined;
|
||||||
|
};
|
||||||
|
// Handle positioning of the toggle
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
throttle(() => {
|
||||||
|
elRect = undefined;
|
||||||
|
if (selectedAnnoteEl) {
|
||||||
|
selectCodeLines(selectedAnnoteEl);
|
||||||
|
}
|
||||||
|
}, 10)
|
||||||
|
);
|
||||||
|
function throttle(fn, ms) {
|
||||||
|
let throttle = false;
|
||||||
|
let timer;
|
||||||
|
return (...args) => {
|
||||||
|
if(!throttle) { // first call gets through
|
||||||
|
fn.apply(this, args);
|
||||||
|
throttle = true;
|
||||||
|
} else { // all the others get throttled
|
||||||
|
if(timer) clearTimeout(timer); // cancel #2
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
fn.apply(this, args);
|
||||||
|
timer = throttle = false;
|
||||||
|
}, ms);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Attach click handler to the DT
|
||||||
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
|
for (const annoteDlNode of annoteDls) {
|
||||||
|
annoteDlNode.addEventListener('click', (event) => {
|
||||||
|
const clickedEl = event.target;
|
||||||
|
if (clickedEl !== selectedAnnoteEl) {
|
||||||
|
unselectCodeLines();
|
||||||
|
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
|
||||||
|
if (activeEl) {
|
||||||
|
activeEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
selectCodeLines(clickedEl);
|
||||||
|
clickedEl.classList.add('code-annotation-active');
|
||||||
|
} else {
|
||||||
|
// Unselect the line
|
||||||
|
unselectCodeLines();
|
||||||
|
clickedEl.classList.remove('code-annotation-active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const findCites = (el) => {
|
||||||
|
const parentEl = el.parentElement;
|
||||||
|
if (parentEl) {
|
||||||
|
const cites = parentEl.dataset.cites;
|
||||||
|
if (cites) {
|
||||||
|
return {
|
||||||
|
el,
|
||||||
|
cites: cites.split(' ')
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return findCites(el.parentElement)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
|
||||||
|
for (var i=0; i<bibliorefs.length; i++) {
|
||||||
|
const ref = bibliorefs[i];
|
||||||
|
const citeInfo = findCites(ref);
|
||||||
|
if (citeInfo) {
|
||||||
|
tippyHover(citeInfo.el, function() {
|
||||||
|
var popup = window.document.createElement('div');
|
||||||
|
citeInfo.cites.forEach(function(cite) {
|
||||||
|
var citeDiv = window.document.createElement('div');
|
||||||
|
citeDiv.classList.add('hanging-indent');
|
||||||
|
citeDiv.classList.add('csl-entry');
|
||||||
|
var biblioDiv = window.document.getElementById('ref-' + cite);
|
||||||
|
if (biblioDiv) {
|
||||||
|
citeDiv.innerHTML = biblioDiv.innerHTML;
|
||||||
|
}
|
||||||
|
popup.appendChild(citeDiv);
|
||||||
|
});
|
||||||
|
return popup.innerHTML;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div> <!-- /content -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body></html>
|
||||||
BIN
docs/posts/test_files/figure-html/unnamed-chunk-2-1.png
Normal file
BIN
docs/posts/test_files/figure-html/unnamed-chunk-2-1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
30
docs/search.json
Normal file
30
docs/search.json
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"objectID": "index.html",
|
||||||
|
"href": "index.html",
|
||||||
|
"title": "Site perso",
|
||||||
|
"section": "",
|
||||||
|
"text": "Will update later\n\nMy Github contributions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectID": "about.html",
|
||||||
|
"href": "about.html",
|
||||||
|
"title": "About me",
|
||||||
|
"section": "",
|
||||||
|
"text": "I’m a 24 years old PhD student in Applied Mathematics at MIA Paris-Saclay."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectID": "posts.html",
|
||||||
|
"href": "posts.html",
|
||||||
|
"title": "Posts",
|
||||||
|
"section": "",
|
||||||
|
"text": "A test post\n\n\n\n\n\n\nLouis Lacoste\n\n\n\n\n\n\n\n\nNo matching items"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectID": "posts/test.html",
|
||||||
|
"href": "posts/test.html",
|
||||||
|
"title": "A test post",
|
||||||
|
"section": "",
|
||||||
|
"text": "library(ggplot2)\n\n\nvec <- rnorm(n = 10000)\n\nggplot(as.data.frame(vec)) + aes(x=vec) +\ngeom_histogram() + theme_minimal()\n\n`stat_bin()` using `bins = 30`. Pick better value with `binwidth`."
|
||||||
|
}
|
||||||
|
]
|
||||||
2078
docs/site_libs/bootstrap/bootstrap-icons.css
vendored
Normal file
2078
docs/site_libs/bootstrap/bootstrap-icons.css
vendored
Normal file
File diff suppressed because it is too large
Load diff
BIN
docs/site_libs/bootstrap/bootstrap-icons.woff
Normal file
BIN
docs/site_libs/bootstrap/bootstrap-icons.woff
Normal file
Binary file not shown.
12
docs/site_libs/bootstrap/bootstrap.min.css
vendored
Normal file
12
docs/site_libs/bootstrap/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
7
docs/site_libs/bootstrap/bootstrap.min.js
vendored
Normal file
7
docs/site_libs/bootstrap/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
7
docs/site_libs/clipboard/clipboard.min.js
vendored
Normal file
7
docs/site_libs/clipboard/clipboard.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load diff
|
After Width: | Height: | Size: 379 KiB |
Binary file not shown.
Binary file not shown.
738
docs/site_libs/quarto-contrib/academicons-1.9.2/all.css
Executable file
738
docs/site_libs/quarto-contrib/academicons-1.9.2/all.css
Executable file
|
|
@ -0,0 +1,738 @@
|
||||||
|
/*
|
||||||
|
* Academicons 1.9.4 by James Walsh (https://github.com/jpswalsh) and Katja Bercic (https://github.com/katjabercic)
|
||||||
|
* Fonts generated using FontForge - https://fontforge.org
|
||||||
|
* Square icons designed to be used alongside Font Awesome square icons - https://fortawesome.github.io/Font-Awesome/
|
||||||
|
* Licenses - Font: SIL OFL 1.1, CSS: MIT License
|
||||||
|
*/
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Academicons';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: block;
|
||||||
|
src: url('1e21o67/academicons.eot');
|
||||||
|
src: url('1e21o67/academicons.eot') format('embedded-opentype'),
|
||||||
|
url('1e21o67/academicons.ttf') format('truetype'),
|
||||||
|
url('1e21o67/academicons.woff') format('woff'),
|
||||||
|
url('1e21o67/academicons.svg') format('svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai {
|
||||||
|
font-family: 'Academicons';
|
||||||
|
font-weight: 400;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
display: inline-block;
|
||||||
|
font-style: normal;
|
||||||
|
font-variant: normal;
|
||||||
|
text-rendering: auto;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-academia:before {
|
||||||
|
content: "\e9af";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-academia-square:before {
|
||||||
|
content: "\e93d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acclaim:before {
|
||||||
|
content: "\e92e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acclaim-square:before {
|
||||||
|
content: "\e93a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acm:before {
|
||||||
|
content: "\e93c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acm-square:before {
|
||||||
|
content: "\e95d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acmdl:before {
|
||||||
|
content: "\e96a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-acmdl-square:before {
|
||||||
|
content: "\e9d3";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ads:before {
|
||||||
|
content: "\e9cb";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ads-square:before {
|
||||||
|
content: "\e94a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-africarxiv:before {
|
||||||
|
content: "\e91b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-africarxiv-square:before {
|
||||||
|
content: "\e90b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-archive:before {
|
||||||
|
content: "\e955";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-archive-square:before {
|
||||||
|
content: "\e956";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-arxiv:before {
|
||||||
|
content: "\e974";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-arxiv-square:before {
|
||||||
|
content: "\e9a6";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-biorxiv:before {
|
||||||
|
content: "\e9a2";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-biorxiv-square:before {
|
||||||
|
content: "\e98b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ceur:before {
|
||||||
|
content: "\e96d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ceur-square:before {
|
||||||
|
content: "\e92f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ciencia-vitae:before {
|
||||||
|
content: "\e912";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ciencia-vitae-square:before {
|
||||||
|
content: "\e913";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-clarivate:before {
|
||||||
|
content: "\e924";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-clarivate-square:before {
|
||||||
|
content: "\e925";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-closed-access:before {
|
||||||
|
content: "\e942";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-closed-access-square:before {
|
||||||
|
content: "\e943";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-conversation:before {
|
||||||
|
content: "\e94c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-conversation-square:before {
|
||||||
|
content: "\e915";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-coursera:before {
|
||||||
|
content: "\e95f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-coursera-square:before {
|
||||||
|
content: "\e97f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-crossref:before {
|
||||||
|
content: "\e918";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-crossref-square:before {
|
||||||
|
content: "\e919";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-cv:before {
|
||||||
|
content: "\e9a5";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-cv-square:before {
|
||||||
|
content: "\e90a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-datacite:before {
|
||||||
|
content: "\e91c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-datacite-square:before {
|
||||||
|
content: "\e91d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dataverse:before {
|
||||||
|
content: "\e9f7";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dataverse-square:before {
|
||||||
|
content: "\e9e4";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dblp:before {
|
||||||
|
content: "\e94f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dblp-square:before {
|
||||||
|
content: "\e93f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-depsy:before {
|
||||||
|
content: "\e97a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-depsy-square:before {
|
||||||
|
content: "\e94b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-doi:before {
|
||||||
|
content: "\e97e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-doi-square:before {
|
||||||
|
content: "\e98f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dryad:before {
|
||||||
|
content: "\e97c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-dryad-square:before {
|
||||||
|
content: "\e98c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-elsevier:before {
|
||||||
|
content: "\e961";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-elsevier-square:before {
|
||||||
|
content: "\e910";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-figshare:before {
|
||||||
|
content: "\e981";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-figshare-square:before {
|
||||||
|
content: "\e9e7";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-google-scholar:before {
|
||||||
|
content: "\e9d4";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-google-scholar-square:before {
|
||||||
|
content: "\e9f9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-hal:before {
|
||||||
|
content: "\e92c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-hal-square:before {
|
||||||
|
content: "\e92d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-hypothesis:before {
|
||||||
|
content: "\e95a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-hypothesis-square:before {
|
||||||
|
content: "\e95b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ideas-repec:before {
|
||||||
|
content: "\e9ed";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ideas-repec-square:before {
|
||||||
|
content: "\e9f8";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ieee:before {
|
||||||
|
content: "\e929";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ieee-square:before {
|
||||||
|
content: "\e9b9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-impactstory:before {
|
||||||
|
content: "\e9cf";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-impactstory-square:before {
|
||||||
|
content: "\e9aa";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inaturalist:before {
|
||||||
|
content: "\e900";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inaturalist-square:before {
|
||||||
|
content: "\e901";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inpn:before {
|
||||||
|
content: "\e902";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inpn-square:before {
|
||||||
|
content: "\e903";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inspire:before {
|
||||||
|
content: "\e9e9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inspire-square:before {
|
||||||
|
content: "\e9fe";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-isidore:before {
|
||||||
|
content: "\e936";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-isidore-square:before {
|
||||||
|
content: "\e954";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-isni:before {
|
||||||
|
content: "\e957";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-isni-square:before {
|
||||||
|
content: "\e958";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-jstor:before {
|
||||||
|
content: "\e938";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-jstor-square:before {
|
||||||
|
content: "\e944";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-lattes:before {
|
||||||
|
content: "\e9b3";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-lattes-square:before {
|
||||||
|
content: "\e99c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mathoverflow:before {
|
||||||
|
content: "\e9f6";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mathoverflow-square:before {
|
||||||
|
content: "\e97b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mendeley:before {
|
||||||
|
content: "\e9f0";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mendeley-square:before {
|
||||||
|
content: "\e9f3";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-moodle:before {
|
||||||
|
content: "\e907";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-moodle-square:before {
|
||||||
|
content: "\e908";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mtmt:before {
|
||||||
|
content: "\e950";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-mtmt-square:before {
|
||||||
|
content: "\e951";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-nakala:before {
|
||||||
|
content: "\e940";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-nakala-square:before {
|
||||||
|
content: "\e941";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-obp:before {
|
||||||
|
content: "\e92a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-obp-square:before {
|
||||||
|
content: "\e92b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-access:before {
|
||||||
|
content: "\e939";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-access-square:before {
|
||||||
|
content: "\e9f4";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-data:before {
|
||||||
|
content: "\e966";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-data-square:before {
|
||||||
|
content: "\e967";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-materials:before {
|
||||||
|
content: "\e968";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-open-materials-square:before {
|
||||||
|
content: "\e969";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-openedition:before {
|
||||||
|
content: "\e946";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-openedition-square:before {
|
||||||
|
content: "\e947";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-orcid:before {
|
||||||
|
content: "\e9d9";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-orcid-square:before {
|
||||||
|
content: "\e9c3";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-osf:before {
|
||||||
|
content: "\e9ef";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-osf-square:before {
|
||||||
|
content: "\e931";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-overleaf:before {
|
||||||
|
content: "\e914";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-overleaf-square:before {
|
||||||
|
content: "\e98d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-philpapers:before {
|
||||||
|
content: "\e98a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-philpapers-square:before {
|
||||||
|
content: "\e96f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-piazza:before {
|
||||||
|
content: "\e99a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-piazza-square:before {
|
||||||
|
content: "\e90c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-preregistered:before {
|
||||||
|
content: "\e906";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-preregistered-square:before {
|
||||||
|
content: "\e96b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-protocols:before {
|
||||||
|
content: "\e952";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-protocols-square:before {
|
||||||
|
content: "\e953";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-psyarxiv:before {
|
||||||
|
content: "\e90e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-psyarxiv-square:before {
|
||||||
|
content: "\e90f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-publons:before {
|
||||||
|
content: "\e937";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-publons-square:before {
|
||||||
|
content: "\e94e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pubmed:before {
|
||||||
|
content: "\e99f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pubmed-square:before {
|
||||||
|
content: "\e97d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pubpeer:before {
|
||||||
|
content: "\e922";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pubpeer-square:before {
|
||||||
|
content: "\e923";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-researcherid:before {
|
||||||
|
content: "\e91a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-researcherid-square:before {
|
||||||
|
content: "\e95c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-researchgate:before {
|
||||||
|
content: "\e95e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-researchgate-square:before {
|
||||||
|
content: "\e99e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ror:before {
|
||||||
|
content: "\e948";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ror-square:before {
|
||||||
|
content: "\e949";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-sci-hub:before {
|
||||||
|
content: "\e959";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-sci-hub-square:before {
|
||||||
|
content: "\e905";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-scirate:before {
|
||||||
|
content: "\e98e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-scirate-square:before {
|
||||||
|
content: "\e99d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-scopus:before {
|
||||||
|
content: "\e91e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-scopus-square:before {
|
||||||
|
content: "\e91f";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-semantic-scholar:before {
|
||||||
|
content: "\e96e";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-semantic-scholar-square:before {
|
||||||
|
content: "\e96c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-springer:before {
|
||||||
|
content: "\e928";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-springer-square:before {
|
||||||
|
content: "\e99b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ssrn:before {
|
||||||
|
content: "\e916";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ssrn-square:before {
|
||||||
|
content: "\e917";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stackoverflow:before {
|
||||||
|
content: "\e920";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stackoverflow-square:before {
|
||||||
|
content: "\e921";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-viaf:before {
|
||||||
|
content: "\e933";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-viaf-square:before {
|
||||||
|
content: "\e934";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-wiley:before {
|
||||||
|
content: "\e926";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-wiley-square:before {
|
||||||
|
content: "\e927";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-zenodo:before {
|
||||||
|
content: "\e911";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-zotero:before {
|
||||||
|
content: "\e962";
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-zotero-square:before {
|
||||||
|
content: "\e932";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Duplication of the FontAwesome style classes using 'ai' in place of 'fa'. */
|
||||||
|
.ai-lg {
|
||||||
|
font-size: 1.33333em;
|
||||||
|
line-height: 0.75em;
|
||||||
|
vertical-align: -.0667em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-xs {
|
||||||
|
font-size: .75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-sm {
|
||||||
|
font-size: .875em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-1x {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-2x {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-3x {
|
||||||
|
font-size: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-4x {
|
||||||
|
font-size: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-5x {
|
||||||
|
font-size: 5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-6x {
|
||||||
|
font-size: 6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-7x {
|
||||||
|
font-size: 7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-8x {
|
||||||
|
font-size: 8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-9x {
|
||||||
|
font-size: 9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-10x {
|
||||||
|
font-size: 10em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-fw {
|
||||||
|
text-align: center;
|
||||||
|
width: 1.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ul {
|
||||||
|
list-style-type: none;
|
||||||
|
margin-left: 2.5em;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-ul>li {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-li {
|
||||||
|
left: -2em;
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
width: 2em;
|
||||||
|
line-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-border {
|
||||||
|
border: solid 0.08em #eee;
|
||||||
|
border-radius: .1em;
|
||||||
|
padding: .2em .25em .15em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pull-left {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-pull-right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai.ai-pull-left {
|
||||||
|
margin-right: .3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai.ai-pull-right {
|
||||||
|
margin-right: .3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stack {
|
||||||
|
display: inline-block;
|
||||||
|
height: 2em;
|
||||||
|
line-height: 2em;
|
||||||
|
position: relative;
|
||||||
|
vertical-align: middle;
|
||||||
|
width: 2.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stack-1x,
|
||||||
|
.ai-stack-2x {
|
||||||
|
left: 0;
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stack-1x {
|
||||||
|
line-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-stack-2x {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-inverse {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
115
docs/site_libs/quarto-contrib/academicons-1.9.2/size.css
Normal file
115
docs/site_libs/quarto-contrib/academicons-1.9.2/size.css
Normal file
|
|
@ -0,0 +1,115 @@
|
||||||
|
.ai-tiny {
|
||||||
|
font-size: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-scriptsize {
|
||||||
|
font-size: 0.7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-footnotesize {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-small {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-normalsize {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-large {
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-Large {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-LARGE {
|
||||||
|
font-size: 1.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-huge {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-Huge {
|
||||||
|
font-size: 2.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-1x {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-2x {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-3x {
|
||||||
|
font-size: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-4x {
|
||||||
|
font-size: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-5x {
|
||||||
|
font-size: 5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-6x {
|
||||||
|
font-size: 6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-7x {
|
||||||
|
font-size: 7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-8x {
|
||||||
|
font-size: 8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-9x {
|
||||||
|
font-size: 9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-10x {
|
||||||
|
font-size: 10em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-2xs {
|
||||||
|
font-size: 0.625em;
|
||||||
|
line-height: 0.1em;
|
||||||
|
vertical-align: 0.225em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-xs {
|
||||||
|
font-size: 0.75em;
|
||||||
|
line-height: 0.08333em;
|
||||||
|
vertical-align: 0.125em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-sm {
|
||||||
|
font-size: 0.875em;
|
||||||
|
line-height: 0.07143em;
|
||||||
|
vertical-align: 0.05357em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-lg {
|
||||||
|
font-size: 1.25em;
|
||||||
|
line-height: 0.05em;
|
||||||
|
vertical-align: -0.075em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-xl {
|
||||||
|
font-size: 1.5em;
|
||||||
|
line-height: 0.04167em;
|
||||||
|
vertical-align: -0.125em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ai-2xl {
|
||||||
|
font-size: 2em;
|
||||||
|
line-height: 0.03125em;
|
||||||
|
vertical-align: -0.1875em;
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
7971
docs/site_libs/quarto-contrib/fontawesome6-0.1.0/all.css
Normal file
7971
docs/site_libs/quarto-contrib/fontawesome6-0.1.0/all.css
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,30 @@
|
||||||
|
.fa-tiny {
|
||||||
|
font-size: 0.5em;
|
||||||
|
}
|
||||||
|
.fa-scriptsize {
|
||||||
|
font-size: 0.7em;
|
||||||
|
}
|
||||||
|
.fa-footnotesize {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
.fa-small {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
.fa-normalsize {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
.fa-large {
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
.fa-Large {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
.fa-LARGE {
|
||||||
|
font-size: 1.75em;
|
||||||
|
}
|
||||||
|
.fa-huge {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
.fa-Huge {
|
||||||
|
font-size: 2.5em;
|
||||||
|
}
|
||||||
9
docs/site_libs/quarto-html/anchor.min.js
vendored
Normal file
9
docs/site_libs/quarto-html/anchor.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
docs/site_libs/quarto-html/popper.min.js
vendored
Normal file
6
docs/site_libs/quarto-html/popper.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
205
docs/site_libs/quarto-html/quarto-syntax-highlighting.css
Normal file
205
docs/site_libs/quarto-html/quarto-syntax-highlighting.css
Normal file
|
|
@ -0,0 +1,205 @@
|
||||||
|
/* quarto syntax highlight colors */
|
||||||
|
:root {
|
||||||
|
--quarto-hl-ot-color: #003B4F;
|
||||||
|
--quarto-hl-at-color: #657422;
|
||||||
|
--quarto-hl-ss-color: #20794D;
|
||||||
|
--quarto-hl-an-color: #5E5E5E;
|
||||||
|
--quarto-hl-fu-color: #4758AB;
|
||||||
|
--quarto-hl-st-color: #20794D;
|
||||||
|
--quarto-hl-cf-color: #003B4F;
|
||||||
|
--quarto-hl-op-color: #5E5E5E;
|
||||||
|
--quarto-hl-er-color: #AD0000;
|
||||||
|
--quarto-hl-bn-color: #AD0000;
|
||||||
|
--quarto-hl-al-color: #AD0000;
|
||||||
|
--quarto-hl-va-color: #111111;
|
||||||
|
--quarto-hl-bu-color: inherit;
|
||||||
|
--quarto-hl-ex-color: inherit;
|
||||||
|
--quarto-hl-pp-color: #AD0000;
|
||||||
|
--quarto-hl-in-color: #5E5E5E;
|
||||||
|
--quarto-hl-vs-color: #20794D;
|
||||||
|
--quarto-hl-wa-color: #5E5E5E;
|
||||||
|
--quarto-hl-do-color: #5E5E5E;
|
||||||
|
--quarto-hl-im-color: #00769E;
|
||||||
|
--quarto-hl-ch-color: #20794D;
|
||||||
|
--quarto-hl-dt-color: #AD0000;
|
||||||
|
--quarto-hl-fl-color: #AD0000;
|
||||||
|
--quarto-hl-co-color: #5E5E5E;
|
||||||
|
--quarto-hl-cv-color: #5E5E5E;
|
||||||
|
--quarto-hl-cn-color: #8f5902;
|
||||||
|
--quarto-hl-sc-color: #5E5E5E;
|
||||||
|
--quarto-hl-dv-color: #AD0000;
|
||||||
|
--quarto-hl-kw-color: #003B4F;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other quarto variables */
|
||||||
|
:root {
|
||||||
|
--quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre > code.sourceCode > span {
|
||||||
|
color: #003B4F;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span {
|
||||||
|
color: #003B4F;
|
||||||
|
}
|
||||||
|
|
||||||
|
code.sourceCode > span {
|
||||||
|
color: #003B4F;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sourceCode,
|
||||||
|
div.sourceCode pre.sourceCode {
|
||||||
|
color: #003B4F;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.ot {
|
||||||
|
color: #003B4F;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.at {
|
||||||
|
color: #657422;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.ss {
|
||||||
|
color: #20794D;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.an {
|
||||||
|
color: #5E5E5E;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.fu {
|
||||||
|
color: #4758AB;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.st {
|
||||||
|
color: #20794D;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.cf {
|
||||||
|
color: #003B4F;
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.op {
|
||||||
|
color: #5E5E5E;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.er {
|
||||||
|
color: #AD0000;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.bn {
|
||||||
|
color: #AD0000;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.al {
|
||||||
|
color: #AD0000;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.va {
|
||||||
|
color: #111111;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.bu {
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.ex {
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.pp {
|
||||||
|
color: #AD0000;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.in {
|
||||||
|
color: #5E5E5E;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.vs {
|
||||||
|
color: #20794D;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.wa {
|
||||||
|
color: #5E5E5E;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.do {
|
||||||
|
color: #5E5E5E;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.im {
|
||||||
|
color: #00769E;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.ch {
|
||||||
|
color: #20794D;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.dt {
|
||||||
|
color: #AD0000;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.fl {
|
||||||
|
color: #AD0000;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.co {
|
||||||
|
color: #5E5E5E;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.cv {
|
||||||
|
color: #5E5E5E;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.cn {
|
||||||
|
color: #8f5902;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.sc {
|
||||||
|
color: #5E5E5E;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.dv {
|
||||||
|
color: #AD0000;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
code span.kw {
|
||||||
|
color: #003B4F;
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prevent-inlining {
|
||||||
|
content: "</";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*# sourceMappingURL=debc5d5d77c3f9108843748ff7464032.css.map */
|
||||||
908
docs/site_libs/quarto-html/quarto.js
Normal file
908
docs/site_libs/quarto-html/quarto.js
Normal file
|
|
@ -0,0 +1,908 @@
|
||||||
|
const sectionChanged = new CustomEvent("quarto-sectionChanged", {
|
||||||
|
detail: {},
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: false,
|
||||||
|
composed: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const layoutMarginEls = () => {
|
||||||
|
// Find any conflicting margin elements and add margins to the
|
||||||
|
// top to prevent overlap
|
||||||
|
const marginChildren = window.document.querySelectorAll(
|
||||||
|
".column-margin.column-container > *, .margin-caption, .aside"
|
||||||
|
);
|
||||||
|
|
||||||
|
let lastBottom = 0;
|
||||||
|
for (const marginChild of marginChildren) {
|
||||||
|
if (marginChild.offsetParent !== null) {
|
||||||
|
// clear the top margin so we recompute it
|
||||||
|
marginChild.style.marginTop = null;
|
||||||
|
const top = marginChild.getBoundingClientRect().top + window.scrollY;
|
||||||
|
if (top < lastBottom) {
|
||||||
|
const marginChildStyle = window.getComputedStyle(marginChild);
|
||||||
|
const marginBottom = parseFloat(marginChildStyle["marginBottom"]);
|
||||||
|
const margin = lastBottom - top + marginBottom;
|
||||||
|
marginChild.style.marginTop = `${margin}px`;
|
||||||
|
}
|
||||||
|
const styles = window.getComputedStyle(marginChild);
|
||||||
|
const marginTop = parseFloat(styles["marginTop"]);
|
||||||
|
lastBottom = top + marginChild.getBoundingClientRect().height + marginTop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||||
|
// Recompute the position of margin elements anytime the body size changes
|
||||||
|
if (window.ResizeObserver) {
|
||||||
|
const resizeObserver = new window.ResizeObserver(
|
||||||
|
throttle(() => {
|
||||||
|
layoutMarginEls();
|
||||||
|
if (
|
||||||
|
window.document.body.getBoundingClientRect().width < 990 &&
|
||||||
|
isReaderMode()
|
||||||
|
) {
|
||||||
|
quartoToggleReader();
|
||||||
|
}
|
||||||
|
}, 50)
|
||||||
|
);
|
||||||
|
resizeObserver.observe(window.document.body);
|
||||||
|
}
|
||||||
|
|
||||||
|
const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]');
|
||||||
|
const sidebarEl = window.document.getElementById("quarto-sidebar");
|
||||||
|
const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left");
|
||||||
|
const marginSidebarEl = window.document.getElementById(
|
||||||
|
"quarto-margin-sidebar"
|
||||||
|
);
|
||||||
|
// function to determine whether the element has a previous sibling that is active
|
||||||
|
const prevSiblingIsActiveLink = (el) => {
|
||||||
|
const sibling = el.previousElementSibling;
|
||||||
|
if (sibling && sibling.tagName === "A") {
|
||||||
|
return sibling.classList.contains("active");
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// fire slideEnter for bootstrap tab activations (for htmlwidget resize behavior)
|
||||||
|
function fireSlideEnter(e) {
|
||||||
|
const event = window.document.createEvent("Event");
|
||||||
|
event.initEvent("slideenter", true, true);
|
||||||
|
window.document.dispatchEvent(event);
|
||||||
|
}
|
||||||
|
const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]');
|
||||||
|
tabs.forEach((tab) => {
|
||||||
|
tab.addEventListener("shown.bs.tab", fireSlideEnter);
|
||||||
|
});
|
||||||
|
|
||||||
|
// fire slideEnter for tabby tab activations (for htmlwidget resize behavior)
|
||||||
|
document.addEventListener("tabby", fireSlideEnter, false);
|
||||||
|
|
||||||
|
// Track scrolling and mark TOC links as active
|
||||||
|
// get table of contents and sidebar (bail if we don't have at least one)
|
||||||
|
const tocLinks = tocEl
|
||||||
|
? [...tocEl.querySelectorAll("a[data-scroll-target]")]
|
||||||
|
: [];
|
||||||
|
const makeActive = (link) => tocLinks[link].classList.add("active");
|
||||||
|
const removeActive = (link) => tocLinks[link].classList.remove("active");
|
||||||
|
const removeAllActive = () =>
|
||||||
|
[...Array(tocLinks.length).keys()].forEach((link) => removeActive(link));
|
||||||
|
|
||||||
|
// activate the anchor for a section associated with this TOC entry
|
||||||
|
tocLinks.forEach((link) => {
|
||||||
|
link.addEventListener("click", () => {
|
||||||
|
if (link.href.indexOf("#") !== -1) {
|
||||||
|
const anchor = link.href.split("#")[1];
|
||||||
|
const heading = window.document.querySelector(
|
||||||
|
`[data-anchor-id="${anchor}"]`
|
||||||
|
);
|
||||||
|
if (heading) {
|
||||||
|
// Add the class
|
||||||
|
heading.classList.add("reveal-anchorjs-link");
|
||||||
|
|
||||||
|
// function to show the anchor
|
||||||
|
const handleMouseout = () => {
|
||||||
|
heading.classList.remove("reveal-anchorjs-link");
|
||||||
|
heading.removeEventListener("mouseout", handleMouseout);
|
||||||
|
};
|
||||||
|
|
||||||
|
// add a function to clear the anchor when the user mouses out of it
|
||||||
|
heading.addEventListener("mouseout", handleMouseout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const sections = tocLinks.map((link) => {
|
||||||
|
const target = link.getAttribute("data-scroll-target");
|
||||||
|
if (target.startsWith("#")) {
|
||||||
|
return window.document.getElementById(decodeURI(`${target.slice(1)}`));
|
||||||
|
} else {
|
||||||
|
return window.document.querySelector(decodeURI(`${target}`));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const sectionMargin = 200;
|
||||||
|
let currentActive = 0;
|
||||||
|
// track whether we've initialized state the first time
|
||||||
|
let init = false;
|
||||||
|
|
||||||
|
const updateActiveLink = () => {
|
||||||
|
// The index from bottom to top (e.g. reversed list)
|
||||||
|
let sectionIndex = -1;
|
||||||
|
if (
|
||||||
|
window.innerHeight + window.pageYOffset >=
|
||||||
|
window.document.body.offsetHeight
|
||||||
|
) {
|
||||||
|
// This is the no-scroll case where last section should be the active one
|
||||||
|
sectionIndex = 0;
|
||||||
|
} else {
|
||||||
|
// This finds the last section visible on screen that should be made active
|
||||||
|
sectionIndex = [...sections].reverse().findIndex((section) => {
|
||||||
|
if (section) {
|
||||||
|
return window.pageYOffset >= section.offsetTop - sectionMargin;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (sectionIndex > -1) {
|
||||||
|
const current = sections.length - sectionIndex - 1;
|
||||||
|
if (current !== currentActive) {
|
||||||
|
removeAllActive();
|
||||||
|
currentActive = current;
|
||||||
|
makeActive(current);
|
||||||
|
if (init) {
|
||||||
|
window.dispatchEvent(sectionChanged);
|
||||||
|
}
|
||||||
|
init = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const inHiddenRegion = (top, bottom, hiddenRegions) => {
|
||||||
|
for (const region of hiddenRegions) {
|
||||||
|
if (top <= region.bottom && bottom >= region.top) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
const categorySelector = "header.quarto-title-block .quarto-category";
|
||||||
|
const activateCategories = (href) => {
|
||||||
|
// Find any categories
|
||||||
|
// Surround them with a link pointing back to:
|
||||||
|
// #category=Authoring
|
||||||
|
try {
|
||||||
|
const categoryEls = window.document.querySelectorAll(categorySelector);
|
||||||
|
for (const categoryEl of categoryEls) {
|
||||||
|
const categoryText = categoryEl.textContent;
|
||||||
|
if (categoryText) {
|
||||||
|
const link = `${href}#category=${encodeURIComponent(categoryText)}`;
|
||||||
|
const linkEl = window.document.createElement("a");
|
||||||
|
linkEl.setAttribute("href", link);
|
||||||
|
for (const child of categoryEl.childNodes) {
|
||||||
|
linkEl.append(child);
|
||||||
|
}
|
||||||
|
categoryEl.appendChild(linkEl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// Ignore errors
|
||||||
|
}
|
||||||
|
};
|
||||||
|
function hasTitleCategories() {
|
||||||
|
return window.document.querySelector(categorySelector) !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function offsetRelativeUrl(url) {
|
||||||
|
const offset = getMeta("quarto:offset");
|
||||||
|
return offset ? offset + url : url;
|
||||||
|
}
|
||||||
|
|
||||||
|
function offsetAbsoluteUrl(url) {
|
||||||
|
const offset = getMeta("quarto:offset");
|
||||||
|
const baseUrl = new URL(offset, window.location);
|
||||||
|
|
||||||
|
const projRelativeUrl = url.replace(baseUrl, "");
|
||||||
|
if (projRelativeUrl.startsWith("/")) {
|
||||||
|
return projRelativeUrl;
|
||||||
|
} else {
|
||||||
|
return "/" + projRelativeUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// read a meta tag value
|
||||||
|
function getMeta(metaName) {
|
||||||
|
const metas = window.document.getElementsByTagName("meta");
|
||||||
|
for (let i = 0; i < metas.length; i++) {
|
||||||
|
if (metas[i].getAttribute("name") === metaName) {
|
||||||
|
return metas[i].getAttribute("content");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
async function findAndActivateCategories() {
|
||||||
|
const currentPagePath = offsetAbsoluteUrl(window.location.href);
|
||||||
|
const response = await fetch(offsetRelativeUrl("listings.json"));
|
||||||
|
if (response.status == 200) {
|
||||||
|
return response.json().then(function (listingPaths) {
|
||||||
|
const listingHrefs = [];
|
||||||
|
for (const listingPath of listingPaths) {
|
||||||
|
const pathWithoutLeadingSlash = listingPath.listing.substring(1);
|
||||||
|
for (const item of listingPath.items) {
|
||||||
|
if (
|
||||||
|
item === currentPagePath ||
|
||||||
|
item === currentPagePath + "index.html"
|
||||||
|
) {
|
||||||
|
// Resolve this path against the offset to be sure
|
||||||
|
// we already are using the correct path to the listing
|
||||||
|
// (this adjusts the listing urls to be rooted against
|
||||||
|
// whatever root the page is actually running against)
|
||||||
|
const relative = offsetRelativeUrl(pathWithoutLeadingSlash);
|
||||||
|
const baseUrl = window.location;
|
||||||
|
const resolvedPath = new URL(relative, baseUrl);
|
||||||
|
listingHrefs.push(resolvedPath.pathname);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look up the tree for a nearby linting and use that if we find one
|
||||||
|
const nearestListing = findNearestParentListing(
|
||||||
|
offsetAbsoluteUrl(window.location.pathname),
|
||||||
|
listingHrefs
|
||||||
|
);
|
||||||
|
if (nearestListing) {
|
||||||
|
activateCategories(nearestListing);
|
||||||
|
} else {
|
||||||
|
// See if the referrer is a listing page for this item
|
||||||
|
const referredRelativePath = offsetAbsoluteUrl(document.referrer);
|
||||||
|
const referrerListing = listingHrefs.find((listingHref) => {
|
||||||
|
const isListingReferrer =
|
||||||
|
listingHref === referredRelativePath ||
|
||||||
|
listingHref === referredRelativePath + "index.html";
|
||||||
|
return isListingReferrer;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (referrerListing) {
|
||||||
|
// Try to use the referrer if possible
|
||||||
|
activateCategories(referrerListing);
|
||||||
|
} else if (listingHrefs.length > 0) {
|
||||||
|
// Otherwise, just fall back to the first listing
|
||||||
|
activateCategories(listingHrefs[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasTitleCategories()) {
|
||||||
|
findAndActivateCategories();
|
||||||
|
}
|
||||||
|
|
||||||
|
const findNearestParentListing = (href, listingHrefs) => {
|
||||||
|
if (!href || !listingHrefs) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
// Look up the tree for a nearby linting and use that if we find one
|
||||||
|
const relativeParts = href.substring(1).split("/");
|
||||||
|
while (relativeParts.length > 0) {
|
||||||
|
const path = relativeParts.join("/");
|
||||||
|
for (const listingHref of listingHrefs) {
|
||||||
|
if (listingHref.startsWith(path)) {
|
||||||
|
return listingHref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
relativeParts.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
const manageSidebarVisiblity = (el, placeholderDescriptor) => {
|
||||||
|
let isVisible = true;
|
||||||
|
let elRect;
|
||||||
|
|
||||||
|
return (hiddenRegions) => {
|
||||||
|
if (el === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the last element of the TOC
|
||||||
|
const lastChildEl = el.lastElementChild;
|
||||||
|
|
||||||
|
if (lastChildEl) {
|
||||||
|
// Converts the sidebar to a menu
|
||||||
|
const convertToMenu = () => {
|
||||||
|
for (const child of el.children) {
|
||||||
|
child.style.opacity = 0;
|
||||||
|
child.style.overflow = "hidden";
|
||||||
|
child.style.pointerEvents = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
nexttick(() => {
|
||||||
|
const toggleContainer = window.document.createElement("div");
|
||||||
|
toggleContainer.style.width = "100%";
|
||||||
|
toggleContainer.classList.add("zindex-over-content");
|
||||||
|
toggleContainer.classList.add("quarto-sidebar-toggle");
|
||||||
|
toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom
|
||||||
|
toggleContainer.id = placeholderDescriptor.id;
|
||||||
|
toggleContainer.style.position = "fixed";
|
||||||
|
|
||||||
|
const toggleIcon = window.document.createElement("i");
|
||||||
|
toggleIcon.classList.add("quarto-sidebar-toggle-icon");
|
||||||
|
toggleIcon.classList.add("bi");
|
||||||
|
toggleIcon.classList.add("bi-caret-down-fill");
|
||||||
|
|
||||||
|
const toggleTitle = window.document.createElement("div");
|
||||||
|
const titleEl = window.document.body.querySelector(
|
||||||
|
placeholderDescriptor.titleSelector
|
||||||
|
);
|
||||||
|
if (titleEl) {
|
||||||
|
toggleTitle.append(
|
||||||
|
titleEl.textContent || titleEl.innerText,
|
||||||
|
toggleIcon
|
||||||
|
);
|
||||||
|
}
|
||||||
|
toggleTitle.classList.add("zindex-over-content");
|
||||||
|
toggleTitle.classList.add("quarto-sidebar-toggle-title");
|
||||||
|
toggleContainer.append(toggleTitle);
|
||||||
|
|
||||||
|
const toggleContents = window.document.createElement("div");
|
||||||
|
toggleContents.classList = el.classList;
|
||||||
|
toggleContents.classList.add("zindex-over-content");
|
||||||
|
toggleContents.classList.add("quarto-sidebar-toggle-contents");
|
||||||
|
for (const child of el.children) {
|
||||||
|
if (child.id === "toc-title") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const clone = child.cloneNode(true);
|
||||||
|
clone.style.opacity = 1;
|
||||||
|
clone.style.pointerEvents = null;
|
||||||
|
clone.style.display = null;
|
||||||
|
toggleContents.append(clone);
|
||||||
|
}
|
||||||
|
toggleContents.style.height = "0px";
|
||||||
|
const positionToggle = () => {
|
||||||
|
// position the element (top left of parent, same width as parent)
|
||||||
|
if (!elRect) {
|
||||||
|
elRect = el.getBoundingClientRect();
|
||||||
|
}
|
||||||
|
toggleContainer.style.left = `${elRect.left}px`;
|
||||||
|
toggleContainer.style.top = `${elRect.top}px`;
|
||||||
|
toggleContainer.style.width = `${elRect.width}px`;
|
||||||
|
};
|
||||||
|
positionToggle();
|
||||||
|
|
||||||
|
toggleContainer.append(toggleContents);
|
||||||
|
el.parentElement.prepend(toggleContainer);
|
||||||
|
|
||||||
|
// Process clicks
|
||||||
|
let tocShowing = false;
|
||||||
|
// Allow the caller to control whether this is dismissed
|
||||||
|
// when it is clicked (e.g. sidebar navigation supports
|
||||||
|
// opening and closing the nav tree, so don't dismiss on click)
|
||||||
|
const clickEl = placeholderDescriptor.dismissOnClick
|
||||||
|
? toggleContainer
|
||||||
|
: toggleTitle;
|
||||||
|
|
||||||
|
const closeToggle = () => {
|
||||||
|
if (tocShowing) {
|
||||||
|
toggleContainer.classList.remove("expanded");
|
||||||
|
toggleContents.style.height = "0px";
|
||||||
|
tocShowing = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get rid of any expanded toggle if the user scrolls
|
||||||
|
window.document.addEventListener(
|
||||||
|
"scroll",
|
||||||
|
throttle(() => {
|
||||||
|
closeToggle();
|
||||||
|
}, 50)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Handle positioning of the toggle
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
throttle(() => {
|
||||||
|
elRect = undefined;
|
||||||
|
positionToggle();
|
||||||
|
}, 50)
|
||||||
|
);
|
||||||
|
|
||||||
|
window.addEventListener("quarto-hrChanged", () => {
|
||||||
|
elRect = undefined;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Process the click
|
||||||
|
clickEl.onclick = () => {
|
||||||
|
if (!tocShowing) {
|
||||||
|
toggleContainer.classList.add("expanded");
|
||||||
|
toggleContents.style.height = null;
|
||||||
|
tocShowing = true;
|
||||||
|
} else {
|
||||||
|
closeToggle();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Converts a sidebar from a menu back to a sidebar
|
||||||
|
const convertToSidebar = () => {
|
||||||
|
for (const child of el.children) {
|
||||||
|
child.style.opacity = 1;
|
||||||
|
child.style.overflow = null;
|
||||||
|
child.style.pointerEvents = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const placeholderEl = window.document.getElementById(
|
||||||
|
placeholderDescriptor.id
|
||||||
|
);
|
||||||
|
if (placeholderEl) {
|
||||||
|
placeholderEl.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
el.classList.remove("rollup");
|
||||||
|
};
|
||||||
|
|
||||||
|
if (isReaderMode()) {
|
||||||
|
convertToMenu();
|
||||||
|
isVisible = false;
|
||||||
|
} else {
|
||||||
|
// Find the top and bottom o the element that is being managed
|
||||||
|
const elTop = el.offsetTop;
|
||||||
|
const elBottom =
|
||||||
|
elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight;
|
||||||
|
|
||||||
|
if (!isVisible) {
|
||||||
|
// If the element is current not visible reveal if there are
|
||||||
|
// no conflicts with overlay regions
|
||||||
|
if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) {
|
||||||
|
convertToSidebar();
|
||||||
|
isVisible = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If the element is visible, hide it if it conflicts with overlay regions
|
||||||
|
// and insert a placeholder toggle (or if we're in reader mode)
|
||||||
|
if (inHiddenRegion(elTop, elBottom, hiddenRegions)) {
|
||||||
|
convertToMenu();
|
||||||
|
isVisible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]');
|
||||||
|
for (const tabEl of tabEls) {
|
||||||
|
const id = tabEl.getAttribute("data-bs-target");
|
||||||
|
if (id) {
|
||||||
|
const columnEl = document.querySelector(
|
||||||
|
`${id} .column-margin, .tabset-margin-content`
|
||||||
|
);
|
||||||
|
if (columnEl)
|
||||||
|
tabEl.addEventListener("shown.bs.tab", function (event) {
|
||||||
|
const el = event.srcElement;
|
||||||
|
if (el) {
|
||||||
|
const visibleCls = `${el.id}-margin-content`;
|
||||||
|
// walk up until we find a parent tabset
|
||||||
|
let panelTabsetEl = el.parentElement;
|
||||||
|
while (panelTabsetEl) {
|
||||||
|
if (panelTabsetEl.classList.contains("panel-tabset")) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
panelTabsetEl = panelTabsetEl.parentElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (panelTabsetEl) {
|
||||||
|
const prevSib = panelTabsetEl.previousElementSibling;
|
||||||
|
if (
|
||||||
|
prevSib &&
|
||||||
|
prevSib.classList.contains("tabset-margin-container")
|
||||||
|
) {
|
||||||
|
const childNodes = prevSib.querySelectorAll(
|
||||||
|
".tabset-margin-content"
|
||||||
|
);
|
||||||
|
for (const childEl of childNodes) {
|
||||||
|
if (childEl.classList.contains(visibleCls)) {
|
||||||
|
childEl.classList.remove("collapse");
|
||||||
|
} else {
|
||||||
|
childEl.classList.add("collapse");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
layoutMarginEls();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Manage the visibility of the toc and the sidebar
|
||||||
|
const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, {
|
||||||
|
id: "quarto-toc-toggle",
|
||||||
|
titleSelector: "#toc-title",
|
||||||
|
dismissOnClick: true,
|
||||||
|
});
|
||||||
|
const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, {
|
||||||
|
id: "quarto-sidebarnav-toggle",
|
||||||
|
titleSelector: ".title",
|
||||||
|
dismissOnClick: false,
|
||||||
|
});
|
||||||
|
let tocLeftScrollVisibility;
|
||||||
|
if (leftTocEl) {
|
||||||
|
tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, {
|
||||||
|
id: "quarto-lefttoc-toggle",
|
||||||
|
titleSelector: "#toc-title",
|
||||||
|
dismissOnClick: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the first element that uses formatting in special columns
|
||||||
|
const conflictingEls = window.document.body.querySelectorAll(
|
||||||
|
'[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Filter all the possibly conflicting elements into ones
|
||||||
|
// the do conflict on the left or ride side
|
||||||
|
const arrConflictingEls = Array.from(conflictingEls);
|
||||||
|
const leftSideConflictEls = arrConflictingEls.filter((el) => {
|
||||||
|
if (el.tagName === "ASIDE") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return Array.from(el.classList).find((className) => {
|
||||||
|
return (
|
||||||
|
className !== "column-body" &&
|
||||||
|
className.startsWith("column-") &&
|
||||||
|
!className.endsWith("right") &&
|
||||||
|
!className.endsWith("container") &&
|
||||||
|
className !== "column-margin"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const rightSideConflictEls = arrConflictingEls.filter((el) => {
|
||||||
|
if (el.tagName === "ASIDE") {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasMarginCaption = Array.from(el.classList).find((className) => {
|
||||||
|
return className == "margin-caption";
|
||||||
|
});
|
||||||
|
if (hasMarginCaption) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Array.from(el.classList).find((className) => {
|
||||||
|
return (
|
||||||
|
className !== "column-body" &&
|
||||||
|
!className.endsWith("container") &&
|
||||||
|
className.startsWith("column-") &&
|
||||||
|
!className.endsWith("left")
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const kOverlapPaddingSize = 10;
|
||||||
|
function toRegions(els) {
|
||||||
|
return els.map((el) => {
|
||||||
|
const boundRect = el.getBoundingClientRect();
|
||||||
|
const top =
|
||||||
|
boundRect.top +
|
||||||
|
document.documentElement.scrollTop -
|
||||||
|
kOverlapPaddingSize;
|
||||||
|
return {
|
||||||
|
top,
|
||||||
|
bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let hasObserved = false;
|
||||||
|
const visibleItemObserver = (els) => {
|
||||||
|
let visibleElements = [...els];
|
||||||
|
const intersectionObserver = new IntersectionObserver(
|
||||||
|
(entries, _observer) => {
|
||||||
|
entries.forEach((entry) => {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
if (visibleElements.indexOf(entry.target) === -1) {
|
||||||
|
visibleElements.push(entry.target);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
visibleElements = visibleElements.filter((visibleEntry) => {
|
||||||
|
return visibleEntry !== entry;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!hasObserved) {
|
||||||
|
hideOverlappedSidebars();
|
||||||
|
}
|
||||||
|
hasObserved = true;
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
els.forEach((el) => {
|
||||||
|
intersectionObserver.observe(el);
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
getVisibleEntries: () => {
|
||||||
|
return visibleElements;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const rightElementObserver = visibleItemObserver(rightSideConflictEls);
|
||||||
|
const leftElementObserver = visibleItemObserver(leftSideConflictEls);
|
||||||
|
|
||||||
|
const hideOverlappedSidebars = () => {
|
||||||
|
marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries()));
|
||||||
|
sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries()));
|
||||||
|
if (tocLeftScrollVisibility) {
|
||||||
|
tocLeftScrollVisibility(
|
||||||
|
toRegions(leftElementObserver.getVisibleEntries())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.quartoToggleReader = () => {
|
||||||
|
// Applies a slow class (or removes it)
|
||||||
|
// to update the transition speed
|
||||||
|
const slowTransition = (slow) => {
|
||||||
|
const manageTransition = (id, slow) => {
|
||||||
|
const el = document.getElementById(id);
|
||||||
|
if (el) {
|
||||||
|
if (slow) {
|
||||||
|
el.classList.add("slow");
|
||||||
|
} else {
|
||||||
|
el.classList.remove("slow");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
manageTransition("TOC", slow);
|
||||||
|
manageTransition("quarto-sidebar", slow);
|
||||||
|
};
|
||||||
|
const readerMode = !isReaderMode();
|
||||||
|
setReaderModeValue(readerMode);
|
||||||
|
|
||||||
|
// If we're entering reader mode, slow the transition
|
||||||
|
if (readerMode) {
|
||||||
|
slowTransition(readerMode);
|
||||||
|
}
|
||||||
|
highlightReaderToggle(readerMode);
|
||||||
|
hideOverlappedSidebars();
|
||||||
|
|
||||||
|
// If we're exiting reader mode, restore the non-slow transition
|
||||||
|
if (!readerMode) {
|
||||||
|
slowTransition(!readerMode);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const highlightReaderToggle = (readerMode) => {
|
||||||
|
const els = document.querySelectorAll(".quarto-reader-toggle");
|
||||||
|
if (els) {
|
||||||
|
els.forEach((el) => {
|
||||||
|
if (readerMode) {
|
||||||
|
el.classList.add("reader");
|
||||||
|
} else {
|
||||||
|
el.classList.remove("reader");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const setReaderModeValue = (val) => {
|
||||||
|
if (window.location.protocol !== "file:") {
|
||||||
|
window.localStorage.setItem("quarto-reader-mode", val);
|
||||||
|
} else {
|
||||||
|
localReaderMode = val;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const isReaderMode = () => {
|
||||||
|
if (window.location.protocol !== "file:") {
|
||||||
|
return window.localStorage.getItem("quarto-reader-mode") === "true";
|
||||||
|
} else {
|
||||||
|
return localReaderMode;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let localReaderMode = null;
|
||||||
|
|
||||||
|
const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded");
|
||||||
|
const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1;
|
||||||
|
|
||||||
|
// Walk the TOC and collapse/expand nodes
|
||||||
|
// Nodes are expanded if:
|
||||||
|
// - they are top level
|
||||||
|
// - they have children that are 'active' links
|
||||||
|
// - they are directly below an link that is 'active'
|
||||||
|
const walk = (el, depth) => {
|
||||||
|
// Tick depth when we enter a UL
|
||||||
|
if (el.tagName === "UL") {
|
||||||
|
depth = depth + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// It this is active link
|
||||||
|
let isActiveNode = false;
|
||||||
|
if (el.tagName === "A" && el.classList.contains("active")) {
|
||||||
|
isActiveNode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// See if there is an active child to this element
|
||||||
|
let hasActiveChild = false;
|
||||||
|
for (child of el.children) {
|
||||||
|
hasActiveChild = walk(child, depth) || hasActiveChild;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process the collapse state if this is an UL
|
||||||
|
if (el.tagName === "UL") {
|
||||||
|
if (tocOpenDepth === -1 && depth > 1) {
|
||||||
|
// toc-expand: false
|
||||||
|
el.classList.add("collapse");
|
||||||
|
} else if (
|
||||||
|
depth <= tocOpenDepth ||
|
||||||
|
hasActiveChild ||
|
||||||
|
prevSiblingIsActiveLink(el)
|
||||||
|
) {
|
||||||
|
el.classList.remove("collapse");
|
||||||
|
} else {
|
||||||
|
el.classList.add("collapse");
|
||||||
|
}
|
||||||
|
|
||||||
|
// untick depth when we leave a UL
|
||||||
|
depth = depth - 1;
|
||||||
|
}
|
||||||
|
return hasActiveChild || isActiveNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
// walk the TOC and expand / collapse any items that should be shown
|
||||||
|
if (tocEl) {
|
||||||
|
updateActiveLink();
|
||||||
|
walk(tocEl, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Throttle the scroll event and walk peridiocally
|
||||||
|
window.document.addEventListener(
|
||||||
|
"scroll",
|
||||||
|
throttle(() => {
|
||||||
|
if (tocEl) {
|
||||||
|
updateActiveLink();
|
||||||
|
walk(tocEl, 0);
|
||||||
|
}
|
||||||
|
if (!isReaderMode()) {
|
||||||
|
hideOverlappedSidebars();
|
||||||
|
}
|
||||||
|
}, 5)
|
||||||
|
);
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
throttle(() => {
|
||||||
|
if (tocEl) {
|
||||||
|
updateActiveLink();
|
||||||
|
walk(tocEl, 0);
|
||||||
|
}
|
||||||
|
if (!isReaderMode()) {
|
||||||
|
hideOverlappedSidebars();
|
||||||
|
}
|
||||||
|
}, 10)
|
||||||
|
);
|
||||||
|
hideOverlappedSidebars();
|
||||||
|
highlightReaderToggle(isReaderMode());
|
||||||
|
});
|
||||||
|
|
||||||
|
// grouped tabsets
|
||||||
|
window.addEventListener("pageshow", (_event) => {
|
||||||
|
function getTabSettings() {
|
||||||
|
const data = localStorage.getItem("quarto-persistent-tabsets-data");
|
||||||
|
if (!data) {
|
||||||
|
localStorage.setItem("quarto-persistent-tabsets-data", "{}");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
if (data) {
|
||||||
|
return JSON.parse(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setTabSettings(data) {
|
||||||
|
localStorage.setItem(
|
||||||
|
"quarto-persistent-tabsets-data",
|
||||||
|
JSON.stringify(data)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setTabState(groupName, groupValue) {
|
||||||
|
const data = getTabSettings();
|
||||||
|
data[groupName] = groupValue;
|
||||||
|
setTabSettings(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleTab(tab, active) {
|
||||||
|
const tabPanelId = tab.getAttribute("aria-controls");
|
||||||
|
const tabPanel = document.getElementById(tabPanelId);
|
||||||
|
if (active) {
|
||||||
|
tab.classList.add("active");
|
||||||
|
tabPanel.classList.add("active");
|
||||||
|
} else {
|
||||||
|
tab.classList.remove("active");
|
||||||
|
tabPanel.classList.remove("active");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleAll(selectedGroup, selectorsToSync) {
|
||||||
|
for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) {
|
||||||
|
const active = selectedGroup === thisGroup;
|
||||||
|
for (const tab of tabs) {
|
||||||
|
toggleTab(tab, active);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function findSelectorsToSyncByLanguage() {
|
||||||
|
const result = {};
|
||||||
|
const tabs = Array.from(
|
||||||
|
document.querySelectorAll(`div[data-group] a[id^='tabset-']`)
|
||||||
|
);
|
||||||
|
for (const item of tabs) {
|
||||||
|
const div = item.parentElement.parentElement.parentElement;
|
||||||
|
const group = div.getAttribute("data-group");
|
||||||
|
if (!result[group]) {
|
||||||
|
result[group] = {};
|
||||||
|
}
|
||||||
|
const selectorsToSync = result[group];
|
||||||
|
const value = item.innerHTML;
|
||||||
|
if (!selectorsToSync[value]) {
|
||||||
|
selectorsToSync[value] = [];
|
||||||
|
}
|
||||||
|
selectorsToSync[value].push(item);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupSelectorSync() {
|
||||||
|
const selectorsToSync = findSelectorsToSyncByLanguage();
|
||||||
|
Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => {
|
||||||
|
Object.entries(tabSetsByValue).forEach(([value, items]) => {
|
||||||
|
items.forEach((item) => {
|
||||||
|
item.addEventListener("click", (_event) => {
|
||||||
|
setTabState(group, value);
|
||||||
|
toggleAll(value, selectorsToSync[group]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return selectorsToSync;
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectorsToSync = setupSelectorSync();
|
||||||
|
for (const [group, selectedName] of Object.entries(getTabSettings())) {
|
||||||
|
const selectors = selectorsToSync[group];
|
||||||
|
// it's possible that stale state gives us empty selections, so we explicitly check here.
|
||||||
|
if (selectors) {
|
||||||
|
toggleAll(selectedName, selectors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function throttle(func, wait) {
|
||||||
|
let waiting = false;
|
||||||
|
return function () {
|
||||||
|
if (!waiting) {
|
||||||
|
func.apply(this, arguments);
|
||||||
|
waiting = true;
|
||||||
|
setTimeout(function () {
|
||||||
|
waiting = false;
|
||||||
|
}, wait);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function nexttick(func) {
|
||||||
|
return setTimeout(func, 0);
|
||||||
|
}
|
||||||
1
docs/site_libs/quarto-html/tippy.css
Normal file
1
docs/site_libs/quarto-html/tippy.css
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}
|
||||||
2
docs/site_libs/quarto-html/tippy.umd.min.js
vendored
Normal file
2
docs/site_libs/quarto-html/tippy.umd.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
docs/site_libs/quarto-listing/list.min.js
vendored
Normal file
2
docs/site_libs/quarto-listing/list.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
243
docs/site_libs/quarto-listing/quarto-listing.js
Normal file
243
docs/site_libs/quarto-listing/quarto-listing.js
Normal file
|
|
@ -0,0 +1,243 @@
|
||||||
|
const kProgressiveAttr = "data-src";
|
||||||
|
let categoriesLoaded = false;
|
||||||
|
|
||||||
|
window.quartoListingCategory = (category) => {
|
||||||
|
if (categoriesLoaded) {
|
||||||
|
activateCategory(category);
|
||||||
|
setCategoryHash(category);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window["quarto-listing-loaded"] = () => {
|
||||||
|
// Process any existing hash
|
||||||
|
const hash = getHash();
|
||||||
|
|
||||||
|
if (hash) {
|
||||||
|
// If there is a category, switch to that
|
||||||
|
if (hash.category) {
|
||||||
|
activateCategory(hash.category);
|
||||||
|
}
|
||||||
|
// Paginate a specific listing
|
||||||
|
const listingIds = Object.keys(window["quarto-listings"]);
|
||||||
|
for (const listingId of listingIds) {
|
||||||
|
const page = hash[getListingPageKey(listingId)];
|
||||||
|
if (page) {
|
||||||
|
showPage(listingId, page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const listingIds = Object.keys(window["quarto-listings"]);
|
||||||
|
for (const listingId of listingIds) {
|
||||||
|
// The actual list
|
||||||
|
const list = window["quarto-listings"][listingId];
|
||||||
|
|
||||||
|
// Update the handlers for pagination events
|
||||||
|
refreshPaginationHandlers(listingId);
|
||||||
|
|
||||||
|
// Render any visible items that need it
|
||||||
|
renderVisibleProgressiveImages(list);
|
||||||
|
|
||||||
|
// Whenever the list is updated, we also need to
|
||||||
|
// attach handlers to the new pagination elements
|
||||||
|
// and refresh any newly visible items.
|
||||||
|
list.on("updated", function () {
|
||||||
|
renderVisibleProgressiveImages(list);
|
||||||
|
setTimeout(() => refreshPaginationHandlers(listingId));
|
||||||
|
|
||||||
|
// Show or hide the no matching message
|
||||||
|
toggleNoMatchingMessage(list);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||||
|
// Attach click handlers to categories
|
||||||
|
const categoryEls = window.document.querySelectorAll(
|
||||||
|
".quarto-listing-category .category"
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const categoryEl of categoryEls) {
|
||||||
|
const category = categoryEl.getAttribute("data-category");
|
||||||
|
categoryEl.onclick = () => {
|
||||||
|
activateCategory(category);
|
||||||
|
setCategoryHash(category);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attach a click handler to the category title
|
||||||
|
// (there should be only one, but since it is a class name, handle N)
|
||||||
|
const categoryTitleEls = window.document.querySelectorAll(
|
||||||
|
".quarto-listing-category-title"
|
||||||
|
);
|
||||||
|
for (const categoryTitleEl of categoryTitleEls) {
|
||||||
|
categoryTitleEl.onclick = () => {
|
||||||
|
activateCategory("");
|
||||||
|
setCategoryHash("");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
categoriesLoaded = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
function toggleNoMatchingMessage(list) {
|
||||||
|
const selector = `#${list.listContainer.id} .listing-no-matching`;
|
||||||
|
const noMatchingEl = window.document.querySelector(selector);
|
||||||
|
if (noMatchingEl) {
|
||||||
|
if (list.visibleItems.length === 0) {
|
||||||
|
noMatchingEl.classList.remove("d-none");
|
||||||
|
} else {
|
||||||
|
if (!noMatchingEl.classList.contains("d-none")) {
|
||||||
|
noMatchingEl.classList.add("d-none");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setCategoryHash(category) {
|
||||||
|
setHash({ category });
|
||||||
|
}
|
||||||
|
|
||||||
|
function setPageHash(listingId, page) {
|
||||||
|
const currentHash = getHash() || {};
|
||||||
|
currentHash[getListingPageKey(listingId)] = page;
|
||||||
|
setHash(currentHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getListingPageKey(listingId) {
|
||||||
|
return `${listingId}-page`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshPaginationHandlers(listingId) {
|
||||||
|
const listingEl = window.document.getElementById(listingId);
|
||||||
|
const paginationEls = listingEl.querySelectorAll(
|
||||||
|
".pagination li.page-item:not(.disabled) .page.page-link"
|
||||||
|
);
|
||||||
|
for (const paginationEl of paginationEls) {
|
||||||
|
paginationEl.onclick = (sender) => {
|
||||||
|
setPageHash(listingId, sender.target.getAttribute("data-i"));
|
||||||
|
showPage(listingId, sender.target.getAttribute("data-i"));
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderVisibleProgressiveImages(list) {
|
||||||
|
// Run through the visible items and render any progressive images
|
||||||
|
for (const item of list.visibleItems) {
|
||||||
|
const itemEl = item.elm;
|
||||||
|
if (itemEl) {
|
||||||
|
const progressiveImgs = itemEl.querySelectorAll(
|
||||||
|
`img[${kProgressiveAttr}]`
|
||||||
|
);
|
||||||
|
for (const progressiveImg of progressiveImgs) {
|
||||||
|
const srcValue = progressiveImg.getAttribute(kProgressiveAttr);
|
||||||
|
if (srcValue) {
|
||||||
|
progressiveImg.setAttribute("src", srcValue);
|
||||||
|
}
|
||||||
|
progressiveImg.removeAttribute(kProgressiveAttr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getHash() {
|
||||||
|
// Hashes are of the form
|
||||||
|
// #name:value|name1:value1|name2:value2
|
||||||
|
const currentUrl = new URL(window.location);
|
||||||
|
const hashRaw = currentUrl.hash ? currentUrl.hash.slice(1) : undefined;
|
||||||
|
return parseHash(hashRaw);
|
||||||
|
}
|
||||||
|
|
||||||
|
const kAnd = "&";
|
||||||
|
const kEquals = "=";
|
||||||
|
|
||||||
|
function parseHash(hash) {
|
||||||
|
if (!hash) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const hasValuesStrs = hash.split(kAnd);
|
||||||
|
const hashValues = hasValuesStrs
|
||||||
|
.map((hashValueStr) => {
|
||||||
|
const vals = hashValueStr.split(kEquals);
|
||||||
|
if (vals.length === 2) {
|
||||||
|
return { name: vals[0], value: vals[1] };
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter((value) => {
|
||||||
|
return value !== undefined;
|
||||||
|
});
|
||||||
|
|
||||||
|
const hashObj = {};
|
||||||
|
hashValues.forEach((hashValue) => {
|
||||||
|
hashObj[hashValue.name] = decodeURIComponent(hashValue.value);
|
||||||
|
});
|
||||||
|
return hashObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeHash(obj) {
|
||||||
|
return Object.keys(obj)
|
||||||
|
.map((key) => {
|
||||||
|
return `${key}${kEquals}${obj[key]}`;
|
||||||
|
})
|
||||||
|
.join(kAnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setHash(obj) {
|
||||||
|
const hash = makeHash(obj);
|
||||||
|
window.history.pushState(null, null, `#${hash}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showPage(listingId, page) {
|
||||||
|
const list = window["quarto-listings"][listingId];
|
||||||
|
if (list) {
|
||||||
|
list.show((page - 1) * list.page + 1, list.page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function activateCategory(category) {
|
||||||
|
// Deactivate existing categories
|
||||||
|
const activeEls = window.document.querySelectorAll(
|
||||||
|
".quarto-listing-category .category.active"
|
||||||
|
);
|
||||||
|
for (const activeEl of activeEls) {
|
||||||
|
activeEl.classList.remove("active");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Activate this category
|
||||||
|
const categoryEl = window.document.querySelector(
|
||||||
|
`.quarto-listing-category .category[data-category='${category}'`
|
||||||
|
);
|
||||||
|
if (categoryEl) {
|
||||||
|
categoryEl.classList.add("active");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter the listings to this category
|
||||||
|
filterListingCategory(category);
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterListingCategory(category) {
|
||||||
|
const listingIds = Object.keys(window["quarto-listings"]);
|
||||||
|
for (const listingId of listingIds) {
|
||||||
|
const list = window["quarto-listings"][listingId];
|
||||||
|
if (list) {
|
||||||
|
if (category === "") {
|
||||||
|
// resets the filter
|
||||||
|
list.filter();
|
||||||
|
} else {
|
||||||
|
// filter to this category
|
||||||
|
list.filter(function (item) {
|
||||||
|
const itemValues = item.values();
|
||||||
|
if (itemValues.categories !== null) {
|
||||||
|
const categories = itemValues.categories.split(",");
|
||||||
|
return categories.includes(category);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
7
docs/site_libs/quarto-nav/headroom.min.js
vendored
Normal file
7
docs/site_libs/quarto-nav/headroom.min.js
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
/*!
|
||||||
|
* headroom.js v0.12.0 - Give your page some headroom. Hide your header until you need it
|
||||||
|
* Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js
|
||||||
|
* License: MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).Headroom=n()}(this,function(){"use strict";function t(){return"undefined"!=typeof window}function d(t){return function(t){return t&&t.document&&function(t){return 9===t.nodeType}(t.document)}(t)?function(t){var n=t.document,o=n.body,s=n.documentElement;return{scrollHeight:function(){return Math.max(o.scrollHeight,s.scrollHeight,o.offsetHeight,s.offsetHeight,o.clientHeight,s.clientHeight)},height:function(){return t.innerHeight||s.clientHeight||o.clientHeight},scrollY:function(){return void 0!==t.pageYOffset?t.pageYOffset:(s||o.parentNode||o).scrollTop}}}(t):function(t){return{scrollHeight:function(){return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight)},height:function(){return Math.max(t.offsetHeight,t.clientHeight)},scrollY:function(){return t.scrollTop}}}(t)}function n(t,s,e){var n,o=function(){var n=!1;try{var t={get passive(){n=!0}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){n=!1}return n}(),i=!1,r=d(t),l=r.scrollY(),a={};function c(){var t=Math.round(r.scrollY()),n=r.height(),o=r.scrollHeight();a.scrollY=t,a.lastScrollY=l,a.direction=l<t?"down":"up",a.distance=Math.abs(t-l),a.isOutOfBounds=t<0||o<t+n,a.top=t<=s.offset[a.direction],a.bottom=o<=t+n,a.toleranceExceeded=a.distance>s.tolerance[a.direction],e(a),l=t,i=!1}function h(){i||(i=!0,n=requestAnimationFrame(c))}var u=!!o&&{passive:!0,capture:!1};return t.addEventListener("scroll",h,u),c(),{destroy:function(){cancelAnimationFrame(n),t.removeEventListener("scroll",h,u)}}}function o(t){return t===Object(t)?t:{down:t,up:t}}function s(t,n){n=n||{},Object.assign(this,s.options,n),this.classes=Object.assign({},s.options.classes,n.classes),this.elem=t,this.tolerance=o(this.tolerance),this.offset=o(this.offset),this.initialised=!1,this.frozen=!1}return s.prototype={constructor:s,init:function(){return s.cutsTheMustard&&!this.initialised&&(this.addClass("initial"),this.initialised=!0,setTimeout(function(t){t.scrollTracker=n(t.scroller,{offset:t.offset,tolerance:t.tolerance},t.update.bind(t))},100,this)),this},destroy:function(){this.initialised=!1,Object.keys(this.classes).forEach(this.removeClass,this),this.scrollTracker.destroy()},unpin:function(){!this.hasClass("pinned")&&this.hasClass("unpinned")||(this.addClass("unpinned"),this.removeClass("pinned"),this.onUnpin&&this.onUnpin.call(this))},pin:function(){this.hasClass("unpinned")&&(this.addClass("pinned"),this.removeClass("unpinned"),this.onPin&&this.onPin.call(this))},freeze:function(){this.frozen=!0,this.addClass("frozen")},unfreeze:function(){this.frozen=!1,this.removeClass("frozen")},top:function(){this.hasClass("top")||(this.addClass("top"),this.removeClass("notTop"),this.onTop&&this.onTop.call(this))},notTop:function(){this.hasClass("notTop")||(this.addClass("notTop"),this.removeClass("top"),this.onNotTop&&this.onNotTop.call(this))},bottom:function(){this.hasClass("bottom")||(this.addClass("bottom"),this.removeClass("notBottom"),this.onBottom&&this.onBottom.call(this))},notBottom:function(){this.hasClass("notBottom")||(this.addClass("notBottom"),this.removeClass("bottom"),this.onNotBottom&&this.onNotBottom.call(this))},shouldUnpin:function(t){return"down"===t.direction&&!t.top&&t.toleranceExceeded},shouldPin:function(t){return"up"===t.direction&&t.toleranceExceeded||t.top},addClass:function(t){this.elem.classList.add.apply(this.elem.classList,this.classes[t].split(" "))},removeClass:function(t){this.elem.classList.remove.apply(this.elem.classList,this.classes[t].split(" "))},hasClass:function(t){return this.classes[t].split(" ").every(function(t){return this.classList.contains(t)},this.elem)},update:function(t){t.isOutOfBounds||!0!==this.frozen&&(t.top?this.top():this.notTop(),t.bottom?this.bottom():this.notBottom(),this.shouldUnpin(t)?this.unpin():this.shouldPin(t)&&this.pin())}},s.options={tolerance:{up:0,down:0},offset:0,scroller:t()?window:null,classes:{frozen:"headroom--frozen",pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",bottom:"headroom--bottom",notBottom:"headroom--not-bottom",initial:"headroom"}},s.cutsTheMustard=!!(t()&&function(){}.bind&&"classList"in document.documentElement&&Object.assign&&Object.keys&&requestAnimationFrame),s});
|
||||||
325
docs/site_libs/quarto-nav/quarto-nav.js
Normal file
325
docs/site_libs/quarto-nav/quarto-nav.js
Normal file
|
|
@ -0,0 +1,325 @@
|
||||||
|
const headroomChanged = new CustomEvent("quarto-hrChanged", {
|
||||||
|
detail: {},
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: false,
|
||||||
|
composed: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const announceDismiss = () => {
|
||||||
|
const annEl = window.document.getElementById("quarto-announcement");
|
||||||
|
if (annEl) {
|
||||||
|
annEl.remove();
|
||||||
|
|
||||||
|
const annId = annEl.getAttribute("data-announcement-id");
|
||||||
|
window.localStorage.setItem(`quarto-announce-${annId}`, "true");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const announceRegister = () => {
|
||||||
|
const annEl = window.document.getElementById("quarto-announcement");
|
||||||
|
if (annEl) {
|
||||||
|
const annId = annEl.getAttribute("data-announcement-id");
|
||||||
|
const isDismissed =
|
||||||
|
window.localStorage.getItem(`quarto-announce-${annId}`) || false;
|
||||||
|
if (isDismissed) {
|
||||||
|
announceDismiss();
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
annEl.classList.remove("hidden");
|
||||||
|
}
|
||||||
|
|
||||||
|
const actionEl = annEl.querySelector(".quarto-announcement-action");
|
||||||
|
if (actionEl) {
|
||||||
|
actionEl.addEventListener("click", function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
// Hide the bar immediately
|
||||||
|
announceDismiss();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
let init = false;
|
||||||
|
|
||||||
|
announceRegister();
|
||||||
|
|
||||||
|
// Manage the back to top button, if one is present.
|
||||||
|
let lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;
|
||||||
|
const scrollDownBuffer = 5;
|
||||||
|
const scrollUpBuffer = 35;
|
||||||
|
const btn = document.getElementById("quarto-back-to-top");
|
||||||
|
const hideBackToTop = () => {
|
||||||
|
btn.style.display = "none";
|
||||||
|
};
|
||||||
|
const showBackToTop = () => {
|
||||||
|
btn.style.display = "inline-block";
|
||||||
|
};
|
||||||
|
if (btn) {
|
||||||
|
window.document.addEventListener(
|
||||||
|
"scroll",
|
||||||
|
function () {
|
||||||
|
const currentScrollTop =
|
||||||
|
window.pageYOffset || document.documentElement.scrollTop;
|
||||||
|
|
||||||
|
// Shows and hides the button 'intelligently' as the user scrolls
|
||||||
|
if (currentScrollTop - scrollDownBuffer > lastScrollTop) {
|
||||||
|
hideBackToTop();
|
||||||
|
lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop;
|
||||||
|
} else if (currentScrollTop < lastScrollTop - scrollUpBuffer) {
|
||||||
|
showBackToTop();
|
||||||
|
lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show the button at the bottom, hides it at the top
|
||||||
|
if (currentScrollTop <= 0) {
|
||||||
|
hideBackToTop();
|
||||||
|
} else if (
|
||||||
|
window.innerHeight + currentScrollTop >=
|
||||||
|
document.body.offsetHeight
|
||||||
|
) {
|
||||||
|
showBackToTop();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function throttle(func, wait) {
|
||||||
|
var timeout;
|
||||||
|
return function () {
|
||||||
|
const context = this;
|
||||||
|
const args = arguments;
|
||||||
|
const later = function () {
|
||||||
|
clearTimeout(timeout);
|
||||||
|
timeout = null;
|
||||||
|
func.apply(context, args);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!timeout) {
|
||||||
|
timeout = setTimeout(later, wait);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function headerOffset() {
|
||||||
|
// Set an offset if there is are fixed top navbar
|
||||||
|
const headerEl = window.document.querySelector("header.fixed-top");
|
||||||
|
if (headerEl) {
|
||||||
|
return headerEl.clientHeight;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function footerOffset() {
|
||||||
|
const footerEl = window.document.querySelector("footer.footer");
|
||||||
|
if (footerEl) {
|
||||||
|
return footerEl.clientHeight;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function dashboardOffset() {
|
||||||
|
const dashboardNavEl = window.document.getElementById(
|
||||||
|
"quarto-dashboard-header"
|
||||||
|
);
|
||||||
|
if (dashboardNavEl !== null) {
|
||||||
|
return dashboardNavEl.clientHeight;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateDocumentOffsetWithoutAnimation() {
|
||||||
|
updateDocumentOffset(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateDocumentOffset(animated) {
|
||||||
|
// set body offset
|
||||||
|
const topOffset = headerOffset();
|
||||||
|
const bodyOffset = topOffset + footerOffset() + dashboardOffset();
|
||||||
|
const bodyEl = window.document.body;
|
||||||
|
bodyEl.setAttribute("data-bs-offset", topOffset);
|
||||||
|
bodyEl.style.paddingTop = topOffset + "px";
|
||||||
|
|
||||||
|
// deal with sidebar offsets
|
||||||
|
const sidebars = window.document.querySelectorAll(
|
||||||
|
".sidebar, .headroom-target"
|
||||||
|
);
|
||||||
|
sidebars.forEach((sidebar) => {
|
||||||
|
if (!animated) {
|
||||||
|
sidebar.classList.add("notransition");
|
||||||
|
// Remove the no transition class after the animation has time to complete
|
||||||
|
setTimeout(function () {
|
||||||
|
sidebar.classList.remove("notransition");
|
||||||
|
}, 201);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window.Headroom && sidebar.classList.contains("sidebar-unpinned")) {
|
||||||
|
sidebar.style.top = "0";
|
||||||
|
sidebar.style.maxHeight = "100vh";
|
||||||
|
} else {
|
||||||
|
sidebar.style.top = topOffset + "px";
|
||||||
|
sidebar.style.maxHeight = "calc(100vh - " + topOffset + "px)";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// allow space for footer
|
||||||
|
const mainContainer = window.document.querySelector(".quarto-container");
|
||||||
|
if (mainContainer) {
|
||||||
|
mainContainer.style.minHeight = "calc(100vh - " + bodyOffset + "px)";
|
||||||
|
}
|
||||||
|
|
||||||
|
// link offset
|
||||||
|
let linkStyle = window.document.querySelector("#quarto-target-style");
|
||||||
|
if (!linkStyle) {
|
||||||
|
linkStyle = window.document.createElement("style");
|
||||||
|
linkStyle.setAttribute("id", "quarto-target-style");
|
||||||
|
window.document.head.appendChild(linkStyle);
|
||||||
|
}
|
||||||
|
while (linkStyle.firstChild) {
|
||||||
|
linkStyle.removeChild(linkStyle.firstChild);
|
||||||
|
}
|
||||||
|
if (topOffset > 0) {
|
||||||
|
linkStyle.appendChild(
|
||||||
|
window.document.createTextNode(`
|
||||||
|
section:target::before {
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
height: ${topOffset}px;
|
||||||
|
margin: -${topOffset}px 0 0;
|
||||||
|
}`)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (init) {
|
||||||
|
window.dispatchEvent(headroomChanged);
|
||||||
|
}
|
||||||
|
init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize headroom
|
||||||
|
var header = window.document.querySelector("#quarto-header");
|
||||||
|
if (header && window.Headroom) {
|
||||||
|
const headroom = new window.Headroom(header, {
|
||||||
|
tolerance: 5,
|
||||||
|
onPin: function () {
|
||||||
|
const sidebars = window.document.querySelectorAll(
|
||||||
|
".sidebar, .headroom-target"
|
||||||
|
);
|
||||||
|
sidebars.forEach((sidebar) => {
|
||||||
|
sidebar.classList.remove("sidebar-unpinned");
|
||||||
|
});
|
||||||
|
updateDocumentOffset();
|
||||||
|
},
|
||||||
|
onUnpin: function () {
|
||||||
|
const sidebars = window.document.querySelectorAll(
|
||||||
|
".sidebar, .headroom-target"
|
||||||
|
);
|
||||||
|
sidebars.forEach((sidebar) => {
|
||||||
|
sidebar.classList.add("sidebar-unpinned");
|
||||||
|
});
|
||||||
|
updateDocumentOffset();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
headroom.init();
|
||||||
|
|
||||||
|
let frozen = false;
|
||||||
|
window.quartoToggleHeadroom = function () {
|
||||||
|
if (frozen) {
|
||||||
|
headroom.unfreeze();
|
||||||
|
frozen = false;
|
||||||
|
} else {
|
||||||
|
headroom.freeze();
|
||||||
|
frozen = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener(
|
||||||
|
"hashchange",
|
||||||
|
function (e) {
|
||||||
|
if (
|
||||||
|
getComputedStyle(document.documentElement).scrollBehavior !== "smooth"
|
||||||
|
) {
|
||||||
|
window.scrollTo(0, window.pageYOffset - headerOffset());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
|
// Observe size changed for the header
|
||||||
|
const headerEl = window.document.querySelector("header.fixed-top");
|
||||||
|
if (headerEl && window.ResizeObserver) {
|
||||||
|
const observer = new window.ResizeObserver(() => {
|
||||||
|
setTimeout(updateDocumentOffsetWithoutAnimation, 0);
|
||||||
|
});
|
||||||
|
observer.observe(headerEl, {
|
||||||
|
attributes: true,
|
||||||
|
childList: true,
|
||||||
|
characterData: true,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
window.addEventListener(
|
||||||
|
"resize",
|
||||||
|
throttle(updateDocumentOffsetWithoutAnimation, 50)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
setTimeout(updateDocumentOffsetWithoutAnimation, 250);
|
||||||
|
|
||||||
|
// fixup index.html links if we aren't on the filesystem
|
||||||
|
if (window.location.protocol !== "file:") {
|
||||||
|
const links = window.document.querySelectorAll("a");
|
||||||
|
for (let i = 0; i < links.length; i++) {
|
||||||
|
if (links[i].href) {
|
||||||
|
links[i].dataset.originalHref = links[i].href;
|
||||||
|
links[i].href = links[i].href.replace(/\/index\.html/, "/");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fixup any sharing links that require urls
|
||||||
|
// Append url to any sharing urls
|
||||||
|
const sharingLinks = window.document.querySelectorAll(
|
||||||
|
"a.sidebar-tools-main-item, a.quarto-navigation-tool, a.quarto-navbar-tools, a.quarto-navbar-tools-item"
|
||||||
|
);
|
||||||
|
for (let i = 0; i < sharingLinks.length; i++) {
|
||||||
|
const sharingLink = sharingLinks[i];
|
||||||
|
const href = sharingLink.getAttribute("href");
|
||||||
|
if (href) {
|
||||||
|
sharingLink.setAttribute(
|
||||||
|
"href",
|
||||||
|
href.replace("|url|", window.location.href)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scroll the active navigation item into view, if necessary
|
||||||
|
const navSidebar = window.document.querySelector("nav#quarto-sidebar");
|
||||||
|
if (navSidebar) {
|
||||||
|
// Find the active item
|
||||||
|
const activeItem = navSidebar.querySelector("li.sidebar-item a.active");
|
||||||
|
if (activeItem) {
|
||||||
|
// Wait for the scroll height and height to resolve by observing size changes on the
|
||||||
|
// nav element that is scrollable
|
||||||
|
const resizeObserver = new ResizeObserver((_entries) => {
|
||||||
|
// The bottom of the element
|
||||||
|
const elBottom = activeItem.offsetTop;
|
||||||
|
const viewBottom = navSidebar.scrollTop + navSidebar.clientHeight;
|
||||||
|
|
||||||
|
// The element height and scroll height are the same, then we are still loading
|
||||||
|
if (viewBottom !== navSidebar.scrollHeight) {
|
||||||
|
// Determine if the item isn't visible and scroll to it
|
||||||
|
if (elBottom >= viewBottom) {
|
||||||
|
navSidebar.scrollTop = elBottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop observing now since we've completed the scroll
|
||||||
|
resizeObserver.unobserve(navSidebar);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
resizeObserver.observe(navSidebar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
3
docs/site_libs/quarto-search/autocomplete.umd.js
Normal file
3
docs/site_libs/quarto-search/autocomplete.umd.js
Normal file
File diff suppressed because one or more lines are too long
9
docs/site_libs/quarto-search/fuse.min.js
vendored
Normal file
9
docs/site_libs/quarto-search/fuse.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1290
docs/site_libs/quarto-search/quarto-search.js
Normal file
1290
docs/site_libs/quarto-search/quarto-search.js
Normal file
File diff suppressed because it is too large
Load diff
5
docs/styles.css
Normal file
5
docs/styles.css
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
/* css styles */
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
25
index.qmd
25
index.qmd
|
|
@ -1,7 +1,28 @@
|
||||||
---
|
---
|
||||||
title: "Site perso"
|
title: "Site perso"
|
||||||
|
image: media/photo.jpg
|
||||||
|
about:
|
||||||
|
template: trestles
|
||||||
|
image-shape: round
|
||||||
|
image-width: 12em
|
||||||
|
links:
|
||||||
|
- text: Email
|
||||||
|
icon: envelope
|
||||||
|
href: mailto:louis.lacoste@agroparistech.fr
|
||||||
|
target: _blank
|
||||||
|
- text: "{{< ai orcid >}} ORCID"
|
||||||
|
href: https://orcid.org/0009-0004-0178-9821
|
||||||
|
target: _blank
|
||||||
|
- text: "{{< fa brands github >}} Github"
|
||||||
|
href: https://github.com/Polarolouis
|
||||||
|
target: _blank
|
||||||
|
- text: "{{< fa file-pdf >}} CV"
|
||||||
|
href: https://gitea.polarolouis.fr/polarolouis/cv-latex/raw/branch/main/cv.pdf
|
||||||
---
|
---
|
||||||
|
|
||||||
This is a Quarto website.
|
Will update later
|
||||||
|
|
||||||
To learn more about Quarto websites visit <https://quarto.org/docs/websites>.
|
# My Github contributions
|
||||||
|
<!-- replace x.x.x with actual version -->
|
||||||
|
<script src="https://unpkg.com/@codersrank/activity/codersrank-activity.min.js"></script>
|
||||||
|
<codersrank-activity username="Polarolouis"></codersrank-activity>
|
||||||
BIN
media/photo.jpg
Normal file
BIN
media/photo.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
8
posts.qmd
Normal file
8
posts.qmd
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
title: "Posts"
|
||||||
|
listing:
|
||||||
|
contents: posts # this name must match the name of the folder you created in step #1; here, all Quarto docs in the `posts` directory will be included on your listing page
|
||||||
|
type: grid # or `default` or `table`; each type has its own set of yaml options to include
|
||||||
|
sort: "date desc" # can also sort on more than one field
|
||||||
|
categories: true # allows you to sort posts by assigned categories
|
||||||
|
---
|
||||||
13
posts/_metadata.yml
Normal file
13
posts/_metadata.yml
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
# options specified here will apply to all posts in this folder
|
||||||
|
|
||||||
|
# re-render posts only when a change to the source file is made ----
|
||||||
|
freeze: auto
|
||||||
|
|
||||||
|
author:
|
||||||
|
name: Louis Lacoste
|
||||||
|
email: louis.lacoste@agroparistech.fr
|
||||||
|
affiliation: MIA Paris-Saclay, INRAE, AgroParisTech, Université Paris-Saclay
|
||||||
|
orcid: 0009-0004-0178-9821
|
||||||
|
|
||||||
|
# enable banner style title blocks ----
|
||||||
|
title-block-banner: true
|
||||||
14
posts/test.qmd
Normal file
14
posts/test.qmd
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
---
|
||||||
|
title: A test post
|
||||||
|
---
|
||||||
|
|
||||||
|
```{r}
|
||||||
|
library(ggplot2)
|
||||||
|
```
|
||||||
|
|
||||||
|
```{r}
|
||||||
|
vec <- rnorm(n = 10000)
|
||||||
|
|
||||||
|
ggplot(as.data.frame(vec)) + aes(x=vec) +
|
||||||
|
geom_histogram() + theme_minimal()
|
||||||
|
```
|
||||||
|
|
@ -1 +1,5 @@
|
||||||
/* css styles */
|
/* css styles */
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue