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>Publications â 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 aria-current='page' class='nav-link active' href='/papers'> 101<span class="menu-text">Publications</span></a> 102 </li> 103 <li class="nav-item"> 104 <a class='nav-link' 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">Publications</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<div class="lead" style="font-size: 1rem; color: var(--muted); margin: 0 0 2.4rem; max-width: 65ch;"> 146<p>An up-to-date list is available on <a href="https://scholar.google.com/citations?hl=en&user=VVogR6sAAAAJ">Google Scholar</a> and <a href="https://orcid.org/0000-0002-8115-1868">ORCID</a>.</p> 147</div> 148<section id="under-review-or-in-press" class="level2"> 149<h2 data-anchor-id="under-review-or-in-press">Under review or in press</h2> 150<div class="paper-list"> 151<p><strong>Pietrostefani, E., Baumann, H., Harker, C., Sayyad, D., & Shebeitah, R.</strong> (2026). Urban Quality of Life in Times of War. (Under review at <em>Cities</em>).</p> 152<p><strong>Kenyon, G., Pietrostefani, E., Robinson, C., & Gkountouna, O.</strong> (2025). The Price of Cool: Using Hedonic Modelling to Assess Spatial Inequalities of Air Conditioning in Madrid. (R&R at <em>The Geographical Journal</em>).</p> 153<p><strong>Pietrostefani, E.</strong> (2020). Conservation Planning and Informal Institutions: Heterogeneous Patterns in Italian Cities. (Under review at <em>Regional Studies</em>).</p> 154<p><strong>Pietrostefani, E., Mason, M., & Rowe, F.</strong> (2026). Policy-Oriented Data Pipelines for Dynamic Estimation of Disaster-Induced Displacement. (Under review at <em>Vienna Yearbook of Population Research</em>).</p> 155<p><strong>Pietrostefani, E., & Sleiman, Y.</strong> (2022). Assessing Vulnerabilities in Post-Blast Beirut. (Submitting to at <em>Annals of the American Association of Geographers</em>).</p> 156<p><strong>Melios, G., Pietrostefani, E., & Sleiman, Y.</strong> (2026). <a href="https://discovery.ucl.ac.uk/id/eprint/10190727/1/SSRN-id4479897.pdf">Who Needs Job Security in a Crisis? Evidence from a Field Experiment in Lebanon</a>. (Submitted to <em>Journal of Economic Behavior & Organization</em>).</p> 157<p><strong>Pietrostefani, E., Makki, D., & Sleiman, Y.</strong> (2022). (In)formal Employment â Default or Choice: A Mixed-Methods Investigation. (Submitting to <em>World Development</em>).</p> 158<p><strong>Garofani, G., & Pietrostefani, E.</strong> (2026). The Urban Promise? Diverging Economic Perceptions of Opportunity Around the World. (Submitting to <em>Urban Studies</em>).</p> 159</div> 160</section> 161<section id="section" class="level2"> 162<h2 data-anchor-id="section">2026</h2> 163<div class="paper-list"> 164<ol type="1"> 165<li><p><strong>Ahlfeldt, G. M., Pietrostefani, E., & Zhang, A.</strong> (2026). <a href="https://cepr.org/publications/dp21022">The Economics of Architecture</a>. <em>CEPR Discussion Paper.</em></p></li> 166<li><p><strong>Sato, Y., Pietrostefani, E., Mahabir, R., & Arribas-Bel, D.</strong> (2026). <a href="https://www.sciencedirect.com/science/article/pii/S0198971526000943">City2Graph: A Python library for Heterogeneous Graph Neural Networks and spatial analysis in urban systems</a>. <em>Computers, Environment and Urban Systems</em>, 130, 102492.</p></li> 167</ol> 168</div> 169</section> 170<section id="section-1" class="level2"> 171<h2 data-anchor-id="section-1">2025</h2> 172<div class="paper-list"> 173<ol type="1"> 174<li><p><strong>Iradukunda, R., Rowe, F., & Pietrostefani, E.</strong> (2025). <a href="https://www.nature.com/articles/s41599-025-06137-4">Estimating internal displacement in Ukraine from high-frequency GPS mobile phone data</a>. <em>Nature Humanities and Social Sciences Communications</em>, 12(1), 1863.</p></li> 175<li><p><strong>Pietrostefani, E., Mason, M., Iradukunda, R., Tran-Jones, H., Loktieva, I., & Rowe, F.</strong> (2025). Dynamic Estimates of Displacement in Disaster Regions: A Policy-Driven Framework Triangulating Data. <em>Report.</em> IOM, Geneva.</p></li> 176</ol> 177</div> 178</section> 179<section id="section-2" class="level2"> 180<h2 data-anchor-id="section-2">2024</h2> 181<div class="paper-list"> 182<ol type="1"> 183<li><p><strong>Mintchev, N., Daher, M., Jallad, M., Zaher, R., Pietrostefani, E., Ghamrawi, G., Al Harrache, A., Majed, A., & Moore, H. L.</strong> (2024). <a href="https://journals.sagepub.com/doi/pdf/10.1177/19408447241256052">Citizen Social Science for Improved Quality of Life: Research, Interventions, Evaluations</a>. <em>International Review of Qualitative Research.</em> SAGE.</p></li> 184<li><p><strong>Boeri, F., Di Cataldo, M., & Pietrostefani, E.</strong> (2024). <a href="https://iris.unive.it/bitstream/10278/5045981/1/Boeri_DiCataldo_Pietrostefani_JoEG.pdf">Localized effects of confiscated and re-allocated real estate mafia assets</a>. <em>Journal of Economic Geography</em>, 24(2), 219â240.</p></li> 185<li><p><strong>Pietrostefani, E., Garofani, G., & Melios, G.</strong> (2024). <a href="https://www.elgaronline.com/edcollchap/book/9781839106958/book-part-9781839106958-13.xml">Spatial Polarisation of Labour Markets: A Comparative Approach</a>. <em>In</em> Handbook on Labour Markets in Transition. Edward Elgar.</p></li> 186<li><p><strong>Woodcraft, S., Izcue-Gana, J., Melios, G., Tzivanakis, N., Pietrostefani, E., Chan, G., Hasan, Z., & Perez, J.</strong> (2024). <a href="https://discovery.ucl.ac.uk/id/eprint/10195858/">Prosperity in Heath, Barking and Dagenham: Findings from the Prosperity in East London 2021â2031 Longitudinal Study</a>. <em>Report.</em> UCL Institute for Global Prosperity.</p></li> 187<li><p><strong>Woodcraft, S., Izcue-Gana, J., Melios, G., Tzivanakis, N., Pietrostefani, E., Chan, G., Hasan, Z., & Perez, J.</strong> (2024). <a href="https://discovery.ucl.ac.uk/id/eprint/10195859/">Prosperity in and around Londonâs Olympic Park: Findings from the Prosperity in East London 2021â2031 Longitudinal Study</a>. <em>Report.</em> UCL Institute for Global Prosperity.</p></li> 188<li><p><strong>Woodcraft, S., Izcue-Gana, J., Melios, G., Tzivanakis, N., Pietrostefani, E., Chan, G., Hasan, Z., & Perez, J.</strong> (2024). <a href="https://discovery.ucl.ac.uk/id/eprint/10195860/">Prosperity in the Teviot Estate and Coventry Cross Estate, Tower Hamlets: Findings from the Prosperity in East London 2021â2031 Longitudinal Study</a>. <em>Report.</em> UCL Institute for Global Prosperity.</p></li> 189<li><p><strong>Woodcraft, S., Izcue-Gana, J., Melios, G., Tzivanakis, N., Pietrostefani, E., Chan, G., Hasan, Z., & Perez, J.</strong> (2024). <a href="https://discovery.ucl.ac.uk/id/eprint/10195861/">Prosperity in Londonâs Royal Docks, Newham: Findings from the Prosperity in East London 2021â2031 Longitudinal Study</a>. <em>Report.</em> UCL Institute for Global Prosperity.</p></li> 190</ol> 191</div> 192</section> 193<section id="section-3" class="level2"> 194<h2 data-anchor-id="section-3">2023</h2> 195<div class="paper-list"> 196<ol type="1"> 197<li><p><strong>Pietrostefani, E., Dabaj, J., & Boano, C.</strong> (2023). <a href="https://discovery.ucl.ac.uk/id/eprint/10168696/1/Pietrostefani%2CDabaj%2C%20Boano%202023.pdf">Rethinking âSpaces of Exchangeâ for Future Cities</a>. <em>In</em> Future Cities â City Futures: Emerging Urban Perspectives (pp. 208â215). TU Delft.</p></li> 198<li><p><strong>Ahlfeldt, G. M., & Pietrostefani, E.</strong> (2023). <a href="https://www.bak.admin.ch/dam/bak/de/dokumente/kulturpflege/publikationen/study-quality-ells-ahlfeldt-pietrostefani.pdf.download.pdf/Study_Quality_sells_Ahlfeldt-Pietrostefani.pdf">âQuality Sellsâ: High-Quality Baukultur as a Success Factor for the Construction and Real Estate Industry</a>. <em>Report.</em> Swiss Federal Office of Culture.</p></li> 199</ol> 200</div> 201</section> 202<section id="section-4" class="level2"> 203<h2 data-anchor-id="section-4">2022</h2> 204<div class="paper-list"> 205<ol type="1"> 206<li><p><strong>Pietrostefani, E.</strong> (2022). <a href="https://www.cogitatiopress.com/urbanplanning/article/view/4851">Urban Transformations and Complex Values: Insights from Beirut</a>. <em>Urban Planning</em>, 7(1), 1â13.</p></li> 207<li><p><strong>Mintchev, N., Daher, M., Jallad, M., Pietrostefani, E., Moore, H. L., Ghamrawi, G., Al Harrache, A., Majed, A., & Younes, Y.</strong> (2022). <a href="https://journals.sagepub.com/doi/full/10.1177/16094069221133232">Sustained Citizen Science From Research to Solutions: A New Impact Model for the Social Sciences</a>. <em>International Journal of Qualitative Methods</em>, 21, 1â16.</p></li> 208<li><p><strong>Jallad, M., Mintchev, N., Pietrostefani, E., Daher, M., & Moore, H. L.</strong> (2022). <a href="https://www.tandfonline.com/doi/abs/10.1080/13645579.2021.1942664">Citizen Social Science and Pathways to Prosperity: Co-Designing Research and Impact in Beirut, Lebanon</a>. <em>International Journal of Social Research Methodology</em>, 25(6), 769â782.</p></li> 209<li><p><strong>Ahlfeldt, G. M., & Pietrostefani, E.</strong> (2022). Revisiting the Economic Effects of Density in the Wake of the COVID-19 Pandemic. <em>In</em> European Cities After COVID-19: Strategies for Resilient Cities and Real Estate (pp. 95â106). Springer.</p></li> 210<li><p><strong>Pietrostefani, E., Dabaj, J., Jallad, M., Maassarani, S., Makki, D., Mersalli, T., Mintchev, N., Sleiman, Y., Sleiman, M., & Moore, H. L.</strong> (2022). <a href="https://discovery.ucl.ac.uk/id/eprint/10156806/">Prosperity Report â El Mina, Tripoli</a>. <em>Report.</em> UCL and CatalyticAction.</p></li> 211<li><p><strong>Pietrostefani, E., Dabaj, J., Sleiman, Y., Jallad, M., Maassarani, S., & Charalambous, E.</strong> (2022). <a href="https://discovery.ucl.ac.uk/id/eprint/10143225/">Assessing Vulnerabilities for Urban Recovery Solutions</a>. <em>Report.</em> UCL and CatalyticAction.</p></li> 212</ol> 213</div> 214</section> 215<section id="section-5" class="level2"> 216<h2 data-anchor-id="section-5">2021</h2> 217<div class="paper-list"> 218<ol type="1"> 219<li><p><strong>Ahlfeldt, G. M., & Pietrostefani, E.</strong> (2021). Die ökonomischen Effekte urbaner Dichte: Eine Bestandsaufnahme im Lichte der Corona-Pandemie. <em>In</em> Die Europäische Stadt nach Corona: Strategien für resiliente Städte und Immobilien (pp. 111â124). Springer.</p></li> 220<li><p><strong>Charalambous, E., Pietrostefani, E., & Woodcraft, S.</strong> (2021). <a href="https://discovery.ucl.ac.uk/id/eprint/10130980/">Ethnicity and Prosperity in East London: How Racial Inequalities Impact Experiences of the Good Life</a>. <em>Report.</em> UCL Institute for Global Prosperity.</p></li> 221</ol> 222</div> 223</section> 224<section id="section-6" class="level2"> 225<h2 data-anchor-id="section-6">2020</h2> 226<div class="paper-list"> 227<ol type="1"> 228<li><p><strong>Pietrostefani, E., & Holman, N.</strong> (2020). <a href="https://www.sciencedirect.com/science/article/pii/S030590062030026X">The politics of conservation planning: a comparative study of urban heritage making in the Global North and the Global South</a>. <em>
228Progress in Planning</em>, 145, 100505.</p></li> 229<li><p><strong>RELIEF Centre & UN-Habitat Lebanon</strong> (2020). <a href="https://discovery.ucl.ac.uk/id/eprint/10116434/">Hamra Neighbourhood Profile 2020</a>. <em>Report.</em> UN-Habitat Lebanon.</p></li> 230</ol> 231</div> 232</section> 233<section id="section-7" class="level2"> 234<h2 data-anchor-id="section-7">2019</h2> 235<div class="paper-list"> 236<ol type="1"> 237<li><strong>Ahlfeldt, G., & Pietrostefani, E.</strong> (2019). <a href="https://cepr.org/active/publications/discussion_papers/dp.php?dpno=13440">The economic effects of density: a synthesis</a>. <em>Journal of Urban Economics</em>, 111, 93â107.</li> 238</ol> 239</div> 240</section> 241<section id="section-8" class="level2"> 242<h2 data-anchor-id="section-8">2018</h2> 243<div class="paper-list"> 244<ol type="1"> 245<li><strong>Ahlfeldt, G., Pietrostefani, E., Schumann, A., & Matsumoto, T.</strong> (2018). <a href="http://newclimateeconomy.report/workingpapers/wp-content/uploads/sites/5/2017/09/NCE2017_OECD_CompactUrbanGrowth.pdf">Demystifying compact urban growth: Evidence from 300 studies from across the world</a>. <em>OECD Regional Development Working Papers</em>, 2018/03. OECD Publishing.</li> 246</ol> 247</div> 248</section> 249<section id="section-9" class="level2"> 250<h2 data-anchor-id="section-9">2017</h2> 251<div class="paper-list"> 252<ol type="1"> 253<li><p><strong>Fawaz, M., Salamé, I., Serhan, D., Pietrostefani, E., Abdo, N., & Feghali, D.</strong> (2017). <a href="https://www.aub.edu.lb/ifi/Documents/publications/policy_briefs/2017-2018/20180318_you_can_stay_in_beirut.pdf">You Can Stay in Beirut: Towards Inclusive Urban Housing Policy</a>. <em>Policy brief.</em> American University of Beirut, Social Justice and the City (AUB Policy Institute Brief #8/2017).</p></li> 254<li><p><strong>Ahlfeldt, G., & Pietrostefani, E.</strong> (2017). <a href="https://researchonline.lse.ac.uk/id/eprint/83638/1/sercdp0215.pdf">The Compact City in Empirical Research: A Quantitative Literature Review</a>. <em>SERC Discussion Paper.</em></p></li> 255</ol> 256</div> 257</section> 258<section id="section-10" class="level2"> 259<h2 data-anchor-id="section-10">2015</h2> 260<div class="paper-list"> 261<ol type="1"> 262<li><strong>Pietrostefani, E.</strong> (2015). <a href="https://shs.cairn.info/article/TFD_118_0065/pdf?lang=fr">Valuating Urban Heritage in the Perspective of Holistic Development: Illustrating the Lebanese Case</a>. <em>La valeur économique du patrimoine â Techniques Financières et Développement</em>, Epargne Sans Frontière, no. 118.</li> 263</ol> 264</div> 265 266 267</section> 268 269</main> <!-- /main -->
270<script src="assets/menu.js"></script>
vendor: 1 bytes, line 270
270
271<script id="quarto-html-after-body" type="application/javascript"> 272window.document.addEventListener("DOMContentLoaded", function (event) { 273 const toggleBodyColorMode = (bsSheetEl) => { 274 const mode = bsSheetEl.getAttribute("data-mode"); 275 const bodyEl = window.document.querySelector("body"); 276 if (mode === "dark") { 277 bodyEl.classList.add("quarto-dark"); 278 bodyEl.classList.remove("quarto-light"); 279 } else { 280 bodyEl.classList.add("quarto-light"); 281 bodyEl.classList.remove("quarto-dark"); 282 } 283 } 284 const toggleBodyColorPrimary = () => { 285 const bsSheetEl = window.document.querySelector("link#quarto-bootstrap"); 286 if (bsSheetEl) { 287 toggleBodyColorMode(bsSheetEl); 288 } 289 } 290 toggleBodyColorPrimary(); 291 const isCodeAnnotation = (el) => { 292 for (const clz of el.classList) { 293 if (clz.startsWith('code-annotation-')) { 294 return true; 295 } 296 } 297 return false; 298 } 299 const onCopySuccess = function(e) { 300 // button target 301 const button = e.trigger; 302 // don't keep focus 303 button.blur(); 304 // flash "checked" 305 button.classList.add('code-copy-button-checked'); 306 var currentTitle = button.getAttribute("title"); 307 button.setAttribute("title", "Copied!"); 308 let tooltip; 309 if (window.bootstrap) { 310 button.setAttribute("data-bs-toggle", "tooltip"); 311 button.setAttribute("data-bs-placement", "left"); 312 button.setAttribute("data-bs-title", "Copied!"); 313 tooltip = new bootstrap.Tooltip(button, 314 { trigger: "manual", 315 customClass: "code-copy-button-tooltip", 316 offset: [0, -8]}); 317 tooltip.show(); 318 } 319 setTimeout(function() { 320 if (tooltip) { 321 tooltip.hide(); 322 button.removeAttribute("data-bs-title"); 323 button.removeAttribute("data-bs-toggle"); 324 button.removeAttribute("data-bs-placement"); 325 } 326 button.setAttribute("title", currentTitle); 327 button.classList.remove('code-copy-button-checked'); 328 }, 1000); 329 // clear code selection 330 e.clearSelection(); 331 } 332 const getTextToCopy = function(trigger) { 333 const codeEl = trigger.previousElementSibling.cloneNode(true); 334 for (const childEl of codeEl.children) { 335 if (isCodeAnnotation(childEl)) { 336 childEl.remove(); 337 } 338 } 339 return codeEl.innerText; 340 } 341 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 342 text: getTextToCopy 343 }); 344 clipboard.on('success', onCopySuccess); 345 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 346 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 347 text: getTextToCopy, 348 container: window.document.getElementById('quarto-embedded-source-code-modal') 349 }); 350 clipboardModal.on('success', onCopySuccess); 351 } 352 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 353 var mailtoRegex = new RegExp(/^mailto:/); 354 var filterRegex = new RegExp("https:\/\/pietrostefani\.com"); 355 var isInternal = (href) => { 356 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 357 } 358 // Inspect non-navigation links and adorn them if external 359 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)'); 360 for (var i=0; i<links.length; i++) { 361 const link = links[i]; 362 if (!isInternal(link.href)) { 363 // undo the damage that might have been done by quarto-nav.js in the case of 364 // links that we want to consider external 365 if (link.dataset.originalHref !== undefined) { 366 link.href = link.dataset.originalHref; 367 } 368 } 369 } 370 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 371 const config = { 372 allowHTML: true, 373 maxWidth: 500, 374 delay: 100, 375 arrow: false, 376 appendTo: function(el) { 377 return el.parentElement; 378 }, 379 interactive: true, 380 interactiveBorder: 10, 381 theme: 'quarto', 382 placement: 'bottom-start', 383 }; 384 if (contentFn) { 385 config.content = contentFn; 386 } 387 if (onTriggerFn) { 388 config.onTrigger = onTriggerFn; 389 } 390 if (onUntriggerFn) { 391 config.onUntrigger = onUntriggerFn; 392 } 393 window.tippy(el, config); 394 } 395 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 396 for (var i=0; i<noterefs.length; i++) { 397 const ref = noterefs[i]; 398 tippyHover(ref, function() { 399 // use id or data attribute instead here 400 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
401 try { href = new URL(href).hash; } catch {} 402 const id = href.replace(/^#\/?/, ""); 403 const note = window.document.getElementById(id); 404 if (note) { 405 return note.innerHTML; 406 } else { 407 return ""; 408 } 409 }); 410 } 411 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 412 const processXRef = (id, note) => { 413 // Strip column container classes 414 const stripColumnClz = (el) => { 415 el.classList.remove("page-full", "page-columns"); 416 if (el.children) { 417 for (const child of el.children) { 418 stripColumnClz(child); 419 } 420 } 421 } 422 stripColumnClz(note) 423 if (id === null || id.startsWith('sec-')) { 424 // Special case sections, only their first couple elements 425 const container = document.createElement("div"); 426 if (note.children && note.children.length > 2) { 427 container.appendChild(note.children[0].cloneNode(true)); 428 for (let i = 1; i < note.children.length; i++) { 429 const child = note.children[i]; 430 if (child.tagName === "P" && child.innerText === "") { 431 continue; 432 } else { 433 container.appendChild(child.cloneNode(true)); 434 break; 435 } 436 } 437 if (window.Quarto?.typesetMath) { 438 window.Quarto.typesetMath(container); 439 } 440 return container.innerHTML 441 } else { 442 if (window.Quarto?.typesetMath) { 443 window.Quarto.typesetMath(note); 444 } 445 return note.innerHTML; 446 } 447 } else { 448 // Remove any anchor links if they are present 449 const anchorLink = note.querySelector('a.anchorjs-link'); 450 if (anchorLink) { 451 anchorLink.remove(); 452 } 453 if (window.Quarto?.typesetMath) { 454 window.Quarto.typesetMath(note); 455 } 456 if (note.classList.contains("callout")) { 457 return note.outerHTML; 458 } else { 459 return note.innerHTML; 460 } 461 } 462 } 463 for (var i=0; i<xrefs.length; i++) { 464 const xref = xrefs[i]; 465 tippyHover(xref, undefined, function(instance) { 466 instance.disable(); 467 let url = xref.getAttribute('href'); 468 let hash = undefined; 469 if (url.startsWith('#')) { 470 hash = url; 471 } else { 472 try { hash = new URL(url).hash; } catch {} 473 } 474 if (hash) { 475 const id = hash.replace(/^#\/?/, ""); 476 const note = window.document.getElementById(id); 477 if (note !== null) { 478 try { 479 const html = processXRef(id, note.cloneNode(true)); 480 instance.setContent(html); 481 } finally { 482 instance.enable(); 483 instance.show(); 484 } 485 } else { 486 // See if we can fetch this 487 fetch(url.split('#')[0]) 488 .then(res => res.text()) 489 .then(html => { 490 const parser = new DOMParser(); 491 const htmlDoc = parser.parseFromString(html, "text/html"); 492 const note = htmlDoc.getElementById(id); 493 if (note !== null) { 494 const html = processXRef(id, note); 495 instance.setContent(html); 496 } 497 }).finally(() => { 498 instance.enable(); 499 instance.show(); 500 }); 501 } 502 } else { 503 // See if we can fetch a full url (with no hash to target) 504 // This is a special case and we should probably do some content thinning / targeting 505 fetch(url) 506 .then(res => res.text()) 507 .then(html => { 508 const parser = new DOMParser(); 509 const htmlDoc = parser.parseFromString(html, "text/html"); 510 const note = htmlDoc.querySelector('main.content'); 511 if (note !== null) { 512 // This should only happen for chapter cross references 513 // (since there is no id in the URL) 514 // remove the first header 515 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 516 note.children[0].remove(); 517 } 518 const html = processXRef(null, note); 519 instance.setContent(html); 520 } 521 }).finally(() => { 522 instance.enable(); 523 instance.show(); 524 }); 525 } 526 }, function(instance) { 527 }); 528 } 529 let selectedAnnoteEl; 530 const selectorForAnnotation = ( cell, annotation) => { 531 let cellAttr = 'data-code-cell="' + cell + '"'; 532 let lineAttr = 'data-code-annotation="' + annotation + '"'; 533 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 534 return selector; 535 } 536 const selectCodeLines = (annoteEl) => { 537 const doc = window.document; 538 const targetCell = annoteEl.getAttribute("data-target-cell"); 539 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 540 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 541 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 542 const lineIds = lines.map((line) => { 543 return targetCell + "-" + line; 544 }) 545 let top = null; 546 let height = null; 547 let parent = null; 548 if (lineIds.length > 0) { 549 //compute the position of the single el (top and bottom and make a div) 550 const el = window.document.getElementById(lineIds[0]); 551 top = el.offsetTop; 552 height = el.offsetHeight; 553 parent = el.parentElement.parentElement; 554 if (lineIds.length > 1) { 555 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 556 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 557 height = bottom - top; 558 } 559 if (top !== null && height !== null && parent !== null) { 560 // cook up a div (if necessary) and position it 561 let div = window.document.getElementById("code-annotation-line-highlight"); 562 if (div === null) { 563 div = window.document.createElement("div"); 564 div.setAttribute("id", "code-annotation-line-highlight"); 565 div.style.position = 'absolute'; 566 parent.appendChild(div); 567 } 568 div.style.top = top - 2 + "px"; 569 div.style.height = height + 4 + "px"; 570 div.style.left = 0; 571 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 572 if (gutterDiv === null) { 573 gutterDiv = window.document.createElement("div"); 574 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 575 gutterDiv.style.position = 'absolute'; 576 const codeCell = window.document.getElementById(targetCell); 577 const gutter = codeCell.querySelector('.code-annotation-gutter'); 578 gutter.appendChild(gutterDiv); 579 } 580 gutterDiv.style.top = top - 2 + "px"; 581 gutterDiv.style.height = height + 4 + "px"; 582 } 583 selectedAnnoteEl = annoteEl; 584 } 585 }; 586 const unselectCodeLines = () => { 587 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 588 elementsIds.forEach((elId) => { 589 const div = window.document.getElementById(elId); 590 if (div) { 591 div.remove(); 592 } 593 }); 594 selectedAnnoteEl = undefined; 595 }; 596 // Handle positioning of the toggle 597 window.addEventListener( 598 "resize", 599 throttle(() => { 600 elRect = undefined; 601 if (selectedAnnoteEl) { 602 selectCodeLines(selectedAnnoteEl); 603 } 604 }, 10) 605 ); 606 function throttle(fn, ms) { 607 let throttle = false;
608 let timer; 609 return (...args) => { 610 if(!throttle) { // first call gets through 611 fn.apply(this, args); 612 throttle = true; 613 } else { // all the others get throttled 614 if(timer) clearTimeout(timer); // cancel #2 615 timer = setTimeout(() => { 616 fn.apply(this, args); 617 timer = throttle = false; 618 }, ms); 619 } 620 }; 621 } 622 // Attach click handler to the DT 623 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 624 for (const annoteDlNode of annoteDls) { 625 annoteDlNode.addEventListener('click', (event) => { 626 const clickedEl = event.target; 627 if (clickedEl !== selectedAnnoteEl) { 628 unselectCodeLines(); 629 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 630 if (activeEl) { 631 activeEl.classList.remove('code-annotation-active'); 632 } 633 selectCodeLines(clickedEl); 634 clickedEl.classList.add('code-annotation-active'); 635 } else { 636 // Unselect the line 637 unselectCodeLines(); 638 clickedEl.classList.remove('code-annotation-active'); 639 } 640 }); 641 } 642 const findCites = (el) => { 643 const parentEl = el.parentElement; 644 if (parentEl) { 645 const cites = parentEl.dataset.cites; 646 if (cites) { 647 return { 648 el, 649 cites: cites.split(' ') 650 }; 651 } else { 652 return findCites(el.parentElement) 653 } 654 } else { 655 return undefined; 656 } 657 }; 658 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 659 for (var i=0; i<bibliorefs.length; i++) { 660 const ref = bibliorefs[i]; 661 const citeInfo = findCites(ref); 662 if (citeInfo) { 663 tippyHover(citeInfo.el, function() { 664 var popup = window.document.createElement('div'); 665 citeInfo.cites.forEach(function(cite) { 666 var citeDiv = window.document.createElement('div'); 667 citeDiv.classList.add('hanging-indent'); 668 citeDiv.classList.add('csl-entry'); 669 var biblioDiv = window.document.getElementById('ref-' + cite); 670 if (biblioDiv) { 671 citeDiv.innerHTML = biblioDiv.innerHTML; 672 } 673 popup.appendChild(citeDiv); 674 }); 675 return popup.innerHTML; 676 }); 677 } 678 } 679}); 680</script>
680 681</div> <!-- /content --> 682<footer class="footer"> 683 <div class="nav-footer"> 684 <div class="nav-footer-left"> 685<p>© 2026 Elisabetta Pietrostefani</p> 686</div> 687 <div class="nav-footer-center"> 688 689 </div> 690 <div class="nav-footer-right"> 691<p><i class="bi bi-code-slash" aria-hidden="true"></i> Built with Quarto</p> 692</div> 693 </div> 694</footer> 695 696 697 698
699<script src="site_libs/quarto-html/zenscroll-min.js"></script>
699 700</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.