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.6.39"> 6 7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 8 9 10<title>Teaching â Elisabetta Pietrostefani</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/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 27
27
28<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 28
28
29<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-search/quarto-search.js"></script>
30 31<meta name="quarto:offset" content="./"> 32<link href="./assets/favicon.svg" rel="icon" type="image/svg+xml">
33<script src="site_libs/quarto-html/quarto.js"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
35 36<link href="site_libs/quarto-html/tippy.css" rel="stylesheet"> 37<link href="site_libs/quarto-html/quarto-syntax-highlighting-e26003cea8cd680ca0c55a263523d882.css" rel="stylesheet" id="quarto-text-highlighting-styles">
38<script src="site_libs/bootstrap/bootstrap.min.js"></script>
38 39<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> 40<link href="site_libs/bootstrap/bootstrap-518349efc12e5c6411259d03c752f14e.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
41<script id="quarto-search-options" type="application/json">{ 42 "location": "navbar", 43 "copy-button": false, 44 "collapse-after": 3, 45 "panel-placement": "end", 46 "type": "overlay", 47 "limit": 50, 48 "keyboard-shortcut": [ 49 "f", 50 "/", 51 "s" 52 ], 53 "show-item-context": false, 54 "language": { 55 "search-no-results-text": "No results", 56 "search-matching-documents-text": "matching documents", 57 "search-copy-link-title": "Copy link to search", 58 "search-hide-matches-text": "Hide additional matches", 59 "search-more-match-text": "more match in this document", 60 "search-more-matches-text": "more matches in this document", 61 "search-clear-button-title": "Clear", 62 "search-text-placeholder": "", 63 "search-detached-cancel-button-title": "Cancel", 64 "search-submit-button-title": "Submit", 65 "search-label": "Search" 66 } 67}</script>
67 68<style>html{ scroll-behavior: smooth; }</style> 69<link rel="icon" href="./favicon.ico?v=4" sizes="any"> 70<link rel="shortcut icon" href="./favicon.ico?v=4" type="image/x-icon"> 71<link rel="icon" href="./favicon-v3.ico" sizes="any"> 72<link rel="icon" href="./assets/favicon.svg?v=4" type="image/svg+xml"> 73<link rel="apple-touch-icon" href="./apple-touch-icon.png?v=4"> 74 75 76</head> 77 78<body class="nav-fixed fullcontent"> 79 80<div id="quarto-search-results"></div> 81 <header id="quarto-header" class="headroom fixed-top"> 82 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 83 <div class="navbar-container container-fluid"> 84 <div class="navbar-brand-container mx-auto"> 85 <a class='navbar-brand' href='/'> 86 <span class="navbar-title">Elisabetta Pietrostefani</span> 87 </a> 88 </div> 89 <div id="quarto-search" class="" title="Search"></div> 90 <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(); }"> 91 <span class="navbar-toggler-icon"></span> 92</button> 93 <div class="collapse navbar-collapse" id="navbarCollapse"> 94 <ul class="navbar-nav navbar-nav-scroll me-auto"> 95 <li class="nav-item"> 96 <a class='nav-link' href='/projects'> 97<span class="menu-text">Projects</span></a> 98 </li> 99 <li class="nav-item"> 100 <a class='nav-link' href='/papers'> 101<span class="menu-text">Publications</span></a> 102 </li> 103 <li class="nav-item"> 104 <a aria-current='page' class='nav-link active' href='/courses'> 105<span class="menu-text">Teaching</span></a> 106 </li> 107 <li class="nav-item"> 108 <a class='nav-link' href='/log'> 109<span class="menu-text">Log</span></a> 110 </li> 111</ul> 112 </div> <!-- /navcollapse --> 113 <div class="quarto-navbar-tools"> 114</div> 115 </div> <!-- /container-fluid --> 116 </nav> 117</header> 118<!-- content --> 119<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar"> 120<!-- sidebar --> 121<!-- margin-sidebar --> 122 123<!-- main --> 124<main class="content" id="quarto-document-content"> 125 126<header id="title-block-header" class="quarto-title-block default"> 127<div class="quarto-title"> 128<h1 class="title">Teaching</h1> 129</div> 130 131 132 133<div class="quarto-title-meta"> 134 135 136 137 138 </div> 139 140 141 142</header> 143 144 145<section id="current" class="level2"> 146<h2 data-anchor-id="current">Current</h2> 147<div class="media-grid"> 148<div class="media-card"> 149<p><img src="content/courses/gdsl_density_africa.jpg" class="img-fluid" alt="Geographic Data Science course preview"></p> 150<section id="geographic-data-science" class="level3"> 151<h3 data-anchor-id="geographic-data-science">Geographic Data Science</h3> 152<p><span class="meta">The intersection of GIS and Data Science, applied to real-world problems in R and Python. Co-taught with Dr Carmen Cabrera. UG/MSc, Liverpool.</span></p> 153<p><a href="https://gdsl-ul.github.io/gds/">Course website</a></p> 154</section> 155</div> 156<div class="media-card"> 157<p><img src="content/courses/adv_geovis.jpg" class="img-fluid" alt="Advanced Geovisualisation course preview"></p> 158<section id="advanced-geovisualisation" class="level3"> 159<h3 data-anchor-id="advanced-geovisualisation">Advanced Geovisualisation</h3> 160<p><span class="meta">Modern web mapping and interactive geovisualisation for spatial data in Python. MSc, Liverpool.</span></p> 161<p><a href="https://gdsl-ul.github.io/wma/">Course website</a></p> 162</section> 163</div> 164<div class="media-card"> 165<p><img src="content/courses/css.png" class="img-fluid" alt="Population Data Science course preview"></p> 166<section id="computational-social-science" class="level3"> 167<h3 data-anchor-id="computational-social-science">Computational Social Science</h3> 168<p><span class="meta">Data science methods for social science questions: supervised and unsupervised machine learning, network analysis, and time series. Co-designed with Prof Francisco Rowe and Dr Carmen Cabrera. MSc, Liverpool.</span></p> 169<p><a href="https://www.population-science.net/">Course website</a></p> 170</section> 171</div> 172<div class="media-card"> 173<p><img src="content/courses/Imago_training.JPG" class="img-fluid" alt="IMAGO training course preview"></p> 174<section id="imago-training" class="level3"> 175<h3 data-anchor-id="imago-training">IMAGO Training</h3> 176<p><span class="meta">Hands-on training in imagery data for research on sustainability, prosperity, and wellbeing. Part of the ESRC SDR-UK Imago Data Service.</span></p> 177<p><a href="https://imago-sdruk.github.io/Imago_training/">Course website</a></p> 178</section> 179</div> 180<div class="media-card"> 181<p><img src="content/courses/r_carto.png" class="img-fluid" alt="RCarto training preview"></p> 182<section id="rcarto-spatial-data-science-with-r-or-python-in-french" class="level3"> 183<h3 data-anchor-id="rcarto-spatial-data-science-with-r-or-python-in-french">RCarto â Spatial data science with R or Python in French</h3> 184<p><span class="meta">Two-day hands-on training in spatial data science with R â from mapping and reprojection to geoprocessing and spatial interpolation. Uses real data from London, Paris, and Corsica. Delivered in French.</span></p> 185<p><a href="https://pietrostefani.github.io/Rcarto/">Course website</a>
185 · <a href="mailto:[email protected]?subject=Training%20enquiry">Get in touch</a> for similar training</p> 186</section> 187</div> 188</div> 189</section> 190<section id="past" class="level2"> 191<h2 data-anchor-id="past">Past</h2> 192<div class="media-grid"> 193<div class="media-card"> 194<p><img src="content/courses/osm.jpg" class="img-fluid" alt="Applied Geographic Data Science course preview"></p> 195<section id="applied-geographic-data-science" class="level3"> 196<h3 data-anchor-id="applied-geographic-data-science">Applied Geographic Data Science</h3> 197<p><span class="meta">Applied GIS techniques for social science research in QGIS and R. MSc, LSE (2021â2023).</span></p> 198<p><a href="https://www.lse.ac.uk/resources/calendar2025-2026/courseGuides/GY/2025_GY476.htm">Course website</a></p> 199</section> 200</div> 201<div class="media-card"> 202<p><img src="content/courses/gy245.jpg" class="img-fluid" alt="Quantitative Methods in Geography course preview"></p> 203<section id="quantitative-methods-in-geography" class="level3"> 204<h3 data-anchor-id="quantitative-methods-in-geography">Quantitative Methods in Geography</h3> 205<p><span class="meta">Regression analysis and GIS foundations for geographical research. BSc, LSE (2016â2017).</span></p> 206<p><a href="https://www.lse.ac.uk/resources/calendar2025-2026/courseGuides/GY/2025_GY245.htm">Course website</a></p> 207</section> 208</div> 209<div class="media-card"> 210<p><img src="content/courses/econ_geo.jpeg" class="img-fluid" alt="Introduction to Geographical Research course preview"></p> 211<section id="introduction-to-geographical-research" class="level3"> 212<h3 data-anchor-id="introduction-to-geographical-research">Introduction to Geographical Research</h3> 213<p><span class="meta">Foundations of geographical research methods and quantitative analysis in Stata. BA, LSE (2019).</span></p> 214</section> 215</div> 216<div class="media-card"> 217<p><img src="content/courses/fig9_bis.jpg" class="img-fluid" alt="ArcGIS for Urban Planners course preview"></p> 218<section id="arcgis-for-urban-planners" class="level3"> 219<h3 data-anchor-id="arcgis-for-urban-planners">ArcGIS for Urban Planners</h3> 220<p><span class="meta">GIS analysis techniques for regional and urban planning research. MSc, LSE (2017â2020).</span></p> 221</section> 222</div> 223<div class="media-card"> 224<p><img src="content/courses/Beirut_pp.JPG" class="img-fluid" alt="Prosperity Index Citizen Science Training preview"></p> 225<section id="prosperity-index-citizen-science-training" class="level3"> 226<h3 data-anchor-id="prosperity-index-citizen-science-training">Prosperity Index Citizen Science Training</h3> 227<p><span class="meta">Workshop series on citizen science data collection methods for urban prosperity research. RELIEF Centre, UCL (2019â2020).</span></p> 228</section> 229</div> 230</div> 231 232 233</section> 234 235</main> <!-- /main -->
236<script src="assets/menu.js"></script>
vendor: 1 bytes, line 236
236
237<script id="quarto-html-after-body" type="application/javascript"> 238window.document.addEventListener("DOMContentLoaded", function (event) { 239 const toggleBodyColorMode = (bsSheetEl) => { 240 const mode = bsSheetEl.getAttribute("data-mode"); 241 const bodyEl = window.document.querySelector("body"); 242 if (mode === "dark") { 243 bodyEl.classList.add("quarto-dark"); 244 bodyEl.classList.remove("quarto-light"); 245 } else { 246 bodyEl.classList.add("quarto-light"); 247 bodyEl.classList.remove("quarto-dark"); 248 } 249 } 250 const toggleBodyColorPrimary = () => { 251 const bsSheetEl = window.document.querySelector("link#quarto-bootstrap"); 252 if (bsSheetEl) { 253 toggleBodyColorMode(bsSheetEl); 254 } 255 } 256 toggleBodyColorPrimary(); 257 const isCodeAnnotation = (el) => { 258 for (const clz of el.classList) { 259 if (clz.startsWith('code-annotation-')) { 260 return true; 261 } 262 } 263 return false; 264 } 265 const onCopySuccess = function(e) { 266 // button target 267 const button = e.trigger; 268 // don't keep focus 269 button.blur(); 270 // flash "checked" 271 button.classList.add('code-copy-button-checked'); 272 var currentTitle = button.getAttribute("title"); 273 button.setAttribute("title", "Copied!"); 274 let tooltip; 275 if (window.bootstrap) { 276 button.setAttribute("data-bs-toggle", "tooltip"); 277 button.setAttribute("data-bs-placement", "left"); 278 button.setAttribute("data-bs-title", "Copied!"); 279 tooltip = new bootstrap.Tooltip(button, 280 { trigger: "manual", 281 customClass: "code-copy-button-tooltip", 282 offset: [0, -8]}); 283 tooltip.show(); 284 } 285 setTimeout(function() { 286 if (tooltip) { 287 tooltip.hide(); 288 button.removeAttribute("data-bs-title"); 289 button.removeAttribute("data-bs-toggle"); 290 button.removeAttribute("data-bs-placement"); 291 } 292 button.setAttribute("title", currentTitle); 293 button.classList.remove('code-copy-button-checked'); 294 }, 1000); 295 // clear code selection 296 e.clearSelection(); 297 } 298 const getTextToCopy = function(trigger) { 299 const codeEl = trigger.previousElementSibling.cloneNode(true); 300 for (const childEl of codeEl.children) { 301 if (isCodeAnnotation(childEl)) { 302 childEl.remove(); 303 } 304 } 305 return codeEl.innerText; 306 } 307 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 308 text: getTextToCopy 309 }); 310 clipboard.on('success', onCopySuccess); 311 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 312 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 313 text: getTextToCopy, 314 container: window.document.getElementById('quarto-embedded-source-code-modal') 315 }); 316 clipboardModal.on('success', onCopySuccess); 317 } 318 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 319 var mailtoRegex = new RegExp(/^mailto:/); 320 var filterRegex = new RegExp("https:\/\/pietrostefani\.com"); 321 var isInternal = (href) => { 322 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 323 } 324 // Inspect non-navigation links and adorn them if external 325 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)'); 326 for (var i=0; i<links.length; i++) { 327 const link = links[i]; 328 if (!isInternal(link.href)) { 329 // undo the damage that might have been done by quarto-nav.js in the case of 330 // links that we want to consider external 331 if (link.dataset.originalHref !== undefined) { 332 link.href = link.dataset.originalHref; 333 } 334 } 335 } 336 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 337 const config = { 338 allowHTML: true, 339 maxWidth: 500, 340 delay: 100, 341 arrow: false, 342 appendTo: function(el) { 343 return el.parentElement; 344 }, 345 interactive: true, 346 interactiveBorder: 10, 347 theme: 'quarto', 348 placement: 'bottom-start', 349 }; 350 if (contentFn) { 351 config.content = contentFn; 352 } 353 if (onTriggerFn) { 354 config.onTrigger = onTriggerFn; 355 } 356 if (onUntriggerFn) { 357 config.onUntrigger = onUntriggerFn; 358 } 359 window.tippy(el, config); 360 } 361 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 362 for (var i=0; i<noterefs.length; i++) { 363 const ref = noterefs[i]; 364 tippyHover(ref, function() { 365 // use id or data attribute instead here 366 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
367 try { href = new URL(href).hash; } catch {} 368 const id = href.replace(/^#\/?/, ""); 369 const note = window.document.getElementById(id); 370 if (note) { 371 return note.innerHTML; 372 } else { 373 return ""; 374 } 375 }); 376 } 377 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 378 const processXRef = (id, note) => { 379 // Strip column container classes 380 const stripColumnClz = (el) => { 381 el.classList.remove("page-full", "page-columns"); 382 if (el.children) { 383 for (const child of el.children) { 384 stripColumnClz(child); 385 } 386 } 387 } 388 stripColumnClz(note) 389 if (id === null || id.startsWith('sec-')) { 390 // Special case sections, only their first couple elements 391 const container = document.createElement("div"); 392 if (note.children && note.children.length > 2) { 393 container.appendChild(note.children[0].cloneNode(true)); 394 for (let i = 1; i < note.children.length; i++) { 395 const child = note.children[i]; 396 if (child.tagName === "P" && child.innerText === "") { 397 continue; 398 } else { 399 container.appendChild(child.cloneNode(true)); 400 break; 401 } 402 } 403 if (window.Quarto?.typesetMath) { 404 window.Quarto.typesetMath(container); 405 } 406 return container.innerHTML 407 } else { 408 if (window.Quarto?.typesetMath) { 409 window.Quarto.typesetMath(note); 410 } 411 return note.innerHTML; 412 } 413 } else { 414 // Remove any anchor links if they are present 415 const anchorLink = note.querySelector('a.anchorjs-link'); 416 if (anchorLink) { 417 anchorLink.remove(); 418 } 419 if (window.Quarto?.typesetMath) { 420 window.Quarto.typesetMath(note); 421 } 422 if (note.classList.contains("callout")) { 423 return note.outerHTML; 424 } else { 425 return note.innerHTML; 426 } 427 } 428 } 429 for (var i=0; i<xrefs.length; i++) { 430 const xref = xrefs[i]; 431 tippyHover(xref, undefined, function(instance) { 432 instance.disable(); 433 let url = xref.getAttribute('href'); 434 let hash = undefined; 435 if (url.startsWith('#')) { 436 hash = url; 437 } else { 438 try { hash = new URL(url).hash; } catch {} 439 } 440 if (hash) { 441 const id = hash.replace(/^#\/?/, ""); 442 const note = window.document.getElementById(id); 443 if (note !== null) { 444 try { 445 const html = processXRef(id, note.cloneNode(true)); 446 instance.setContent(html); 447 } finally { 448 instance.enable(); 449 instance.show(); 450 } 451 } else { 452 // See if we can fetch this 453 fetch(url.split('#')[0]) 454 .then(res => res.text()) 455 .then(html => { 456 const parser = new DOMParser(); 457 const htmlDoc = parser.parseFromString(html, "text/html"); 458 const note = htmlDoc.getElementById(id); 459 if (note !== null) { 460 const html = processXRef(id, note); 461 instance.setContent(html); 462 } 463 }).finally(() => { 464 instance.enable(); 465 instance.show(); 466 }); 467 } 468 } else { 469 // See if we can fetch a full url (with no hash to target) 470 // This is a special case and we should probably do some content thinning / targeting 471 fetch(url) 472 .then(res => res.text()) 473 .then(html => { 474 const parser = new DOMParser(); 475 const htmlDoc = parser.parseFromString(html, "text/html"); 476 const note = htmlDoc.querySelector('main.content'); 477 if (note !== null) { 478 // This should only happen for chapter cross references 479 // (since there is no id in the URL) 480 // remove the first header 481 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 482 note.children[0].remove(); 483 } 484 const html = processXRef(null, note); 485 instance.setContent(html); 486 } 487 }).finally(() => { 488 instance.enable(); 489 instance.show(); 490 }); 491 } 492 }, function(instance) { 493 }); 494 } 495 let selectedAnnoteEl; 496 const selectorForAnnotation = ( cell, annotation) => { 497 let cellAttr = 'data-code-cell="' + cell + '"'; 498 let lineAttr = 'data-code-annotation="' + annotation + '"'; 499 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 500 return selector; 501 } 502 const selectCodeLines = (annoteEl) => { 503 const doc = window.document; 504 const targetCell = annoteEl.getAttribute("data-target-cell"); 505 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 506 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 507 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 508 const lineIds = lines.map((line) => { 509 return targetCell + "-" + line; 510 }) 511 let top = null; 512 let height = null; 513 let parent = null; 514 if (lineIds.length > 0) { 515 //compute the position of the single el (top and bottom and make a div) 516 const el = window.document.getElementById(lineIds[0]); 517 top = el.offsetTop; 518 height = el.offsetHeight; 519 parent = el.parentElement.parentElement; 520 if (lineIds.length > 1) { 521 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 522 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 523 height = bottom - top; 524 } 525 if (top !== null && height !== null && parent !== null) { 526 // cook up a div (if necessary) and position it 527 let div = window.document.getElementById("code-annotation-line-highlight"); 528 if (div === null) { 529 div = window.document.createElement("div"); 530 div.setAttribute("id", "code-annotation-line-highlight"); 531 div.style.position = 'absolute'; 532 parent.appendChild(div); 533 } 534 div.style.top = top - 2 + "px"; 535 div.style.height = height + 4 + "px"; 536 div.style.left = 0; 537 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 538 if (gutterDiv === null) { 539 gutterDiv = window.document.createElement("div"); 540 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 541 gutterDiv.style.position = 'absolute'; 542 const codeCell = window.document.getElementById(targetCell); 543 const gutter = codeCell.querySelector('.code-annotation-gutter'); 544 gutter.appendChild(gutterDiv); 545 } 546 gutterDiv.style.top = top - 2 + "px"; 547 gutterDiv.style.height = height + 4 + "px"; 548 } 549 selectedAnnoteEl = annoteEl; 550 } 551 }; 552 const unselectCodeLines = () => { 553 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 554 elementsIds.forEach((elId) => { 555 const div = window.document.getElementById(elId); 556 if (div) { 557 div.remove(); 558 } 559 }); 560 selectedAnnoteEl = undefined; 561 }; 562 // Handle positioning of the toggle 563 window.addEventListener( 564 "resize", 565 throttle(() => { 566 elRect = undefined; 567 if (selectedAnnoteEl) { 568 selectCodeLines(selectedAnnoteEl); 569 } 570 }, 10) 571 ); 572 function throttle(fn, ms) { 573 let throttle = false;
574 let timer; 575 return (...args) => { 576 if(!throttle) { // first call gets through 577 fn.apply(this, args); 578 throttle = true; 579 } else { // all the others get throttled 580 if(timer) clearTimeout(timer); // cancel #2 581 timer = setTimeout(() => { 582 fn.apply(this, args); 583 timer = throttle = false; 584 }, ms); 585 } 586 }; 587 } 588 // Attach click handler to the DT 589 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 590 for (const annoteDlNode of annoteDls) { 591 annoteDlNode.addEventListener('click', (event) => { 592 const clickedEl = event.target; 593 if (clickedEl !== selectedAnnoteEl) { 594 unselectCodeLines(); 595 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 596 if (activeEl) { 597 activeEl.classList.remove('code-annotation-active'); 598 } 599 selectCodeLines(clickedEl); 600 clickedEl.classList.add('code-annotation-active'); 601 } else { 602 // Unselect the line 603 unselectCodeLines(); 604 clickedEl.classList.remove('code-annotation-active'); 605 } 606 }); 607 } 608 const findCites = (el) => { 609 const parentEl = el.parentElement; 610 if (parentEl) { 611 const cites = parentEl.dataset.cites; 612 if (cites) { 613 return { 614 el, 615 cites: cites.split(' ') 616 }; 617 } else { 618 return findCites(el.parentElement) 619 } 620 } else { 621 return undefined; 622 } 623 }; 624 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 625 for (var i=0; i<bibliorefs.length; i++) { 626 const ref = bibliorefs[i]; 627 const citeInfo = findCites(ref); 628 if (citeInfo) { 629 tippyHover(citeInfo.el, function() { 630 var popup = window.document.createElement('div'); 631 citeInfo.cites.forEach(function(cite) { 632 var citeDiv = window.document.createElement('div'); 633 citeDiv.classList.add('hanging-indent'); 634 citeDiv.classList.add('csl-entry'); 635 var biblioDiv = window.document.getElementById('ref-' + cite); 636 if (biblioDiv) { 637 citeDiv.innerHTML = biblioDiv.innerHTML; 638 } 639 popup.appendChild(citeDiv); 640 }); 641 return popup.innerHTML; 642 }); 643 } 644 } 645}); 646</script>
646 647</div> <!-- /content --> 648<footer class="footer"> 649 <div class="nav-footer"> 650 <div class="nav-footer-left"> 651<p>© 2026 Elisabetta Pietrostefani</p> 652</div> 653 <div class="nav-footer-center"> 654 655 </div> 656 <div class="nav-footer-right"> 657<p><i class="bi bi-code-slash" aria-hidden="true"></i> Built with Quarto</p> 658</div> 659 </div> 660</footer> 661 662 663 664
665<script src="site_libs/quarto-html/zenscroll-min.js"></script>
665 666</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.