overhaul. blog taken down. links to Ebba

This commit is contained in:
Andreas Gammelgaard Damsbo 2024-06-21 15:25:51 +02:00
parent 1b1f403f8d
commit 9a062fd815
No known key found for this signature in database
37 changed files with 5435 additions and 1001 deletions

4
.gitignore vendored
View file

@ -55,3 +55,7 @@ rsconnect/
food/refs/
osrm-backend/
data-raw/
R/

View file

@ -16,8 +16,10 @@ website:
text: Start
- href: food.qmd
text: Opskrifter
- href: blog.qmd
text: Blog
- href: https://ebba.gdamsbo.dk/
text: Ebbas side
# - href: blog.qmd
# text: Blog
right:
- href: https://github.com/agdamsbo/familien.gdamsbo
text: Kildekode

View file

@ -1,62 +0,0 @@
---
title: Wireguard bro
date: 2022-09-28
description: Kort dokumentation for at sætte en Wireguard-bro op.
categories:
- Selfhost
- Homelab
- Wireguard
- VPS
- VPN
---
Vi bor til leje og har en hjemmeserver stående på kontoret. Serveren hoster bl.a. denne side. For at undgå indstillinger lokalt på routeren stillet til rådighed af vores udlejer har jeg lejet den mindste VPS hos Hetzner, og bruger denne som bro med Wireguard til hjemmeserveren. Der findes et væld af opsætningsvejledninger og uddybende forklaringer af hver af de introducerede begreber. Her kommer min opsætning til inspiration.
## Noter
Inspirationen kommer fra følgende sider, som jeg kun kan anbefale også at læse (jeg har dog intet med disse sider at gøre):
- [wiki.r-selfhosted.com](https://wiki.r-selfhosted.com/guides/virtual-private-networks/wireguard/)\
- [www.procustodibus.com](https://www.procustodibus.com/blog/2022/09/wireguard-port-forward-from-internet/)
## Eksempler på konfigurationsfiler
### Hetzner VPS
```
[Interface]
Address = 10.25.4.3/32,fd42::1/128
PrivateKey = [Privat nøgle for VPS]
ListenPort = [VPS port]
PreUp = sysctl -w net.ipv4.ip_forward=1
PreUp = iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.25.4.1:443
PreUp = iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.25.4.1:80
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.25.4.1:443
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.25.4.1:80
PreUp = iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE
[Peer]
PublicKey = [Offentlig nøgle for hjemmeserver]
AllowedIPs = 10.25.4.1/32
PersistentKeepalive = 25
```
### Hjemmeserver
```
[Interface]
Address = 10.25.4.1/24
ListenPort = [Wireguard port nummer]
PrivateKey = [Privat nøgle for Hjemmeserver]
## Hetzner VPS
[Peer]
PublicKey = [Offentlig nøgle til VPS]
AllowedIPs = 10.25.4.3/32
Endpoint = [VPS offentlig ip-adresse]:[Wireguard port]
PersistentKeepalive = 25
```

View file

@ -2,12 +2,12 @@
<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.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>Familien G Damsbo license</title>
<title>Familien G Damsbo</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
@ -49,7 +49,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "No results",
"search-matching-documents-text": "matching documents",
@ -58,6 +64,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "more match in this document",
"search-more-matches-text": "more matches in this document",
"search-clear-button-title": "Clear",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Cancel",
"search-submit-button-title": "Submit",
"search-label": "Search"
@ -73,9 +80,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="./index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -87,28 +94,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="./index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="./food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="./food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="./blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Toggle dark mode"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -124,6 +131,7 @@ ul.task-list li input[type="checkbox"] {
<p>Attribution 4.0 International</p>
<p>=======================================================================</p>
<p>Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.</p>
@ -316,6 +324,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -382,13 +417,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -467,10 +504,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -480,8 +539,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -493,7 +561,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -537,6 +728,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -562,6 +754,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -619,20 +837,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -641,7 +845,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -650,4 +856,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -51,7 +51,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -60,6 +66,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -99,6 +106,33 @@ ul.task-list li input[type="checkbox"] {
<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>
<script type="text/javascript">
const typesetMath = (el) => {
if (window.MathJax) {
// MathJax Typeset
window.MathJax.typeset([el]);
} else if (window.katex) {
// KaTeX Render
var mathElements = el.getElementsByClassName("math");
var macros = [];
for (var i = 0; i < mathElements.length; i++) {
var texText = mathElements[i].firstChild;
if (mathElements[i].tagName == "SPAN") {
window.katex.render(texText.data, mathElements[i], {
displayMode: mathElements[i].classList.contains('display'),
throwOnError: false,
macros: macros,
fleqn: false
});
}
}
}
}
window.Quarto = {
typesetMath
};
</script>
<link rel="stylesheet" href="styles.css">
</head>
@ -106,9 +140,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="./index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -120,28 +154,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="./index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="./food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="./food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link active" href="./blog.html" rel="" target="" aria-current="page">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -170,8 +204,10 @@ ul.task-list li input[type="checkbox"] {
</div>
</header>
<div class="topbr">
<p>Her handler det om alle mulige familieprojekter. Det kommer nok til at lugte lidt af kode og IT også.</p>
</div>
@ -181,7 +217,7 @@ ul.task-list li input[type="checkbox"] {
<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-categories="Canada,BC,Vancouver,Camper,Børn" data-listing-date-sort="1691013600000" data-listing-file-modified-sort="1691122836210" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2">
<div class="g-col-1" data-index="0" data-categories="Canada,BC,Vancouver,Camper,Børn" data-listing-date-sort="1691013600000" data-listing-file-modified-sort="1691122836210" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2" data-listing-word-count-sort="278">
<a href="./blog/4_vancouver_og_camper.html" class="quarto-grid-link">
<div class="quarto-grid-item card h-100 card-left">
<div class="listing-item-img-placeholder card-img-top" style="height: 150px;">&nbsp;</div>
@ -221,7 +257,7 @@ Andreas
</div>
</a>
</div>
<div class="g-col-1" data-index="1" data-categories="Canada,Rejse,Tog" data-listing-date-sort="1689285600000" data-listing-file-modified-sort="1689249727226" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1">
<div class="g-col-1" data-index="1" data-categories="Canada,Rejse,Tog" data-listing-date-sort="1689285600000" data-listing-file-modified-sort="1689249727226" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="131">
<a href="./blog/3_checked_in.html" class="quarto-grid-link">
<div class="quarto-grid-item card h-100 card-left">
<div class="listing-item-img-placeholder card-img-top" style="height: 150px;">&nbsp;</div>
@ -255,7 +291,7 @@ Andreas
</div>
</a>
</div>
<div class="g-col-1" data-index="2" data-categories="Canada,Rejse,Forberedelser" data-listing-date-sort="1689026400000" data-listing-file-modified-sort="1689099570380" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1">
<div class="g-col-1" data-index="2" data-categories="Canada,Rejse,Forberedelser" data-listing-date-sort="1689026400000" data-listing-file-modified-sort="1689099570380" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="35">
<a href="./blog/2_snart_klar.html" class="quarto-grid-link">
<div class="quarto-grid-item card h-100 card-left">
<p class="card-img-top">
@ -291,7 +327,7 @@ Andreas
</div>
</a>
</div>
<div class="g-col-1" data-index="3" data-categories="Canada,Rejse,Børn,R" data-listing-date-sort="1687903200000" data-listing-file-modified-sort="1689099570379" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3">
<div class="g-col-1" data-index="3" data-categories="Canada,Rejse,Børn,R" data-listing-date-sort="1687903200000" data-listing-file-modified-sort="1689099570379" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3" data-listing-word-count-sort="506">
<a href="./blog/1_canada_camper.html" class="quarto-grid-link">
<div class="quarto-grid-item card h-100 card-left">
<p class="card-img-top">
@ -378,6 +414,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -444,13 +507,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -529,10 +594,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -542,8 +629,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -555,7 +651,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -599,6 +818,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -624,6 +844,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -681,20 +927,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -703,7 +935,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -712,4 +946,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -24,7 +24,7 @@ ul.task-list li input[type="checkbox"] {
}
/* CSS for syntax highlighting */
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
@ -85,7 +85,13 @@ pre > code.sourceCode > span > a:first-child::before { text-decoration: underlin
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -94,6 +100,7 @@ pre > code.sourceCode > span > a:first-child::before { text-decoration: underlin
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -120,9 +127,9 @@ pre > code.sourceCode > span > a:first-child::before { text-decoration: underlin
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -134,28 +141,28 @@ pre > code.sourceCode > span > a:first-child::before { text-decoration: underlin
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -217,12 +224,14 @@ pre > code.sourceCode > span > a:first-child::before { text-decoration: underlin
</div>
</header>
<section id="kode" class="level1">
<h1>Kode</h1>
<div class="cell">
<details>
<details class="code-fold">
<summary>Kode til oversigtskort</summary>
<div class="sourceCode cell-code" id="cb1"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="co"># Original export from plotting in OsmAnd on phone</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="co"># bookmarks &lt;- gpx::read_gpx(file = "data/favorites_canada_2023.gpx")</span></span>
@ -316,7 +325,7 @@ pre > code.sourceCode > span > a:first-child::before { text-decoration: underlin
<p>Først holder vi lidt ferie. På dag 2 kører vi afsted i en lejet camper og har 14 dage i den, hvor vi skal udforske den sydvestlige del af British Colombia.</p>
<p>Vores rute er tegnet in på kortet herunder.</p>
<div class="cell">
<details>
<details class="code-fold">
<summary>Print kort</summary>
<div class="sourceCode cell-code" id="cb2"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>map</span></code><button title="Kopier til udklipsholder" class="code-copy-button"><i class="bi"></i></button></pre></div>
</details>
@ -377,6 +386,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -443,13 +479,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -528,10 +566,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -541,8 +601,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -554,7 +623,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -598,6 +790,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -623,6 +816,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -680,20 +899,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -702,7 +907,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -711,4 +918,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -51,7 +51,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -60,6 +66,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -75,9 +82,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -89,28 +96,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -167,18 +174,24 @@ ul.task-list li input[type="checkbox"] {
</div>
</header>
<section id="snart-klar-til-afgang" class="level2">
<h2 class="anchored" data-anchor-id="snart-klar-til-afgang">Snart klar til afgang</h2>
<p>Formiddagen har stået på pølsehornsbagning og tilretning af vores lidt rustikke havebord.</p>
<p>Eftermiddagen var bytur i Aarhus og aftensmad hos Faour i Klastergade. yndlingsstedet!</p>
<p>Her er lidt <a href="https://share.gdamsbo.dk/s/DwWjQfPjdzfRjf9">billeder fra formoddagen</a>.</p>
<div id="fig-billeder" class="quarto-figure quarto-figure-center anchored">
<figure class="figure">
<div id="fig-billeder" class="quarto-figure quarto-figure-center quarto-float anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-billeder-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<iframe width="560" height="315" src="https://share.gdamsbo.dk/s/DwWjQfPjdzfRjf9">
</iframe>
<figcaption class="figure-caption">Figur&nbsp;1: Sidste forberedelser</figcaption>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-billeder-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figur&nbsp;1: Sidste forberedelser
</figcaption>
</figure>
</div>
@ -229,6 +242,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -295,13 +335,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -380,10 +422,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -393,8 +457,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -406,7 +479,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -450,6 +646,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -475,6 +672,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -532,20 +755,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -554,7 +763,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -563,4 +774,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -51,7 +51,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -60,6 +66,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -75,9 +82,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -89,28 +96,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -167,8 +174,10 @@ ul.task-list li input[type="checkbox"] {
</div>
</header>
<section id="først-med-tog-og-så-med-fly" class="level2">
<h2 class="anchored" data-anchor-id="først-med-tog-og-så-med-fly">Først med tog og så med fly</h2>
<p>Vi er godt med toget. Mange rejsende til koncert og alt muligt andet. Det er altid spændende med rejser, hvor alle de andre er på vej hen. Ved siden af skal de til Bruce Springsteen-koncert. Heller ikke tosset.</p>
@ -222,6 +231,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -288,13 +324,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -373,10 +411,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -386,8 +446,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -399,7 +468,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -443,6 +635,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -468,6 +661,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -525,20 +744,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -547,7 +752,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -556,4 +763,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -51,7 +51,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -60,6 +66,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -75,9 +82,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -89,28 +96,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -173,8 +180,10 @@ ul.task-list li input[type="checkbox"] {
</div>
</header>
<section id="en-rettelse" class="level2">
<h2 class="anchored" data-anchor-id="en-rettelse">En rettelse</h2>
<p>Vi må nok skynde os at erkende at vi alene har været på campertur i det sydvestlige hjørne af BC, Canada. Dette land er stort!</p>
@ -244,6 +253,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -310,13 +346,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -395,10 +433,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -408,8 +468,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -421,7 +490,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -465,6 +657,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -490,6 +683,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -547,20 +766,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -569,7 +774,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -578,4 +785,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -51,7 +51,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -60,6 +66,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -99,6 +106,33 @@ ul.task-list li input[type="checkbox"] {
<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>
<script type="text/javascript">
const typesetMath = (el) => {
if (window.MathJax) {
// MathJax Typeset
window.MathJax.typeset([el]);
} else if (window.katex) {
// KaTeX Render
var mathElements = el.getElementsByClassName("math");
var macros = [];
for (var i = 0; i < mathElements.length; i++) {
var texText = mathElements[i].firstChild;
if (mathElements[i].tagName == "SPAN") {
window.katex.render(texText.data, mathElements[i], {
displayMode: mathElements[i].classList.contains('display'),
throwOnError: false,
macros: macros,
fleqn: false
});
}
}
}
}
window.Quarto = {
typesetMath
};
</script>
<link rel="stylesheet" href="styles.css">
</head>
@ -106,9 +140,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="./index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -120,28 +154,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="./index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link active" href="./food.html" rel="" target="" aria-current="page">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link active" href="./food.html" aria-current="page">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="./blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -151,7 +185,7 @@ ul.task-list li input[type="checkbox"] {
<!-- margin-sidebar -->
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
<h5 class="quarto-listing-category-title">Kategorier</h5><div class="quarto-listing-category category-default"><div class="category" data-category="">Alle <span class="quarto-category-count">(5)</span></div><div class="category" data-category="Bagværk">Bagværk <span class="quarto-category-count">(3)</span></div><div class="category" data-category="Brød">Brød <span class="quarto-category-count">(2)</span></div><div class="category" data-category="Børnene med!">Børnene med! <span class="quarto-category-count">(3)</span></div><div class="category" data-category="Dansk">Dansk <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Forår">Forår <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Kage">Kage <span class="quarto-category-count">(2)</span></div><div class="category" data-category="Sødt">Sødt <span class="quarto-category-count">(1)</span></div></div></div>
<h5 class="quarto-listing-category-title">Kategorier</h5><div class="quarto-listing-category category-default"><div class="category" data-category="">Alle <span class="quarto-category-count">(6)</span></div><div class="category" data-category="Bagværk">Bagværk <span class="quarto-category-count">(4)</span></div><div class="category" data-category="Brød">Brød <span class="quarto-category-count">(3)</span></div><div class="category" data-category="Børnene med!">Børnene med! <span class="quarto-category-count">(3)</span></div><div class="category" data-category="Dansk">Dansk <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Forår">Forår <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Kage">Kage <span class="quarto-category-count">(2)</span></div><div class="category" data-category="Sødt">Sødt <span class="quarto-category-count">(1)</span></div></div></div>
<!-- main -->
<main class="content" id="quarto-document-content">
@ -170,8 +204,10 @@ ul.task-list li input[type="checkbox"] {
</div>
</header>
<div class="topbr">
<p>Vi er glade for at lave mad, og vi øver os i at have børnene med.</p>
<p>Her deler vi nogle af vores yndlingsopskrifter. Så kan vi selv finde dem, og de kan deles.</p>
@ -183,19 +219,55 @@ ul.task-list li input[type="checkbox"] {
<div class="quarto-listing quarto-listing-container-default" id="listing-listing">
<div class="list quarto-listing-default">
<div class="quarto-post image-right" data-index="0" data-categories="Sødt,Børnene med!" data-listing-date-sort="1687903200000" data-listing-file-modified-sort="1689099570381" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1">
<div class="quarto-post image-right" data-index="0" data-categories="Bagværk,Brød" data-listing-date-sort="1718920800000" data-listing-file-modified-sort="1718975948377" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3" data-listing-word-count-sort="402">
<div class="thumbnail">
<p><a href="./food/hyldesaft.html"> <div class="listing-item-img-placeholder card-img-top" >&nbsp;</div> </a></p>
<p><a href="./food/rugbrød-i-træramme.html" class="no-external"></a></p><a href="./food/rugbrød-i-træramme.html" class="no-external">
<div class="listing-item-img-placeholder card-img-top" >&nbsp;</div>
</a><p><a href="./food/rugbrød-i-træramme.html" class="no-external"></a></p>
</div>
<div class="body">
<a href="./food/hyldesaft.html">
<h3 class="no-anchor listing-title">
Hyldesaft
<a href="./food/rugbrød-i-træramme.html" class="no-external">Rugbrødsopskrift til træramme</a>
</h3>
<div class="listing-subtitle">
<a href="./food/rugbrød-i-træramme.html" class="no-external"></a>
</div>
<div class="listing-categories">
<div class="listing-category" onclick="window.quartoListingCategory('Bagværk'); return false;">
Bagværk
</div>
<div class="listing-category" onclick="window.quartoListingCategory('Brød'); return false;">
Brød
</div>
</div>
<div class="listing-description">
<a href="./food/rugbrød-i-træramme.html" class="no-external">Vi har skiftet de gamle brødforme ud med trærammer. Rugbrødsopskriften er let revideret. Det er blevet en vane, så det virker!</a>
</div>
</div>
<div class="metadata">
<a href="./food/rugbrød-i-træramme.html" class="no-external">
<div class="listing-date">
21. jun. 2024
</div>
<div class="listing-author">
Andreas
</div>
</a>
</div>
</div>
<div class="quarto-post image-right" data-index="1" data-categories="Sødt,Børnene med!" data-listing-date-sort="1687903200000" data-listing-file-modified-sort="1689099570381" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="95">
<div class="thumbnail">
<p><a href="./food/hyldesaft.html" class="no-external"></a></p><a href="./food/hyldesaft.html" class="no-external">
<div class="listing-item-img-placeholder card-img-top" >&nbsp;</div>
</a><p><a href="./food/hyldesaft.html" class="no-external"></a></p>
</div>
<div class="body">
<h3 class="no-anchor listing-title">
<a href="./food/hyldesaft.html" class="no-external">Hyldesaft</a>
</h3>
<div class="listing-subtitle">
<a href="./food/hyldesaft.html" class="no-external"></a>
</div>
<div class="listing-categories">
<div class="listing-category" onclick="window.quartoListingCategory('Sødt'); return false;">
Sødt
@ -204,14 +276,12 @@ Sødt
Børnene med!
</div>
</div>
<a href="./food/hyldesaft.html">
<div class="listing-description">
<p>En klassiker i juni.</p>
<a href="./food/hyldesaft.html" class="no-external">En klassiker i juni.</a>
</div>
</a>
</div>
<div class="metadata">
<a href="./food/hyldesaft.html">
<a href="./food/hyldesaft.html" class="no-external">
<div class="listing-date">
28. jun. 2023
</div>
@ -221,19 +291,19 @@ Andreas
</a>
</div>
</div>
<div class="quarto-post image-right" data-index="1" data-categories="Kage,Bagværk,Børnene med!,Dansk" data-listing-date-sort="1682632800000" data-listing-file-modified-sort="1687767650309" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1">
<div class="quarto-post image-right" data-index="2" data-categories="Kage,Bagværk,Børnene med!,Dansk" data-listing-date-sort="1682632800000" data-listing-file-modified-sort="1687767650309" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="170">
<div class="thumbnail">
<p><a href="./food/banankage.html"> <div class="listing-item-img-placeholder card-img-top" >&nbsp;</div> </a></p>
<p><a href="./food/banankage.html" class="no-external"></a></p><a href="./food/banankage.html" class="no-external">
<div class="listing-item-img-placeholder card-img-top" >&nbsp;</div>
</a><p><a href="./food/banankage.html" class="no-external"></a></p>
</div>
<div class="body">
<a href="./food/banankage.html">
<h3 class="no-anchor listing-title">
Super nem banankage
<a href="./food/banankage.html" class="no-external">Super nem banankage</a>
</h3>
<div class="listing-subtitle">
<a href="./food/banankage.html" class="no-external"></a>
</div>
</a>
<div class="listing-categories">
<div class="listing-category" onclick="window.quartoListingCategory('Kage'); return false;">
Kage
@ -248,33 +318,31 @@ Børnene med!
Dansk
</div>
</div>
<a href="./food/banankage.html">
<div class="listing-description">
<p>Der er aldrig nok banan i banankage. Sådan er det ikke her!</p>
<a href="./food/banankage.html" class="no-external">Der er aldrig nok banan i banankage. Sådan er det ikke her!</a>
</div>
</a>
</div>
<div class="metadata">
<a href="./food/banankage.html">
<a href="./food/banankage.html" class="no-external">
<div class="listing-date">
28. apr. 2023
</div>
</a>
</div>
</div>
<div class="quarto-post image-right" data-index="2" data-categories="Kage,Forår,Børnene med!" data-listing-date-sort="1677970800000" data-listing-file-modified-sort="1689099570380" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1">
<div class="quarto-post image-right" data-index="3" data-categories="Kage,Forår,Børnene med!" data-listing-date-sort="1677970800000" data-listing-file-modified-sort="1689099570380" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="159">
<div class="thumbnail">
<p><a href="./food/elses_vafler.html"> <div class="listing-item-img-placeholder card-img-top" >&nbsp;</div> </a></p>
<p><a href="./food/elses_vafler.html" class="no-external"></a></p><a href="./food/elses_vafler.html" class="no-external">
<div class="listing-item-img-placeholder card-img-top" >&nbsp;</div>
</a><p><a href="./food/elses_vafler.html" class="no-external"></a></p>
</div>
<div class="body">
<a href="./food/elses_vafler.html">
<h3 class="no-anchor listing-title">
Elses vafler
<a href="./food/elses_vafler.html" class="no-external">Elses vafler</a>
</h3>
<div class="listing-subtitle">
<a href="./food/elses_vafler.html" class="no-external"></a>
</div>
</a>
<div class="listing-categories">
<div class="listing-category" onclick="window.quartoListingCategory('Kage'); return false;">
Kage
@ -286,14 +354,12 @@ Forår
Børnene med!
</div>
</div>
<a href="./food/elses_vafler.html">
<div class="listing-description">
<p>Verdens bedste vafler. Punktum.</p>
<a href="./food/elses_vafler.html" class="no-external">Verdens bedste vafler. Punktum.</a>
</div>
</a>
</div>
<div class="metadata">
<a href="./food/elses_vafler.html">
<a href="./food/elses_vafler.html" class="no-external">
<div class="listing-date">
5. mar. 2023
</div>
@ -303,19 +369,19 @@ Andreas
</a>
</div>
</div>
<div class="quarto-post image-right" data-index="3" data-categories="Bagværk,Brød" data-listing-date-sort="1663797600000" data-listing-file-modified-sort="1689099570381" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2">
<div class="quarto-post image-right" data-index="4" data-categories="Bagværk,Brød" data-listing-date-sort="1663797600000" data-listing-file-modified-sort="1689099570381" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2" data-listing-word-count-sort="323">
<div class="thumbnail">
<p><a href="./food/rugbrød.html"> <div class="listing-item-img-placeholder card-img-top" >&nbsp;</div> </a></p>
<p><a href="./food/rugbrød.html" class="no-external"></a></p><a href="./food/rugbrød.html" class="no-external">
<div class="listing-item-img-placeholder card-img-top" >&nbsp;</div>
</a><p><a href="./food/rugbrød.html" class="no-external"></a></p>
</div>
<div class="body">
<a href="./food/rugbrød.html">
<h3 class="no-anchor listing-title">
Rugbrød
<a href="./food/rugbrød.html" class="no-external">Rugbrød</a>
</h3>
<div class="listing-subtitle">
<a href="./food/rugbrød.html" class="no-external"></a>
</div>
</a>
<div class="listing-categories">
<div class="listing-category" onclick="window.quartoListingCategory('Bagværk'); return false;">
Bagværk
@ -324,33 +390,31 @@ Bagværk
Brød
</div>
</div>
<a href="./food/rugbrød.html">
<div class="listing-description">
<p>Vores hverdagsrugbrød. Det er blevet en vane, så det virker!</p>
<a href="./food/rugbrød.html" class="no-external">Vores hverdagsrugbrød. Det er blevet en vane, så det virker!</a>
</div>
</a>
</div>
<div class="metadata">
<a href="./food/rugbrød.html">
<a href="./food/rugbrød.html" class="no-external">
<div class="listing-date">
22. sep. 2022
</div>
</a>
</div>
</div>
<div class="quarto-post image-right" data-index="4" data-categories="Bagværk,Brød" data-listing-date-sort="1663797600000" data-listing-file-modified-sort="1689099570382" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1">
<div class="quarto-post image-right" data-index="5" data-categories="Bagværk,Brød" data-listing-date-sort="1663797600000" data-listing-file-modified-sort="1689099570382" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="1" data-listing-word-count-sort="163">
<div class="thumbnail">
<p><a href="./food/surdej.html"> <div class="listing-item-img-placeholder card-img-top" >&nbsp;</div> </a></p>
<p><a href="./food/surdej.html" class="no-external"></a></p><a href="./food/surdej.html" class="no-external">
<div class="listing-item-img-placeholder card-img-top" >&nbsp;</div>
</a><p><a href="./food/surdej.html" class="no-external"></a></p>
</div>
<div class="body">
<a href="./food/surdej.html">
<h3 class="no-anchor listing-title">
Surdej
<a href="./food/surdej.html" class="no-external">Surdej</a>
</h3>
<div class="listing-subtitle">
<a href="./food/surdej.html" class="no-external"></a>
</div>
</a>
<div class="listing-categories">
<div class="listing-category" onclick="window.quartoListingCategory('Bagværk'); return false;">
Bagværk
@ -359,14 +423,12 @@ Bagværk
Brød
</div>
</div>
<a href="./food/surdej.html">
<div class="listing-description">
<p>Det er ikke så svært endda.</p>
<a href="./food/surdej.html" class="no-external">Det er ikke så svært endda.</a>
</div>
</a>
</div>
<div class="metadata">
<a href="./food/surdej.html">
<a href="./food/surdej.html" class="no-external">
<div class="listing-date">
22. sep. 2022
</div>
@ -421,6 +483,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -487,13 +576,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -572,10 +663,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -585,8 +698,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -598,7 +720,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -642,6 +887,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -667,6 +913,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -724,20 +996,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -746,7 +1004,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -755,4 +1015,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -50,7 +50,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -59,6 +65,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -74,9 +81,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -88,28 +95,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -163,8 +170,10 @@ ul.task-list li input[type="checkbox"] {
</div>
</header>
<section id="noter" class="level2">
<h2 class="anchored" data-anchor-id="noter">Noter</h2>
<p>Denne kage kan sagtens røres sammen med et par unger. Der er sjovt at mose bananer og røre i dej. Dejen smager også ubagt og er jo ikke så farlig. Det tager 15-20 minutter at røre det hele sammen og det passer til en klassisk rugbrødsform på ca 3 L. Kagen er særdeles velegnet til at lægge i fryseren.</p>
@ -239,6 +248,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -305,13 +341,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -390,10 +428,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -403,8 +463,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -416,7 +485,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -460,6 +652,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -485,6 +678,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -542,20 +761,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -564,7 +769,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -573,4 +780,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -51,7 +51,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -60,6 +66,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -75,9 +82,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -89,28 +96,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -170,8 +177,10 @@ ul.task-list li input[type="checkbox"] {
</div>
</header>
<section id="noter" class="level2">
<h2 class="anchored" data-anchor-id="noter">Noter</h2>
<p>At tale om verdens bedste vafler er naturligvis lidt fjollet. Men denne opskrift er virkelig god.</p>
@ -249,6 +258,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -315,13 +351,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -400,10 +438,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -413,8 +473,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -426,7 +495,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -470,6 +662,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -495,6 +688,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -552,20 +771,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -574,7 +779,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -583,4 +790,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,12 +2,12 @@
<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.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>Familien G Damsbo fladmast-hane-med-nye-hvidlog</title>
<title>Familien G Damsbo</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
@ -49,7 +49,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "No results",
"search-matching-documents-text": "matching documents",
@ -58,6 +64,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "more match in this document",
"search-more-matches-text": "more matches in this document",
"search-clear-button-title": "Clear",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Cancel",
"search-submit-button-title": "Submit",
"search-label": "Search"
@ -73,9 +80,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -87,28 +94,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Toggle dark mode"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -124,10 +131,11 @@ ul.task-list li input[type="checkbox"] {
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="images/fladmast hane med nye hvidlog.png" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">fladmast hane med nye hvidlog</figcaption>
<figcaption>fladmast hane med nye hvidlog</figcaption>
</figure>
</div>
<p>Fladmast hane med nye hvidlog</p>
@ -186,6 +194,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -252,13 +287,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -337,10 +374,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -350,8 +409,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -363,7 +431,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -407,6 +598,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -432,6 +624,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -489,20 +707,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -511,7 +715,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -520,4 +726,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,12 +2,12 @@
<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.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>Familien G Damsbo formbrød</title>
<title>Familien G Damsbo</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
@ -49,7 +49,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "No results",
"search-matching-documents-text": "matching documents",
@ -58,6 +64,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "more match in this document",
"search-more-matches-text": "more matches in this document",
"search-clear-button-title": "Clear",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Cancel",
"search-submit-button-title": "Submit",
"search-label": "Search"
@ -73,9 +80,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -87,28 +94,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Toggle dark mode"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -130,6 +137,7 @@ ul.task-list li input[type="checkbox"] {
<section id="formbrød" class="level2">
<h2 class="anchored" data-anchor-id="formbrød">Formbrød</h2>
<p>Rest surdej (150 g) 7 dl vand 2 håndfulde havregryn 25 g salt 10 g gær 1 håndfuld hørfrø Mel</p>
@ -183,6 +191,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -249,13 +284,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -334,10 +371,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -347,8 +406,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -360,7 +428,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -404,6 +595,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -429,6 +621,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -486,20 +704,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -508,7 +712,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -517,4 +723,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,12 +2,12 @@
<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.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>Familien G Damsbo groft-hvede-surdejsbrød</title>
<title>Familien G Damsbo</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
@ -49,7 +49,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "No results",
"search-matching-documents-text": "matching documents",
@ -58,6 +64,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "more match in this document",
"search-more-matches-text": "more matches in this document",
"search-clear-button-title": "Clear",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Cancel",
"search-submit-button-title": "Submit",
"search-label": "Search"
@ -73,9 +80,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -87,28 +94,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Toggle dark mode"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -124,7 +131,8 @@ ul.task-list li input[type="checkbox"] {
<p>Groft hvede-surdejsbrød_ <em> </em> _ <em>https://www.dr.dk/mad/opskrift/groft-hvede-surdejsbrod</em></p>
<p>Groft hvede-surdejsbrød_ _ <em>https://www.dr.dk/mad/opskrift/groft-hvede-surdejsbrod</em></p>
<p><strong>Ingredienser</strong></p>
<ul>
<li>5 g&nbsp;gær (økologisk gær anbefales pga. bedre hæve-effekt)</li>
@ -193,6 +201,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -259,13 +294,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -344,10 +381,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -357,8 +416,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -370,7 +438,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -414,6 +605,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -439,6 +631,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -496,20 +714,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -518,7 +722,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -527,4 +733,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -51,7 +51,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -60,6 +66,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -75,9 +82,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -89,28 +96,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -167,8 +174,10 @@ ul.task-list li input[type="checkbox"] {
</div>
</header>
<section id="hyldeblomstsaft" class="level2">
<h2 class="anchored" data-anchor-id="hyldeblomstsaft">Hyldeblomstsaft</h2>
<ul>
@ -232,6 +241,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -298,13 +334,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -383,10 +421,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -396,8 +456,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -409,7 +478,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -453,6 +645,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -478,6 +671,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -535,20 +754,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -557,7 +762,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -566,4 +773,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -0,0 +1,803 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<meta name="author" content="Andreas">
<meta name="description" content="Vi har skiftet de gamle brødforme ud med trærammer. Rugbrødsopskriften er let revideret. Det er blevet en vane, så det virker!">
<title>Familien G Damsbo - Rugbrødsopskrift til træramme</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" class="quarto-color-scheme" id="quarto-text-highlighting-styles">
<link href="../site_libs/quarto-html/quarto-syntax-highlighting-dark.css" rel="stylesheet" class="quarto-color-scheme quarto-color-alternate" 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" class="quarto-color-scheme" id="quarto-bootstrap" data-mode="light">
<link href="../site_libs/bootstrap/bootstrap-dark.min.css" rel="stylesheet" class="quarto-color-scheme quarto-color-alternate" id="quarto-bootstrap" data-mode="dark">
<link href="../site_libs/quarto-contrib/fontawesome6-0.1.0/all.css" rel="stylesheet">
<link href="../site_libs/quarto-contrib/fontawesome6-0.1.0/latex-fontsize.css" rel="stylesheet">
<script id="quarto-search-options" type="application/json">{
"location": "navbar",
"copy-button": false,
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
"search-copy-link-title": "Kopier link for at søge",
"search-hide-matches-text": "Skjul yderligere resultater",
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
}
}</script>
<script async="" src="https://analytics.gdamsbo.dk/script.js" data-website-id="10947757-af58-4b5c-aab7-f40591b9ed30"></script>
<link rel="stylesheet" href="../styles.css">
</head>
<body class="nav-fixed">
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
</div>
<div id="quarto-search" class="" title="Søg"></div>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Skift 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">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /container-fluid -->
</nav>
</header>
<!-- content -->
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
<!-- sidebar -->
<!-- margin-sidebar -->
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
<nav id="TOC" role="doc-toc" class="toc-active">
<h2 id="toc-title">På denne side</h2>
<ul>
<li><a href="#dag-1" id="toc-dag-1" class="nav-link active" data-scroll-target="#dag-1">Dag 1</a></li>
<li><a href="#dag-2" id="toc-dag-2" class="nav-link" data-scroll-target="#dag-2">Dag 2</a></li>
<li><a href="#dag-3" id="toc-dag-3" class="nav-link" data-scroll-target="#dag-3">Dag 3</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">Rugbrødsopskrift til træramme</h1>
<div class="quarto-categories">
<div class="quarto-category">Bagværk</div>
<div class="quarto-category">Brød</div>
</div>
</div>
<div>
<div class="description">
Vi har skiftet de gamle brødforme ud med trærammer. Rugbrødsopskriften er let revideret. Det er blevet en vane, så det virker!
</div>
</div>
<div class="quarto-title-meta">
<div>
<div class="quarto-title-meta-heading">Forfatter</div>
<div class="quarto-title-meta-contents">
<p>Andreas </p>
</div>
</div>
<div>
<div class="quarto-title-meta-heading">Udgivet</div>
<div class="quarto-title-meta-contents">
<p class="date">21. juni 2024</p>
</div>
</div>
</div>
</header>
<p>Vi har købt tre trærammer fra aarhusianske Kunst og Køkkentøj (de forhandles fra Aurion og produceres på REVA i Herning, hvor <a href="https://www.tvmidtvest.dk/fast-arbejde/fast-arbejde-fra-reva">TV MV var forbi for nogle år siden</a>) for at undgå metalforme med belægning. Rammerne kan lige stå ved siden af hinanden i ovnen, men har skullet have en helt flad plade at stå på. John-smed har hjulpet, tak for det!</p>
<p>Vores brød blev dog ved at hænge i formene, så vi har revideret opskriften primært ved at tilsætte mere mel for at opnå en lidt fastere dej.</p>
<p>Den oprindelige opskrift <a href="https://fam.gdamsbo.dk/food/rugbrød.html">finder du her</a>.</p>
<section id="dag-1" class="level2">
<h2 class="anchored" data-anchor-id="dag-1">Dag 1</h2>
<p>Tag din surdej ud og fodr den. <a href="https://fam.gdamsbo.dk/food/surdej.html">Se her for gode råd.</a></p>
</section>
<section id="dag-2" class="level2">
<h2 class="anchored" data-anchor-id="dag-2">Dag 2</h2>
<ul>
<li>175 g surdej (ca. 1½ dl)</li>
<li>30 g salt</li>
<li>1 liter koldt vand</li>
<li>400 g skårne rugkerner</li>
<li>600 g rugmel</li>
</ul>
<p>Røres sammen i en stor skål (5 L). Tildækkes og står ved stuetemperatur i 12-24 timer.</p>
<ul>
<li>300 g skårne rugkerner</li>
<li>50-100 g surdej (passer for det meste med resten)</li>
<li>Evt. ca 100 g mandler, hasselnødder, boghvede, amarant, chia, quinoa eller lignende.</li>
</ul>
<p>Sættes i blød med rigeligt vand 12-36 timer.</p>
</section>
<section id="dag-3" class="level2">
<h2 class="anchored" data-anchor-id="dag-3">Dag 3</h2>
<p>Dejen fra Dag 2 samt drænede, udblødte rugkerner (og nødder/frø) blandes.</p>
<p>Desuden tilsættes følgende:</p>
<ul>
<li>4 dl frø (fx sesam, solsikke- og græskarkerner i forholdet 1:2:1)</li>
<li>1 spsk honning (kan røres ud i øl)</li>
<li>1 øl (33 cl, gerne hvidtøl eller anden mørk øl, men det kommer sig ikke så nøje)</li>
<li>Ca 9 dl rugmel til rette konsistens.</li>
<li>Evt. 2 spsk mørk maltsirup (Giver mere smag og farve)</li>
</ul>
<p>Det hele røres godt sammen. Det skal have en tyk, sej klistret konsistens og fordeles i 3 smør-smurte trærammer der rummer 2 liter. Glat dejen.</p>
<p>Lad nu brødene hæve under et fugtigt viskestykke indtil dejen når lidt op over kanten (1-4 timer). Inden de bages, brug da en våd strikkepind eller lignende til at prikke huller i brødene (ca. 30 i hver), så større luftlommer punkteres.</p>
<p>Bages med konventionel varme ved 180°C i 1 time og 45 minutter.</p>
<p>Efter bagning fjernes rammerne og brødene skal køle noget af inden de lægges i plasticposer.</p>
<p>Vi plejer at kunne spise de tre brød i løbet af en uges tid. De holder sig længere i køleskabet, men bliver noget tørre og hårde. Egner sig også til at fryse ned, men vent to døgn. Så smuldrer brødet ikke så meget når det skæres efter optøning.</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 disableStylesheet = (stylesheets) => {
for (let i=0; i < stylesheets.length; i++) {
const stylesheet = stylesheets[i];
stylesheet.rel = 'prefetch';
}
}
const enableStylesheet = (stylesheets) => {
for (let i=0; i < stylesheets.length; i++) {
const stylesheet = stylesheets[i];
stylesheet.rel = 'stylesheet';
}
}
const manageTransitions = (selector, allowTransitions) => {
const els = window.document.querySelectorAll(selector);
for (let i=0; i < els.length; i++) {
const el = els[i];
if (allowTransitions) {
el.classList.remove('notransition');
} else {
el.classList.add('notransition');
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
manageTransitions('#quarto-margin-sidebar .nav-link', false);
if (alternate) {
enableStylesheet(alternateStylesheets);
for (const sheetNode of alternateStylesheets) {
if (sheetNode.id === "quarto-bootstrap") {
toggleBodyColorMode(sheetNode);
}
}
} else {
disableStylesheet(alternateStylesheets);
toggleBodyColorPrimary();
}
manageTransitions('#quarto-margin-sidebar .nav-link', true);
// Switch the toggles
const toggles = window.document.querySelectorAll('.quarto-color-scheme-toggle');
for (let i=0; i < toggles.length; i++) {
const toggle = toggles[i];
if (toggle) {
if (alternate) {
toggle.classList.add("alternate");
} else {
toggle.classList.remove("alternate");
}
}
}
// Hack to workaround the fact that safari doesn't
// properly recolor the scrollbar when toggling (#1455)
if (navigator.userAgent.indexOf('Safari') > 0 && navigator.userAgent.indexOf('Chrome') == -1) {
manageTransitions("body", false);
window.scrollTo(0, 1);
setTimeout(() => {
window.scrollTo(0, 0);
manageTransitions("body", true);
}, 40);
}
}
const isFileUrl = () => {
return window.location.protocol === 'file:';
}
const hasAlternateSentinel = () => {
let styleSentinel = getColorSchemeSentinel();
if (styleSentinel !== null) {
return styleSentinel === "alternate";
} else {
return false;
}
}
const setStyleSentinel = (alternate) => {
const value = alternate ? "alternate" : "default";
if (!isFileUrl()) {
window.localStorage.setItem("quarto-color-scheme", value);
} else {
localAlternateSentinel = value;
}
}
const getColorSchemeSentinel = () => {
if (!isFileUrl()) {
const storageValue = window.localStorage.getItem("quarto-color-scheme");
return storageValue != null ? storageValue : localAlternateSentinel;
} else {
return localAlternateSentinel;
}
}
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
const a = window.document.createElement('a');
a.classList.add('top-right');
a.classList.add('quarto-color-scheme-toggle');
a.href = "";
a.onclick = function() { try { window.quartoToggleColorScheme(); } catch {} return false; };
const i = window.document.createElement("i");
i.classList.add('bi');
a.appendChild(i);
window.document.body.appendChild(a);
}
// Switch to dark mode if need be
if (hasAlternateSentinel()) {
toggleColorMode(true);
} else {
toggleColorMode(false);
}
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", "Kopieret!");
let tooltip;
if (window.bootstrap) {
button.setAttribute("data-bs-toggle", "tooltip");
button.setAttribute("data-bs-placement", "left");
button.setAttribute("data-bs-title", "Kopieret!");
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();
});
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
maxWidth: 500,
delay: 100,
arrow: false,
appendTo: function(el) {
return el.parentElement;
},
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
for (var i=0; i<noterefs.length; i++) {
const ref = noterefs[i];
tippyHover(ref, function() {
// use id or data attribute instead here
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
const selectorForAnnotation = ( cell, annotation) => {
let cellAttr = 'data-code-cell="' + cell + '"';
let lineAttr = 'data-code-annotation="' + annotation + '"';
const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
return selector;
}
const selectCodeLines = (annoteEl) => {
const doc = window.document;
const targetCell = annoteEl.getAttribute("data-target-cell");
const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
const lines = annoteSpan.getAttribute("data-code-lines").split(",");
const lineIds = lines.map((line) => {
return targetCell + "-" + line;
})
let top = null;
let height = null;
let parent = null;
if (lineIds.length > 0) {
//compute the position of the single el (top and bottom and make a div)
const el = window.document.getElementById(lineIds[0]);
top = el.offsetTop;
height = el.offsetHeight;
parent = el.parentElement.parentElement;
if (lineIds.length > 1) {
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
const bottom = lastEl.offsetTop + lastEl.offsetHeight;
height = bottom - top;
}
if (top !== null && height !== null && parent !== null) {
// cook up a div (if necessary) and position it
let div = window.document.getElementById("code-annotation-line-highlight");
if (div === null) {
div = window.document.createElement("div");
div.setAttribute("id", "code-annotation-line-highlight");
div.style.position = 'absolute';
parent.appendChild(div);
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
gutterDiv.style.position = 'absolute';
const codeCell = window.document.getElementById(targetCell);
const gutter = codeCell.querySelector('.code-annotation-gutter');
gutter.appendChild(gutterDiv);
}
gutterDiv.style.top = top - 2 + "px";
gutterDiv.style.height = height + 4 + "px";
}
selectedAnnoteEl = annoteEl;
}
};
const unselectCodeLines = () => {
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
elementsIds.forEach((elId) => {
const div = window.document.getElementById(elId);
if (div) {
div.remove();
}
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
annoteDlNode.addEventListener('click', (event) => {
const clickedEl = event.target;
if (clickedEl !== selectedAnnoteEl) {
unselectCodeLines();
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
if (activeEl) {
activeEl.classList.remove('code-annotation-active');
}
selectCodeLines(clickedEl);
clickedEl.classList.add('code-annotation-active');
} else {
// Unselect the line
unselectCodeLines();
clickedEl.classList.remove('code-annotation-active');
}
});
}
const findCites = (el) => {
const parentEl = el.parentElement;
if (parentEl) {
const cites = parentEl.dataset.cites;
if (cites) {
return {
el,
cites: cites.split(' ')
};
} else {
return findCites(el.parentElement)
}
} else {
return undefined;
}
};
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
for (var i=0; i<bibliorefs.length; i++) {
const ref = bibliorefs[i];
const citeInfo = findCites(ref);
if (citeInfo) {
tippyHover(citeInfo.el, function() {
var popup = window.document.createElement('div');
citeInfo.cites.forEach(function(cite) {
var citeDiv = window.document.createElement('div');
citeDiv.classList.add('hanging-indent');
citeDiv.classList.add('csl-entry');
var biblioDiv = window.document.getElementById('ref-' + cite);
if (biblioDiv) {
citeDiv.innerHTML = biblioDiv.innerHTML;
}
popup.appendChild(citeDiv);
});
return popup.innerHTML;
});
}
}
});
</script>
</div> <!-- /content -->
<footer class="footer">
<div class="nav-footer">
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
</div>
</footer>
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -50,7 +50,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -59,6 +65,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -74,9 +81,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -88,28 +95,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -161,8 +168,10 @@ ul.task-list li input[type="checkbox"] {
</div>
</header>
<p>Vi er glade for at bage, og særligt rugbrød er lækkert som hjemmebag. Her er opskriften, som vi bruger. Den er overkommelig og, men kræver at man tænker sig lidt om i god tid.</p>
<section id="dag-1" class="level2">
<h2 class="anchored" data-anchor-id="dag-1">Dag 1</h2>
@ -246,6 +255,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -312,13 +348,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -397,10 +435,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -410,8 +470,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -423,7 +492,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -467,6 +659,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -492,6 +685,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -549,20 +768,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -571,7 +776,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -580,4 +787,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -50,7 +50,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -59,6 +65,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -74,9 +81,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="../index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -88,28 +95,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link" href="../index.html">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="../food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="../blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -153,8 +160,10 @@ ul.task-list li input[type="checkbox"] {
</div>
</header>
<p>Vi bager hverdagsbrød, så her kommer mine gode råd til en hverdagssurdej.</p>
<p>Slap af. Det er ikke svært! Punktum.</p>
<p>Kan opbevares på køl i en mindre beholder. Tages ud 1-2 dage før brug. Brug en beholder på omtrent en liter. Surdejen “fodres” med ca 1,5 dl vand og 1,5 dl mel (fx blanding af rug og spelt, altså det samme mel som skal bruges i brødet). Konsistensen skal være som lidt tynd havregrød. Rør i surdejen et par gange dagligt. Sørg for, at der er lidt surdej tilbage når du har taget fra til brøddej og sæt så resten på køl i en lukket beholder til næste gang.</p>
@ -207,6 +216,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -273,13 +309,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -358,10 +396,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -371,8 +431,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -384,7 +453,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -428,6 +620,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -453,6 +646,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -510,20 +729,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -532,7 +737,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0 <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i></a> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -541,4 +748,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.450">
<meta name="generator" content="quarto-1.4.554">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
@ -48,7 +48,13 @@ ul.task-list li input[type="checkbox"] {
"collapse-after": 3,
"panel-placement": "end",
"type": "overlay",
"limit": 20,
"limit": 50,
"keyboard-shortcut": [
"f",
"/",
"s"
],
"show-item-context": false,
"language": {
"search-no-results-text": "Ingen resultater",
"search-matching-documents-text": "Matchende dokumenter",
@ -57,6 +63,7 @@ ul.task-list li input[type="checkbox"] {
"search-more-match-text": "andet resultat i dette dokument",
"search-more-matches-text": "andre resultater i dette dokument",
"search-clear-button-title": "Ryd",
"search-text-placeholder": "",
"search-detached-cancel-button-title": "Fortryd",
"search-submit-button-title": "Indsend",
"search-label": "Søg"
@ -72,9 +79,9 @@ ul.task-list li input[type="checkbox"] {
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="navbar navbar-expand-lg navbar-dark ">
<nav class="navbar navbar-expand-lg " data-bs-theme="dark">
<div class="navbar-container container-fluid">
<div class="navbar-brand-container">
<div class="navbar-brand-container mx-auto">
<a class="navbar-brand" href="./index.html">
<span class="navbar-title">Familien G Damsbo</span>
</a>
@ -86,28 +93,28 @@ ul.task-list li input[type="checkbox"] {
<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">Start</span></a>
<a class="nav-link active" href="./index.html" aria-current="page">
<span class="menu-text">Start</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="./food.html" rel="" target="">
<span class="menu-text">Opskrifter</span></a>
<a class="nav-link" href="./food.html">
<span class="menu-text">Opskrifter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="./blog.html" rel="" target="">
<span class="menu-text">Blog</span></a>
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
<span class="menu-text">Ebbas side</span></a>
</li>
</ul>
<ul class="navbar-nav navbar-nav-scroll ms-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
<span class="menu-text">Kildekode</span></a>
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
<span class="menu-text">Kildekode</span></a>
</li>
</ul>
</div> <!-- /navcollapse -->
<div class="quarto-navbar-tools">
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Skift mørk tilstand"><i class="bi"></i></a>
</div>
</div> <!-- /navcollapse -->
</div> <!-- /container-fluid -->
</nav>
</header>
@ -117,7 +124,7 @@ ul.task-list li input[type="checkbox"] {
<!-- margin-sidebar -->
<!-- main -->
<div class="quarto-about-jolla">
<div class="quarto-about-jolla content">
<header id="title-block-header" class="quarto-title-block default">
<div class="quarto-title">
<h1 class="title">Familien G Damsbo</h1>
@ -176,6 +183,33 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
}
}
const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
let newTheme = '';
if(darkModeDefault) {
newTheme = isAlternate ? baseTheme : alternateTheme;
} else {
newTheme = isAlternate ? alternateTheme : baseTheme;
}
const changeGiscusTheme = () => {
// From: https://github.com/giscus/giscus/issues/336
const sendMessage = (message) => {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: newTheme
}
});
}
const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
if (isGiscussLoaded) {
changeGiscusTheme();
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
@ -242,13 +276,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'alternate';
const darkModeDefault = true;
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
toggleGiscusIfUsed(toAlternate, darkModeDefault);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
@ -320,10 +356,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var mailtoRegex = new RegExp(/^mailto:/);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// undo the damage that might have been done by quarto-nav.js in the case of
// links that we want to consider external
if (link.dataset.originalHref !== undefined) {
link.href = link.dataset.originalHref;
}
// target, if specified
link.setAttribute("target", "_blank");
if (link.getAttribute("rel") === null) {
link.setAttribute("rel", "noopener");
}
}
}
function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
@ -333,8 +391,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
placement: 'bottom-start',
};
if (contentFn) {
config.content = contentFn;
}
if (onTriggerFn) {
config.onTrigger = onTriggerFn;
}
if (onUntriggerFn) {
config.onUntrigger = onUntriggerFn;
}
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
@ -346,7 +413,130 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note) {
return note.innerHTML;
} else {
return "";
}
});
}
const xrefs = window.document.querySelectorAll('a.quarto-xref');
const processXRef = (id, note) => {
// Strip column container classes
const stripColumnClz = (el) => {
el.classList.remove("page-full", "page-columns");
if (el.children) {
for (const child of el.children) {
stripColumnClz(child);
}
}
}
stripColumnClz(note)
if (id === null || id.startsWith('sec-')) {
// Special case sections, only their first couple elements
const container = document.createElement("div");
if (note.children && note.children.length > 2) {
container.appendChild(note.children[0].cloneNode(true));
for (let i = 1; i < note.children.length; i++) {
const child = note.children[i];
if (child.tagName === "P" && child.innerText === "") {
continue;
} else {
container.appendChild(child.cloneNode(true));
break;
}
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(container);
}
return container.innerHTML
} else {
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
return note.innerHTML;
}
} else {
// Remove any anchor links if they are present
const anchorLink = note.querySelector('a.anchorjs-link');
if (anchorLink) {
anchorLink.remove();
}
if (window.Quarto?.typesetMath) {
window.Quarto.typesetMath(note);
}
// TODO in 1.5, we should make sure this works without a callout special case
if (note.classList.contains("callout")) {
return note.outerHTML;
} else {
return note.innerHTML;
}
}
}
for (var i=0; i<xrefs.length; i++) {
const xref = xrefs[i];
tippyHover(xref, undefined, function(instance) {
instance.disable();
let url = xref.getAttribute('href');
let hash = undefined;
if (url.startsWith('#')) {
hash = url;
} else {
try { hash = new URL(url).hash; } catch {}
}
if (hash) {
const id = hash.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
if (note !== null) {
try {
const html = processXRef(id, note.cloneNode(true));
instance.setContent(html);
} finally {
instance.enable();
instance.show();
}
} else {
// See if we can fetch this
fetch(url.split('#')[0])
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.getElementById(id);
if (note !== null) {
const html = processXRef(id, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
} else {
// See if we can fetch a full url (with no hash to target)
// This is a special case and we should probably do some content thinning / targeting
fetch(url)
.then(res => res.text())
.then(html => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(html, "text/html");
const note = htmlDoc.querySelector('main.content');
if (note !== null) {
// This should only happen for chapter cross references
// (since there is no id in the URL)
// remove the first header
if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
note.children[0].remove();
}
const html = processXRef(null, note);
instance.setContent(html);
}
}).finally(() => {
instance.enable();
instance.show();
});
}
}, function(instance) {
});
}
let selectedAnnoteEl;
@ -390,6 +580,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
div.style.left = 0;
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
@ -415,6 +606,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
selectedAnnoteEl = undefined;
};
// Handle positioning of the toggle
window.addEventListener(
"resize",
throttle(() => {
elRect = undefined;
if (selectedAnnoteEl) {
selectCodeLines(selectedAnnoteEl);
}
}, 10)
);
function throttle(fn, ms) {
let throttle = false;
let timer;
return (...args) => {
if(!throttle) { // first call gets through
fn.apply(this, args);
throttle = true;
} else { // all the others get throttled
if(timer) clearTimeout(timer); // cancel #2
timer = setTimeout(() => {
fn.apply(this, args);
timer = throttle = false;
}, ms);
}
};
}
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
@ -472,20 +689,6 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
});
}
}
var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
var filterRegex = new RegExp('/' + window.location.host + '/');
var isInternal = (href) => {
return filterRegex.test(href) || localhostRegex.test(href);
}
// Inspect non-navigation links and adorn them if external
var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item)');
for (var i=0; i<links.length; i++) {
const link = links[i];
if (!isInternal(link.href)) {
// target, if specified
link.setAttribute("target", "_blank");
}
}
});
</script>
</div> <!-- /content -->
@ -494,7 +697,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
<div class="nav-footer-left">
&nbsp;
</div>
<div class="nav-footer-center">Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></div>
<div class="nav-footer-center">
<p>Lavet med <a href="https://quarto.org/">Quarto</a> i <a href="https://posit.co/download/rstudio-desktop/">RStudio</a> | <a href="LICENSE.html">Licens: CC-BY 4.0</a> <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> | Statistik med <a href="https://analytics.gdamsbo.dk/share/DXB70SBStpd77c3Y/Familie-side">Umami</a></p>
</div>
<div class="nav-footer-right">
&nbsp;
</div>
@ -503,4 +708,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
</body></html>

View file

@ -11,6 +11,7 @@
{
"listing": "/food.html",
"items": [
"/food/rugbrød-i-træramme.html",
"/food/hyldesaft.html",
"/food/banankage.html",
"/food/elses_vafler.html",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,8 +1,14 @@
/*!
* Bootstrap Icons v1.11.1 (https://icons.getbootstrap.com/)
* Copyright 2019-2023 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE)
*/
@font-face {
font-display: block;
font-family: "bootstrap-icons";
src:
url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
url("./bootstrap-icons.woff?2820a3852bdb9a5832199cc61cec4e65") format("woff");
}
.bi::before,
@ -441,7 +447,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-cloud-fog2::before { content: "\f2a2"; }
.bi-cloud-hail-fill::before { content: "\f2a3"; }
.bi-cloud-hail::before { content: "\f2a4"; }
.bi-cloud-haze-1::before { content: "\f2a5"; }
.bi-cloud-haze-fill::before { content: "\f2a6"; }
.bi-cloud-haze::before { content: "\f2a7"; }
.bi-cloud-haze2-fill::before { content: "\f2a8"; }
@ -1437,21 +1442,16 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-dpad::before { content: "\f687"; }
.bi-ear-fill::before { content: "\f688"; }
.bi-ear::before { content: "\f689"; }
.bi-envelope-check-1::before { content: "\f68a"; }
.bi-envelope-check-fill::before { content: "\f68b"; }
.bi-envelope-check::before { content: "\f68c"; }
.bi-envelope-dash-1::before { content: "\f68d"; }
.bi-envelope-dash-fill::before { content: "\f68e"; }
.bi-envelope-dash::before { content: "\f68f"; }
.bi-envelope-exclamation-1::before { content: "\f690"; }
.bi-envelope-exclamation-fill::before { content: "\f691"; }
.bi-envelope-exclamation::before { content: "\f692"; }
.bi-envelope-plus-fill::before { content: "\f693"; }
.bi-envelope-plus::before { content: "\f694"; }
.bi-envelope-slash-1::before { content: "\f695"; }
.bi-envelope-slash-fill::before { content: "\f696"; }
.bi-envelope-slash::before { content: "\f697"; }
.bi-envelope-x-1::before { content: "\f698"; }
.bi-envelope-x-fill::before { content: "\f699"; }
.bi-envelope-x::before { content: "\f69a"; }
.bi-explicit-fill::before { content: "\f69b"; }
@ -1461,8 +1461,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-list-columns-reverse::before { content: "\f69f"; }
.bi-list-columns::before { content: "\f6a0"; }
.bi-meta::before { content: "\f6a1"; }
.bi-mortorboard-fill::before { content: "\f6a2"; }
.bi-mortorboard::before { content: "\f6a3"; }
.bi-nintendo-switch::before { content: "\f6a4"; }
.bi-pc-display-horizontal::before { content: "\f6a5"; }
.bi-pc-display::before { content: "\f6a6"; }
@ -1481,7 +1479,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-send-check::before { content: "\f6b3"; }
.bi-send-dash-fill::before { content: "\f6b4"; }
.bi-send-dash::before { content: "\f6b5"; }
.bi-send-exclamation-1::before { content: "\f6b6"; }
.bi-send-exclamation-fill::before { content: "\f6b7"; }
.bi-send-exclamation::before { content: "\f6b8"; }
.bi-send-fill::before { content: "\f6b9"; }
@ -1493,7 +1490,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-send-x::before { content: "\f6bf"; }
.bi-send::before { content: "\f6c0"; }
.bi-steam::before { content: "\f6c1"; }
.bi-terminal-dash-1::before { content: "\f6c2"; }
.bi-terminal-dash::before { content: "\f6c3"; }
.bi-terminal-plus::before { content: "\f6c4"; }
.bi-terminal-split::before { content: "\f6c5"; }
@ -1523,7 +1519,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-usb-symbol::before { content: "\f6dd"; }
.bi-usb::before { content: "\f6de"; }
.bi-boombox-fill::before { content: "\f6df"; }
.bi-displayport-1::before { content: "\f6e0"; }
.bi-displayport::before { content: "\f6e1"; }
.bi-gpu-card::before { content: "\f6e2"; }
.bi-memory::before { content: "\f6e3"; }
@ -1536,8 +1531,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-pci-card::before { content: "\f6ea"; }
.bi-router-fill::before { content: "\f6eb"; }
.bi-router::before { content: "\f6ec"; }
.bi-ssd-fill::before { content: "\f6ed"; }
.bi-ssd::before { content: "\f6ee"; }
.bi-thunderbolt-fill::before { content: "\f6ef"; }
.bi-thunderbolt::before { content: "\f6f0"; }
.bi-usb-drive-fill::before { content: "\f6f1"; }
@ -1644,7 +1637,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-filetype-pdf::before { content: "\f756"; }
.bi-filetype-php::before { content: "\f757"; }
.bi-filetype-png::before { content: "\f758"; }
.bi-filetype-ppt-1::before { content: "\f759"; }
.bi-filetype-ppt::before { content: "\f75a"; }
.bi-filetype-psd::before { content: "\f75b"; }
.bi-filetype-py::before { content: "\f75c"; }
@ -1660,7 +1652,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-filetype-txt::before { content: "\f766"; }
.bi-filetype-wav::before { content: "\f767"; }
.bi-filetype-woff::before { content: "\f768"; }
.bi-filetype-xls-1::before { content: "\f769"; }
.bi-filetype-xls::before { content: "\f76a"; }
.bi-filetype-xml::before { content: "\f76b"; }
.bi-filetype-yml::before { content: "\f76c"; }
@ -1703,56 +1694,38 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-filetype-json::before { content: "\f791"; }
.bi-filetype-pptx::before { content: "\f792"; }
.bi-filetype-xlsx::before { content: "\f793"; }
.bi-1-circle-1::before { content: "\f794"; }
.bi-1-circle-fill-1::before { content: "\f795"; }
.bi-1-circle-fill::before { content: "\f796"; }
.bi-1-circle::before { content: "\f797"; }
.bi-1-square-fill::before { content: "\f798"; }
.bi-1-square::before { content: "\f799"; }
.bi-2-circle-1::before { content: "\f79a"; }
.bi-2-circle-fill-1::before { content: "\f79b"; }
.bi-2-circle-fill::before { content: "\f79c"; }
.bi-2-circle::before { content: "\f79d"; }
.bi-2-square-fill::before { content: "\f79e"; }
.bi-2-square::before { content: "\f79f"; }
.bi-3-circle-1::before { content: "\f7a0"; }
.bi-3-circle-fill-1::before { content: "\f7a1"; }
.bi-3-circle-fill::before { content: "\f7a2"; }
.bi-3-circle::before { content: "\f7a3"; }
.bi-3-square-fill::before { content: "\f7a4"; }
.bi-3-square::before { content: "\f7a5"; }
.bi-4-circle-1::before { content: "\f7a6"; }
.bi-4-circle-fill-1::before { content: "\f7a7"; }
.bi-4-circle-fill::before { content: "\f7a8"; }
.bi-4-circle::before { content: "\f7a9"; }
.bi-4-square-fill::before { content: "\f7aa"; }
.bi-4-square::before { content: "\f7ab"; }
.bi-5-circle-1::before { content: "\f7ac"; }
.bi-5-circle-fill-1::before { content: "\f7ad"; }
.bi-5-circle-fill::before { content: "\f7ae"; }
.bi-5-circle::before { content: "\f7af"; }
.bi-5-square-fill::before { content: "\f7b0"; }
.bi-5-square::before { content: "\f7b1"; }
.bi-6-circle-1::before { content: "\f7b2"; }
.bi-6-circle-fill-1::before { content: "\f7b3"; }
.bi-6-circle-fill::before { content: "\f7b4"; }
.bi-6-circle::before { content: "\f7b5"; }
.bi-6-square-fill::before { content: "\f7b6"; }
.bi-6-square::before { content: "\f7b7"; }
.bi-7-circle-1::before { content: "\f7b8"; }
.bi-7-circle-fill-1::before { content: "\f7b9"; }
.bi-7-circle-fill::before { content: "\f7ba"; }
.bi-7-circle::before { content: "\f7bb"; }
.bi-7-square-fill::before { content: "\f7bc"; }
.bi-7-square::before { content: "\f7bd"; }
.bi-8-circle-1::before { content: "\f7be"; }
.bi-8-circle-fill-1::before { content: "\f7bf"; }
.bi-8-circle-fill::before { content: "\f7c0"; }
.bi-8-circle::before { content: "\f7c1"; }
.bi-8-square-fill::before { content: "\f7c2"; }
.bi-8-square::before { content: "\f7c3"; }
.bi-9-circle-1::before { content: "\f7c4"; }
.bi-9-circle-fill-1::before { content: "\f7c5"; }
.bi-9-circle-fill::before { content: "\f7c6"; }
.bi-9-circle::before { content: "\f7c7"; }
.bi-9-square-fill::before { content: "\f7c8"; }
@ -1771,8 +1744,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-browser-edge::before { content: "\f7d5"; }
.bi-browser-firefox::before { content: "\f7d6"; }
.bi-browser-safari::before { content: "\f7d7"; }
.bi-c-circle-1::before { content: "\f7d8"; }
.bi-c-circle-fill-1::before { content: "\f7d9"; }
.bi-c-circle-fill::before { content: "\f7da"; }
.bi-c-circle::before { content: "\f7db"; }
.bi-c-square-fill::before { content: "\f7dc"; }
@ -1783,8 +1754,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-car-front::before { content: "\f7e1"; }
.bi-cassette-fill::before { content: "\f7e2"; }
.bi-cassette::before { content: "\f7e3"; }
.bi-cc-circle-1::before { content: "\f7e4"; }
.bi-cc-circle-fill-1::before { content: "\f7e5"; }
.bi-cc-circle-fill::before { content: "\f7e6"; }
.bi-cc-circle::before { content: "\f7e7"; }
.bi-cc-square-fill::before { content: "\f7e8"; }
@ -1803,8 +1772,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-filetype-sql::before { content: "\f7f5"; }
.bi-fire::before { content: "\f7f6"; }
.bi-google-play::before { content: "\f7f7"; }
.bi-h-circle-1::before { content: "\f7f8"; }
.bi-h-circle-fill-1::before { content: "\f7f9"; }
.bi-h-circle-fill::before { content: "\f7fa"; }
.bi-h-circle::before { content: "\f7fb"; }
.bi-h-square-fill::before { content: "\f7fc"; }
@ -1813,8 +1780,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-lungs-fill::before { content: "\f7ff"; }
.bi-lungs::before { content: "\f800"; }
.bi-microsoft-teams::before { content: "\f801"; }
.bi-p-circle-1::before { content: "\f802"; }
.bi-p-circle-fill-1::before { content: "\f803"; }
.bi-p-circle-fill::before { content: "\f804"; }
.bi-p-circle::before { content: "\f805"; }
.bi-p-square-fill::before { content: "\f806"; }
@ -1823,8 +1788,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-pass::before { content: "\f809"; }
.bi-prescription::before { content: "\f80a"; }
.bi-prescription2::before { content: "\f80b"; }
.bi-r-circle-1::before { content: "\f80c"; }
.bi-r-circle-fill-1::before { content: "\f80d"; }
.bi-r-circle-fill::before { content: "\f80e"; }
.bi-r-circle::before { content: "\f80f"; }
.bi-r-square-fill::before { content: "\f810"; }
@ -2016,3 +1979,100 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
.bi-sina-weibo::before { content: "\f8ca"; }
.bi-tencent-qq::before { content: "\f8cb"; }
.bi-wikipedia::before { content: "\f8cc"; }
.bi-alphabet-uppercase::before { content: "\f2a5"; }
.bi-alphabet::before { content: "\f68a"; }
.bi-amazon::before { content: "\f68d"; }
.bi-arrows-collapse-vertical::before { content: "\f690"; }
.bi-arrows-expand-vertical::before { content: "\f695"; }
.bi-arrows-vertical::before { content: "\f698"; }
.bi-arrows::before { content: "\f6a2"; }
.bi-ban-fill::before { content: "\f6a3"; }
.bi-ban::before { content: "\f6b6"; }
.bi-bing::before { content: "\f6c2"; }
.bi-cake::before { content: "\f6e0"; }
.bi-cake2::before { content: "\f6ed"; }
.bi-cookie::before { content: "\f6ee"; }
.bi-copy::before { content: "\f759"; }
.bi-crosshair::before { content: "\f769"; }
.bi-crosshair2::before { content: "\f794"; }
.bi-emoji-astonished-fill::before { content: "\f795"; }
.bi-emoji-astonished::before { content: "\f79a"; }
.bi-emoji-grimace-fill::before { content: "\f79b"; }
.bi-emoji-grimace::before { content: "\f7a0"; }
.bi-emoji-grin-fill::before { content: "\f7a1"; }
.bi-emoji-grin::before { content: "\f7a6"; }
.bi-emoji-surprise-fill::before { content: "\f7a7"; }
.bi-emoji-surprise::before { content: "\f7ac"; }
.bi-emoji-tear-fill::before { content: "\f7ad"; }
.bi-emoji-tear::before { content: "\f7b2"; }
.bi-envelope-arrow-down-fill::before { content: "\f7b3"; }
.bi-envelope-arrow-down::before { content: "\f7b8"; }
.bi-envelope-arrow-up-fill::before { content: "\f7b9"; }
.bi-envelope-arrow-up::before { content: "\f7be"; }
.bi-feather::before { content: "\f7bf"; }
.bi-feather2::before { content: "\f7c4"; }
.bi-floppy-fill::before { content: "\f7c5"; }
.bi-floppy::before { content: "\f7d8"; }
.bi-floppy2-fill::before { content: "\f7d9"; }
.bi-floppy2::before { content: "\f7e4"; }
.bi-gitlab::before { content: "\f7e5"; }
.bi-highlighter::before { content: "\f7f8"; }
.bi-marker-tip::before { content: "\f802"; }
.bi-nvme-fill::before { content: "\f803"; }
.bi-nvme::before { content: "\f80c"; }
.bi-opencollective::before { content: "\f80d"; }
.bi-pci-card-network::before { content: "\f8cd"; }
.bi-pci-card-sound::before { content: "\f8ce"; }
.bi-radar::before { content: "\f8cf"; }
.bi-send-arrow-down-fill::before { content: "\f8d0"; }
.bi-send-arrow-down::before { content: "\f8d1"; }
.bi-send-arrow-up-fill::before { content: "\f8d2"; }
.bi-send-arrow-up::before { content: "\f8d3"; }
.bi-sim-slash-fill::before { content: "\f8d4"; }
.bi-sim-slash::before { content: "\f8d5"; }
.bi-sourceforge::before { content: "\f8d6"; }
.bi-substack::before { content: "\f8d7"; }
.bi-threads-fill::before { content: "\f8d8"; }
.bi-threads::before { content: "\f8d9"; }
.bi-transparency::before { content: "\f8da"; }
.bi-twitter-x::before { content: "\f8db"; }
.bi-type-h4::before { content: "\f8dc"; }
.bi-type-h5::before { content: "\f8dd"; }
.bi-type-h6::before { content: "\f8de"; }
.bi-backpack-fill::before { content: "\f8df"; }
.bi-backpack::before { content: "\f8e0"; }
.bi-backpack2-fill::before { content: "\f8e1"; }
.bi-backpack2::before { content: "\f8e2"; }
.bi-backpack3-fill::before { content: "\f8e3"; }
.bi-backpack3::before { content: "\f8e4"; }
.bi-backpack4-fill::before { content: "\f8e5"; }
.bi-backpack4::before { content: "\f8e6"; }
.bi-brilliance::before { content: "\f8e7"; }
.bi-cake-fill::before { content: "\f8e8"; }
.bi-cake2-fill::before { content: "\f8e9"; }
.bi-duffle-fill::before { content: "\f8ea"; }
.bi-duffle::before { content: "\f8eb"; }
.bi-exposure::before { content: "\f8ec"; }
.bi-gender-neuter::before { content: "\f8ed"; }
.bi-highlights::before { content: "\f8ee"; }
.bi-luggage-fill::before { content: "\f8ef"; }
.bi-luggage::before { content: "\f8f0"; }
.bi-mailbox-flag::before { content: "\f8f1"; }
.bi-mailbox2-flag::before { content: "\f8f2"; }
.bi-noise-reduction::before { content: "\f8f3"; }
.bi-passport-fill::before { content: "\f8f4"; }
.bi-passport::before { content: "\f8f5"; }
.bi-person-arms-up::before { content: "\f8f6"; }
.bi-person-raised-hand::before { content: "\f8f7"; }
.bi-person-standing-dress::before { content: "\f8f8"; }
.bi-person-standing::before { content: "\f8f9"; }
.bi-person-walking::before { content: "\f8fa"; }
.bi-person-wheelchair::before { content: "\f8fb"; }
.bi-shadows::before { content: "\f8fc"; }
.bi-suitcase-fill::before { content: "\f8fd"; }
.bi-suitcase-lg-fill::before { content: "\f8fe"; }
.bi-suitcase-lg::before { content: "\f8ff"; }
.bi-suitcase::before { content: "\f900"; }
.bi-suitcase2-fill::before { content: "\f901"; }
.bi-suitcase2::before { content: "\f902"; }
.bi-vignette::before { content: "\f903"; }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -9,7 +9,7 @@ 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 > * "
".column-margin.column-container > *, .margin-caption, .aside"
);
let lastBottom = 0;
@ -18,25 +18,14 @@ const layoutMarginEls = () => {
// 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;
const marginChildStyle = window.getComputedStyle(marginChild);
const marginBottom = parseFloat(marginChildStyle["marginBottom"]);
const margin = lastBottom - top + marginBottom;
marginChild.style.marginTop = `${margin}px`;
}
const styles = window.getComputedStyle(marginChild);
const marginTop = parseFloat(styles["marginTop"]);
console.log({
top,
height: marginChild.getBoundingClientRect().height,
marginTop,
total: top + marginChild.getBoundingClientRect().height + marginTop,
});
lastBottom = top + marginChild.getBoundingClientRect().height + marginTop;
}
}
@ -46,7 +35,15 @@ 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)
throttle(() => {
layoutMarginEls();
if (
window.document.body.getBoundingClientRect().width < 990 &&
isReaderMode()
) {
quartoToggleReader();
}
}, 50)
);
resizeObserver.observe(window.document.body);
}

View file

@ -85,6 +85,17 @@ window.document.addEventListener("DOMContentLoaded", function () {
}
}
function dashboardOffset() {
const dashboardNavEl = window.document.getElementById(
"quarto-dashboard-header"
);
if (dashboardNavEl !== null) {
return dashboardNavEl.clientHeight;
} else {
return 0;
}
}
function updateDocumentOffsetWithoutAnimation() {
updateDocumentOffset(false);
}
@ -92,7 +103,7 @@ window.document.addEventListener("DOMContentLoaded", function () {
function updateDocumentOffset(animated) {
// set body offset
const topOffset = headerOffset();
const bodyOffset = topOffset + footerOffset();
const bodyOffset = topOffset + footerOffset() + dashboardOffset();
const bodyEl = window.document.body;
bodyEl.setAttribute("data-bs-offset", topOffset);
bodyEl.style.paddingTop = topOffset + "px";
@ -205,9 +216,9 @@ window.document.addEventListener("DOMContentLoaded", function () {
// Observe size changed for the header
const headerEl = window.document.querySelector("header.fixed-top");
if (headerEl && window.ResizeObserver) {
const observer = new window.ResizeObserver(
updateDocumentOffsetWithoutAnimation
);
const observer = new window.ResizeObserver(() => {
setTimeout(updateDocumentOffsetWithoutAnimation, 0);
});
observer.observe(headerEl, {
attributes: true,
childList: true,
@ -226,6 +237,7 @@ window.document.addEventListener("DOMContentLoaded", function () {
const links = window.document.querySelectorAll("a");
for (let i = 0; i < links.length; i++) {
if (links[i].href) {
links[i].dataset.originalHref = links[i].href;
links[i].href = links[i].href.replace(/\/index\.html/, "/");
}
}
@ -233,7 +245,7 @@ window.document.addEventListener("DOMContentLoaded", function () {
// Fixup any sharing links that require urls
// Append url to any sharing urls
const sharingLinks = window.document.querySelectorAll(
"a.sidebar-tools-main-item"
"a.sidebar-tools-main-item, a.quarto-navigation-tool, a.quarto-navbar-tools, a.quarto-navbar-tools-item"
);
for (let i = 0; i < sharingLinks.length; i++) {
const sharingLink = sharingLinks[i];

File diff suppressed because one or more lines are too long

View file

@ -43,7 +43,7 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
const mainEl = window.document.querySelector("main");
// highlight matches on the page
if (query !== null && mainEl) {
if (query && mainEl) {
// perform any highlighting
highlight(escapeRegExp(query), mainEl);
@ -57,7 +57,7 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
// (e.g. if the user edits the query or clears it)
let highlighting = true;
const resetHighlighting = (searchTerm) => {
if (mainEl && highlighting && query !== null && searchTerm !== query) {
if (mainEl && highlighting && query && searchTerm !== query) {
clearHighlight(query, mainEl);
highlighting = false;
}
@ -98,6 +98,7 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
classNames: {
form: "d-flex",
},
placeholder: language["search-text-placeholder"],
translations: {
clearButtonTitle: language["search-clear-button-title"],
detachedCancelButtonText: language["search-detached-cancel-button-title"],
@ -110,6 +111,8 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
return item.href;
},
onStateChange({ state }) {
// If this is a file URL, note that
// Perhaps reset highlighting
resetHighlighting(state.query);
@ -359,7 +362,8 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
state,
setActiveItemId,
setContext,
refresh
refresh,
quartoSearchOptions
);
},
},
@ -374,6 +378,32 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
focusSearchInput();
};
document.addEventListener("keyup", (event) => {
const { key } = event;
const kbds = quartoSearchOptions["keyboard-shortcut"];
const focusedEl = document.activeElement;
const isFormElFocused = [
"input",
"select",
"textarea",
"button",
"option",
].find((tag) => {
return focusedEl.tagName.toLowerCase() === tag;
});
if (
kbds &&
kbds.includes(key) &&
!isFormElFocused &&
!document.activeElement.isContentEditable
) {
event.preventDefault();
window.quartoOpenSearch();
}
});
// Remove the labeleledby attribute since it is pointing
// to a non-existent label
if (quartoSearchOptions.type === "overlay") {
@ -385,11 +415,30 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
}
}
function throttle(func, wait) {
let waiting = false;
return function () {
if (!waiting) {
func.apply(this, arguments);
waiting = true;
setTimeout(function () {
waiting = false;
}, wait);
}
};
}
// If the main document scrolls dismiss the search results
// (otherwise, since they're floating in the document they can scroll with the document)
window.document.body.onscroll = () => {
window.document.body.onscroll = throttle(() => {
// Only do this if we're not detached
// Bug #7117
// This will happen when the keyboard is shown on ios (resulting in a scroll)
// which then closed the search UI
if (!window.matchMedia(detachedMediaQuery).matches) {
setIsOpen(false);
};
}
}, 50);
if (showSearchResults) {
setIsOpen(true);
@ -429,15 +478,27 @@ function configurePlugins(quartoSearchOptions) {
const algoliaInsightsPlugin = createAlgoliaInsightsPlugin({
insightsClient: window.aa,
onItemsChange({ insights, insightsEvents }) {
const events = insightsEvents.map((event) => {
const maxEvents = event.objectIDs.slice(0, 20);
const events = insightsEvents.flatMap((event) => {
// This API limits the number of items per event to 20
const chunkSize = 20;
const itemChunks = [];
const eventItems = event.items;
for (let i = 0; i < eventItems.length; i += chunkSize) {
itemChunks.push(eventItems.slice(i, i + chunkSize));
}
// Split the items into multiple events that can be sent
const events = itemChunks.map((items) => {
return {
...event,
objectIDs: maxEvents,
items,
};
});
return events;
});
insights.viewedObjectIDs(...events);
for (const event of events) {
insights.viewedObjectIDs(event);
}
},
});
return algoliaInsightsPlugin;
@ -613,11 +674,10 @@ function showCopyLink(query, options) {
/* Search Index Handling */
// create the index
var fuseIndex = undefined;
async function readSearchData() {
// Initialize the search index on demand
if (fuseIndex === undefined) {
// create fuse index
const options = {
var shownWarning = false;
// fuse index options
const kFuseIndexOptions = {
keys: [
{ name: "title", weight: 20 },
{ name: "section", weight: 20 },
@ -625,8 +685,19 @@ async function readSearchData() {
],
ignoreLocation: true,
threshold: 0.1,
};
const fuse = new window.Fuse([], options);
};
async function readSearchData() {
// Initialize the search index on demand
if (fuseIndex === undefined) {
if (window.location.protocol === "file:" && !shownWarning) {
window.alert(
"Search requires JavaScript features disabled when running in file://... URLs. In order to use search, please run this document in a web server."
);
shownWarning = true;
return;
}
const fuse = new window.Fuse([], kFuseIndexOptions);
// fetch the main search.json
const response = await fetch(offsetURL("search.json"));
@ -646,6 +717,7 @@ async function readSearchData() {
);
}
}
return fuseIndex;
}
@ -674,7 +746,8 @@ function renderItem(
state,
setActiveItemId,
setContext,
refresh
refresh,
quartoSearchOptions
) {
switch (item.type) {
case kItemTypeDoc:
@ -684,7 +757,9 @@ function renderItem(
item.title,
item.section,
item.text,
item.href
item.href,
item.crumbs,
quartoSearchOptions
);
case kItemTypeMore:
return createMoreCard(
@ -709,15 +784,46 @@ function renderItem(
}
}
function createDocumentCard(createElement, icon, title, section, text, href) {
function createDocumentCard(
createElement,
icon,
title,
section,
text,
href,
crumbs,
quartoSearchOptions
) {
const iconEl = createElement("i", {
class: `bi bi-${icon} search-result-icon`,
});
const titleEl = createElement("p", { class: "search-result-title" }, title);
const titleContents = [iconEl, titleEl];
const showParent = quartoSearchOptions["show-item-context"];
if (crumbs && showParent) {
let crumbsOut = undefined;
const crumbClz = ["search-result-crumbs"];
if (showParent === "root") {
crumbsOut = crumbs.length > 1 ? crumbs[0] : undefined;
} else if (showParent === "parent") {
crumbsOut = crumbs.length > 1 ? crumbs[crumbs.length - 2] : undefined;
} else {
crumbsOut = crumbs.length > 1 ? crumbs.join(" > ") : undefined;
crumbClz.push("search-result-crumbs-wrap");
}
const crumbEl = createElement(
"p",
{ class: crumbClz.join(" ") },
crumbsOut
);
titleContents.push(crumbEl);
}
const titleContainerEl = createElement(
"div",
{ class: "search-result-title-container" },
[iconEl, titleEl]
titleContents
);
const textEls = [];
@ -1099,7 +1205,8 @@ function algoliaSearch(query, limit, algoliaOptions) {
const remappedHits = response.hits.map((hit) => {
return hit.map((item) => {
const newItem = { ...item };
["href", "section", "title", "text"].forEach((keyName) => {
["href", "section", "title", "text", "crumbs"].forEach(
(keyName) => {
const mappedName = indexFields[keyName];
if (
mappedName &&
@ -1109,7 +1216,8 @@ function algoliaSearch(query, limit, algoliaOptions) {
newItem[keyName] = item[mappedName];
delete newItem[mappedName];
}
});
}
);
newItem.text = highlightMatch(query, newItem.text);
return newItem;
});
@ -1120,8 +1228,34 @@ function algoliaSearch(query, limit, algoliaOptions) {
});
}
function fuseSearch(query, fuse, fuseOptions) {
return fuse.search(query, fuseOptions).map((result) => {
let subSearchTerm = undefined;
let subSearchFuse = undefined;
const kFuseMaxWait = 125;
async function fuseSearch(query, fuse, fuseOptions) {
let index = fuse;
// Fuse.js using the Bitap algorithm for text matching which runs in
// O(nm) time (no matter the structure of the text). In our case this
// means that long search terms mixed with large index gets very slow
//
// This injects a subIndex that will be used once the terms get long enough
// Usually making this subindex is cheap since there will typically be
// a subset of results matching the existing query
if (subSearchFuse !== undefined && query.startsWith(subSearchTerm)) {
// Use the existing subSearchFuse
index = subSearchFuse;
} else if (subSearchFuse !== undefined) {
// The term changed, discard the existing fuse
subSearchFuse = undefined;
subSearchTerm = undefined;
}
// Search using the active fuse
const then = performance.now();
const resultsRaw = await index.search(query, fuseOptions);
const now = performance.now();
const results = resultsRaw.map((result) => {
const addParam = (url, name, value) => {
const anchorParts = url.split("#");
const baseUrl = anchorParts[0];
@ -1135,6 +1269,18 @@ function fuseSearch(query, fuse, fuseOptions) {
section: result.item.section,
href: addParam(result.item.href, kQueryArg, query),
text: highlightMatch(query, result.item.text),
crumbs: result.item.crumbs,
};
});
// If we don't have a subfuse and the query is long enough, go ahead
// and create a subfuse to use for subsequent queries
if (now - then > kFuseMaxWait && subSearchFuse === undefined) {
subSearchTerm = query;
subSearchFuse = new window.Fuse([], kFuseIndexOptions);
resultsRaw.forEach((rr) => {
subSearchFuse.add(rr.item);
});
}
return results;
}

View file

@ -6,20 +6,9 @@ Fladmasning kræver ikke stor køkkensnilde. Det er en ret genial måde at stege
Til 6 personer
En stor hane eller kylling
1 ½ kg. Kartofler
3 hele hvidløg
1 citron
salt og peber
olivenolie
En stor hane eller kylling 1 ½ kg. Kartofler 3 hele hvidløg 1 citron salt og peber olivenolie
Læg hanen på et bræt med brystet nedad. Skær med en meget skarp og tung kniv langs rygbenet på begge sider og tag rygbenet væk - halsen følger med.
Vend hanen om og tryk den flad.
Skær kartoflerne i kvarter - gerne med skræl.
Fjern de yderste seje hinder fra hvidløgene og skær dem i kvarter.
Skræl den ene halvdel af citronen tyndt.
Læg hvidløg og citronskal i en bradepande og læg den fladmaste hane ovenpå med skindsiden opad Arranger kartoflerne udenom, drys med salt og peber, og dryp med olivenolie.
Hæld 3 dl. vand ved.
Læg hanen på et bræt med brystet nedad. Skær med en meget skarp og tung kniv langs rygbenet på begge sider og tag rygbenet væk - halsen følger med. Vend hanen om og tryk den flad. Skær kartoflerne i kvarter - gerne med skræl. Fjern de yderste seje hinder fra hvidløgene og skær dem i kvarter. Skræl den ene halvdel af citronen tyndt. Læg hvidløg og citronskal i en bradepande og læg den fladmaste hane ovenpå med skindsiden opad Arranger kartoflerne udenom, drys med salt og peber, og dryp med olivenolie. Hæld 3 dl. vand ved.
Bag ved 200° - til hanen er er mør og sprød - ca. 1 time.

View file

@ -1,12 +1,6 @@
## Formbrød
Rest surdej (150 g)
7 dl vand
2 håndfulde havregryn
25 g salt
10 g gær
1 håndfuld hørfrø
Mel
Rest surdej (150 g) 7 dl vand 2 håndfulde havregryn 25 g salt 10 g gær 1 håndfuld hørfrø Mel
Bagt 35 min ved 200gr.

View file

@ -1,18 +1,14 @@
Groft hvede-surdejsbrød_
_
_
_
_https://www.dr.dk/mad/opskrift/groft-hvede-surdejsbrod_
Groft hvede-surdejsbrød\_ \_ *https://www.dr.dk/mad/opskrift/groft-hvede-surdejsbrod*
**Ingredienser**
* 5 g gær (økologisk gær anbefales pga. bedre hæve-effekt)
* 6 dl koldt vand
* 1,5 dl hvedesurdej
* 150 g fuldkornshvedemel (f.eks. ølandshvede, spelt eller emmermel) (300)
* 750 g hvedemel (600)
* 20 g havsalt
* 2 spsk. olie
- 5 g gær (økologisk gær anbefales pga. bedre hæve-effekt)
- 6 dl koldt vand
- 1,5 dl hvedesurdej
- 150 g fuldkornshvedemel (f.eks. ølandshvede, spelt eller emmermel) (300)
- 750 g hvedemel (600)
- 20 g havsalt
- 2 spsk. olie
Særdeles velegnet til boller også. Deles i 16-20 stykker og bages 13-15 min ved 250gr
@ -25,11 +21,4 @@ Særdeles velegnet til boller også. Deles i 16-20 stykker og bages 13-15 min ve
5. Smør olie på indersiden af en skål og kom dejen i. 
6. Dæk med film og lad dejen koldhæve i køleskabet natten over. 
**Dag 2**
1. Vend dejen ud på et meldrysset bord og del den i to brød. Rør ikke for meget ved dejen, da luften derved vil blive presset ud af den. Lad brødene hæve på et stykke bagepapir i 30-40 minutter. 
2. Varm imens ovnen op til 250 grader ved varmluft med din tykkeste bageplade på den midterste hylde. Tag bagepladen ud, når ovnen er varm og træk bagepapiret, som brødene ligger på, over på den varme bageplade. 
3. Sæt pladen tilbage midt i ovnen og sprøjt grundigt med vand ind i ovnen med en forstøver, så der hurtigt opstår damp.
4. Luk lågen og bag brødene i ca. 35 minutter. Vend bagepladen 1-2 gange undervejs for at sikre en jævn afbagning. Skru evt. lidt ned for temperaturen de sidste 10 minutter, hvis brødene bliver for mørke. 
5. Tag brødene ud og lad dem afkøle på en rist i cirka 30 minutter, før du skærer i dem.
6.
**Dag 2** 1. Vend dejen ud på et meldrysset bord og del den i to brød. Rør ikke for meget ved dejen, da luften derved vil blive presset ud af den. Lad brødene hæve på et stykke bagepapir i 30-40 minutter.  2. Varm imens ovnen op til 250 grader ved varmluft med din tykkeste bageplade på den midterste hylde. Tag bagepladen ud, når ovnen er varm og træk bagepapiret, som brødene ligger på, over på den varme bageplade.  3. Sæt pladen tilbage midt i ovnen og sprøjt grundigt med vand ind i ovnen med en forstøver, så der hurtigt opstår damp. 4. Luk lågen og bag brødene i ca. 35 minutter. Vend bagepladen 1-2 gange undervejs for at sikre en jævn afbagning. Skru evt. lidt ned for temperaturen de sidste 10 minutter, hvis brødene bliver for mørke.  5. Tag brødene ud og lad dem afkøle på en rist i cirka 30 minutter, før du skærer i dem. 6.

View file

@ -0,0 +1,61 @@
---
title: Rugbrødsopskrift til træramme
lang: da
date: 2024-06-21
author: Andreas
formats:
- html: default
- docx: default
description: Vi har skiftet de gamle brødforme ud med trærammer. Rugbrødsopskriften er let revideret. Det er blevet en vane, så det virker!
categories:
- Bagværk
- Brød
---
Vi har købt tre trærammer fra aarhusianske Kunst og Køkkentøj (de forhandles fra Aurion og produceres på REVA i Herning, hvor [TV MV var forbi for nogle år siden](https://www.tvmidtvest.dk/fast-arbejde/fast-arbejde-fra-reva)) for at undgå metalforme med belægning. Rammerne kan lige stå ved siden af hinanden i ovnen, men har skullet have en helt flad plade at stå på. John-smed har hjulpet, tak for det!
Vores brød blev dog ved at hænge i formene, så vi har revideret opskriften primært ved at tilsætte mere mel for at opnå en lidt fastere dej.
Den oprindelige opskrift [finder du her](https://fam.gdamsbo.dk/food/rugbrød.html).
## Dag 1
Tag din surdej ud og fodr den. [Se her for gode råd.](https://fam.gdamsbo.dk/food/surdej.html)
## Dag 2
- 175 g surdej (ca. 1½ dl)
- 30 g salt
- 1 liter koldt vand
- 400 g skårne rugkerner
- 600 g rugmel
Røres sammen i en stor skål (5 L). Tildækkes og står ved stuetemperatur i 12-24 timer.
- 300 g skårne rugkerner
- 50-100 g surdej (passer for det meste med resten)
- Evt. ca 100 g mandler, hasselnødder, boghvede, amarant, chia, quinoa eller lignende.
Sættes i blød med rigeligt vand 12-36 timer.
## Dag 3
Dejen fra Dag 2 samt drænede, udblødte rugkerner (og nødder/frø) blandes.
Desuden tilsættes følgende:
- 4 dl frø (fx sesam, solsikke- og græskarkerner i forholdet 1:2:1)
- 1 spsk honning (kan røres ud i øl)
- 1 øl (33 cl, gerne hvidtøl eller anden mørk øl, men det kommer sig ikke så nøje)
- Ca 9 dl rugmel til rette konsistens.
- Evt. 2 spsk mørk maltsirup (Giver mere smag og farve)
Det hele røres godt sammen. Det skal have en tyk, sej klistret konsistens og fordeles i 3 smør-smurte trærammer der rummer 2 liter. Glat dejen.
Lad nu brødene hæve under et fugtigt viskestykke indtil dejen når lidt op over kanten (1-4 timer). Inden de bages, brug da en våd strikkepind eller lignende til at prikke huller i brødene (ca. 30 i hver), så større luftlommer punkteres.
Bages med konventionel varme ved 180°C i 1 time og 45 minutter.
Efter bagning fjernes rammerne og brødene skal køle noget af inden de lægges i plasticposer.
Vi plejer at kunne spise de tre brød i løbet af en uges tid. De holder sig længere i køleskabet, men bliver noget tørre og hårde. Egner sig også til at fryse ned, men vent to døgn. Så smuldrer brødet ikke så meget når det skæres efter optøning.