removing _site files
This commit is contained in:
parent
2791c130c7
commit
cc679d5dfc
@ -1,393 +0,0 @@
|
|||||||
<!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.3.353">
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
|
||||||
|
|
||||||
|
|
||||||
<title>WASH Web - Contact</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": 20,
|
|
||||||
"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-detached-cancel-button-title": "Cancel",
|
|
||||||
"search-submit-button-title": "Submit"
|
|
||||||
}
|
|
||||||
}</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 navbar-dark ">
|
|
||||||
<div class="navbar-container container-fluid">
|
|
||||||
<div class="navbar-brand-container">
|
|
||||||
<a class="navbar-brand" href="./index.html">
|
|
||||||
<span class="navbar-title">WASH Web</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" 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" rel="" target="">
|
|
||||||
<span class="menu-text">Home</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./vision.html" rel="" target="">
|
|
||||||
<span class="menu-text">Vision</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link active" href="./contact.html" rel="" target="" aria-current="page">
|
|
||||||
<span class="menu-text">Contact</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./posts.html" rel="" target="">
|
|
||||||
<span class="menu-text">News</span></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="quarto-navbar-tools ms-auto">
|
|
||||||
</div>
|
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</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="#core-facilitating-team" id="toc-core-facilitating-team" class="nav-link active" data-scroll-target="#core-facilitating-team">Core facilitating team</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</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">Contact</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="quarto-title-meta">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<section id="core-facilitating-team" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="core-facilitating-team">Core facilitating team</h2>
|
|
||||||
<section id="nicolas-dickinson---wash-web-lead" class="level4">
|
|
||||||
<h4 class="anchored" data-anchor-id="nicolas-dickinson---wash-web-lead">Nicolas Dickinson - WASH Web Lead</h4>
|
|
||||||
<p>Founder of <a href="#0">WASHNote</a>. With over 15 years of experience in the WASH sector, Nick is highly specialized in the development of international and regional monitoring of WASH commitments and their enabling environments, providing country-led monitoring and evaluation of services, and facilitating trainings to a range of different organizations. Above all, he firmly believes in the need for making better use of data and digital systems to advance towards reaching SDG 6: clean water and sanitation for all by 2030.</p>
|
|
||||||
<p><a href="mailto:dickinson@washnote.com" target="_blank">Email</a> | <a href="https://www.linkedin.com/in/nicolasdickinson/">LinkedIn</a></p>
|
|
||||||
</section>
|
|
||||||
<section id="merel-laauwen---wash-web-coordinator" class="level4">
|
|
||||||
<h4 class="anchored" data-anchor-id="merel-laauwen---wash-web-coordinator">Merel Laauwen - WASH Web Coordinator</h4>
|
|
||||||
<p>Merel works as an independent consultant in the WASH sector. Her work spans a variety of topics, from WASH systems strengthening to disaster preparedness in humanitarian settings. She graduated from the University of Oxford with an MSc in Water Science, Policy and Management, where her dissertation research focused on the use of systems thinking in the implementation of rural water treatment.</p>
|
|
||||||
<p><a href="mailto:merel@lwn.earth" target="_blank">Email</a> | <a href="https://www.linkedin.com/in/merel-laauwen/">LinkedIn</a></p>
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
</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 clipboard = new window.ClipboardJS('.code-copy-button', {
|
|
||||||
text: function(trigger) {
|
|
||||||
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
|
||||||
for (const childEl of codeEl.children) {
|
|
||||||
if (isCodeAnnotation(childEl)) {
|
|
||||||
childEl.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return codeEl.innerText;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
clipboard.on('success', 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();
|
|
||||||
});
|
|
||||||
function tippyHover(el, contentFn) {
|
|
||||||
const config = {
|
|
||||||
allowHTML: true,
|
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
|
||||||
delay: 100,
|
|
||||||
arrow: false,
|
|
||||||
appendTo: function(el) {
|
|
||||||
return el.parentElement;
|
|
||||||
},
|
|
||||||
interactive: true,
|
|
||||||
interactiveBorder: 10,
|
|
||||||
theme: 'quarto',
|
|
||||||
placement: 'bottom-start'
|
|
||||||
};
|
|
||||||
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);
|
|
||||||
return note.innerHTML;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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";
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
// 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>
|
|
Binary file not shown.
Before Width: | Height: | Size: 38 KiB |
417
_site/index.html
417
_site/index.html
@ -1,417 +0,0 @@
|
|||||||
<!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.3.353">
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
|
||||||
|
|
||||||
|
|
||||||
<title>WASH Web - Agents of Change</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": 20,
|
|
||||||
"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-detached-cancel-button-title": "Cancel",
|
|
||||||
"search-submit-button-title": "Submit"
|
|
||||||
}
|
|
||||||
}</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 navbar-dark ">
|
|
||||||
<div class="navbar-container container-fluid">
|
|
||||||
<div class="navbar-brand-container">
|
|
||||||
<a class="navbar-brand" href="./index.html">
|
|
||||||
<span class="navbar-title">WASH Web</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" 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" rel="" target="" aria-current="page">
|
|
||||||
<span class="menu-text">Home</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./vision.html" rel="" target="">
|
|
||||||
<span class="menu-text">Vision</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./contact.html" rel="" target="">
|
|
||||||
<span class="menu-text">Contact</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./posts.html" rel="" target="">
|
|
||||||
<span class="menu-text">News</span></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="quarto-navbar-tools ms-auto">
|
|
||||||
</div>
|
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</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="#working-group-initiatives" id="toc-working-group-initiatives" class="nav-link active" data-scroll-target="#working-group-initiatives">Working group initiatives</a>
|
|
||||||
<ul class="collapse">
|
|
||||||
<li><a href="#social-justice" id="toc-social-justice" class="nav-link" data-scroll-target="#social-justice">Social Justice</a></li>
|
|
||||||
<li><a href="#using-data-better" id="toc-using-data-better" class="nav-link" data-scroll-target="#using-data-better">Using Data Better</a></li>
|
|
||||||
<li><a href="#systems-thinking" id="toc-systems-thinking" class="nav-link" data-scroll-target="#systems-thinking">Systems Thinking</a></li>
|
|
||||||
<li><a href="#accountability-4ws" id="toc-accountability-4ws" class="nav-link" data-scroll-target="#accountability-4ws">Accountability: 4Ws</a></li>
|
|
||||||
<li><a href="#join" id="toc-join" class="nav-link" data-scroll-target="#join">Who can take part?</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</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">Agents of Change</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="quarto-title-meta">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<p>WASH Web is a set of participatory initiatives to give you and everyone you know better access to water, sanitation and hygiene information. This web page is where you can find more information about taking part in various ways.</p>
|
|
||||||
<p>The WASH Web is made up of people and organizations that work to fill the water, sanitation and hygiene (WASH) gap to make data discoverable, usable and representative. WASH Web is meant to serve as an open platform and requires diverse inputs to work. Our vision cannot be realized without community support.</p>
|
|
||||||
<p><a href="#join">Please join us to contribute.</a></p>
|
|
||||||
<section id="working-group-initiatives" class="level1">
|
|
||||||
<h1>Working group initiatives</h1>
|
|
||||||
<p>The work groups facilitate collaboration and discussions on four different initiatives for an improved and healthy data environment.</p>
|
|
||||||
<section id="social-justice" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="social-justice">Social Justice</h2>
|
|
||||||
<p>Access to safe drinking water is a basic human right, and access to WASH systems is a social justice issue. What information is needed to improve access for marginalized people? What specific ethical issues around data collection, privacy, data ownership, and use of data need to be addressed?</p>
|
|
||||||
</section>
|
|
||||||
<section id="using-data-better" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="using-data-better">Using Data Better</h2>
|
|
||||||
<p>There is a wealth of information and knowledge available regarding WASH data. Organizations like the JMP, GLAAS, World Bank, and OECD have generated valuable data for the sector. How can we make this publicly available data more accessible and more usable? How can we incorporate data that is more difficult to find? How can we involve smaller organizations?</p>
|
|
||||||
</section>
|
|
||||||
<section id="systems-thinking" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="systems-thinking">Systems Thinking</h2>
|
|
||||||
<p>In the WASH sector, it is increasingly recognized that systems strengthening is critical to achieve universal services. Understanding and acting on systems requires that qualitative and quantitative information is used holistically in collective action. How do we bring together diverse sources of information to support systems strengthening? What are the benefits and risks of using artificial intelligence and information technology for this task?</p>
|
|
||||||
</section>
|
|
||||||
<section id="accountability-4ws" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="accountability-4ws">Accountability: 4Ws</h2>
|
|
||||||
<p>The actors accountable for water and sanitation decision-making are often dispersed throughout diverse organizations. As a result, there is a scattered and disconnected WASH data ecosystem. It is proposed to make a WASH Registry to offer an overview of <strong>who</strong> is <strong>where, when,</strong> and doing <strong>what</strong> for formal change agents. Can this make the WASH sector more accountable?</p>
|
|
||||||
</section>
|
|
||||||
<section id="join" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="join">Who can take part?</h2>
|
|
||||||
<p>Citizens, suppliers, NGOs and governments can take part to better use evidence to and to make information accessible.</p>
|
|
||||||
<p>Are you interested in one of these initiatives? Please get in touch or add an issue on Github.</p>
|
|
||||||
<p>Contact form: <a href="https://washnote.com/contact/" class="uri">https://washnote.com/contact/</a></p>
|
|
||||||
<p>Add an issue: <a href="https://github.com/WASHNote/WASHWeb/issues" class="uri">https://github.com/WASHNote/WASHWeb/issues</a></p>
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
</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 clipboard = new window.ClipboardJS('.code-copy-button', {
|
|
||||||
text: function(trigger) {
|
|
||||||
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
|
||||||
for (const childEl of codeEl.children) {
|
|
||||||
if (isCodeAnnotation(childEl)) {
|
|
||||||
childEl.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return codeEl.innerText;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
clipboard.on('success', 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();
|
|
||||||
});
|
|
||||||
function tippyHover(el, contentFn) {
|
|
||||||
const config = {
|
|
||||||
allowHTML: true,
|
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
|
||||||
delay: 100,
|
|
||||||
arrow: false,
|
|
||||||
appendTo: function(el) {
|
|
||||||
return el.parentElement;
|
|
||||||
},
|
|
||||||
interactive: true,
|
|
||||||
interactiveBorder: 10,
|
|
||||||
theme: 'quarto',
|
|
||||||
placement: 'bottom-start'
|
|
||||||
};
|
|
||||||
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);
|
|
||||||
return note.innerHTML;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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";
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
// 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>
|
|
@ -1,8 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"listing": "/posts.html",
|
|
||||||
"items": [
|
|
||||||
"/posts/2023-09-26-intro/index.html"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
439
_site/posts.html
439
_site/posts.html
@ -1,439 +0,0 @@
|
|||||||
<!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.3.353">
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
|
||||||
|
|
||||||
|
|
||||||
<title>WASH Web - News</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": 20,
|
|
||||||
"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-detached-cancel-button-title": "Cancel",
|
|
||||||
"search-submit-button-title": "Submit"
|
|
||||||
}
|
|
||||||
}</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-date','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-date","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://polyfill.io/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>
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="styles.css">
|
|
||||||
<link rel="alternate" type="application/rss+xml" title="WASH Web" href="posts.xml"></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 navbar-dark ">
|
|
||||||
<div class="navbar-container container-fluid">
|
|
||||||
<div class="navbar-brand-container">
|
|
||||||
<a class="navbar-brand" href="./index.html">
|
|
||||||
<span class="navbar-title">WASH Web</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" 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" rel="" target="">
|
|
||||||
<span class="menu-text">Home</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./vision.html" rel="" target="">
|
|
||||||
<span class="menu-text">Vision</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./contact.html" rel="" target="">
|
|
||||||
<span class="menu-text">Contact</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link active" href="./posts.html" rel="" target="" aria-current="page">
|
|
||||||
<span class="menu-text">News</span></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="quarto-navbar-tools ms-auto">
|
|
||||||
</div>
|
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</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">News</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-date-sort="1695679200000" data-listing-file-modified-sort="1697116659338" data-listing-date-modified-sort="1697061600000" data-listing-reading-time-sort="5">
|
|
||||||
<a href="./posts/2023-09-26-intro/index.html" class="quarto-grid-link">
|
|
||||||
<div class="quarto-grid-item card h-100 card-left">
|
|
||||||
<p class="card-img-top">
|
|
||||||
<img src="./posts/2023-09-26-intro/mckenna-phillips-Db-stA8meJY-unsplash.jpg" class="thumbnail-image card-img" style="height: 150px;">
|
|
||||||
</p>
|
|
||||||
<div class="card-body post-contents">
|
|
||||||
<h5 class="no-anchor card-title listing-title">
|
|
||||||
Welcome
|
|
||||||
</h5>
|
|
||||||
<div class="card-text listing-description">
|
|
||||||
An invitation to WASH Web
|
|
||||||
</div>
|
|
||||||
<div class="card-attribution card-text-small justify">
|
|
||||||
<div class="listing-author">
|
|
||||||
Nicolas Dickinson
|
|
||||||
</div>
|
|
||||||
<div class="listing-date">
|
|
||||||
Sep 26, 2023
|
|
||||||
</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 clipboard = new window.ClipboardJS('.code-copy-button', {
|
|
||||||
text: function(trigger) {
|
|
||||||
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
|
||||||
for (const childEl of codeEl.children) {
|
|
||||||
if (isCodeAnnotation(childEl)) {
|
|
||||||
childEl.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return codeEl.innerText;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
clipboard.on('success', 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();
|
|
||||||
});
|
|
||||||
function tippyHover(el, contentFn) {
|
|
||||||
const config = {
|
|
||||||
allowHTML: true,
|
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
|
||||||
delay: 100,
|
|
||||||
arrow: false,
|
|
||||||
appendTo: function(el) {
|
|
||||||
return el.parentElement;
|
|
||||||
},
|
|
||||||
interactive: true,
|
|
||||||
interactiveBorder: 10,
|
|
||||||
theme: 'quarto',
|
|
||||||
placement: 'bottom-start'
|
|
||||||
};
|
|
||||||
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);
|
|
||||||
return note.innerHTML;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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";
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
// 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>
|
|
@ -1,59 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<rss xmlns:atom="http://www.w3.org/2005/Atom"
|
|
||||||
xmlns:media="http://search.yahoo.com/mrss/"
|
|
||||||
xmlns:content="http://purl.org/rss/1.0/modules/content/"
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
version="2.0">
|
|
||||||
<channel>
|
|
||||||
<title>WASH Web</title>
|
|
||||||
<link>https://washnote.org/posts.html</link>
|
|
||||||
<atom:link href="https://washnote.org/posts.xml" rel="self" type="application/rss+xml"/>
|
|
||||||
<description>WASH Web is a set of participatory initiatives to give you and everyone you know better access to water, sanitation and hygiene information.</description>
|
|
||||||
<generator>quarto-1.3.353</generator>
|
|
||||||
<lastBuildDate>Mon, 25 Sep 2023 22:00:00 GMT</lastBuildDate>
|
|
||||||
<item>
|
|
||||||
<title>Welcome</title>
|
|
||||||
<dc:creator>Nicolas Dickinson</dc:creator>
|
|
||||||
<link>https://washnote.org/posts/2023-09-26-intro/index.html</link>
|
|
||||||
<description><![CDATA[
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<p>Sitting together and listening to stories is a source of insight. At a young age, my parent’s work on peace and reconciliation exposed me to thoughtful communicators from different places: Norwegian resistance fighter from WWII who survived against all odds and went on to work on reconciliation himself, Native American leaders and Indian leaders (from India) who processed together with Europeans and white Americans shared colonial legacies, musicians who faced incredible odds and sang about it, and Cambodian educators who survived and outlasted the Khmer Rouge. I also had the opportunity to travel and experience different cultures. Through libraries and books, I continued to travel to new places.</p>
|
|
||||||
<p>As personal computers and then internet took off, my curiosity and computer programming led me to develop early information products like websites and hypercards from the mid to late 1990s. I was excited about the possibility to connect to even more of the world and to learn and share stories. Finally, my studies and work, especially from 2001 onwards, brought my passion for sharing knowledge and experiences to the water, sanitation and hygiene space. However, one thing still strikes me: listening to stories from people with different experiences is how I learn the most. They are a source of my inspiration and help me both frame and validate the information I get from diverse sources.</p>
|
|
||||||
<p>We continue to tell stories with the purpose of improving knowledge in water, sanitation and hygiene. While we tell stories in our sector and produce reports, there is often a barrier between experts who communicate in conferences and users in communities: we use different language, talk in different forums, and have different interests. But by having more exchanges between experts and non-experts these barriers can be overcome. As a result, knowledge can be discovered when it is needed by whom it is needed. Listening, validation and respect are essential so that data and information are owned by those who produce it. With WASH Web, we want participation in a space where this happens. Discussions already taking place can become more accessible.</p>
|
|
||||||
<p>But back to my story: I am remain surprised when I receive a request to work on one more national database or to produce one more programme evaluation or one more national monitoring and evaluation manual. While this has been my bread and butter for a number of years now, I am convinced that focusing more on data for action is less about these artifacts (databases and manuals) and more about the action and vision that produces data and the people who use information. Working to address people going back to open defecation after having a latrine in a community gives the opportunity to identify and collect data that will make a difference, such as understanding the latrine types and quality of latrines households use. It gives us a sense of how these factors impact the ability of people to continue to use latrines. The information is not the source of improvement. The source of improvement is from the vision and will to address a challenge of open defection. Does it require targeted subsidies? Does it require a new sanitation product by a local innovator? How can that be developed? These questions are answered through collective action and collective information sharing. Data alone is not the answer.</p>
|
|
||||||
<p>I would like to invite you to take part in a few different discussions with your colleagues, with the people you speak to day to day, and with partners and leaders:</p>
|
|
||||||
<ul>
|
|
||||||
<li><p>Using data better: How can we leverage all the activities, surveys, communication and information that is already there without overburdening people?</p></li>
|
|
||||||
<li><p>Social justice: How can we improve the representation of the least served in statistics and data? What are the ethical and power dynamics around this data and how do we better manage this?</p></li>
|
|
||||||
<li><p>Systems thinking: How can we better use qualitative and quantitative information holistically in collective action?</p></li>
|
|
||||||
<li><p>Accountability: Who’s doing what, where, and when? How can this be made more visible to ensure accountability?</p></li>
|
|
||||||
</ul>
|
|
||||||
<p>Why a discussion? Because this is how we can link data to people and their stories!</p>
|
|
||||||
<p>I am searching for homes to host these discussions for people passionate about the stories that speak to these questions and for the data producers and users who need to link data to action. Are you someone who can facilitate this discussion? Or perhaps you know an existing community of practice such as <a href="https://www.rural-water-supply.net/en/">RWSN</a> or <a href="https://www.susana.org/en/">Susana</a> or in a sector leader like <a href="https://www.ircwash.org/">IRCWASH</a> or <a href="https://washagendaforchange.org/">Agenda for Change</a>? Are you interested? Please get in touch!</p>
|
|
||||||
<p><a href="https://www.linkedin.com/in/nicolasdickinson/">Nicolas Dickinson</a></p>
|
|
||||||
<p>Some things I have done:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Publishing an open source software package for downloading JMP data for all countries, including inequality country files as <a href="https://github.com/WASHNote/jmpwashdata">a single dataset</a></li>
|
|
||||||
<li>One of the originating partners of the <a href="https://www.waterpointdata.org/">Water Point Data Exchange (WPdx)</a> and long-time working group member: I first proposed it to be data exchange standard instead of a list of common indicators</li>
|
|
||||||
<li>Life-cycle analysis of costs and finance of WASH including the <a href="https://www.who.int/teams/environment-climate-change-and-health/water-sanitation-and-health/monitoring-and-evidence/wash-systems-monitoring/un-water-global-analysis-and-assessment-of-sanitation-and-drinking-water/wash-accounts">WHO WASH Accounts WAPT</a> and the WASHCost calculator prototype</li>
|
|
||||||
<li>Co-founding Knowledge Point Q&A with IRCWASH, WaterAid, and RedR among others: the successor is now hosted by CAWST</li>
|
|
||||||
<li>Supporting <a href="https://www.ircwash.org/">IRCWASH</a>’s online resource library in various ways since 2008</li>
|
|
||||||
<li>Researching mobile-enabled technologies from data collection to billing in WASH, including sitting on the GSMA grant panel for a number of years</li>
|
|
||||||
<li>The 12 components participatory assessment methodology for national WASH M&E used to develop costed M&E plans in 8 countries in Western and Central Africa with UNICEF and IRC</li>
|
|
||||||
<li>Supporting the establishment of <a href="https://akvopedia.org/wiki/Main_Page">Akvopedia</a></li>
|
|
||||||
<li>Founding WASH Web</li>
|
|
||||||
</ul>
|
|
||||||
<p>Feature <a href="https://unsplash.com/photos/Db-stA8meJY">photo</a> by <a href="https://unsplash.com/@ellobeastie">McKenna Phillips</a> found on unsplash.com.</p>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
]]></description>
|
|
||||||
<guid>https://washnote.org/posts/2023-09-26-intro/index.html</guid>
|
|
||||||
<pubDate>Mon, 25 Sep 2023 22:00:00 GMT</pubDate>
|
|
||||||
<media:content url="https://washnote.org/posts/2023-09-26-intro/mckenna-phillips-Db-stA8meJY-unsplash.jpg" medium="image" type="image/jpeg"/>
|
|
||||||
</item>
|
|
||||||
</channel>
|
|
||||||
</rss>
|
|
@ -1,429 +0,0 @@
|
|||||||
<!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.3.353">
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
|
||||||
|
|
||||||
<meta name="author" content="Nicolas Dickinson">
|
|
||||||
<meta name="dcterms.date" content="2023-09-26">
|
|
||||||
<meta name="description" content="An invitation to WASH Web">
|
|
||||||
|
|
||||||
<title>WASH Web - Welcome</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": 20,
|
|
||||||
"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-detached-cancel-button-title": "Cancel",
|
|
||||||
"search-submit-button-title": "Submit"
|
|
||||||
}
|
|
||||||
}</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 navbar-dark ">
|
|
||||||
<div class="navbar-container container-fluid">
|
|
||||||
<div class="navbar-brand-container">
|
|
||||||
<a class="navbar-brand" href="../../index.html">
|
|
||||||
<span class="navbar-title">WASH Web</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" 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" rel="" target="">
|
|
||||||
<span class="menu-text">Home</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="../../vision.html" rel="" target="">
|
|
||||||
<span class="menu-text">Vision</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="../../contact.html" rel="" target="">
|
|
||||||
<span class="menu-text">Contact</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="../../posts.html" rel="" target="">
|
|
||||||
<span class="menu-text">News</span></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="quarto-navbar-tools ms-auto">
|
|
||||||
</div>
|
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</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">Welcome</h1>
|
|
||||||
<div>
|
|
||||||
<div class="description">
|
|
||||||
An invitation to WASH Web
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="quarto-title-meta">
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div class="quarto-title-meta-heading">Author</div>
|
|
||||||
<div class="quarto-title-meta-contents">
|
|
||||||
<p>Nicolas Dickinson </p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div class="quarto-title-meta-heading">Published</div>
|
|
||||||
<div class="quarto-title-meta-contents">
|
|
||||||
<p class="date">September 26, 2023</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div class="quarto-title-meta-heading">Modified</div>
|
|
||||||
<div class="quarto-title-meta-contents">
|
|
||||||
<p class="date-modified">October 12, 2023</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</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">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<!-- main -->
|
|
||||||
<main class="content quarto-banner-title-block" id="quarto-document-content">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<p>Sitting together and listening to stories is a source of insight. At a young age, my parent’s work on peace and reconciliation exposed me to thoughtful communicators from different places: Norwegian resistance fighter from WWII who survived against all odds and went on to work on reconciliation himself, Native American leaders and Indian leaders (from India) who processed together with Europeans and white Americans shared colonial legacies, musicians who faced incredible odds and sang about it, and Cambodian educators who survived and outlasted the Khmer Rouge. I also had the opportunity to travel and experience different cultures. Through libraries and books, I continued to travel to new places.</p>
|
|
||||||
<p>As personal computers and then internet took off, my curiosity and computer programming led me to develop early information products like websites and hypercards from the mid to late 1990s. I was excited about the possibility to connect to even more of the world and to learn and share stories. Finally, my studies and work, especially from 2001 onwards, brought my passion for sharing knowledge and experiences to the water, sanitation and hygiene space. However, one thing still strikes me: listening to stories from people with different experiences is how I learn the most. They are a source of my inspiration and help me both frame and validate the information I get from diverse sources.</p>
|
|
||||||
<p>We continue to tell stories with the purpose of improving knowledge in water, sanitation and hygiene. While we tell stories in our sector and produce reports, there is often a barrier between experts who communicate in conferences and users in communities: we use different language, talk in different forums, and have different interests. But by having more exchanges between experts and non-experts these barriers can be overcome. As a result, knowledge can be discovered when it is needed by whom it is needed. Listening, validation and respect are essential so that data and information are owned by those who produce it. With WASH Web, we want participation in a space where this happens. Discussions already taking place can become more accessible.</p>
|
|
||||||
<p>But back to my story: I am remain surprised when I receive a request to work on one more national database or to produce one more programme evaluation or one more national monitoring and evaluation manual. While this has been my bread and butter for a number of years now, I am convinced that focusing more on data for action is less about these artifacts (databases and manuals) and more about the action and vision that produces data and the people who use information. Working to address people going back to open defecation after having a latrine in a community gives the opportunity to identify and collect data that will make a difference, such as understanding the latrine types and quality of latrines households use. It gives us a sense of how these factors impact the ability of people to continue to use latrines. The information is not the source of improvement. The source of improvement is from the vision and will to address a challenge of open defection. Does it require targeted subsidies? Does it require a new sanitation product by a local innovator? How can that be developed? These questions are answered through collective action and collective information sharing. Data alone is not the answer.</p>
|
|
||||||
<p>I would like to invite you to take part in a few different discussions with your colleagues, with the people you speak to day to day, and with partners and leaders:</p>
|
|
||||||
<ul>
|
|
||||||
<li><p>Using data better: How can we leverage all the activities, surveys, communication and information that is already there without overburdening people?</p></li>
|
|
||||||
<li><p>Social justice: How can we improve the representation of the least served in statistics and data? What are the ethical and power dynamics around this data and how do we better manage this?</p></li>
|
|
||||||
<li><p>Systems thinking: How can we better use qualitative and quantitative information holistically in collective action?</p></li>
|
|
||||||
<li><p>Accountability: Who’s doing what, where, and when? How can this be made more visible to ensure accountability?</p></li>
|
|
||||||
</ul>
|
|
||||||
<p>Why a discussion? Because this is how we can link data to people and their stories!</p>
|
|
||||||
<p>I am searching for homes to host these discussions for people passionate about the stories that speak to these questions and for the data producers and users who need to link data to action. Are you someone who can facilitate this discussion? Or perhaps you know an existing community of practice such as <a href="https://www.rural-water-supply.net/en/">RWSN</a> or <a href="https://www.susana.org/en/">Susana</a> or in a sector leader like <a href="https://www.ircwash.org/">IRCWASH</a> or <a href="https://washagendaforchange.org/">Agenda for Change</a>? Are you interested? Please get in touch!</p>
|
|
||||||
<p><a href="https://www.linkedin.com/in/nicolasdickinson/">Nicolas Dickinson</a></p>
|
|
||||||
<p>Some things I have done:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Publishing an open source software package for downloading JMP data for all countries, including inequality country files as <a href="https://github.com/WASHNote/jmpwashdata">a single dataset</a></li>
|
|
||||||
<li>One of the originating partners of the <a href="https://www.waterpointdata.org/">Water Point Data Exchange (WPdx)</a> and long-time working group member: I first proposed it to be data exchange standard instead of a list of common indicators</li>
|
|
||||||
<li>Life-cycle analysis of costs and finance of WASH including the <a href="https://www.who.int/teams/environment-climate-change-and-health/water-sanitation-and-health/monitoring-and-evidence/wash-systems-monitoring/un-water-global-analysis-and-assessment-of-sanitation-and-drinking-water/wash-accounts">WHO WASH Accounts WAPT</a> and the WASHCost calculator prototype</li>
|
|
||||||
<li>Co-founding Knowledge Point Q&A with IRCWASH, WaterAid, and RedR among others: the successor is now hosted by CAWST</li>
|
|
||||||
<li>Supporting <a href="https://www.ircwash.org/">IRCWASH</a>’s online resource library in various ways since 2008</li>
|
|
||||||
<li>Researching mobile-enabled technologies from data collection to billing in WASH, including sitting on the GSMA grant panel for a number of years</li>
|
|
||||||
<li>The 12 components participatory assessment methodology for national WASH M&E used to develop costed M&E plans in 8 countries in Western and Central Africa with UNICEF and IRC</li>
|
|
||||||
<li>Supporting the establishment of <a href="https://akvopedia.org/wiki/Main_Page">Akvopedia</a></li>
|
|
||||||
<li>Founding WASH Web</li>
|
|
||||||
</ul>
|
|
||||||
<p>Feature <a href="https://unsplash.com/photos/Db-stA8meJY">photo</a> by <a href="https://unsplash.com/@ellobeastie">McKenna Phillips</a> found on unsplash.com.</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 clipboard = new window.ClipboardJS('.code-copy-button', {
|
|
||||||
text: function(trigger) {
|
|
||||||
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
|
||||||
for (const childEl of codeEl.children) {
|
|
||||||
if (isCodeAnnotation(childEl)) {
|
|
||||||
childEl.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return codeEl.innerText;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
clipboard.on('success', 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();
|
|
||||||
});
|
|
||||||
function tippyHover(el, contentFn) {
|
|
||||||
const config = {
|
|
||||||
allowHTML: true,
|
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
|
||||||
delay: 100,
|
|
||||||
arrow: false,
|
|
||||||
appendTo: function(el) {
|
|
||||||
return el.parentElement;
|
|
||||||
},
|
|
||||||
interactive: true,
|
|
||||||
interactiveBorder: 10,
|
|
||||||
theme: 'quarto',
|
|
||||||
placement: 'bottom-start'
|
|
||||||
};
|
|
||||||
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);
|
|
||||||
return note.innerHTML;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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";
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
// 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>
|
|
Binary file not shown.
Before Width: | Height: | Size: 53 KiB |
@ -1,310 +0,0 @@
|
|||||||
<!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.2.475">
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
|
||||||
|
|
||||||
<meta name="author" content="Merel Laauwen">
|
|
||||||
<meta name="dcterms.date" content="2023-10-06">
|
|
||||||
<meta name="description" content="Collaboration between openwashdata & WASH Web">
|
|
||||||
|
|
||||||
<title>WASH Web - openwashdata & WASH Web</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 -1.6em;
|
|
||||||
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": 20,
|
|
||||||
"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-detached-cancel-button-title": "Cancel",
|
|
||||||
"search-submit-button-title": "Submit"
|
|
||||||
}
|
|
||||||
}</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 navbar-dark ">
|
|
||||||
<div class="navbar-container container-fluid">
|
|
||||||
<div class="navbar-brand-container">
|
|
||||||
<a class="navbar-brand" href="../../index.html">
|
|
||||||
<span class="navbar-title">WASH Web</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" 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="../../vision.html">
|
|
||||||
<span class="menu-text">Vision</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="../../contact.html">
|
|
||||||
<span class="menu-text">Contact</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="../../posts.html">
|
|
||||||
<span class="menu-text">News</span></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div id="quarto-search" class="" title="Search"></div>
|
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</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">openwashdata & WASH Web</h1>
|
|
||||||
<div>
|
|
||||||
<div class="description">
|
|
||||||
Collaboration between openwashdata & WASH Web
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="quarto-title-meta">
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div class="quarto-title-meta-heading">Author</div>
|
|
||||||
<div class="quarto-title-meta-contents">
|
|
||||||
<p>Merel Laauwen </p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div class="quarto-title-meta-heading">Published</div>
|
|
||||||
<div class="quarto-title-meta-contents">
|
|
||||||
<p class="date">October 6, 2023</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div class="quarto-title-meta-heading">Modified</div>
|
|
||||||
<div class="quarto-title-meta-contents">
|
|
||||||
<p class="date-modified">October 6, 2023</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</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">
|
|
||||||
<nav id="TOC" role="doc-toc" class="toc-active">
|
|
||||||
<h2 id="toc-title">On this page</h2>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><a href="#header-1" id="toc-header-1" class="nav-link active" data-scroll-target="#header-1">header 1</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
<!-- main -->
|
|
||||||
<main class="content quarto-banner-title-block" id="quarto-document-content">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<section id="header-1" class="level1">
|
|
||||||
<h1>header 1</h1>
|
|
||||||
<p>text</p>
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
|
|
||||||
</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 clipboard = new window.ClipboardJS('.code-copy-button', {
|
|
||||||
target: function(trigger) {
|
|
||||||
return trigger.previousElementSibling;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
clipboard.on('success', 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();
|
|
||||||
});
|
|
||||||
function tippyHover(el, contentFn) {
|
|
||||||
const config = {
|
|
||||||
allowHTML: true,
|
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
|
||||||
delay: 100,
|
|
||||||
arrow: false,
|
|
||||||
appendTo: function(el) {
|
|
||||||
return el.parentElement;
|
|
||||||
},
|
|
||||||
interactive: true,
|
|
||||||
interactiveBorder: 10,
|
|
||||||
theme: 'quarto',
|
|
||||||
placement: 'bottom-start'
|
|
||||||
};
|
|
||||||
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);
|
|
||||||
return note.innerHTML;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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>
|
|
@ -1,471 +0,0 @@
|
|||||||
<!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.3.353">
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
|
||||||
|
|
||||||
|
|
||||||
<title>WASH Web - PRIVACY POLICY</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": 20,
|
|
||||||
"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-detached-cancel-button-title": "Cancel",
|
|
||||||
"search-submit-button-title": "Submit"
|
|
||||||
}
|
|
||||||
}</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 navbar-dark ">
|
|
||||||
<div class="navbar-container container-fluid">
|
|
||||||
<div class="navbar-brand-container">
|
|
||||||
<a class="navbar-brand" href="./index.html">
|
|
||||||
<span class="navbar-title">WASH Web</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" 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" rel="" target="">
|
|
||||||
<span class="menu-text">Home</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./vision.html" rel="" target="">
|
|
||||||
<span class="menu-text">Vision</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./contact.html" rel="" target="">
|
|
||||||
<span class="menu-text">Contact</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./posts.html" rel="" target="">
|
|
||||||
<span class="menu-text">News</span></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="quarto-navbar-tools ms-auto">
|
|
||||||
</div>
|
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</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="#scope" id="toc-scope" class="nav-link active" data-scroll-target="#scope">Scope</a></li>
|
|
||||||
<li><a href="#purpose" id="toc-purpose" class="nav-link" data-scroll-target="#purpose">Purpose</a></li>
|
|
||||||
<li><a href="#washnote" id="toc-washnote" class="nav-link" data-scroll-target="#washnote">WASHNote</a></li>
|
|
||||||
<li><a href="#what-data-how-long-and-where" id="toc-what-data-how-long-and-where" class="nav-link" data-scroll-target="#what-data-how-long-and-where">What data, how long, and where?</a></li>
|
|
||||||
<li><a href="#data-protection" id="toc-data-protection" class="nav-link" data-scroll-target="#data-protection">Data protection</a></li>
|
|
||||||
<li><a href="#what-are-your-data-protection-rights" id="toc-what-are-your-data-protection-rights" class="nav-link" data-scroll-target="#what-are-your-data-protection-rights">What are your data protection rights?</a></li>
|
|
||||||
<li><a href="#cookies" id="toc-cookies" class="nav-link" data-scroll-target="#cookies">Cookies</a>
|
|
||||||
<ul class="collapse">
|
|
||||||
<li><a href="#how-do-we-use-cookies" id="toc-how-do-we-use-cookies" class="nav-link" data-scroll-target="#how-do-we-use-cookies">How do we use cookies?</a></li>
|
|
||||||
<li><a href="#what-types-of-cookies-do-we-use" id="toc-what-types-of-cookies-do-we-use" class="nav-link" data-scroll-target="#what-types-of-cookies-do-we-use">What types of cookies do we use?</a></li>
|
|
||||||
<li><a href="#how-to-manage-cookies" id="toc-how-to-manage-cookies" class="nav-link" data-scroll-target="#how-to-manage-cookies">How to manage cookies</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="#minors" id="toc-minors" class="nav-link" data-scroll-target="#minors">Minors</a></li>
|
|
||||||
<li><a href="#how-to-contact-us" id="toc-how-to-contact-us" class="nav-link" data-scroll-target="#how-to-contact-us">How to contact us</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</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">PRIVACY POLICY</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="quarto-title-meta">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<p>When you visit our websites and contact us or create an account on *.washweb.org, *.washnote.org, and *.washnote.com we receive information about you.</p>
|
|
||||||
<p>We also have a commitment to reducing the use of private data to the bare minimum to provide you with these websites and associated services.</p>
|
|
||||||
<p>We do our best to handle your information securely and with respect and care.</p>
|
|
||||||
<section id="scope" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="scope">Scope</h2>
|
|
||||||
<p>This privacy policy applies to all personal data that we process on all domains related to us. This concerns personal data of visitors and users of these websites.</p>
|
|
||||||
<p>We process the personal data of anyone who has visited our website and created an account, filled in data, or contacted us.</p>
|
|
||||||
<p>Personal data is data that can be traced back to you. If you want to know more, please visit the website of the <a href="https://www.autoriteitpersoonsgegevens.nl/themas/basis-avg">Dutch Data Protection Authority</a> or the <a href="https://gdpr.eu/">EU GDPR website</a>.</p>
|
|
||||||
</section>
|
|
||||||
<section id="purpose" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="purpose">Purpose</h2>
|
|
||||||
<p>We only use your personal data for the purpose for which we are allowed to use it based on our permission to use your personal data and based on data required to provide you with the service requested.</p>
|
|
||||||
<p>We have a commitment to keep this to the minimum required.</p>
|
|
||||||
<p>We don’t share your personal data with others.</p>
|
|
||||||
</section>
|
|
||||||
<section id="washnote" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="washnote">WASHNote</h2>
|
|
||||||
<p>WASHNote is responsible for the website (*.washnote.com, *.washnote.org, and *.washweb.org) and therefore the responsible organisation for the use of your personal data as described in this privacy statement. Our full details are:</p>
|
|
||||||
<p>WASHNote<br>
|
|
||||||
Sumatraweg 5A<br>
|
|
||||||
3072ZP Rotterdam<br>
|
|
||||||
62484885</p>
|
|
||||||
</section>
|
|
||||||
<section id="what-data-how-long-and-where" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="what-data-how-long-and-where">What data, how long, and where?</h2>
|
|
||||||
<p>We may use your name, address or business address, e-mail address, telephone number, and information you provide.</p>
|
|
||||||
<p>We keep your personal data for as long as we are required to do so by law and for as long as you use our services. We only process your personal data ourselves.</p>
|
|
||||||
<p>We process your data within the European Economic Area and we follow the the Dutch General Data Protection Regulation.</p>
|
|
||||||
<p>General rules that apply under Dutch law apply to our privacy statement.</p>
|
|
||||||
</section>
|
|
||||||
<section id="data-protection" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="data-protection">Data protection</h2>
|
|
||||||
<p>We do our best to ensure your data is safe according to the latest standards. We also minimize the amount of data we hold to the bare minimum to ensure we reduce any potential risks.</p>
|
|
||||||
</section>
|
|
||||||
<section id="what-are-your-data-protection-rights" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="what-are-your-data-protection-rights">What are your data protection rights?</h2>
|
|
||||||
<p>We would like to make sure you are fully aware of all of your data protection rights. Every user is entitled to the following:</p>
|
|
||||||
<p><strong>The right to access</strong> – You have the right to request WASHNote for copies of your personal data. We may charge you a small fee for this service.</p>
|
|
||||||
<p><strong>The right to rectification</strong> – You have the right to request that WASHNote correct any information you believe is inaccurate. You also have the right to request WASHNote to complete the information you believe is incomplete.</p>
|
|
||||||
<p><strong>The right to erasure</strong> – You have the right to request that WASHNote erase your personal data, under certain conditions. In some cases, may be required keep some data for 7 years for the Dutch tax authorities.</p>
|
|
||||||
<p><strong>The right to restrict processing</strong> – You have the right to request that WASHNote restrict the processing of your personal data, under certain conditions.</p>
|
|
||||||
<p><strong>The right to object to processing</strong> – You have the right to object to WASHNote’s processing of your personal data, under certain conditions.</p>
|
|
||||||
<p><strong>The right to data portability</strong> – You have the right to request that WASHNote transfer the data that we have collected to another organization, or directly to you, under certain conditions.</p>
|
|
||||||
<p>If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us at our email: dickinson+privacy@washnote.com</p>
|
|
||||||
<p>If you submit multiple applications or a complex request, it could potentially require additional processing time. In such instances, we will make sure to reach out to you within a maximum of 60 days. If necessary, we may also request that you verify your identity by providing specific information to confirm that you are indeed the rightful owner of the personal data in question.</p>
|
|
||||||
</section>
|
|
||||||
<section id="cookies" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="cookies">Cookies</h2>
|
|
||||||
<p>Cookies are text files placed on your computer to collect standard Internet log information and visitor behavior information. When you visit our websites, we may collect information from you automatically through cookies or similar technology</p>
|
|
||||||
<p>For further information, visit allaboutcookies.org.</p>
|
|
||||||
<section id="how-do-we-use-cookies" class="level3">
|
|
||||||
<h3 class="anchored" data-anchor-id="how-do-we-use-cookies">How do we use cookies?</h3>
|
|
||||||
<p>Our Company uses cookies in a range of ways to improve your experience on our website, including:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Keeping you signed in and storing information for your session</li>
|
|
||||||
</ul>
|
|
||||||
<p>We do not use cookies for advertising or tracking.</p>
|
|
||||||
</section>
|
|
||||||
<section id="what-types-of-cookies-do-we-use" class="level3">
|
|
||||||
<h3 class="anchored" data-anchor-id="what-types-of-cookies-do-we-use">What types of cookies do we use?</h3>
|
|
||||||
<p>There are a number of different types of cookies, however, our website uses only:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Functionality – Our Company uses these cookies so that we recognize you on our website and remember your previously selected preferences. These could include what language you prefer and location you are in. A mix of first-party and third-party cookies are used.</li>
|
|
||||||
</ul>
|
|
||||||
</section>
|
|
||||||
<section id="how-to-manage-cookies" class="level3">
|
|
||||||
<h3 class="anchored" data-anchor-id="how-to-manage-cookies">How to manage cookies</h3>
|
|
||||||
<p>You can set your browser not to accept cookies, and the above website tells you how to remove cookies from your browser. However, in a few cases, some of our website features may not function as a result.</p>
|
|
||||||
</section>
|
|
||||||
</section>
|
|
||||||
<section id="minors" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="minors">Minors</h2>
|
|
||||||
<p>We do not target minors with our website or as an organisation. This means that if you are under the age of 18, you need permission from a parent or guardian to use our website. If you are a minor when you visit our websites, we assume that you have received this permission before your visit.</p>
|
|
||||||
</section>
|
|
||||||
<section id="how-to-contact-us" class="level2">
|
|
||||||
<h2 class="anchored" data-anchor-id="how-to-contact-us">How to contact us</h2>
|
|
||||||
<p>If you have a question about our privacy policy, please get in touch: dickinson+privacy@washnote.com.</p>
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
|
|
||||||
</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 clipboard = new window.ClipboardJS('.code-copy-button', {
|
|
||||||
text: function(trigger) {
|
|
||||||
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
|
||||||
for (const childEl of codeEl.children) {
|
|
||||||
if (isCodeAnnotation(childEl)) {
|
|
||||||
childEl.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return codeEl.innerText;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
clipboard.on('success', 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();
|
|
||||||
});
|
|
||||||
function tippyHover(el, contentFn) {
|
|
||||||
const config = {
|
|
||||||
allowHTML: true,
|
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
|
||||||
delay: 100,
|
|
||||||
arrow: false,
|
|
||||||
appendTo: function(el) {
|
|
||||||
return el.parentElement;
|
|
||||||
},
|
|
||||||
interactive: true,
|
|
||||||
interactiveBorder: 10,
|
|
||||||
theme: 'quarto',
|
|
||||||
placement: 'bottom-start'
|
|
||||||
};
|
|
||||||
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);
|
|
||||||
return note.innerHTML;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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";
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
// 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>
|
|
@ -1 +0,0 @@
|
|||||||
Sitemap: https://washnote.org/sitemap.xml
|
|
File diff suppressed because one or more lines are too long
2018
_site/site_libs/bootstrap/bootstrap-icons.css
vendored
2018
_site/site_libs/bootstrap/bootstrap-icons.css
vendored
File diff suppressed because it is too large
Load Diff
Binary file not shown.
10
_site/site_libs/bootstrap/bootstrap.min.css
vendored
10
_site/site_libs/bootstrap/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
7
_site/site_libs/bootstrap/bootstrap.min.js
vendored
7
_site/site_libs/bootstrap/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
7
_site/site_libs/clipboard/clipboard.min.js
vendored
7
_site/site_libs/clipboard/clipboard.min.js
vendored
File diff suppressed because one or more lines are too long
9
_site/site_libs/quarto-html/anchor.min.js
vendored
9
_site/site_libs/quarto-html/anchor.min.js
vendored
File diff suppressed because one or more lines are too long
6
_site/site_libs/quarto-html/popper.min.js
vendored
6
_site/site_libs/quarto-html/popper.min.js
vendored
File diff suppressed because one or more lines are too long
@ -1,203 +0,0 @@
|
|||||||
/* 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-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-style: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prevent-inlining {
|
|
||||||
content: "</";
|
|
||||||
}
|
|
||||||
|
|
||||||
/*# sourceMappingURL=debc5d5d77c3f9108843748ff7464032.css.map */
|
|
@ -1,902 +0,0 @@
|
|||||||
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 > * "
|
|
||||||
);
|
|
||||||
|
|
||||||
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;
|
|
||||||
console.log({
|
|
||||||
childtop: marginChild.getBoundingClientRect().top,
|
|
||||||
scroll: window.scrollY,
|
|
||||||
top,
|
|
||||||
lastBottom,
|
|
||||||
});
|
|
||||||
if (top < lastBottom) {
|
|
||||||
const margin = lastBottom - top;
|
|
||||||
marginChild.style.marginTop = `${margin}px`;
|
|
||||||
}
|
|
||||||
const styles = window.getComputedStyle(marginChild);
|
|
||||||
const marginTop = parseFloat(styles["marginTop"]);
|
|
||||||
|
|
||||||
console.log({
|
|
||||||
top,
|
|
||||||
height: marginChild.getBoundingClientRect().height,
|
|
||||||
marginTop,
|
|
||||||
total: top + marginChild.getBoundingClientRect().height + 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, 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
|
|
||||||
) {
|
|
||||||
sectionIndex = 0;
|
|
||||||
} else {
|
|
||||||
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";
|
|
||||||
}
|
|
||||||
|
|
||||||
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.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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
|
||||||
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) {
|
|
||||||
walk(tocEl, 0);
|
|
||||||
updateActiveLink();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 (!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 +0,0 @@
|
|||||||
.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
_site/site_libs/quarto-html/tippy.umd.min.js
vendored
2
_site/site_libs/quarto-html/tippy.umd.min.js
vendored
File diff suppressed because one or more lines are too long
2
_site/site_libs/quarto-listing/list.min.js
vendored
2
_site/site_libs/quarto-listing/list.min.js
vendored
File diff suppressed because one or more lines are too long
@ -1,243 +0,0 @@
|
|||||||
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
_site/site_libs/quarto-nav/headroom.min.js
vendored
7
_site/site_libs/quarto-nav/headroom.min.js
vendored
@ -1,7 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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});
|
|
@ -1,277 +0,0 @@
|
|||||||
const headroomChanged = new CustomEvent("quarto-hrChanged", {
|
|
||||||
detail: {},
|
|
||||||
bubbles: true,
|
|
||||||
cancelable: false,
|
|
||||||
composed: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
window.document.addEventListener("DOMContentLoaded", function () {
|
|
||||||
let init = false;
|
|
||||||
|
|
||||||
// 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 updateDocumentOffsetWithoutAnimation() {
|
|
||||||
updateDocumentOffset(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateDocumentOffset(animated) {
|
|
||||||
// set body offset
|
|
||||||
const topOffset = headerOffset();
|
|
||||||
const bodyOffset = topOffset + footerOffset();
|
|
||||||
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(
|
|
||||||
updateDocumentOffsetWithoutAnimation
|
|
||||||
);
|
|
||||||
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].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"
|
|
||||||
);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
File diff suppressed because one or more lines are too long
9
_site/site_libs/quarto-search/fuse.min.js
vendored
9
_site/site_libs/quarto-search/fuse.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -1,31 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
||||||
<url>
|
|
||||||
<loc>https://washnote.org/contact.html</loc>
|
|
||||||
<lastmod>2023-10-12T13:12:10.830Z</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://washnote.org/index.html</loc>
|
|
||||||
<lastmod>2023-10-12T13:12:11.139Z</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://washnote.org/posts/2023-09-26-intro/index.html</loc>
|
|
||||||
<lastmod>2023-10-12T13:17:42.765Z</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://washnote.org/posts.html</loc>
|
|
||||||
<lastmod>2023-10-12T13:17:43.116Z</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://washnote.org/privacy.html</loc>
|
|
||||||
<lastmod>2023-10-12T13:12:12.466Z</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://washnote.org/test.html</loc>
|
|
||||||
<lastmod>2023-10-12T13:12:12.730Z</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://washnote.org/vision.html</loc>
|
|
||||||
<lastmod>2023-10-12T13:12:13.898Z</lastmod>
|
|
||||||
</url>
|
|
||||||
</urlset>
|
|
@ -1 +0,0 @@
|
|||||||
/* css styles */
|
|
374
_site/test.html
374
_site/test.html
@ -1,374 +0,0 @@
|
|||||||
<!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.3.353">
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
|
||||||
|
|
||||||
|
|
||||||
<title>WASH Web - Untitled</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": 20,
|
|
||||||
"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-detached-cancel-button-title": "Cancel",
|
|
||||||
"search-submit-button-title": "Submit"
|
|
||||||
}
|
|
||||||
}</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 navbar-dark ">
|
|
||||||
<div class="navbar-container container-fluid">
|
|
||||||
<div class="navbar-brand-container">
|
|
||||||
<a class="navbar-brand" href="./index.html">
|
|
||||||
<span class="navbar-title">WASH Web</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" 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" rel="" target="">
|
|
||||||
<span class="menu-text">Home</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./vision.html" rel="" target="">
|
|
||||||
<span class="menu-text">Vision</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./contact.html" rel="" target="">
|
|
||||||
<span class="menu-text">Contact</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./posts.html" rel="" target="">
|
|
||||||
<span class="menu-text">News</span></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="quarto-navbar-tools ms-auto">
|
|
||||||
</div>
|
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</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">
|
|
||||||
|
|
||||||
</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">Untitled</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 clipboard = new window.ClipboardJS('.code-copy-button', {
|
|
||||||
text: function(trigger) {
|
|
||||||
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
|
||||||
for (const childEl of codeEl.children) {
|
|
||||||
if (isCodeAnnotation(childEl)) {
|
|
||||||
childEl.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return codeEl.innerText;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
clipboard.on('success', 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();
|
|
||||||
});
|
|
||||||
function tippyHover(el, contentFn) {
|
|
||||||
const config = {
|
|
||||||
allowHTML: true,
|
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
|
||||||
delay: 100,
|
|
||||||
arrow: false,
|
|
||||||
appendTo: function(el) {
|
|
||||||
return el.parentElement;
|
|
||||||
},
|
|
||||||
interactive: true,
|
|
||||||
interactiveBorder: 10,
|
|
||||||
theme: 'quarto',
|
|
||||||
placement: 'bottom-start'
|
|
||||||
};
|
|
||||||
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);
|
|
||||||
return note.innerHTML;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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";
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
// 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>
|
|
@ -1,386 +0,0 @@
|
|||||||
<!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.3.353">
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
|
||||||
|
|
||||||
|
|
||||||
<title>WASH Web - Vision</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": 20,
|
|
||||||
"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-detached-cancel-button-title": "Cancel",
|
|
||||||
"search-submit-button-title": "Submit"
|
|
||||||
}
|
|
||||||
}</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 navbar-dark ">
|
|
||||||
<div class="navbar-container container-fluid">
|
|
||||||
<div class="navbar-brand-container">
|
|
||||||
<a class="navbar-brand" href="./index.html">
|
|
||||||
<span class="navbar-title">WASH Web</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" 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" rel="" target="">
|
|
||||||
<span class="menu-text">Home</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link active" href="./vision.html" rel="" target="" aria-current="page">
|
|
||||||
<span class="menu-text">Vision</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./contact.html" rel="" target="">
|
|
||||||
<span class="menu-text">Contact</span></a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="./posts.html" rel="" target="">
|
|
||||||
<span class="menu-text">News</span></a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="quarto-navbar-tools ms-auto">
|
|
||||||
</div>
|
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</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">
|
|
||||||
|
|
||||||
</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">Vision</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="quarto-title-meta">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<p>At the core of the vision, the idea is to make information discoverable, representative, and useful.</p>
|
|
||||||
<div class="quarto-figure quarto-figure-center">
|
|
||||||
<figure class="figure">
|
|
||||||
<p><img src="images/Screen Shot 2023-06-27 at 11.12.19 AM.png" class="img-fluid figure-img" width="270"></p>
|
|
||||||
</figure>
|
|
||||||
</div>
|
|
||||||
<p><strong>Discoverable</strong> means that it can not only be found through search and also by simply showing interest in the area and somehow you discover it. Browsing wikipedia articles should be sufficient to find key statistics on water and sanitation. At the moment, these statistics are a few steps away in specialist websites like washdata.org and this information is not automatically used in those articles. Showing interest in a specific district and search “water” and the name of US county should give key facts about water supplies. Data may already be available but simply not discoverable.</p>
|
|
||||||
<p><strong>Representative</strong> means that information should also represent the reality on the ground from different perspectives and that information is not from a single source of truth. It should also be appropriate to the local needs both in terms of the WASH sector and local populations and should be validated.</p>
|
|
||||||
<p><strong>Useful</strong> information is information from which one can begin to take action. Often key information about who to contact for more information, what happened, when and where is missing. If there is information about water services or sanitation, these are often dated.</p>
|
|
||||||
<p>In short, WASH Web intends to make information and expertise more accessible so that it is no longer only experts who are able to make informed decisions based on available evidence. Up until now, WASH Web has been an idea and a project that a few people have been playing with. This website and the project is open source and participatory meaning it is open to the initiative and inputs from others. Currently, WASHNote hosts and maintains the project website and source code.</p>
|
|
||||||
<p>Would you like to get involved? Please get in touch or add an issue on Github.</p>
|
|
||||||
<p>This website was last updated on 2023-10-12 .</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 clipboard = new window.ClipboardJS('.code-copy-button', {
|
|
||||||
text: function(trigger) {
|
|
||||||
const codeEl = trigger.previousElementSibling.cloneNode(true);
|
|
||||||
for (const childEl of codeEl.children) {
|
|
||||||
if (isCodeAnnotation(childEl)) {
|
|
||||||
childEl.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return codeEl.innerText;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
clipboard.on('success', 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();
|
|
||||||
});
|
|
||||||
function tippyHover(el, contentFn) {
|
|
||||||
const config = {
|
|
||||||
allowHTML: true,
|
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
|
||||||
delay: 100,
|
|
||||||
arrow: false,
|
|
||||||
appendTo: function(el) {
|
|
||||||
return el.parentElement;
|
|
||||||
},
|
|
||||||
interactive: true,
|
|
||||||
interactiveBorder: 10,
|
|
||||||
theme: 'quarto',
|
|
||||||
placement: 'bottom-start'
|
|
||||||
};
|
|
||||||
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);
|
|
||||||
return note.innerHTML;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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";
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
// 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>
|
|
Loading…
Reference in New Issue
Block a user