1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head> 3 4<meta charset="utf-8"> 5<meta name="generator" content="quarto-1.7.33"> 6 7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 8 9 10<title>Amphibian Genomics and Evolution Lab â Amphibian Genomics and Evolution Lab</title> 11<style> 12code{white-space: pre-wrap;} 13span.smallcaps{font-variant: small-caps;} 14div.columns{display: flex; gap: min(4vw, 1.5em);} 15div.column{flex: auto; overflow-x: auto;} 16div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} 17ul.task-list{list-style: none;} 18ul.task-list li input[type="checkbox"] { 19 width: 0.8em; 20 margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 21 vertical-align: middle; 22} 23</style> 24 25
26<script src="../site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 26
26
27<script src="../site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 27
27
28<script src="../site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 28
28
29<script src="../site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 29
29
30<script src="../site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 30
30
31<script src="../site_libs/quarto-search/quarto-search.js"></script>
31 32<meta name="quarto:offset" content="../"> 33<link href="../assets/img/favicon.png" rel="icon" type="image/png">
34<script src="../site_libs/quarto-listing/list.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="../site_libs/quarto-listing/quarto-listing.js"></script>
vendor: 1 bytes, line 35
35
36<script src="../site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 36
36
37<script src="../site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 37
37
38<script src="../site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 38
38
39<script src="../site_libs/quarto-html/tippy.umd.min.js"></script>
39 40<link href="../site_libs/quarto-html/tippy.css" rel="stylesheet"> 41<link href="../site_libs/quarto-html/quarto-syntax-highlighting-ea385d0e468b0dd5ea5bf0780b1290d9.css" rel="stylesheet" id="quarto-text-highlighting-styles">
42<script src="../site_libs/bootstrap/bootstrap.min.js"></script>
42 43<link href="../site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> 44<link href="../site_libs/bootstrap/bootstrap-c1fac2584b48ed01fb6e278e36375074.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light"> 45<link href="../site_libs/quarto-contrib/fontawesome6-1.2.0/all.min.css" rel="stylesheet"> 46<link href="../site_libs/quarto-contrib/fontawesome6-1.2.0/latex-fontsize.css" rel="stylesheet"> 47<link href="../site_libs/quarto-contrib/academicons-1.9.4/all.css" rel="stylesheet"> 48<link href="../site_libs/quarto-contrib/academicons-1.9.4/size.css" rel="stylesheet">
49<script id="quarto-search-options" type="application/json">{ 50 "location": "navbar", 51 "copy-button": false, 52 "collapse-after": 3, 53 "panel-placement": "end", 54 "type": "overlay", 55 "limit": 50, 56 "keyboard-shortcut": [ 57 "f", 58 "/", 59 "s" 60 ], 61 "show-item-context": false, 62 "language": { 63 "search-no-results-text": "No results", 64 "search-matching-documents-text": "matching documents", 65 "search-copy-link-title": "Copy link to search", 66 "search-hide-matches-text": "Hide additional matches", 67 "search-more-match-text": "more match in this document", 68 "search-more-matches-text": "more matches in this document", 69 "search-clear-button-title": "Clear", 70 "search-text-placeholder": "", 71 "search-detached-cancel-button-title": "Cancel", 72 "search-submit-button-title": "Submit", 73 "search-label": "Search" 74 } 75}</script>
vendor: 1 bytes, line 75
75
76<script> 77 78 window.document.addEventListener("DOMContentLoaded", function (_event) { 79 const listingTargetEl = window.document.querySelector('#listing-news .list'); 80 if (!listingTargetEl) { 81 // No listing discovered, do not attach. 82 return; 83 } 84 85 const options = { 86 valueNames: ['listing-title','listing-subtitle','listing-image',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }], 87 88 searchColumns: ["listing-title","listing-author","listing-date","listing-image","listing-description"], 89 }; 90 91 window['quarto-listings'] = window['quarto-listings'] || {}; 92 window['quarto-listings']['listing-news'] = new List('listing-news', options); 93 94 if (window['quarto-listing-loaded']) { 95 window['quarto-listing-loaded'](); 96 } 97 }); 98 99 window.addEventListener('hashchange',() => { 100 if (window['quarto-listing-loaded']) { 101 window['quarto-listing-loaded'](); 102 } 103 }) 104 105 106 window.document.addEventListener("DOMContentLoaded", function (_event) { 107 const listingTargetEl = window.document.querySelector('#listing-featured .list'); 108 if (!listingTargetEl) { 109 // No listing discovered, do not attach. 110 return; 111 } 112 113 const options = { 114 valueNames: ['listing-title','listing-subtitle','listing-image',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }], 115 116 searchColumns: ["listing-title","listing-author","listing-date","listing-image","listing-description"], 117 }; 118 119 window['quarto-listings'] = window['quarto-listings'] || {}; 120 window['quarto-listings']['listing-featured'] = new List('listing-featured', options); 121 122 if (window['quarto-listing-loaded']) { 123 window['quarto-listing-loaded'](); 124 } 125 }); 126 127 window.addEventListener('hashchange',() => { 128 if (window['quarto-listing-loaded']) { 129 window['quarto-listing-loaded'](); 130 } 131 }) 132 133 134 window.document.addEventListener("DOMContentLoaded", function (_event) { 135 const listingTargetEl = window.document.querySelector('#listing-publication .list'); 136 if (!listingTargetEl) { 137 // No listing discovered, do not attach. 138 return; 139 } 140 141 const options = { 142 valueNames: ['listing-title','listing-image',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }], 143 144 searchColumns: [], 145 }; 146 147 window['quarto-listings'] = window['quarto-listings'] || {}; 148 window['quarto-listings']['listing-publication'] = new List('listing-publication', options); 149 150 if (window['quarto-listing-loaded']) { 151 window['quarto-listing-loaded'](); 152 } 153 }); 154 155 window.addEventListener('hashchange',() => { 156 if (window['quarto-listing-loaded']) { 157 window['quarto-listing-loaded'](); 158 } 159 }) 160 161 162 window.document.addEventListener("DOMContentLoaded", function (_event) { 163 const listingTargetEl = window.document.querySelector('#listing-project .list'); 164 if (!listingTargetEl) { 165 // No listing discovered, do not attach. 166 return; 167 } 168 169 const options = { 170 valueNames: ['listing-title','listing-subtitle','listing-image',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }], 171 172 searchColumns: ["listing-title","listing-author","listing-date","listing-image","listing-description"], 173 }; 174 175 window['quarto-listings'] = window['quarto-listings'] || {}; 176 window['quarto-listings']['listing-project'] = new List('listing-project', options); 177 178 if (window['quarto-listing-loaded']) { 179 window['quarto-listing-loaded'](); 180 } 181 }); 182 183 window.addEventListener('hashchange',() => { 184 if (window['quarto-listing-loaded']) { 185 window['quarto-listing-loaded'](); 186 } 187 }) 188 </script>
188 189<link rel="stylesheet" href="../assets/about.css"> 190 191
191<script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6"></script>
191 192
192<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js" type="text/javascript"></script>
192 193
194<script type="text/javascript"> 195const typesetMath = (el) => { 196 if (window.MathJax) { 197 // MathJax Typeset 198 window.MathJax.typeset([el]); 199 } else if (window.katex) { 200 // KaTeX Render 201 var mathElements = el.getElementsByClassName("math"); 202 var macros = []; 203 for (var i = 0; i < mathElements.length; i++) { 204 var texText = mathElements[i].firstChild; 205 if (mathElements[i].tagName == "SPAN") { 206 window.katex.render(texText.data, mathElements[i], { 207 displayMode: mathElements[i].classList.contains('display'), 208 throwOnError: false, 209 macros: macros, 210 fleqn: false 211 }); 212 } 213 } 214 } 215} 216window.Quarto = { 217 typesetMath 218}; 219</script>
219 220 221</head> 222 223<body class="nav-fixed quarto-light"> 224 225<div id="quarto-search-results"></div> 226 <header id="quarto-header" class="headroom fixed-top"> 227 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 228 <div class="navbar-container container-fluid"> 229 <div class="navbar-brand-container mx-auto"> 230 <a href="../index.html" class="navbar-brand navbar-brand-logo"> 231 <img src="../assets/img/evoamphibia_logo.png" alt="" class="navbar-logo"> 232 </a> 233 <a class="navbar-brand" href="../index.html"> 234 <span class="navbar-title">Amphibian Genomics and Evolution Lab</span> 235 </a> 236 </div> 237 <div id="quarto-search" class="" title="Search"></div> 238 <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }"> 239 <span class="navbar-toggler-icon"></span> 240</button> 241 <div class="collapse navbar-collapse" id="navbarCollapse"> 242 <ul class="navbar-nav navbar-nav-scroll ms-auto"> 243 <li class="nav-item"> 244 <a class="nav-link active" href="../about/index.html" aria-current="page"> 245<span class="menu-text">About</span></a> 246 </li> 247 <li class="nav-item"> 248 <a class="nav-link" href="../project/index.html"> 249<span class="menu-text">Projects</span></a> 250 </li> 251 <li class="nav-item"> 252 <a class="nav-link" href="../team/index.html"> 253<span class="menu-text">Team</span></a> 254 </li> 255 <li class="nav-item"> 256 <a class="nav-link" href="../publications/index.html"> 257<span class="menu-text">Publications</span></a> 258 </li> 259 <li class="nav-item"> 260 <a class="nav-link" href="../news/index.html"> 261<span class="menu-text">News</span></a> 262 </li> 263 <li class="nav-item"> 264 <a class="nav-link" href="../featured/index.html"> 265<span class="menu-text">Featured</span></a> 266 </li> 267 <li class="nav-item"> 268 <a class="nav-link" href="../wildlife/index.html"> 269<span class="menu-text">Wildlife</span></a> 270 </li> 271</ul> 272 </div> <!-- /navcollapse --> 273 <div class="quarto-navbar-tools"> 274</div> 275 </div> <!-- /container-fluid --> 276 </nav> 277</header> 278<!-- content --> 279<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar"> 280<!-- sidebar --> 281<!-- margin-sidebar --> 282 283<!-- main --> 284<main class="content column-page" id="quarto-document-content"> 285 286 287 288 289<div class="quarto-about-trestles column-page"> 290 <div class="about-entity"> 291 <img src="sidebar/evoamphibia_logos.png" alt="Frog and DNA logo" class="about-image 292 rounded " style="width: 14em;"> 293<header id="title-block-header" class="quarto-title-block default"> 294<div class="quarto-title"> 295<h1 class="title">Amphibian Genomics and Evolution Lab</h1> 296<p class="subtitle lead">Evolution at different scales: From patterns to mechanisms</p> 297</div> 298<div class="quarto-title-meta column-page"> 299 </div> 300</header> 301 <div class="about-links"> 302 <a href="https://github.com/hcliedtke" class="about-link" rel="" target=""> 303 <i class="bi bi-github"></i> 304 <span class="about-link-text"></span> 305 </a> 306 <a href="https://orcid.org/0000-0002-6221-8043" class="about-link" rel="" target=""> 307 <span class="about-link-text"><i class="ai ai-orcid" aria-label="orcid"></i></span> 308 </a> 309 <a href="https://scholar.google.com/citations?user=Mke2CrAAAAAJ&hl=en" class="about-link" rel="" target=""> 310 <span class="about-link-text"><i class="ai ai-google-scholar" aria-label="google-scholar"></i></span> 311 </a> 312</div> 313 </div> 314 <div class="about-contents"><div id="hero-heading"> 315<div class="h1"> 316What we do 317</div> 318<p>Living amphibians inspire us to think about how the first vertebrates transitioned from aquatic to terrestrial habitats. Despite many millions of years of evolution since then, most amphibians are still tied to fresh water to varying degrees. Perhaps most directly so, because of their complex life cycles. Many species (though not all) have aquatic larval stages, which represent unique ecological, evolutionary and developmental challanges. We, at the Amphibian Genomics and Evolution Lab, at the <a href="https://www.ebd.csic.es/">Biological Station of Doñana</a>, are interested in applying different approaches to studying the evolution of amphibian traits (especially those related to the larval stage and reproductive modes) at different scales. From broad patterns in evolution across species, using comparative phylogenetic methods, down to the molecular mechanisms underlying plastic phenotypic changes, using transcriptomics and genomics.</p> 319<p>If you would like to get in touch <a href="../contact.html">sending us an email</a>! <i class="fa-solid fa-feather-pointed" aria-label="feather-pointed"></i></p> 320</div></div> 321</div> 322 323<!-- end grid --> 324<section id="what-we-have-been-up-to-lately" class="level2"> 325<h2 data-anchor-id="what-we-have-been-up-to-lately">What we have been up to lately â¦</h2> 326<div class="grid"> 327<section id="news" class="level4 g-col-3"> 328<h4 data-anchor-id="news">News</h4> 329<div id="listing-news" class="quarto-listing quarto-listing-container-grid"> 330<div class="list grid quarto-listing-cols-1"> 331<div class="g-col-1" data-index="0" data-categories="Q29tcGFyYXRpdmUlMjBHZW5vbWljcyUyQ1RyYW5zY3JpcHRvbWljcyUyQ1ZpdmlwYXJpdHklMkNUYW56YW5pYQ==" data-listing-date-sort="1756504800000" data-listing-file-modified-sort="1788531482190" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3" data-listing-word-count-sort="554"> 332<a href="../news/grad-student-search/index.html" class="quarto-grid-link"> 333<div class="quarto-grid-item card h-100 card-left"> 334<p class="card-img-top"> 335<img loading="lazy" src="../news/grad-student-search/featured.jpg" class="thumbnail-image card-img" style="height: 200;"> 336</p> 337<div class="card-body post-contents"> 338<h5 class="no-anchor card-title listing-title"> 339Grad student position open! [POSITION FILLED] 340</h5> 341<div class="card-subtitle listing-subtitle"> 342We are looking for a PhD student to join our lab. 343</div> 344</div> 345</div></a> 346</div> 347</div> 348<div class="listing-no-matching d-none">No matching items</div> 349</div> 350<p><a href="../news" class="about-links subtitle">See all â</a></p> 351</section> 352<section id="features-and-press" class="level4 g-col-3"> 353<h4 data-anchor-id="features-and-press">Features and Press</h4> 354<div id="listing-featured" class="quarto-listing quarto-listing-container-grid"> 355<div class="list grid quarto-listing-cols-1"> 356<div class="g-col-1" data-index="0" data-categories="TmV3JTIwU3BlY2llcyUyQ1ZpdmlwYXJvdXMlMkNOZWN0b3Bocnlub2lkZXM=" data-listing-date-sort="1763074800000" data-listing-file-modified-sort="1763156055445" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2" data-listing-word-count-sort="270"> 357<a href="../featured/2025_uhehe/index.html" class="quarto-grid-link"> 358<div class="quarto-grid-item card h-100 card-left"> 359<p class="card-img-top"> 360<img loading="lazy" src="../featured/2025_uhehe/featured.png" class="thumbnail-image card-img" style="height: 200;"> 361</p> 362<div class="card-body post-contents"> 363<h5 class="no-anchor card-title listing-title"> 364Three new viviparous toads 365</h5> 366<div class="card-subtitle listing-subtitle"> 367Using museomics to aid species descriptions. 368</div> 369</div> 370</div></a> 371</div> 372</div> 373<div class="listing-no-matching d-none">No matching items</div> 374</div> 375<p><a href="../featured" class="about-links subtitle">See all â</a></p> 376</section> 377<section id="projects" class="level4 g-col-3"> 378<h4 data-anchor-id="projects">Projects</h4> 379<div id="listing-project" class="quarto-listing quarto-listing-container-grid"> 380<div class="list grid quarto-listing-cols-1"> 381<div class="g-col-1" data-index="0" data-categories="QW1waGliaWFucyUyQ0dlbm9taWNzJTJDVHJhbnNjcmlwdG9taWNzJTJDUGh5bG9nZW9ncmFwaHklMkNQaHlsb2dlbm9taWNzJTJDQnVmb25pZGFl" data-listing-date-sort="1753999200000" data-listing-file-modified-sort="1788531365712" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2" data-listing-word-count-sort="393"> 382<a href="../project/gravid/index.html" class="quarto-grid-link"> 383<div class="quarto-grid-item card h-100 card-left"> 384<p class="card-img-top"> 385<img loading="lazy" src="../project/gravid/avatar.jpg" class="thumbnail-image card-img" style="height: 200;"> 386</p> 387<div class="card-body post-contents"> 388<h5 class="no-anchor card-title listing-title"> 389GRAViD 390</h5> 391<div class="card-subtitle listing-subtitle"> 392Genomic Regulation of Amphibian Viviparous Development. 393</div> 394</div> 395</div></a> 396</div> 397</div> 398<div class="listing-no-matching d-none">No matching items</div> 399</div> 400<p><a href="../project" class="about-links subtitle">See all â</a></p> 401</section> 402<section id="publications" class="level4 g-col-3"> 403<h4 data-anchor-id="publications">Publications</h4> 404<div id="listing-publication" class="quarto-listing quarto-listing-container-grid"> 405<div class="list grid quarto-listing-cols-1"> 406 407</div> 408<div class="listing-no-matching d-none">No matching items</div> 409</div> 410<p><a href="../publications" class="about-links subtitle">See all â</a></p> 411</section> 412</div> 413 414 415 416 417</section> 418
419<a onclick="window.scrollTo(0, 0); return false;" role="button" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a></main> <!-- /main -->
420<script id="quarto-html-after-body" type="application/javascript"> 421 window.document.addEventListener("DOMContentLoaded", function (event) { 422 const isCodeAnnotation = (el) => { 423 for (const clz of el.classList) { 424 if (clz.startsWith('code-annotation-')) { 425 return true; 426 } 427 } 428 return false; 429 } 430 const onCopySuccess = function(e) { 431 // button target 432 const button = e.trigger; 433 // don't keep focus 434 button.blur(); 435 // flash "checked" 436 button.classList.add('code-copy-button-checked'); 437 var currentTitle = button.getAttribute("title"); 438 button.setAttribute("title", "Copied!"); 439 let tooltip; 440 if (window.bootstrap) { 441 button.setAttribute("data-bs-toggle", "tooltip"); 442 button.setAttribute("data-bs-placement", "left"); 443 button.setAttribute("data-bs-title", "Copied!"); 444 tooltip = new bootstrap.Tooltip(button, 445 { trigger: "manual", 446 customClass: "code-copy-button-tooltip", 447 offset: [0, -8]}); 448 tooltip.show(); 449 } 450 setTimeout(function() { 451 if (tooltip) { 452 tooltip.hide(); 453 button.removeAttribute("data-bs-title"); 454 button.removeAttribute("data-bs-toggle"); 455 button.removeAttribute("data-bs-placement"); 456 } 457 button.setAttribute("title", currentTitle); 458 button.classList.remove('code-copy-button-checked'); 459 }, 1000); 460 // clear code selection 461 e.clearSelection(); 462 } 463 const getTextToCopy = function(trigger) { 464 const codeEl = trigger.previousElementSibling.cloneNode(true); 465 for (const childEl of codeEl.children) { 466 if (isCodeAnnotation(childEl)) { 467 childEl.remove(); 468 } 469 } 470 return codeEl.innerText; 471 } 472 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 473 text: getTextToCopy 474 }); 475 clipboard.on('success', onCopySuccess); 476 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 477 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 478 text: getTextToCopy, 479 container: window.document.getElementById('quarto-embedded-source-code-modal') 480 }); 481 clipboardModal.on('success', onCopySuccess); 482 } 483 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 484 var mailtoRegex = new RegExp(/^mailto:/); 485 var filterRegex = new RegExp("https:\/\/www\.christophliedtke\.com"); 486 var isInternal = (href) => { 487 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 488 } 489 // Inspect non-navigation links and adorn them if external 490 var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)'); 491 for (var i=0; i<links.length; i++) { 492 const link = links[i]; 493 if (!isInternal(link.href)) { 494 // undo the damage that might have been done by quarto-nav.js in the case of 495 // links that we want to consider external 496 if (link.dataset.originalHref !== undefined) { 497 link.href = link.dataset.originalHref; 498 } 499 } 500 } 501 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 502 const config = { 503 allowHTML: true, 504 maxWidth: 500, 505 delay: 100, 506 arrow: false, 507 appendTo: function(el) { 508 return el.parentElement; 509 }, 510 interactive: true, 511 interactiveBorder: 10, 512 theme: 'quarto', 513 placement: 'bottom-start', 514 }; 515 if (contentFn) { 516 config.content = contentFn; 517 } 518 if (onTriggerFn) { 519 config.onTrigger = onTriggerFn; 520 } 521 if (onUntriggerFn) { 522 config.onUntrigger = onUntriggerFn; 523 } 524 window.tippy(el, config); 525 } 526 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 527 for (var i=0; i<noterefs.length; i++) { 528 const ref = noterefs[i]; 529 tippyHover(ref, function() { 530 // use id or data attribute instead here 531 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 532 try { href = new URL(href).hash; } catch {} 533 const id = href.replace(/^#\/?/, ""); 534 const note = window.document.getElementById(id); 535 if (note) { 536 return note.innerHTML; 537 } else { 538 return ""; 539 } 540 }); 541 } 542 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 543 const processXRef = (id, note) => { 544 // Strip column container classes 545 const stripColumnClz = (el) => { 546 el.classList.remove("page-full", "page-columns"); 547 if (el.children) { 548 for (const child of el.children) {
549 stripColumnClz(child); 550 } 551 } 552 } 553 stripColumnClz(note) 554 if (id === null || id.startsWith('sec-')) { 555 // Special case sections, only their first couple elements 556 const container = document.createElement("div"); 557 if (note.children && note.children.length > 2) { 558 container.appendChild(note.children[0].cloneNode(true)); 559 for (let i = 1; i < note.children.length; i++) { 560 const child = note.children[i]; 561 if (child.tagName === "P" && child.innerText === "") { 562 continue; 563 } else { 564 container.appendChild(child.cloneNode(true)); 565 break; 566 } 567 } 568 if (window.Quarto?.typesetMath) { 569 window.Quarto.typesetMath(container); 570 } 571 return container.innerHTML 572 } else { 573 if (window.Quarto?.typesetMath) { 574 window.Quarto.typesetMath(note); 575 } 576 return note.innerHTML; 577 } 578 } else { 579 // Remove any anchor links if they are present 580 const anchorLink = note.querySelector('a.anchorjs-link'); 581 if (anchorLink) { 582 anchorLink.remove(); 583 } 584 if (window.Quarto?.typesetMath) { 585 window.Quarto.typesetMath(note); 586 } 587 if (note.classList.contains("callout")) { 588 return note.outerHTML; 589 } else { 590 return note.innerHTML; 591 } 592 } 593 } 594 for (var i=0; i<xrefs.length; i++) { 595 const xref = xrefs[i]; 596 tippyHover(xref, undefined, function(instance) { 597 instance.disable(); 598 let url = xref.getAttribute('href'); 599 let hash = undefined; 600 if (url.startsWith('#')) { 601 hash = url; 602 } else { 603 try { hash = new URL(url).hash; } catch {} 604 } 605 if (hash) { 606 const id = hash.replace(/^#\/?/, ""); 607 const note = window.document.getElementById(id); 608 if (note !== null) { 609 try { 610 const html = processXRef(id, note.cloneNode(true)); 611 instance.setContent(html); 612 } finally { 613 instance.enable(); 614 instance.show(); 615 } 616 } else { 617 // See if we can fetch this 618 fetch(url.split('#')[0]) 619 .then(res => res.text()) 620 .then(html => { 621 const parser = new DOMParser(); 622 const htmlDoc = parser.parseFromString(html, "text/html"); 623 const note = htmlDoc.getElementById(id); 624 if (note !== null) { 625 const html = processXRef(id, note); 626 instance.setContent(html); 627 } 628 }).finally(() => { 629 instance.enable(); 630 instance.show(); 631 }); 632 } 633 } else { 634 // See if we can fetch a full url (with no hash to target) 635 // This is a special case and we should probably do some content thinning / targeting 636 fetch(url) 637 .then(res => res.text()) 638 .then(html => { 639 const parser = new DOMParser(); 640 const htmlDoc = parser.parseFromString(html, "text/html"); 641 const note = htmlDoc.querySelector('main.content'); 642 if (note !== null) { 643 // This should only happen for chapter cross references 644 // (since there is no id in the URL) 645 // remove the first header 646 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 647 note.children[0].remove(); 648 } 649 const html = processXRef(null, note); 650 instance.setContent(html); 651 } 652 }).finally(() => { 653 instance.enable(); 654 instance.show(); 655 }); 656 } 657 }, function(instance) { 658 }); 659 } 660 let selectedAnnoteEl; 661 const selectorForAnnotation = ( cell, annotation) => { 662 let cellAttr = 'data-code-cell="' + cell + '"'; 663 let lineAttr = 'data-code-annotation="' + annotation + '"'; 664 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 665 return selector; 666 } 667 const selectCodeLines = (annoteEl) => { 668 const doc = window.document; 669 const targetCell = annoteEl.getAttribute("data-target-cell"); 670 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 671 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 672 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 673 const lineIds = lines.map((line) => { 674 return targetCell + "-" + line; 675 }) 676 let top = null; 677 let height = null; 678 let parent = null; 679 if (lineIds.length > 0) { 680 //compute the position of the single el (top and bottom and make a div) 681 const el = window.document.getElementById(lineIds[0]); 682 top = el.offsetTop; 683 height = el.offsetHeight; 684 parent = el.parentElement.parentElement; 685 if (lineIds.length > 1) { 686 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 687 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 688 height = bottom - top; 689 } 690 if (top !== null && height !== null && parent !== null) { 691 // cook up a div (if necessary) and position it 692 let div = window.document.getElementById("code-annotation-line-highlight"); 693 if (div === null) { 694 div = window.document.createElement("div"); 695 div.setAttribute("id", "code-annotation-line-highlight"); 696 div.style.position = 'absolute'; 697 parent.appendChild(div); 698 } 699 div.style.top = top - 2 + "px"; 700 div.style.height = height + 4 + "px"; 701 div.style.left = 0; 702 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 703 if (gutterDiv === null) { 704 gutterDiv = window.document.createElement("div"); 705 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 706 gutterDiv.style.position = 'absolute'; 707 const codeCell = window.document.getElementById(targetCell); 708 const gutter = codeCell.querySelector('.code-annotation-gutter'); 709 gutter.appendChild(gutterDiv); 710 } 711 gutterDiv.style.top = top - 2 + "px"; 712 gutterDiv.style.height = height + 4 + "px"; 713 } 714 selectedAnnoteEl = annoteEl; 715 } 716 }; 717 const unselectCodeLines = () => { 718 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 719 elementsIds.forEach((elId) => { 720 const div = window.document.getElementById(elId); 721 if (div) { 722 div.remove(); 723 } 724 }); 725 selectedAnnoteEl = undefined; 726 }; 727 // Handle positioning of the toggle 728 window.addEventListener( 729 "resize", 730 throttle(() => { 731 elRect = undefined; 732 if (selectedAnnoteEl) { 733 selectCodeLines(selectedAnnoteEl); 734 } 735 }, 10) 736 ); 737 function throttle(fn, ms) { 738 let throttle = false;
739 let timer; 740 return (...args) => { 741 if(!throttle) { // first call gets through 742 fn.apply(this, args); 743 throttle = true; 744 } else { // all the others get throttled 745 if(timer) clearTimeout(timer); // cancel #2 746 timer = setTimeout(() => { 747 fn.apply(this, args); 748 timer = throttle = false; 749 }, ms); 750 } 751 }; 752 } 753 // Attach click handler to the DT 754 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 755 for (const annoteDlNode of annoteDls) { 756 annoteDlNode.addEventListener('click', (event) => { 757 const clickedEl = event.target; 758 if (clickedEl !== selectedAnnoteEl) { 759 unselectCodeLines(); 760 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 761 if (activeEl) { 762 activeEl.classList.remove('code-annotation-active'); 763 } 764 selectCodeLines(clickedEl); 765 clickedEl.classList.add('code-annotation-active'); 766 } else { 767 // Unselect the line 768 unselectCodeLines(); 769 clickedEl.classList.remove('code-annotation-active'); 770 } 771 }); 772 } 773 const findCites = (el) => { 774 const parentEl = el.parentElement; 775 if (parentEl) { 776 const cites = parentEl.dataset.cites; 777 if (cites) { 778 return { 779 el, 780 cites: cites.split(' ') 781 }; 782 } else { 783 return findCites(el.parentElement) 784 } 785 } else { 786 return undefined; 787 } 788 }; 789 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 790 for (var i=0; i<bibliorefs.length; i++) { 791 const ref = bibliorefs[i]; 792 const citeInfo = findCites(ref); 793 if (citeInfo) { 794 tippyHover(citeInfo.el, function() { 795 var popup = window.document.createElement('div'); 796 citeInfo.cites.forEach(function(cite) { 797 var citeDiv = window.document.createElement('div'); 798 citeDiv.classList.add('hanging-indent'); 799 citeDiv.classList.add('csl-entry'); 800 var biblioDiv = window.document.getElementById('ref-' + cite); 801 if (biblioDiv) { 802 citeDiv.innerHTML = biblioDiv.innerHTML; 803 } 804 popup.appendChild(citeDiv); 805 }); 806 return popup.innerHTML; 807 }); 808 } 809 } 810 }); 811 </script>
vendor: 1 bytes, line 811
811
812<script src="https://utteranc.es/client.js" repo="hcliedtke/website" issue-term="title" theme="body-light" crossorigin="anonymous" async=""> 813</script>
813 814</div> <!-- /content --> 815<footer class="footer"> 816 <div class="nav-footer"> 817 <div class="nav-footer-left"> 818<p>© 2025 H. Christoph Liedtke â Made with <a href="https://quarto.org">Quarto</a></p> 819</div> 820 <div class="nav-footer-center"> 821<p><a class="link-dark me-1" href="https://github.com/hcliedtke" title="github" target="_blank" rel="noopener"><i class="fa-brands fa-github" aria-label="github"></i></a> <a class="link-dark me-1" href="https://orcid.org/0000-0002-6221-8043" title="orcid" target="_blank" rel="noopener"><i class="ai ai-orcid" aria-label="orcid"></i></a> <a class="link-dark me-1" href="https://scholar.google.com/citations?user=Mke2CrAAAAAJ&hl=en" title="Google Scholar" target="_blank" rel="noopener"><i class="ai ai-google-scholar" aria-label="google-scholar"></i></a></p> 822</div> 823 <div class="nav-footer-right"> 824 <ul class="footer-items list-unstyled"> 825 <li class="nav-item"> 826 <a class="nav-link" href="../contact.html"> 827<p>Contact</p> 828</a> 829 </li> 830 <li class="nav-item"> 831 <a class="nav-link" href="../license.html"> 832<p>License</p> 833</a> 834 </li> 835</ul> 836 </div> 837 </div> 838</footer> 839 840 841 842 843</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.