overhaul. blog taken down. links to Ebba
This commit is contained in:
parent
1b1f403f8d
commit
9a062fd815
37 changed files with 5435 additions and 1001 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -55,3 +55,7 @@ rsconnect/
|
||||||
food/refs/
|
food/refs/
|
||||||
|
|
||||||
osrm-backend/
|
osrm-backend/
|
||||||
|
|
||||||
|
data-raw/
|
||||||
|
|
||||||
|
R/
|
||||||
|
|
|
@ -16,8 +16,10 @@ website:
|
||||||
text: Start
|
text: Start
|
||||||
- href: food.qmd
|
- href: food.qmd
|
||||||
text: Opskrifter
|
text: Opskrifter
|
||||||
- href: blog.qmd
|
- href: https://ebba.gdamsbo.dk/
|
||||||
text: Blog
|
text: Ebbas side
|
||||||
|
# - href: blog.qmd
|
||||||
|
# text: Blog
|
||||||
right:
|
right:
|
||||||
- href: https://github.com/agdamsbo/familien.gdamsbo
|
- href: https://github.com/agdamsbo/familien.gdamsbo
|
||||||
text: Kildekode
|
text: Kildekode
|
||||||
|
|
|
@ -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
|
|
||||||
```
|
|
|
@ -2,12 +2,12 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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>
|
<style>
|
||||||
code{white-space: pre-wrap;}
|
code{white-space: pre-wrap;}
|
||||||
span.smallcaps{font-variant: small-caps;}
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
@ -49,7 +49,13 @@ ul.task-list li input[type="checkbox"] {
|
||||||
"collapse-after": 3,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "No results",
|
"search-no-results-text": "No results",
|
||||||
"search-matching-documents-text": "matching documents",
|
"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-match-text": "more match in this document",
|
||||||
"search-more-matches-text": "more matches in this document",
|
"search-more-matches-text": "more matches in this document",
|
||||||
"search-clear-button-title": "Clear",
|
"search-clear-button-title": "Clear",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Cancel",
|
"search-detached-cancel-button-title": "Cancel",
|
||||||
"search-submit-button-title": "Submit",
|
"search-submit-button-title": "Submit",
|
||||||
"search-label": "Search"
|
"search-label": "Search"
|
||||||
|
@ -73,9 +80,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="./index.html">
|
<a class="navbar-brand" href="./index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -87,28 +94,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="./index.html" rel="" target="">
|
<a class="nav-link" href="./index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="./food.html" rel="" target="">
|
<a class="nav-link" href="./food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="./blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -124,6 +131,7 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<p>Attribution 4.0 International</p>
|
<p>Attribution 4.0 International</p>
|
||||||
<p>=======================================================================</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>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -382,13 +417,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -467,10 +504,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -480,8 +539,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -537,6 +728,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -562,6 +754,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -641,7 +845,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -650,4 +856,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
301
docs/blog.html
301
docs/blog.html
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"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://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 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">
|
<link rel="stylesheet" href="styles.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
@ -106,9 +140,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="./index.html">
|
<a class="navbar-brand" href="./index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -120,28 +154,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="./index.html" rel="" target="">
|
<a class="nav-link" href="./index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="./food.html" rel="" target="">
|
<a class="nav-link" href="./food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" href="./blog.html" rel="" target="" aria-current="page">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -170,8 +204,10 @@ ul.task-list li input[type="checkbox"] {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<div class="topbr">
|
<div class="topbr">
|
||||||
<p>Her handler det om alle mulige familieprojekter. Det kommer nok til at lugte lidt af kode og IT også.</p>
|
<p>Her handler det om alle mulige familieprojekter. Det kommer nok til at lugte lidt af kode og IT også.</p>
|
||||||
</div>
|
</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="quarto-listing quarto-listing-container-grid" id="listing-listing">
|
||||||
<div class="list grid quarto-listing-cols-3">
|
<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">
|
<a href="./blog/4_vancouver_og_camper.html" class="quarto-grid-link">
|
||||||
<div class="quarto-grid-item card h-100 card-left">
|
<div class="quarto-grid-item card h-100 card-left">
|
||||||
<div class="listing-item-img-placeholder card-img-top" style="height: 150px;"> </div>
|
<div class="listing-item-img-placeholder card-img-top" style="height: 150px;"> </div>
|
||||||
|
@ -221,7 +257,7 @@ Andreas
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</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">
|
<a href="./blog/3_checked_in.html" class="quarto-grid-link">
|
||||||
<div class="quarto-grid-item card h-100 card-left">
|
<div class="quarto-grid-item card h-100 card-left">
|
||||||
<div class="listing-item-img-placeholder card-img-top" style="height: 150px;"> </div>
|
<div class="listing-item-img-placeholder card-img-top" style="height: 150px;"> </div>
|
||||||
|
@ -255,7 +291,7 @@ Andreas
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</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">
|
<a href="./blog/2_snart_klar.html" class="quarto-grid-link">
|
||||||
<div class="quarto-grid-item card h-100 card-left">
|
<div class="quarto-grid-item card h-100 card-left">
|
||||||
<p class="card-img-top">
|
<p class="card-img-top">
|
||||||
|
@ -291,7 +327,7 @@ Andreas
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</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">
|
<a href="./blog/1_canada_camper.html" class="quarto-grid-link">
|
||||||
<div class="quarto-grid-item card h-100 card-left">
|
<div class="quarto-grid-item card h-100 card-left">
|
||||||
<p class="card-img-top">
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -444,13 +507,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -529,10 +594,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -542,8 +629,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -599,6 +818,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -624,6 +844,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -703,7 +935,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -712,4 +946,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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 */
|
/* CSS for syntax highlighting */
|
||||||
pre > code.sourceCode { white-space: pre; position: relative; }
|
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; }
|
pre > code.sourceCode > span:empty { height: 1.2em; }
|
||||||
.sourceCode { overflow: visible; }
|
.sourceCode { overflow: visible; }
|
||||||
code.sourceCode > span { color: inherit; text-decoration: inherit; }
|
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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"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>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -134,28 +141,28 @@ pre > code.sourceCode > span > a:first-child::before { text-decoration: underlin
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -217,12 +224,14 @@ pre > code.sourceCode > span > a:first-child::before { text-decoration: underlin
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<section id="kode" class="level1">
|
<section id="kode" class="level1">
|
||||||
<h1>Kode</h1>
|
<h1>Kode</h1>
|
||||||
<div class="cell">
|
<div class="cell">
|
||||||
<details>
|
<details class="code-fold">
|
||||||
<summary>Kode til oversigtskort</summary>
|
<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>
|
<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 <- gpx::read_gpx(file = "data/favorites_canada_2023.gpx")</span></span>
|
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="co"># bookmarks <- 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>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>
|
<p>Vores rute er tegnet in på kortet herunder.</p>
|
||||||
<div class="cell">
|
<div class="cell">
|
||||||
<details>
|
<details class="code-fold">
|
||||||
<summary>Print kort</summary>
|
<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>
|
<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>
|
</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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -443,13 +479,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -528,10 +566,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -541,8 +601,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -598,6 +790,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -623,6 +816,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -702,7 +907,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -711,4 +918,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"search-label": "Søg"
|
||||||
|
@ -75,9 +82,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -89,28 +96,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -167,18 +174,24 @@ ul.task-list li input[type="checkbox"] {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<section id="snart-klar-til-afgang" class="level2">
|
<section id="snart-klar-til-afgang" class="level2">
|
||||||
<h2 class="anchored" data-anchor-id="snart-klar-til-afgang">Snart klar til afgang</h2>
|
<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>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>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>
|
<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">
|
<div id="fig-billeder" class="quarto-figure quarto-figure-center quarto-float anchored">
|
||||||
<figure class="figure">
|
<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 width="560" height="315" src="https://share.gdamsbo.dk/s/DwWjQfPjdzfRjf9">
|
||||||
</iframe>
|
</iframe>
|
||||||
<figcaption class="figure-caption">Figur 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 1: Sidste forberedelser
|
||||||
|
</figcaption>
|
||||||
</figure>
|
</figure>
|
||||||
</div>
|
</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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -295,13 +335,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -380,10 +422,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -393,8 +457,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -450,6 +646,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -475,6 +672,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -554,7 +763,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -563,4 +774,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"search-label": "Søg"
|
||||||
|
@ -75,9 +82,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -89,28 +96,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -167,8 +174,10 @@ ul.task-list li input[type="checkbox"] {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<section id="først-med-tog-og-så-med-fly" class="level2">
|
<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>
|
<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>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -288,13 +324,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -373,10 +411,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -386,8 +446,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -443,6 +635,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -468,6 +661,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -547,7 +752,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -556,4 +763,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"search-label": "Søg"
|
||||||
|
@ -75,9 +82,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -89,28 +96,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -173,8 +180,10 @@ ul.task-list li input[type="checkbox"] {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<section id="en-rettelse" class="level2">
|
<section id="en-rettelse" class="level2">
|
||||||
<h2 class="anchored" data-anchor-id="en-rettelse">En rettelse</h2>
|
<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>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -310,13 +346,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -395,10 +433,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -408,8 +468,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -465,6 +657,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -490,6 +683,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -569,7 +774,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -578,4 +785,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
419
docs/food.html
419
docs/food.html
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"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://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 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">
|
<link rel="stylesheet" href="styles.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
@ -106,9 +140,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="./index.html">
|
<a class="navbar-brand" href="./index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -120,28 +154,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="./index.html" rel="" target="">
|
<a class="nav-link" href="./index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" href="./food.html" rel="" target="" aria-current="page">
|
<a class="nav-link active" href="./food.html" aria-current="page">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="./blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -151,7 +185,7 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<!-- margin-sidebar -->
|
<!-- margin-sidebar -->
|
||||||
<div id="quarto-margin-sidebar" class="sidebar 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 -->
|
||||||
<main class="content" id="quarto-document-content">
|
<main class="content" id="quarto-document-content">
|
||||||
|
|
||||||
|
@ -170,8 +204,10 @@ ul.task-list li input[type="checkbox"] {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<div class="topbr">
|
<div class="topbr">
|
||||||
<p>Vi er glade for at lave mad, og vi øver os i at have børnene med.</p>
|
<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>
|
<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="quarto-listing quarto-listing-container-default" id="listing-listing">
|
||||||
<div class="list quarto-listing-default">
|
<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">
|
<div class="thumbnail">
|
||||||
<p><a href="./food/hyldesaft.html"> <div class="listing-item-img-placeholder card-img-top" > </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" > </div>
|
||||||
|
</a><p><a href="./food/rugbrød-i-træramme.html" class="no-external"></a></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<a href="./food/hyldesaft.html">
|
|
||||||
<h3 class="no-anchor listing-title">
|
<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>
|
</h3>
|
||||||
<div class="listing-subtitle">
|
<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>
|
</div>
|
||||||
</a>
|
</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" > </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-categories">
|
||||||
<div class="listing-category" onclick="window.quartoListingCategory('Sødt'); return false;">
|
<div class="listing-category" onclick="window.quartoListingCategory('Sødt'); return false;">
|
||||||
Sødt
|
Sødt
|
||||||
|
@ -204,14 +276,12 @@ Sødt
|
||||||
Børnene med!
|
Børnene med!
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a href="./food/hyldesaft.html">
|
|
||||||
<div class="listing-description">
|
<div class="listing-description">
|
||||||
<p>En klassiker i juni.</p>
|
<a href="./food/hyldesaft.html" class="no-external">En klassiker i juni.</a>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="metadata">
|
<div class="metadata">
|
||||||
<a href="./food/hyldesaft.html">
|
<a href="./food/hyldesaft.html" class="no-external">
|
||||||
<div class="listing-date">
|
<div class="listing-date">
|
||||||
28. jun. 2023
|
28. jun. 2023
|
||||||
</div>
|
</div>
|
||||||
|
@ -221,19 +291,19 @@ Andreas
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</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">
|
<div class="thumbnail">
|
||||||
<p><a href="./food/banankage.html"> <div class="listing-item-img-placeholder card-img-top" > </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" > </div>
|
||||||
|
</a><p><a href="./food/banankage.html" class="no-external"></a></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<a href="./food/banankage.html">
|
|
||||||
<h3 class="no-anchor listing-title">
|
<h3 class="no-anchor listing-title">
|
||||||
Super nem banankage
|
<a href="./food/banankage.html" class="no-external">Super nem banankage</a>
|
||||||
</h3>
|
</h3>
|
||||||
<div class="listing-subtitle">
|
<div class="listing-subtitle">
|
||||||
|
<a href="./food/banankage.html" class="no-external"></a>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
|
||||||
<div class="listing-categories">
|
<div class="listing-categories">
|
||||||
<div class="listing-category" onclick="window.quartoListingCategory('Kage'); return false;">
|
<div class="listing-category" onclick="window.quartoListingCategory('Kage'); return false;">
|
||||||
Kage
|
Kage
|
||||||
|
@ -248,33 +318,31 @@ Børnene med!
|
||||||
Dansk
|
Dansk
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a href="./food/banankage.html">
|
|
||||||
<div class="listing-description">
|
<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>
|
</div>
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="metadata">
|
<div class="metadata">
|
||||||
<a href="./food/banankage.html">
|
<a href="./food/banankage.html" class="no-external">
|
||||||
<div class="listing-date">
|
<div class="listing-date">
|
||||||
28. apr. 2023
|
28. apr. 2023
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</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">
|
<div class="thumbnail">
|
||||||
<p><a href="./food/elses_vafler.html"> <div class="listing-item-img-placeholder card-img-top" > </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" > </div>
|
||||||
|
</a><p><a href="./food/elses_vafler.html" class="no-external"></a></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<a href="./food/elses_vafler.html">
|
|
||||||
<h3 class="no-anchor listing-title">
|
<h3 class="no-anchor listing-title">
|
||||||
Elses vafler
|
<a href="./food/elses_vafler.html" class="no-external">Elses vafler</a>
|
||||||
</h3>
|
</h3>
|
||||||
<div class="listing-subtitle">
|
<div class="listing-subtitle">
|
||||||
|
<a href="./food/elses_vafler.html" class="no-external"></a>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
|
||||||
<div class="listing-categories">
|
<div class="listing-categories">
|
||||||
<div class="listing-category" onclick="window.quartoListingCategory('Kage'); return false;">
|
<div class="listing-category" onclick="window.quartoListingCategory('Kage'); return false;">
|
||||||
Kage
|
Kage
|
||||||
|
@ -286,14 +354,12 @@ Forår
|
||||||
Børnene med!
|
Børnene med!
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a href="./food/elses_vafler.html">
|
|
||||||
<div class="listing-description">
|
<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>
|
</div>
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="metadata">
|
<div class="metadata">
|
||||||
<a href="./food/elses_vafler.html">
|
<a href="./food/elses_vafler.html" class="no-external">
|
||||||
<div class="listing-date">
|
<div class="listing-date">
|
||||||
5. mar. 2023
|
5. mar. 2023
|
||||||
</div>
|
</div>
|
||||||
|
@ -303,19 +369,19 @@ Andreas
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</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">
|
<div class="thumbnail">
|
||||||
<p><a href="./food/rugbrød.html"> <div class="listing-item-img-placeholder card-img-top" > </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" > </div>
|
||||||
|
</a><p><a href="./food/rugbrød.html" class="no-external"></a></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<a href="./food/rugbrød.html">
|
|
||||||
<h3 class="no-anchor listing-title">
|
<h3 class="no-anchor listing-title">
|
||||||
Rugbrød
|
<a href="./food/rugbrød.html" class="no-external">Rugbrød</a>
|
||||||
</h3>
|
</h3>
|
||||||
<div class="listing-subtitle">
|
<div class="listing-subtitle">
|
||||||
|
<a href="./food/rugbrød.html" class="no-external"></a>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
|
||||||
<div class="listing-categories">
|
<div class="listing-categories">
|
||||||
<div class="listing-category" onclick="window.quartoListingCategory('Bagværk'); return false;">
|
<div class="listing-category" onclick="window.quartoListingCategory('Bagværk'); return false;">
|
||||||
Bagværk
|
Bagværk
|
||||||
|
@ -324,33 +390,31 @@ Bagværk
|
||||||
Brød
|
Brød
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a href="./food/rugbrød.html">
|
|
||||||
<div class="listing-description">
|
<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>
|
</div>
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="metadata">
|
<div class="metadata">
|
||||||
<a href="./food/rugbrød.html">
|
<a href="./food/rugbrød.html" class="no-external">
|
||||||
<div class="listing-date">
|
<div class="listing-date">
|
||||||
22. sep. 2022
|
22. sep. 2022
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</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">
|
<div class="thumbnail">
|
||||||
<p><a href="./food/surdej.html"> <div class="listing-item-img-placeholder card-img-top" > </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" > </div>
|
||||||
|
</a><p><a href="./food/surdej.html" class="no-external"></a></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<a href="./food/surdej.html">
|
|
||||||
<h3 class="no-anchor listing-title">
|
<h3 class="no-anchor listing-title">
|
||||||
Surdej
|
<a href="./food/surdej.html" class="no-external">Surdej</a>
|
||||||
</h3>
|
</h3>
|
||||||
<div class="listing-subtitle">
|
<div class="listing-subtitle">
|
||||||
|
<a href="./food/surdej.html" class="no-external"></a>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
|
||||||
<div class="listing-categories">
|
<div class="listing-categories">
|
||||||
<div class="listing-category" onclick="window.quartoListingCategory('Bagværk'); return false;">
|
<div class="listing-category" onclick="window.quartoListingCategory('Bagværk'); return false;">
|
||||||
Bagværk
|
Bagværk
|
||||||
|
@ -359,14 +423,12 @@ Bagværk
|
||||||
Brød
|
Brød
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a href="./food/surdej.html">
|
|
||||||
<div class="listing-description">
|
<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>
|
</div>
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="metadata">
|
<div class="metadata">
|
||||||
<a href="./food/surdej.html">
|
<a href="./food/surdej.html" class="no-external">
|
||||||
<div class="listing-date">
|
<div class="listing-date">
|
||||||
22. sep. 2022
|
22. sep. 2022
|
||||||
</div>
|
</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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -487,13 +576,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -572,10 +663,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -585,8 +698,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -642,6 +887,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -667,6 +913,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -746,7 +1004,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -755,4 +1015,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"search-label": "Søg"
|
||||||
|
@ -74,9 +81,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -88,28 +95,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -163,8 +170,10 @@ ul.task-list li input[type="checkbox"] {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<section id="noter" class="level2">
|
<section id="noter" class="level2">
|
||||||
<h2 class="anchored" data-anchor-id="noter">Noter</h2>
|
<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>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -305,13 +341,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -390,10 +428,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -403,8 +463,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -460,6 +652,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -485,6 +678,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -564,7 +769,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -573,4 +780,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"search-label": "Søg"
|
||||||
|
@ -75,9 +82,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -89,28 +96,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -170,8 +177,10 @@ ul.task-list li input[type="checkbox"] {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<section id="noter" class="level2">
|
<section id="noter" class="level2">
|
||||||
<h2 class="anchored" data-anchor-id="noter">Noter</h2>
|
<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>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -315,13 +351,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -400,10 +438,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -413,8 +473,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -470,6 +662,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -495,6 +688,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -574,7 +779,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -583,4 +790,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,12 +2,12 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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>
|
<style>
|
||||||
code{white-space: pre-wrap;}
|
code{white-space: pre-wrap;}
|
||||||
span.smallcaps{font-variant: small-caps;}
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
@ -49,7 +49,13 @@ ul.task-list li input[type="checkbox"] {
|
||||||
"collapse-after": 3,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "No results",
|
"search-no-results-text": "No results",
|
||||||
"search-matching-documents-text": "matching documents",
|
"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-match-text": "more match in this document",
|
||||||
"search-more-matches-text": "more matches in this document",
|
"search-more-matches-text": "more matches in this document",
|
||||||
"search-clear-button-title": "Clear",
|
"search-clear-button-title": "Clear",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Cancel",
|
"search-detached-cancel-button-title": "Cancel",
|
||||||
"search-submit-button-title": "Submit",
|
"search-submit-button-title": "Submit",
|
||||||
"search-label": "Search"
|
"search-label": "Search"
|
||||||
|
@ -73,9 +80,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -87,28 +94,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -124,10 +131,11 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="quarto-figure quarto-figure-center">
|
<div class="quarto-figure quarto-figure-center">
|
||||||
<figure class="figure">
|
<figure class="figure">
|
||||||
<p><img src="images/fladmast hane med nye hvidlog.png" class="img-fluid figure-img"></p>
|
<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>
|
</figure>
|
||||||
</div>
|
</div>
|
||||||
<p>Fladmast hane med nye hvidlog</p>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -252,13 +287,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -337,10 +374,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -350,8 +409,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -407,6 +598,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -432,6 +624,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -511,7 +715,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -520,4 +726,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,12 +2,12 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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>
|
<style>
|
||||||
code{white-space: pre-wrap;}
|
code{white-space: pre-wrap;}
|
||||||
span.smallcaps{font-variant: small-caps;}
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
@ -49,7 +49,13 @@ ul.task-list li input[type="checkbox"] {
|
||||||
"collapse-after": 3,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "No results",
|
"search-no-results-text": "No results",
|
||||||
"search-matching-documents-text": "matching documents",
|
"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-match-text": "more match in this document",
|
||||||
"search-more-matches-text": "more matches in this document",
|
"search-more-matches-text": "more matches in this document",
|
||||||
"search-clear-button-title": "Clear",
|
"search-clear-button-title": "Clear",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Cancel",
|
"search-detached-cancel-button-title": "Cancel",
|
||||||
"search-submit-button-title": "Submit",
|
"search-submit-button-title": "Submit",
|
||||||
"search-label": "Search"
|
"search-label": "Search"
|
||||||
|
@ -73,9 +80,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -87,28 +94,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -130,6 +137,7 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<section id="formbrød" class="level2">
|
<section id="formbrød" class="level2">
|
||||||
<h2 class="anchored" data-anchor-id="formbrød">Formbrød</h2>
|
<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>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -249,13 +284,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -334,10 +371,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -347,8 +406,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -404,6 +595,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -429,6 +621,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -508,7 +712,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -517,4 +723,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,12 +2,12 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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>
|
<style>
|
||||||
code{white-space: pre-wrap;}
|
code{white-space: pre-wrap;}
|
||||||
span.smallcaps{font-variant: small-caps;}
|
span.smallcaps{font-variant: small-caps;}
|
||||||
|
@ -49,7 +49,13 @@ ul.task-list li input[type="checkbox"] {
|
||||||
"collapse-after": 3,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "No results",
|
"search-no-results-text": "No results",
|
||||||
"search-matching-documents-text": "matching documents",
|
"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-match-text": "more match in this document",
|
||||||
"search-more-matches-text": "more matches in this document",
|
"search-more-matches-text": "more matches in this document",
|
||||||
"search-clear-button-title": "Clear",
|
"search-clear-button-title": "Clear",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Cancel",
|
"search-detached-cancel-button-title": "Cancel",
|
||||||
"search-submit-button-title": "Submit",
|
"search-submit-button-title": "Submit",
|
||||||
"search-label": "Search"
|
"search-label": "Search"
|
||||||
|
@ -73,9 +80,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -87,28 +94,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</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>
|
<p><strong>Ingredienser</strong></p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>5 g gær (økologisk gær anbefales pga. bedre hæve-effekt)</li>
|
<li>5 g 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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -259,13 +294,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -344,10 +381,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -357,8 +416,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -414,6 +605,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -439,6 +631,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -518,7 +722,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -527,4 +733,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"search-label": "Søg"
|
||||||
|
@ -75,9 +82,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -89,28 +96,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -167,8 +174,10 @@ ul.task-list li input[type="checkbox"] {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<section id="hyldeblomstsaft" class="level2">
|
<section id="hyldeblomstsaft" class="level2">
|
||||||
<h2 class="anchored" data-anchor-id="hyldeblomstsaft">Hyldeblomstsaft</h2>
|
<h2 class="anchored" data-anchor-id="hyldeblomstsaft">Hyldeblomstsaft</h2>
|
||||||
<ul>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -298,13 +334,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -383,10 +421,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -396,8 +456,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -453,6 +645,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -478,6 +671,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -557,7 +762,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -566,4 +773,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
803
docs/food/rugbrød-i-træramme.html
Normal file
803
docs/food/rugbrød-i-træramme.html
Normal 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">
|
||||||
|
|
||||||
|
</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">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body></html>
|
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"search-label": "Søg"
|
||||||
|
@ -74,9 +81,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -88,28 +95,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -161,8 +168,10 @@ ul.task-list li input[type="checkbox"] {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</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>
|
<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">
|
<section id="dag-1" class="level2">
|
||||||
<h2 class="anchored" data-anchor-id="dag-1">Dag 1</h2>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -312,13 +348,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -397,10 +435,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -410,8 +470,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -467,6 +659,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -492,6 +685,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -571,7 +776,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -580,4 +787,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"search-label": "Søg"
|
||||||
|
@ -74,9 +81,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="../index.html">
|
<a class="navbar-brand" href="../index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -88,28 +95,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../index.html" rel="" target="">
|
<a class="nav-link" href="../index.html">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../food.html" rel="" target="">
|
<a class="nav-link" href="../food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="../blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -153,8 +160,10 @@ ul.task-list li input[type="checkbox"] {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<p>Vi bager hverdagsbrød, så her kommer mine gode råd til en hverdagssurdej.</p>
|
<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>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>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -273,13 +309,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -358,10 +396,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -371,8 +431,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -428,6 +620,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -453,6 +646,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -532,7 +737,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -541,4 +748,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
266
docs/index.html
266
docs/index.html
|
@ -2,7 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="da" xml:lang="da"><head>
|
||||||
|
|
||||||
<meta charset="utf-8">
|
<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">
|
<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,
|
"collapse-after": 3,
|
||||||
"panel-placement": "end",
|
"panel-placement": "end",
|
||||||
"type": "overlay",
|
"type": "overlay",
|
||||||
"limit": 20,
|
"limit": 50,
|
||||||
|
"keyboard-shortcut": [
|
||||||
|
"f",
|
||||||
|
"/",
|
||||||
|
"s"
|
||||||
|
],
|
||||||
|
"show-item-context": false,
|
||||||
"language": {
|
"language": {
|
||||||
"search-no-results-text": "Ingen resultater",
|
"search-no-results-text": "Ingen resultater",
|
||||||
"search-matching-documents-text": "Matchende dokumenter",
|
"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-match-text": "andet resultat i dette dokument",
|
||||||
"search-more-matches-text": "andre resultater i dette dokument",
|
"search-more-matches-text": "andre resultater i dette dokument",
|
||||||
"search-clear-button-title": "Ryd",
|
"search-clear-button-title": "Ryd",
|
||||||
|
"search-text-placeholder": "",
|
||||||
"search-detached-cancel-button-title": "Fortryd",
|
"search-detached-cancel-button-title": "Fortryd",
|
||||||
"search-submit-button-title": "Indsend",
|
"search-submit-button-title": "Indsend",
|
||||||
"search-label": "Søg"
|
"search-label": "Søg"
|
||||||
|
@ -72,9 +79,9 @@ ul.task-list li input[type="checkbox"] {
|
||||||
|
|
||||||
<div id="quarto-search-results"></div>
|
<div id="quarto-search-results"></div>
|
||||||
<header id="quarto-header" class="headroom fixed-top">
|
<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-container container-fluid">
|
||||||
<div class="navbar-brand-container">
|
<div class="navbar-brand-container mx-auto">
|
||||||
<a class="navbar-brand" href="./index.html">
|
<a class="navbar-brand" href="./index.html">
|
||||||
<span class="navbar-title">Familien G Damsbo</span>
|
<span class="navbar-title">Familien G Damsbo</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -86,28 +93,28 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||||
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
<ul class="navbar-nav navbar-nav-scroll me-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" href="./index.html" rel="" target="" aria-current="page">
|
<a class="nav-link active" href="./index.html" aria-current="page">
|
||||||
<span class="menu-text">Start</span></a>
|
<span class="menu-text">Start</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="./food.html" rel="" target="">
|
<a class="nav-link" href="./food.html">
|
||||||
<span class="menu-text">Opskrifter</span></a>
|
<span class="menu-text">Opskrifter</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="./blog.html" rel="" target="">
|
<a class="nav-link" href="https://ebba.gdamsbo.dk/">
|
||||||
<span class="menu-text">Blog</span></a>
|
<span class="menu-text">Ebbas side</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
<ul class="navbar-nav navbar-nav-scroll ms-auto">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo" rel="" target="">
|
<a class="nav-link" href="https://github.com/agdamsbo/familien.gdamsbo">
|
||||||
<span class="menu-text">Kildekode</span></a>
|
<span class="menu-text">Kildekode</span></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div> <!-- /navcollapse -->
|
||||||
<div class="quarto-navbar-tools">
|
<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>
|
<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>
|
||||||
</div> <!-- /navcollapse -->
|
|
||||||
</div> <!-- /container-fluid -->
|
</div> <!-- /container-fluid -->
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
@ -117,7 +124,7 @@ ul.task-list li input[type="checkbox"] {
|
||||||
<!-- margin-sidebar -->
|
<!-- margin-sidebar -->
|
||||||
|
|
||||||
<!-- main -->
|
<!-- main -->
|
||||||
<div class="quarto-about-jolla">
|
<div class="quarto-about-jolla content">
|
||||||
<header id="title-block-header" class="quarto-title-block default">
|
<header id="title-block-header" class="quarto-title-block default">
|
||||||
<div class="quarto-title">
|
<div class="quarto-title">
|
||||||
<h1 class="title">Familien G Damsbo</h1>
|
<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) => {
|
const toggleColorMode = (alternate) => {
|
||||||
// Switch the stylesheets
|
// Switch the stylesheets
|
||||||
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
|
||||||
|
@ -242,13 +276,15 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
return localAlternateSentinel;
|
return localAlternateSentinel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localAlternateSentinel = 'alternate';
|
const darkModeDefault = true;
|
||||||
|
let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
|
||||||
// Dark / light mode switch
|
// Dark / light mode switch
|
||||||
window.quartoToggleColorScheme = () => {
|
window.quartoToggleColorScheme = () => {
|
||||||
// Read the current dark / light value
|
// Read the current dark / light value
|
||||||
let toAlternate = !hasAlternateSentinel();
|
let toAlternate = !hasAlternateSentinel();
|
||||||
toggleColorMode(toAlternate);
|
toggleColorMode(toAlternate);
|
||||||
setStyleSentinel(toAlternate);
|
setStyleSentinel(toAlternate);
|
||||||
|
toggleGiscusIfUsed(toAlternate, darkModeDefault);
|
||||||
};
|
};
|
||||||
// Ensure there is a toggle, if there isn't float one in the top right
|
// Ensure there is a toggle, if there isn't float one in the top right
|
||||||
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
|
||||||
|
@ -320,10 +356,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
// clear code selection
|
// clear code selection
|
||||||
e.clearSelection();
|
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 = {
|
const config = {
|
||||||
allowHTML: true,
|
allowHTML: true,
|
||||||
content: contentFn,
|
|
||||||
maxWidth: 500,
|
maxWidth: 500,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
arrow: false,
|
arrow: false,
|
||||||
|
@ -333,8 +391,17 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
interactive: true,
|
interactive: true,
|
||||||
interactiveBorder: 10,
|
interactiveBorder: 10,
|
||||||
theme: 'quarto',
|
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);
|
window.tippy(el, config);
|
||||||
}
|
}
|
||||||
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
|
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 {}
|
try { href = new URL(href).hash; } catch {}
|
||||||
const id = href.replace(/^#\/?/, "");
|
const id = href.replace(/^#\/?/, "");
|
||||||
const note = window.document.getElementById(id);
|
const note = window.document.getElementById(id);
|
||||||
|
if (note) {
|
||||||
return note.innerHTML;
|
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;
|
let selectedAnnoteEl;
|
||||||
|
@ -390,6 +580,7 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
}
|
}
|
||||||
div.style.top = top - 2 + "px";
|
div.style.top = top - 2 + "px";
|
||||||
div.style.height = height + 4 + "px";
|
div.style.height = height + 4 + "px";
|
||||||
|
div.style.left = 0;
|
||||||
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
|
||||||
if (gutterDiv === null) {
|
if (gutterDiv === null) {
|
||||||
gutterDiv = window.document.createElement("div");
|
gutterDiv = window.document.createElement("div");
|
||||||
|
@ -415,6 +606,32 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
});
|
});
|
||||||
selectedAnnoteEl = undefined;
|
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
|
// Attach click handler to the DT
|
||||||
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
|
||||||
for (const annoteDlNode of annoteDls) {
|
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>
|
</script>
|
||||||
</div> <!-- /content -->
|
</div> <!-- /content -->
|
||||||
|
@ -494,7 +697,9 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
<div class="nav-footer-left">
|
<div class="nav-footer-left">
|
||||||
|
|
||||||
</div>
|
</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">
|
<div class="nav-footer-right">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -503,4 +708,5 @@ window.document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
|
@ -11,6 +11,7 @@
|
||||||
{
|
{
|
||||||
"listing": "/food.html",
|
"listing": "/food.html",
|
||||||
"items": [
|
"items": [
|
||||||
|
"/food/rugbrød-i-træramme.html",
|
||||||
"/food/hyldesaft.html",
|
"/food/hyldesaft.html",
|
||||||
"/food/banankage.html",
|
"/food/banankage.html",
|
||||||
"/food/elses_vafler.html",
|
"/food/elses_vafler.html",
|
||||||
|
|
334
docs/search.json
334
docs/search.json
File diff suppressed because one or more lines are too long
12
docs/site_libs/bootstrap/bootstrap-dark.min.css
vendored
12
docs/site_libs/bootstrap/bootstrap-dark.min.css
vendored
File diff suppressed because one or more lines are too long
148
docs/site_libs/bootstrap/bootstrap-icons.css
vendored
148
docs/site_libs/bootstrap/bootstrap-icons.css
vendored
|
@ -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-face {
|
||||||
font-display: block;
|
font-display: block;
|
||||||
font-family: "bootstrap-icons";
|
font-family: "bootstrap-icons";
|
||||||
src:
|
src:
|
||||||
url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
|
url("./bootstrap-icons.woff?2820a3852bdb9a5832199cc61cec4e65") format("woff");
|
||||||
}
|
}
|
||||||
|
|
||||||
.bi::before,
|
.bi::before,
|
||||||
|
@ -441,7 +447,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
|
||||||
.bi-cloud-fog2::before { content: "\f2a2"; }
|
.bi-cloud-fog2::before { content: "\f2a2"; }
|
||||||
.bi-cloud-hail-fill::before { content: "\f2a3"; }
|
.bi-cloud-hail-fill::before { content: "\f2a3"; }
|
||||||
.bi-cloud-hail::before { content: "\f2a4"; }
|
.bi-cloud-hail::before { content: "\f2a4"; }
|
||||||
.bi-cloud-haze-1::before { content: "\f2a5"; }
|
|
||||||
.bi-cloud-haze-fill::before { content: "\f2a6"; }
|
.bi-cloud-haze-fill::before { content: "\f2a6"; }
|
||||||
.bi-cloud-haze::before { content: "\f2a7"; }
|
.bi-cloud-haze::before { content: "\f2a7"; }
|
||||||
.bi-cloud-haze2-fill::before { content: "\f2a8"; }
|
.bi-cloud-haze2-fill::before { content: "\f2a8"; }
|
||||||
|
@ -1437,21 +1442,16 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
|
||||||
.bi-dpad::before { content: "\f687"; }
|
.bi-dpad::before { content: "\f687"; }
|
||||||
.bi-ear-fill::before { content: "\f688"; }
|
.bi-ear-fill::before { content: "\f688"; }
|
||||||
.bi-ear::before { content: "\f689"; }
|
.bi-ear::before { content: "\f689"; }
|
||||||
.bi-envelope-check-1::before { content: "\f68a"; }
|
|
||||||
.bi-envelope-check-fill::before { content: "\f68b"; }
|
.bi-envelope-check-fill::before { content: "\f68b"; }
|
||||||
.bi-envelope-check::before { content: "\f68c"; }
|
.bi-envelope-check::before { content: "\f68c"; }
|
||||||
.bi-envelope-dash-1::before { content: "\f68d"; }
|
|
||||||
.bi-envelope-dash-fill::before { content: "\f68e"; }
|
.bi-envelope-dash-fill::before { content: "\f68e"; }
|
||||||
.bi-envelope-dash::before { content: "\f68f"; }
|
.bi-envelope-dash::before { content: "\f68f"; }
|
||||||
.bi-envelope-exclamation-1::before { content: "\f690"; }
|
|
||||||
.bi-envelope-exclamation-fill::before { content: "\f691"; }
|
.bi-envelope-exclamation-fill::before { content: "\f691"; }
|
||||||
.bi-envelope-exclamation::before { content: "\f692"; }
|
.bi-envelope-exclamation::before { content: "\f692"; }
|
||||||
.bi-envelope-plus-fill::before { content: "\f693"; }
|
.bi-envelope-plus-fill::before { content: "\f693"; }
|
||||||
.bi-envelope-plus::before { content: "\f694"; }
|
.bi-envelope-plus::before { content: "\f694"; }
|
||||||
.bi-envelope-slash-1::before { content: "\f695"; }
|
|
||||||
.bi-envelope-slash-fill::before { content: "\f696"; }
|
.bi-envelope-slash-fill::before { content: "\f696"; }
|
||||||
.bi-envelope-slash::before { content: "\f697"; }
|
.bi-envelope-slash::before { content: "\f697"; }
|
||||||
.bi-envelope-x-1::before { content: "\f698"; }
|
|
||||||
.bi-envelope-x-fill::before { content: "\f699"; }
|
.bi-envelope-x-fill::before { content: "\f699"; }
|
||||||
.bi-envelope-x::before { content: "\f69a"; }
|
.bi-envelope-x::before { content: "\f69a"; }
|
||||||
.bi-explicit-fill::before { content: "\f69b"; }
|
.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-reverse::before { content: "\f69f"; }
|
||||||
.bi-list-columns::before { content: "\f6a0"; }
|
.bi-list-columns::before { content: "\f6a0"; }
|
||||||
.bi-meta::before { content: "\f6a1"; }
|
.bi-meta::before { content: "\f6a1"; }
|
||||||
.bi-mortorboard-fill::before { content: "\f6a2"; }
|
|
||||||
.bi-mortorboard::before { content: "\f6a3"; }
|
|
||||||
.bi-nintendo-switch::before { content: "\f6a4"; }
|
.bi-nintendo-switch::before { content: "\f6a4"; }
|
||||||
.bi-pc-display-horizontal::before { content: "\f6a5"; }
|
.bi-pc-display-horizontal::before { content: "\f6a5"; }
|
||||||
.bi-pc-display::before { content: "\f6a6"; }
|
.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-check::before { content: "\f6b3"; }
|
||||||
.bi-send-dash-fill::before { content: "\f6b4"; }
|
.bi-send-dash-fill::before { content: "\f6b4"; }
|
||||||
.bi-send-dash::before { content: "\f6b5"; }
|
.bi-send-dash::before { content: "\f6b5"; }
|
||||||
.bi-send-exclamation-1::before { content: "\f6b6"; }
|
|
||||||
.bi-send-exclamation-fill::before { content: "\f6b7"; }
|
.bi-send-exclamation-fill::before { content: "\f6b7"; }
|
||||||
.bi-send-exclamation::before { content: "\f6b8"; }
|
.bi-send-exclamation::before { content: "\f6b8"; }
|
||||||
.bi-send-fill::before { content: "\f6b9"; }
|
.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-x::before { content: "\f6bf"; }
|
||||||
.bi-send::before { content: "\f6c0"; }
|
.bi-send::before { content: "\f6c0"; }
|
||||||
.bi-steam::before { content: "\f6c1"; }
|
.bi-steam::before { content: "\f6c1"; }
|
||||||
.bi-terminal-dash-1::before { content: "\f6c2"; }
|
|
||||||
.bi-terminal-dash::before { content: "\f6c3"; }
|
.bi-terminal-dash::before { content: "\f6c3"; }
|
||||||
.bi-terminal-plus::before { content: "\f6c4"; }
|
.bi-terminal-plus::before { content: "\f6c4"; }
|
||||||
.bi-terminal-split::before { content: "\f6c5"; }
|
.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-symbol::before { content: "\f6dd"; }
|
||||||
.bi-usb::before { content: "\f6de"; }
|
.bi-usb::before { content: "\f6de"; }
|
||||||
.bi-boombox-fill::before { content: "\f6df"; }
|
.bi-boombox-fill::before { content: "\f6df"; }
|
||||||
.bi-displayport-1::before { content: "\f6e0"; }
|
|
||||||
.bi-displayport::before { content: "\f6e1"; }
|
.bi-displayport::before { content: "\f6e1"; }
|
||||||
.bi-gpu-card::before { content: "\f6e2"; }
|
.bi-gpu-card::before { content: "\f6e2"; }
|
||||||
.bi-memory::before { content: "\f6e3"; }
|
.bi-memory::before { content: "\f6e3"; }
|
||||||
|
@ -1536,8 +1531,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
|
||||||
.bi-pci-card::before { content: "\f6ea"; }
|
.bi-pci-card::before { content: "\f6ea"; }
|
||||||
.bi-router-fill::before { content: "\f6eb"; }
|
.bi-router-fill::before { content: "\f6eb"; }
|
||||||
.bi-router::before { content: "\f6ec"; }
|
.bi-router::before { content: "\f6ec"; }
|
||||||
.bi-ssd-fill::before { content: "\f6ed"; }
|
|
||||||
.bi-ssd::before { content: "\f6ee"; }
|
|
||||||
.bi-thunderbolt-fill::before { content: "\f6ef"; }
|
.bi-thunderbolt-fill::before { content: "\f6ef"; }
|
||||||
.bi-thunderbolt::before { content: "\f6f0"; }
|
.bi-thunderbolt::before { content: "\f6f0"; }
|
||||||
.bi-usb-drive-fill::before { content: "\f6f1"; }
|
.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-pdf::before { content: "\f756"; }
|
||||||
.bi-filetype-php::before { content: "\f757"; }
|
.bi-filetype-php::before { content: "\f757"; }
|
||||||
.bi-filetype-png::before { content: "\f758"; }
|
.bi-filetype-png::before { content: "\f758"; }
|
||||||
.bi-filetype-ppt-1::before { content: "\f759"; }
|
|
||||||
.bi-filetype-ppt::before { content: "\f75a"; }
|
.bi-filetype-ppt::before { content: "\f75a"; }
|
||||||
.bi-filetype-psd::before { content: "\f75b"; }
|
.bi-filetype-psd::before { content: "\f75b"; }
|
||||||
.bi-filetype-py::before { content: "\f75c"; }
|
.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-txt::before { content: "\f766"; }
|
||||||
.bi-filetype-wav::before { content: "\f767"; }
|
.bi-filetype-wav::before { content: "\f767"; }
|
||||||
.bi-filetype-woff::before { content: "\f768"; }
|
.bi-filetype-woff::before { content: "\f768"; }
|
||||||
.bi-filetype-xls-1::before { content: "\f769"; }
|
|
||||||
.bi-filetype-xls::before { content: "\f76a"; }
|
.bi-filetype-xls::before { content: "\f76a"; }
|
||||||
.bi-filetype-xml::before { content: "\f76b"; }
|
.bi-filetype-xml::before { content: "\f76b"; }
|
||||||
.bi-filetype-yml::before { content: "\f76c"; }
|
.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-json::before { content: "\f791"; }
|
||||||
.bi-filetype-pptx::before { content: "\f792"; }
|
.bi-filetype-pptx::before { content: "\f792"; }
|
||||||
.bi-filetype-xlsx::before { content: "\f793"; }
|
.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-fill::before { content: "\f796"; }
|
||||||
.bi-1-circle::before { content: "\f797"; }
|
.bi-1-circle::before { content: "\f797"; }
|
||||||
.bi-1-square-fill::before { content: "\f798"; }
|
.bi-1-square-fill::before { content: "\f798"; }
|
||||||
.bi-1-square::before { content: "\f799"; }
|
.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-fill::before { content: "\f79c"; }
|
||||||
.bi-2-circle::before { content: "\f79d"; }
|
.bi-2-circle::before { content: "\f79d"; }
|
||||||
.bi-2-square-fill::before { content: "\f79e"; }
|
.bi-2-square-fill::before { content: "\f79e"; }
|
||||||
.bi-2-square::before { content: "\f79f"; }
|
.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-fill::before { content: "\f7a2"; }
|
||||||
.bi-3-circle::before { content: "\f7a3"; }
|
.bi-3-circle::before { content: "\f7a3"; }
|
||||||
.bi-3-square-fill::before { content: "\f7a4"; }
|
.bi-3-square-fill::before { content: "\f7a4"; }
|
||||||
.bi-3-square::before { content: "\f7a5"; }
|
.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-fill::before { content: "\f7a8"; }
|
||||||
.bi-4-circle::before { content: "\f7a9"; }
|
.bi-4-circle::before { content: "\f7a9"; }
|
||||||
.bi-4-square-fill::before { content: "\f7aa"; }
|
.bi-4-square-fill::before { content: "\f7aa"; }
|
||||||
.bi-4-square::before { content: "\f7ab"; }
|
.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-fill::before { content: "\f7ae"; }
|
||||||
.bi-5-circle::before { content: "\f7af"; }
|
.bi-5-circle::before { content: "\f7af"; }
|
||||||
.bi-5-square-fill::before { content: "\f7b0"; }
|
.bi-5-square-fill::before { content: "\f7b0"; }
|
||||||
.bi-5-square::before { content: "\f7b1"; }
|
.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-fill::before { content: "\f7b4"; }
|
||||||
.bi-6-circle::before { content: "\f7b5"; }
|
.bi-6-circle::before { content: "\f7b5"; }
|
||||||
.bi-6-square-fill::before { content: "\f7b6"; }
|
.bi-6-square-fill::before { content: "\f7b6"; }
|
||||||
.bi-6-square::before { content: "\f7b7"; }
|
.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-fill::before { content: "\f7ba"; }
|
||||||
.bi-7-circle::before { content: "\f7bb"; }
|
.bi-7-circle::before { content: "\f7bb"; }
|
||||||
.bi-7-square-fill::before { content: "\f7bc"; }
|
.bi-7-square-fill::before { content: "\f7bc"; }
|
||||||
.bi-7-square::before { content: "\f7bd"; }
|
.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-fill::before { content: "\f7c0"; }
|
||||||
.bi-8-circle::before { content: "\f7c1"; }
|
.bi-8-circle::before { content: "\f7c1"; }
|
||||||
.bi-8-square-fill::before { content: "\f7c2"; }
|
.bi-8-square-fill::before { content: "\f7c2"; }
|
||||||
.bi-8-square::before { content: "\f7c3"; }
|
.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-fill::before { content: "\f7c6"; }
|
||||||
.bi-9-circle::before { content: "\f7c7"; }
|
.bi-9-circle::before { content: "\f7c7"; }
|
||||||
.bi-9-square-fill::before { content: "\f7c8"; }
|
.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-edge::before { content: "\f7d5"; }
|
||||||
.bi-browser-firefox::before { content: "\f7d6"; }
|
.bi-browser-firefox::before { content: "\f7d6"; }
|
||||||
.bi-browser-safari::before { content: "\f7d7"; }
|
.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-fill::before { content: "\f7da"; }
|
||||||
.bi-c-circle::before { content: "\f7db"; }
|
.bi-c-circle::before { content: "\f7db"; }
|
||||||
.bi-c-square-fill::before { content: "\f7dc"; }
|
.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-car-front::before { content: "\f7e1"; }
|
||||||
.bi-cassette-fill::before { content: "\f7e2"; }
|
.bi-cassette-fill::before { content: "\f7e2"; }
|
||||||
.bi-cassette::before { content: "\f7e3"; }
|
.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-fill::before { content: "\f7e6"; }
|
||||||
.bi-cc-circle::before { content: "\f7e7"; }
|
.bi-cc-circle::before { content: "\f7e7"; }
|
||||||
.bi-cc-square-fill::before { content: "\f7e8"; }
|
.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-filetype-sql::before { content: "\f7f5"; }
|
||||||
.bi-fire::before { content: "\f7f6"; }
|
.bi-fire::before { content: "\f7f6"; }
|
||||||
.bi-google-play::before { content: "\f7f7"; }
|
.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-fill::before { content: "\f7fa"; }
|
||||||
.bi-h-circle::before { content: "\f7fb"; }
|
.bi-h-circle::before { content: "\f7fb"; }
|
||||||
.bi-h-square-fill::before { content: "\f7fc"; }
|
.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-fill::before { content: "\f7ff"; }
|
||||||
.bi-lungs::before { content: "\f800"; }
|
.bi-lungs::before { content: "\f800"; }
|
||||||
.bi-microsoft-teams::before { content: "\f801"; }
|
.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-fill::before { content: "\f804"; }
|
||||||
.bi-p-circle::before { content: "\f805"; }
|
.bi-p-circle::before { content: "\f805"; }
|
||||||
.bi-p-square-fill::before { content: "\f806"; }
|
.bi-p-square-fill::before { content: "\f806"; }
|
||||||
|
@ -1823,8 +1788,6 @@ url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff");
|
||||||
.bi-pass::before { content: "\f809"; }
|
.bi-pass::before { content: "\f809"; }
|
||||||
.bi-prescription::before { content: "\f80a"; }
|
.bi-prescription::before { content: "\f80a"; }
|
||||||
.bi-prescription2::before { content: "\f80b"; }
|
.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-fill::before { content: "\f80e"; }
|
||||||
.bi-r-circle::before { content: "\f80f"; }
|
.bi-r-circle::before { content: "\f80f"; }
|
||||||
.bi-r-square-fill::before { content: "\f810"; }
|
.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-sina-weibo::before { content: "\f8ca"; }
|
||||||
.bi-tencent-qq::before { content: "\f8cb"; }
|
.bi-tencent-qq::before { content: "\f8cb"; }
|
||||||
.bi-wikipedia::before { content: "\f8cc"; }
|
.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"; }
|
||||||
|
|
Binary file not shown.
12
docs/site_libs/bootstrap/bootstrap.min.css
vendored
12
docs/site_libs/bootstrap/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
6
docs/site_libs/bootstrap/bootstrap.min.js
vendored
6
docs/site_libs/bootstrap/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
6
docs/site_libs/quarto-html/anchor.min.js
vendored
6
docs/site_libs/quarto-html/anchor.min.js
vendored
File diff suppressed because one or more lines are too long
4
docs/site_libs/quarto-html/popper.min.js
vendored
4
docs/site_libs/quarto-html/popper.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -9,7 +9,7 @@ const layoutMarginEls = () => {
|
||||||
// Find any conflicting margin elements and add margins to the
|
// Find any conflicting margin elements and add margins to the
|
||||||
// top to prevent overlap
|
// top to prevent overlap
|
||||||
const marginChildren = window.document.querySelectorAll(
|
const marginChildren = window.document.querySelectorAll(
|
||||||
".column-margin.column-container > * "
|
".column-margin.column-container > *, .margin-caption, .aside"
|
||||||
);
|
);
|
||||||
|
|
||||||
let lastBottom = 0;
|
let lastBottom = 0;
|
||||||
|
@ -18,25 +18,14 @@ const layoutMarginEls = () => {
|
||||||
// clear the top margin so we recompute it
|
// clear the top margin so we recompute it
|
||||||
marginChild.style.marginTop = null;
|
marginChild.style.marginTop = null;
|
||||||
const top = marginChild.getBoundingClientRect().top + window.scrollY;
|
const top = marginChild.getBoundingClientRect().top + window.scrollY;
|
||||||
console.log({
|
|
||||||
childtop: marginChild.getBoundingClientRect().top,
|
|
||||||
scroll: window.scrollY,
|
|
||||||
top,
|
|
||||||
lastBottom,
|
|
||||||
});
|
|
||||||
if (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`;
|
marginChild.style.marginTop = `${margin}px`;
|
||||||
}
|
}
|
||||||
const styles = window.getComputedStyle(marginChild);
|
const styles = window.getComputedStyle(marginChild);
|
||||||
const marginTop = parseFloat(styles["marginTop"]);
|
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;
|
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
|
// Recompute the position of margin elements anytime the body size changes
|
||||||
if (window.ResizeObserver) {
|
if (window.ResizeObserver) {
|
||||||
const resizeObserver = new 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);
|
resizeObserver.observe(window.document.body);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
function updateDocumentOffsetWithoutAnimation() {
|
||||||
updateDocumentOffset(false);
|
updateDocumentOffset(false);
|
||||||
}
|
}
|
||||||
|
@ -92,7 +103,7 @@ window.document.addEventListener("DOMContentLoaded", function () {
|
||||||
function updateDocumentOffset(animated) {
|
function updateDocumentOffset(animated) {
|
||||||
// set body offset
|
// set body offset
|
||||||
const topOffset = headerOffset();
|
const topOffset = headerOffset();
|
||||||
const bodyOffset = topOffset + footerOffset();
|
const bodyOffset = topOffset + footerOffset() + dashboardOffset();
|
||||||
const bodyEl = window.document.body;
|
const bodyEl = window.document.body;
|
||||||
bodyEl.setAttribute("data-bs-offset", topOffset);
|
bodyEl.setAttribute("data-bs-offset", topOffset);
|
||||||
bodyEl.style.paddingTop = topOffset + "px";
|
bodyEl.style.paddingTop = topOffset + "px";
|
||||||
|
@ -205,9 +216,9 @@ window.document.addEventListener("DOMContentLoaded", function () {
|
||||||
// Observe size changed for the header
|
// Observe size changed for the header
|
||||||
const headerEl = window.document.querySelector("header.fixed-top");
|
const headerEl = window.document.querySelector("header.fixed-top");
|
||||||
if (headerEl && window.ResizeObserver) {
|
if (headerEl && window.ResizeObserver) {
|
||||||
const observer = new window.ResizeObserver(
|
const observer = new window.ResizeObserver(() => {
|
||||||
updateDocumentOffsetWithoutAnimation
|
setTimeout(updateDocumentOffsetWithoutAnimation, 0);
|
||||||
);
|
});
|
||||||
observer.observe(headerEl, {
|
observer.observe(headerEl, {
|
||||||
attributes: true,
|
attributes: true,
|
||||||
childList: true,
|
childList: true,
|
||||||
|
@ -226,6 +237,7 @@ window.document.addEventListener("DOMContentLoaded", function () {
|
||||||
const links = window.document.querySelectorAll("a");
|
const links = window.document.querySelectorAll("a");
|
||||||
for (let i = 0; i < links.length; i++) {
|
for (let i = 0; i < links.length; i++) {
|
||||||
if (links[i].href) {
|
if (links[i].href) {
|
||||||
|
links[i].dataset.originalHref = links[i].href;
|
||||||
links[i].href = links[i].href.replace(/\/index\.html/, "/");
|
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
|
// Fixup any sharing links that require urls
|
||||||
// Append url to any sharing urls
|
// Append url to any sharing urls
|
||||||
const sharingLinks = window.document.querySelectorAll(
|
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++) {
|
for (let i = 0; i < sharingLinks.length; i++) {
|
||||||
const sharingLink = sharingLinks[i];
|
const sharingLink = sharingLinks[i];
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -43,7 +43,7 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||||
const mainEl = window.document.querySelector("main");
|
const mainEl = window.document.querySelector("main");
|
||||||
|
|
||||||
// highlight matches on the page
|
// highlight matches on the page
|
||||||
if (query !== null && mainEl) {
|
if (query && mainEl) {
|
||||||
// perform any highlighting
|
// perform any highlighting
|
||||||
highlight(escapeRegExp(query), mainEl);
|
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)
|
// (e.g. if the user edits the query or clears it)
|
||||||
let highlighting = true;
|
let highlighting = true;
|
||||||
const resetHighlighting = (searchTerm) => {
|
const resetHighlighting = (searchTerm) => {
|
||||||
if (mainEl && highlighting && query !== null && searchTerm !== query) {
|
if (mainEl && highlighting && query && searchTerm !== query) {
|
||||||
clearHighlight(query, mainEl);
|
clearHighlight(query, mainEl);
|
||||||
highlighting = false;
|
highlighting = false;
|
||||||
}
|
}
|
||||||
|
@ -98,6 +98,7 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||||
classNames: {
|
classNames: {
|
||||||
form: "d-flex",
|
form: "d-flex",
|
||||||
},
|
},
|
||||||
|
placeholder: language["search-text-placeholder"],
|
||||||
translations: {
|
translations: {
|
||||||
clearButtonTitle: language["search-clear-button-title"],
|
clearButtonTitle: language["search-clear-button-title"],
|
||||||
detachedCancelButtonText: language["search-detached-cancel-button-title"],
|
detachedCancelButtonText: language["search-detached-cancel-button-title"],
|
||||||
|
@ -110,6 +111,8 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||||
return item.href;
|
return item.href;
|
||||||
},
|
},
|
||||||
onStateChange({ state }) {
|
onStateChange({ state }) {
|
||||||
|
// If this is a file URL, note that
|
||||||
|
|
||||||
// Perhaps reset highlighting
|
// Perhaps reset highlighting
|
||||||
resetHighlighting(state.query);
|
resetHighlighting(state.query);
|
||||||
|
|
||||||
|
@ -359,7 +362,8 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||||
state,
|
state,
|
||||||
setActiveItemId,
|
setActiveItemId,
|
||||||
setContext,
|
setContext,
|
||||||
refresh
|
refresh,
|
||||||
|
quartoSearchOptions
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -374,6 +378,32 @@ window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||||
focusSearchInput();
|
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
|
// Remove the labeleledby attribute since it is pointing
|
||||||
// to a non-existent label
|
// to a non-existent label
|
||||||
if (quartoSearchOptions.type === "overlay") {
|
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
|
// If the main document scrolls dismiss the search results
|
||||||
// (otherwise, since they're floating in the document they can scroll with the document)
|
// (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);
|
setIsOpen(false);
|
||||||
};
|
}
|
||||||
|
}, 50);
|
||||||
|
|
||||||
if (showSearchResults) {
|
if (showSearchResults) {
|
||||||
setIsOpen(true);
|
setIsOpen(true);
|
||||||
|
@ -429,15 +478,27 @@ function configurePlugins(quartoSearchOptions) {
|
||||||
const algoliaInsightsPlugin = createAlgoliaInsightsPlugin({
|
const algoliaInsightsPlugin = createAlgoliaInsightsPlugin({
|
||||||
insightsClient: window.aa,
|
insightsClient: window.aa,
|
||||||
onItemsChange({ insights, insightsEvents }) {
|
onItemsChange({ insights, insightsEvents }) {
|
||||||
const events = insightsEvents.map((event) => {
|
const events = insightsEvents.flatMap((event) => {
|
||||||
const maxEvents = event.objectIDs.slice(0, 20);
|
// 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 {
|
return {
|
||||||
...event,
|
...event,
|
||||||
objectIDs: maxEvents,
|
items,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
return events;
|
||||||
|
});
|
||||||
|
|
||||||
insights.viewedObjectIDs(...events);
|
for (const event of events) {
|
||||||
|
insights.viewedObjectIDs(event);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
return algoliaInsightsPlugin;
|
return algoliaInsightsPlugin;
|
||||||
|
@ -613,11 +674,10 @@ function showCopyLink(query, options) {
|
||||||
/* Search Index Handling */
|
/* Search Index Handling */
|
||||||
// create the index
|
// create the index
|
||||||
var fuseIndex = undefined;
|
var fuseIndex = undefined;
|
||||||
async function readSearchData() {
|
var shownWarning = false;
|
||||||
// Initialize the search index on demand
|
|
||||||
if (fuseIndex === undefined) {
|
// fuse index options
|
||||||
// create fuse index
|
const kFuseIndexOptions = {
|
||||||
const options = {
|
|
||||||
keys: [
|
keys: [
|
||||||
{ name: "title", weight: 20 },
|
{ name: "title", weight: 20 },
|
||||||
{ name: "section", weight: 20 },
|
{ name: "section", weight: 20 },
|
||||||
|
@ -626,7 +686,18 @@ async function readSearchData() {
|
||||||
ignoreLocation: true,
|
ignoreLocation: true,
|
||||||
threshold: 0.1,
|
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
|
// fetch the main search.json
|
||||||
const response = await fetch(offsetURL("search.json"));
|
const response = await fetch(offsetURL("search.json"));
|
||||||
|
@ -646,6 +717,7 @@ async function readSearchData() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return fuseIndex;
|
return fuseIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -674,7 +746,8 @@ function renderItem(
|
||||||
state,
|
state,
|
||||||
setActiveItemId,
|
setActiveItemId,
|
||||||
setContext,
|
setContext,
|
||||||
refresh
|
refresh,
|
||||||
|
quartoSearchOptions
|
||||||
) {
|
) {
|
||||||
switch (item.type) {
|
switch (item.type) {
|
||||||
case kItemTypeDoc:
|
case kItemTypeDoc:
|
||||||
|
@ -684,7 +757,9 @@ function renderItem(
|
||||||
item.title,
|
item.title,
|
||||||
item.section,
|
item.section,
|
||||||
item.text,
|
item.text,
|
||||||
item.href
|
item.href,
|
||||||
|
item.crumbs,
|
||||||
|
quartoSearchOptions
|
||||||
);
|
);
|
||||||
case kItemTypeMore:
|
case kItemTypeMore:
|
||||||
return createMoreCard(
|
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", {
|
const iconEl = createElement("i", {
|
||||||
class: `bi bi-${icon} search-result-icon`,
|
class: `bi bi-${icon} search-result-icon`,
|
||||||
});
|
});
|
||||||
const titleEl = createElement("p", { class: "search-result-title" }, title);
|
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(
|
const titleContainerEl = createElement(
|
||||||
"div",
|
"div",
|
||||||
{ class: "search-result-title-container" },
|
{ class: "search-result-title-container" },
|
||||||
[iconEl, titleEl]
|
titleContents
|
||||||
);
|
);
|
||||||
|
|
||||||
const textEls = [];
|
const textEls = [];
|
||||||
|
@ -1099,7 +1205,8 @@ function algoliaSearch(query, limit, algoliaOptions) {
|
||||||
const remappedHits = response.hits.map((hit) => {
|
const remappedHits = response.hits.map((hit) => {
|
||||||
return hit.map((item) => {
|
return hit.map((item) => {
|
||||||
const newItem = { ...item };
|
const newItem = { ...item };
|
||||||
["href", "section", "title", "text"].forEach((keyName) => {
|
["href", "section", "title", "text", "crumbs"].forEach(
|
||||||
|
(keyName) => {
|
||||||
const mappedName = indexFields[keyName];
|
const mappedName = indexFields[keyName];
|
||||||
if (
|
if (
|
||||||
mappedName &&
|
mappedName &&
|
||||||
|
@ -1109,7 +1216,8 @@ function algoliaSearch(query, limit, algoliaOptions) {
|
||||||
newItem[keyName] = item[mappedName];
|
newItem[keyName] = item[mappedName];
|
||||||
delete newItem[mappedName];
|
delete newItem[mappedName];
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
newItem.text = highlightMatch(query, newItem.text);
|
newItem.text = highlightMatch(query, newItem.text);
|
||||||
return newItem;
|
return newItem;
|
||||||
});
|
});
|
||||||
|
@ -1120,8 +1228,34 @@ function algoliaSearch(query, limit, algoliaOptions) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function fuseSearch(query, fuse, fuseOptions) {
|
let subSearchTerm = undefined;
|
||||||
return fuse.search(query, fuseOptions).map((result) => {
|
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 addParam = (url, name, value) => {
|
||||||
const anchorParts = url.split("#");
|
const anchorParts = url.split("#");
|
||||||
const baseUrl = anchorParts[0];
|
const baseUrl = anchorParts[0];
|
||||||
|
@ -1135,6 +1269,18 @@ function fuseSearch(query, fuse, fuseOptions) {
|
||||||
section: result.item.section,
|
section: result.item.section,
|
||||||
href: addParam(result.item.href, kQueryArg, query),
|
href: addParam(result.item.href, kQueryArg, query),
|
||||||
text: highlightMatch(query, result.item.text),
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,20 +6,9 @@ Fladmasning kræver ikke stor køkkensnilde. Det er en ret genial måde at stege
|
||||||
|
|
||||||
Til 6 personer
|
Til 6 personer
|
||||||
|
|
||||||
En stor hane eller kylling
|
En stor hane eller kylling 1 ½ kg. Kartofler 3 hele hvidløg 1 citron salt og peber olivenolie
|
||||||
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.
|
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.
|
||||||
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.
|
Bag ved 200° - til hanen er er mør og sprød - ca. 1 time.
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,6 @@
|
||||||
## Formbrød
|
## Formbrød
|
||||||
|
|
||||||
Rest surdej (150 g)
|
Rest surdej (150 g) 7 dl vand 2 håndfulde havregryn 25 g salt 10 g gær 1 håndfuld hørfrø Mel
|
||||||
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.
|
Bagt 35 min ved 200gr.
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,14 @@
|
||||||
Groft hvede-surdejsbrød_
|
Groft hvede-surdejsbrød\_ \_ *https://www.dr.dk/mad/opskrift/groft-hvede-surdejsbrod*
|
||||||
_
|
|
||||||
_
|
|
||||||
_
|
|
||||||
_https://www.dr.dk/mad/opskrift/groft-hvede-surdejsbrod_
|
|
||||||
|
|
||||||
**Ingredienser**
|
**Ingredienser**
|
||||||
|
|
||||||
* 5 g gær (økologisk gær anbefales pga. bedre hæve-effekt)
|
- 5 g gær (økologisk gær anbefales pga. bedre hæve-effekt)
|
||||||
* 6 dl koldt vand
|
- 6 dl koldt vand
|
||||||
* 1,5 dl hvedesurdej
|
- 1,5 dl hvedesurdej
|
||||||
* 150 g fuldkornshvedemel (f.eks. ølandshvede, spelt eller emmermel) (300)
|
- 150 g fuldkornshvedemel (f.eks. ølandshvede, spelt eller emmermel) (300)
|
||||||
* 750 g hvedemel (600)
|
- 750 g hvedemel (600)
|
||||||
* 20 g havsalt
|
- 20 g havsalt
|
||||||
* 2 spsk. olie
|
- 2 spsk. olie
|
||||||
|
|
||||||
Særdeles velegnet til boller også. Deles i 16-20 stykker og bages 13-15 min ved 250gr
|
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.
|
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.
|
6. Dæk med film og lad dejen koldhæve i køleskabet natten over.
|
||||||
|
|
||||||
**Dag 2**
|
**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.
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
61
food/rugbrød-i-træramme.qmd
Normal file
61
food/rugbrød-i-træramme.qmd
Normal 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.
|
Loading…
Add table
Reference in a new issue