1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" lang="en-GB" xml:lang="en-GB"><head> 3 4<meta charset="utf-8"> 5<meta name="generator" content="quarto-1.9.37"> 6 7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 8 9 10<title>Publications â Eleanor Jackson</title> 11<style> 12/* Default styles provided by pandoc. 13** See https://pandoc.org/MANUAL.html#variables-for-html for config info. 14*/ 15code{white-space: pre-wrap;} 16span.smallcaps{font-variant: small-caps;} 17div.columns{display: flex; gap: min(4vw, 1.5em);} 18div.column{flex: auto; overflow-x: auto;} 19div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} 20ul.task-list{list-style: none;} 21ul.task-list li input[type="checkbox"] { 22 width: 0.8em; 23 margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 24 vertical-align: middle; 25} 26</style> 27 28
29<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-nav/headroom.min.js"></script>
30 31<link href="./images/icon.png" rel="icon" type="image/png">
32<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 32
32
33<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-html/anchor.min.js"></script>
37 38<link href="site_libs/quarto-html/tippy.css" rel="stylesheet"> 39<link href="site_libs/quarto-html/quarto-syntax-highlighting-7f8f88aac4f3542376d5c11b86a4c14d.css" rel="stylesheet" id="quarto-text-highlighting-styles">
40<script src="site_libs/bootstrap/bootstrap.min.js"></script>
40 41<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> 42<link href="site_libs/bootstrap/bootstrap-2f324a3e2402b1b1411e6a4607dc701e.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light"> 43<link href="site_libs/quarto-contrib/fontawesome6-6.7.2/all.min.css" rel="stylesheet"> 44<link href="site_libs/quarto-contrib/fontawesome6-6.7.2/latex-fontsize.css" rel="stylesheet">
45<script id="quarto-search-options" type="application/json">{ 46 "language": { 47 "search-no-results-text": "No results", 48 "search-matching-documents-text": "matching documents", 49 "search-copy-link-title": "Copy link to search", 50 "search-hide-matches-text": "Hide additional matches", 51 "search-more-match-text": "more match in this document", 52 "search-more-matches-text": "more matches in this document", 53 "search-clear-button-title": "Clear", 54 "search-text-placeholder": "", 55 "search-detached-cancel-button-title": "Cancel", 56 "search-submit-button-title": "Submit", 57 "search-label": "Search" 58 } 59}</script>
59 60 61 62<link rel="stylesheet" href="styles.css"> 63<meta property="og:title" content="Publications"> 64<meta property="og:description" content="Research scientist and ecologist"> 65<meta property="og:image" content="https://eleanorjackson.com/images/icon.png"> 66<meta property="og:site_name" content="Eleanor Jackson"> 67<meta property="og:locale" content="en_GB"> 68<meta property="og:image:height" content="512"> 69<meta property="og:image:width" content="512"> 70</head> 71 72<body class="nav-fixed quarto-light"> 73 74<div id="quarto-search-results"></div> 75 <header id="quarto-header" class="headroom fixed-top"> 76 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 77 <div class="navbar-container container-fluid"> 78 <div class="navbar-brand-container mx-auto"> 79 <a class='navbar-brand navbar-brand-logo' href='/'> 80 <img src="./images/logo.png" alt="" class="navbar-logo light-content"> 81 <img src="./images/logo.png" alt="" class="navbar-logo dark-content"> 82 </a> 83 </div> 84 <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(); }"> 85 <span class="navbar-toggler-icon"></span> 86</button> 87 <div class="collapse navbar-collapse" id="navbarCollapse"> 88 <ul class="navbar-nav navbar-nav-scroll me-auto"> 89 <li class="nav-item"> 90 <a aria-current='page' class='nav-link active' href='/publications'> 91<span class="menu-text">Publications</span></a> 92 </li> 93</ul> 94 </div> <!-- /navcollapse --> 95 <div class="quarto-navbar-tools"> 96</div> 97 </div> <!-- /container-fluid --> 98 </nav> 99</header> 100<!-- content --> 101<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar"> 102<!-- sidebar --> 103<!-- margin-sidebar --> 104 <div id="quarto-margin-sidebar" class="sidebar margin-sidebar"> 105 <nav id="TOC" role="doc-toc" class="toc-active"> 106 <h2 id="toc-title">On this page</h2> 107 108 <ul> 109 <li><a href="#preprints" id="toc-preprints" class="nav-link active" data-scroll-target="#preprints">Preprints</a></li> 110 <li><a href="#peer-reviewed-publications" id="toc-peer-reviewed-publications" class="nav-link" data-scroll-target="#peer-reviewed-publications">Peer-reviewed publications</a> 111 <ul class="collapse"> 112 <li><a href="#section" id="toc-section" class="nav-link" data-scroll-target="#section">2026</a></li> 113 <li><a href="#section-1" id="toc-section-1" class="nav-link" data-scroll-target="#section-1">2025</a></li> 114 <li><a href="#section-2" id="toc-section-2" class="nav-link" data-scroll-target="#section-2">2024</a></li> 115 <li><a href="#section-3" id="toc-section-3" class="nav-link" data-scroll-target="#section-3">2023</a></li> 116 <li><a href="#section-4" id="toc-section-4" class="nav-link" data-scroll-target="#section-4">2022</a></li> 117 <li><a href="#section-5" id="toc-section-5" class="nav-link" data-scroll-target="#section-5">2021</a></li> 118 </ul></li> 119 </ul> 120</nav> 121 </div> 122<!-- main --> 123<main class="content" id="quarto-document-content"> 124 125<header id="title-block-header" class="quarto-title-block default"> 126<div class="quarto-title"> 127<h1 class="title">Publications</h1> 128</div> 129 130 131 132<div class="quarto-title-meta"> 133 134 135 136 137 </div> 138 139 140 141</header> 142 143 144<section id="preprints" class="level2"> 145<h2 class="anchored" data-anchor-id="preprints">Preprints</h2> 146<p><strong>Eleanor E. Jackson</strong>, Tord Snäll, Emma Gardner, James M. Bullock, Rebecca Spake (2025). Towards causal predictions of site-specific management effects in applied ecology. <em>EcoEvoRxiv.</em><br> <a href="https://ecoevorxiv.org/repository/object/9335/download/20248/"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.32942/X2KK95"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.13269917"><i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5281/zenodo.13269917"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p> 147</section> 148<section id="peer-reviewed-publications" class="level2"> 149<h2 class="anchored" data-anchor-id="peer-reviewed-publications">Peer-reviewed publications</h2> 150<section id="section" class="level3"> 151<h3 class="anchored" data-anchor-id="section">2026</h3> 152<p>The BES Data and Code Hackathon Group<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a> (2026). Data- and code-archiving in the British Ecological Society journals: present status and recommendations for future improvements. <em>Methods in Ecology and Evolution.</em><br> <a href="https://besjournals.onlinelibrary.wiley.com/doi/pdfdirect/10.1111/2041-210x.70338?download=false"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="http://doi.org/10.1111/2041-210x.70338"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.19737911">
152<i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5281/zenodo.19737911"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p> 153<p>Toby D. Jackson, Lucy V.J. Beese, Andy Hector, <strong>Eleanor E. Jackson</strong>, Michael OâBrien, Gianluca Cerullo, David A. Coomes, David F.R.P. Burslem, Fabian J. Fischer, Christopher D. Philipson, Elia Godoong, Charissa Wong, Martin Svátek, Michele Dalponte, Wan Shafrina Wan Mohd Jaafar, Tommaso Jucker (2026). Liana cutting accelerates the structural recovery of once-logged tropical forests at a fraction of the cost of tree planting. <em>Current Biology.</em> <br> <a href="https://www.cell.com/current-biology/pdfExtended/S0960-9822(26)00526-9"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1016/j.cub.2026.04.056"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.19692749"><i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5281/zenodo.14917551"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p> 154</section> 155<section id="section-1" class="level3"> 156<h3 class="anchored" data-anchor-id="section-1">2025</h3> 157<p>L. Crowley, P. Mulhair, O.T. Lewis, P.W.H. Holland, T. Hesselberg, L.R. Cole, C.N. Hackforth, P. Waring, S. Falk, <strong>E.E. Jackson,</strong> S. Gripenberg, E. Eatough, T. Lander, C.A.L. Dahlsjö, B.C. Sheldon, D. Linton, C. Lamberth, A. Raulo (2025). Changes in the Fauna. In <em>Wytham Woods: How a Landscape Works.</em> K. J. Kirby. pp. 141â175. Oxford University Press.</p> 158<p><strong>Eleanor E. Jackson</strong>, Matthew P. Greenwell, James M. Bullock, Tom H. Oliver, Susie Topple, Christopher W. Foster, Sofia Gripenberg (2025). Density-dependent effects on the reproductive ecology of trees in a temperate woodland. <em>Ecology and Evolution.</em><br> <a href="https://onlinelibrary.wiley.com/doi/pdfdirect/10.1002/ece3.71491?download=false"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1002/ece3.71491"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.15124592"><i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5281/zenodo.10599206"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p> 159<p>Rebecca Spake, <strong>Eleanor E. Jackson</strong>, James M. Bullock, Emma Gardener, Elizabeth Tipton, Matthew Grainger, C. Patrick Doncaster (2025). Precision ecology for targeted conservation action. <em>Nature Ecology & Evolution.</em><br> <a href="https://rdcu.be/eoaR4"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1038/s41559-025-02733-4"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> <br></p> 160</section> 161<section id="section-2" class="level3"> 162<h3 class="anchored" data-anchor-id="section-2">2024</h3> 163<p><strong>Eleanor E. Jackson</strong> (2024). Conspecific density and the reproductive ecology of trees â implications for species coexistence. PhD thesis, University of Reading.<br> <a href="https://centaur.reading.ac.uk/119733/1/JACKSON_Thesis.pdf"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.48683/1926.00119733"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> <br></p> 164</section> 165<section id="section-3" class="level3"> 166<h3 class="anchored" data-anchor-id="section-3">2023</h3> 167<p>The Herbivory Variability Network<a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a> (2023). Plant size, latitude, and phylogeny explain within-population variability in herbivory. <em>Science.</em><br> <a href="http://herbvar.org/products/herbvar-et-al-2023-science.pdf"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1126/science.adh8830"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.8133118">
167<i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5061/dryad.44j0zpckm"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p> 168</section> 169<section id="section-4" class="level3"> 170<h3 class="anchored" data-anchor-id="section-4">2022</h3> 171<p>Josianne Lachapelle, Elvire Bestion, <strong>Eleanor E. Jackson</strong>, C.-Elisa Schaum (2022). Presence of a resident species aids invader evolution. <em>Limnology and Oceanography.</em><br> <a href="https://aslopubs.onlinelibrary.wiley.com/doi/pdfdirect/10.1002/lno.12200?download=false"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1002/lno.12200"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.6884040"><i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5281/zenodo.6884040"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p> 172<p><strong>Eleanor E. Jackson</strong>, S. Joseph Wright, Osvaldo Calderón, James M. Bullock, Tom H. Oliver, Sofia Gripenberg (2022). Preâdispersal seed predation could help explain premature fruit drop in a tropical forest. <em>Journal of Ecology.</em><br> <a href="https://besjournals.onlinelibrary.wiley.com/doi/pdfdirect/10.1111/1365-2745.13867?download=false"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1111/1365-2745.13867"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> · <a href="https://doi.org/10.5281/zenodo.5767680"><i class="fa-solid fa-code" aria-label="code"></i> code</a> · <a href="https://doi.org/10.5061/dryad.4mw6m909j"><i class="fa-solid fa-database" aria-label="database"></i> data</a> <br></p> 173</section> 174<section id="section-5" class="level3"> 175<h3 class="anchored" data-anchor-id="section-5">2021</h3> 176<p><strong>Eleanor E. Jackson</strong>, Ian Hawes, Anne D. Jungblut (2021). 16S rRNA gene and 18S rRNA gene diversity in microbial mat communities in meltwater ponds on the McMurdo Ice Shelf, Antarctica. <em>Polar Biology.</em> <br> <a href="https://link.springer.com/content/pdf/10.1007/s00300-021-02843-2.pdf"><i class="fa-solid fa-file-pdf" aria-label="file-pdf"></i> PDF</a> · <a href="https://doi.org/10.1007/s00300-021-02843-2"><i class="fa-solid fa-link" aria-label="link"></i> DOI</a> <br></p> 177 178 179</section> 180</section> 181 182 183<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes"><h2 class="anchored quarto-appendix-heading">Footnotes</h2> 184 185<ol> 186<li id="fn1"><p>N. Cooper, B.J. Allen, N. Almaani, R. Altwegg, J. Balogh, H. Balti, R.A. Barber, M.E. Barbosa de Sousa, J.G.N. Barreat, C.F. Barrett, R. Bates, A.M.J.M. Beale, L. Bliard, N. Blömer, D. Borovyk, C. Bunnenberg, E.A. Bygate, L. Cash, N. Chatterjee, T.-W. Chen, A. Chiti, S.S.-W. Chung, H. Chuquillanqui, A. Ciezarek, A. Clarkson, E. Codling, A. Corradini, A. Cowans, S. Dartnell, A.J.S. Davis, L.L.M. De Benedictis, G.G. Deme, C. Devenish, S. Dimri, C. Dittrich, K.R. Dorheim, H.B. Drage, M.-A. Dueñas, A. Efstathiou, L.C. Evans, M.E. Ferreira Santos, A.J. Foxx, R.J. Gardiner, J. Gaudard, W. Gearty, L. Graham, V.M. Graves, H.M. Green, R.V. Greensmith, S. Gérard, A.H. Halbritter, T.R. Hartke, R.M. Hechler, B.J. Hindle, P.-Y. Hsing, S. Illanas, G. Iossa, <strong>E.E. Jackson</strong>, L.A. Jones, F.A.M. Jones, J.A. Jones, J.F. Jupke, N.N. Kaunain, R. Kennedy, M.R. Kerr, N.J. Kester, M. Klaassen, O. Konecka, R. Krasnow, R. Kukowski, A. Kumar, R. Kuminski, K.S. Kuzey, L. Laccetti, M. Lagisz, H. Latifi, N. Lecomte, K.D. Luchmun, A. Lévêque, A. Markitantova, B.M. Marshall, E. Menares-Barraza, D. Mertens, G. Mesbahi, J. Meyer, J. Millard, L.M. Montilla, B. Moreira, A. Morera, G. Murali, M.P. Murray, F. Märker, K. Nagahawatte, C.L. Narraway, H.I. Niven, A.G. Nytko, B. Ohse, S. Patterson, H.R.P. Phillips, R. Pienaar, P. Pollo, A. Ponce, L.M.V. Porto, E.F.R. Preston, C.S. Prieul, A. Prylutska, O. Prylutskyi, K. Radman-Daw, A.M. Raharison, R. Rao, F.R. Read, S. Record, W. Rees, R. Reeve, H. Rhodes, C. Rocabado, A. Rouviere, A. Rönnfeldt, A. Sagouis, S.P. Sakhalkar, G.S. Santos, M.A. Shakur, R. Shaw, D. Siegieda, L. Å mÃdova, B.I. Simmons, H.G. Sisley, A. Sánchez-Tójar, F.G. Taboada, N.G. Taylor, H. Teague, K. Thrikkadeeri, V. Thuroczy, A. Varah, K.L. Vinay,
186C.M. Watrobska, Z.B. Williams and S.M. Windecker <br><a href="#fnref1" class="footnote-back" role="doc-backlink">â©ï¸</a></p></li> 187<li id="fn2"><p>M.L. Robinson, P.G. Hahn, B.D. Inouye, N. Underwood, S.R. Whitehead, K.C. Abbott, E.M. Bruna, N.I. Cacho, L.A. Dyer, L. Abdala-Roberts, W.J. Allen, J.F. Andrade, D.F. Angulo, D. Anjos, D.N. Anstett, R. Bagchi, S. Bagchi, M. Barbosa, S. Barrett, C.A. Baskett, E. Ben-Simchon, K.J. Bloodworth, J.L. Bronstein, Y.M. Buckley, K.T. Burghardt, C. Bustos-Segura, E.S. Calixto, R.L. Carvalho, B. Castagneyrol, M.C. Chiuffo, D. CinoÄlu, E. Cinto MejÃa, M.C. Cock, R. Cogni, O.L. Cope, T. Cornelissen, D.R. Cortez, D.W. Crowder, C. Dallstream, W. Dáttilo, J.K. Davis, R.D. Dimarco, H.E. Dole, I.N. Egbon, M. Eisenring, A. Ejomah, B.D. Elderd, M.-J. Endara, M.D. Eubanks, S.E. Everingham, K.N. Farah, R.P. Farias, A.P. Fernandes, G.W. Fernandes, M. Ferrante, A. Finn, G.A. Florjancic, M.L. Forister, Q.N. Fox, E. Frago, F.M. França, A.S. Getman-Pickering, Z. Getman-Pickering, E. Gianoli, B. Gooden, M.M. Gossner, K.A. Greig, S. Gripenberg, R. Groenteman, P. Grof-Tisza, N. Haack, L. Hahn, S.M. Haq, A.M. Helms, J. Hennecke, S.L. Hermann, L.M. Holeski, S. Holm, M.C. Hutchinson, <strong>E.E. Jackson</strong>, S. Kagiya, A. Kalske, M. Kalwajtys, R. Karban, R. Kariyat, T. Keasar, M.F. Kersch-Becker, H.M. Kharouba, T.N. Kim, D.M. Kimuyu, J. Kluse, S.E. Koerner, K.J. Komatsu, S. Krishnan, M. Laihonen, L. Lamelas-López, M.C. LaScaleia, N. Lecomte, C.R. Lehn, X. Li, R.L. Lindroth, E.F. LoPresti, M. Losada, A.M. Louthan, V.J. Luizzi, S.C. Lynch, J.S. Lynn, N.J. Lyon, L.F. Maia, R.A. Maia, T.L. Mannall, B.S. Martin, T.J. Massad, A.C. McCall, K. McGurrin, A.C. Merwin, Z. Mijango-Ramos, C.H. Mills, A.T. Moles, C.M. Moore, X. Moreira, C.R. Morrison, M.C. Moshobane, A. Muola, R. Nakadai, K. Nakajima, S. Novais, C.O. Ogbebor, H. Ohsaki, V.S. Pan, N.A. Pardikes, M. Pareja, N. Parthasarathy, R.R. Pawar, Q. Paynter, I.S. Pearse, R.M. Penczykowski, A.A. Pepi, C.C. Pereira, S.S. Phartyal, F.I. Piper, K. Poveda, E.G. Pringle, J. Puy, T. Quijano, C. Quintero, S. Rasmann, C. Rosche, L.Y. Rosenheim, J.A. Rosenheim, J.B. Runyon, A. Sadeh, Y. Sakata, D.M. Salcido, C. Salgado-Luarte, B.A. Santos, Y. Sapir, Y. Sasal, Y. Sato, M. Sawant, H. Schroeder, I. Schumann, M. Segoli, H. Segre, O. Shelef, N. Shinohara, R.P. Singh, D.S. Smith, M. Sobral, G.C. Stotz, A.J.M. Tack, M. Tayal, J.F. Tooker, D. Torrico-Bazoberry, K. Tougeron, A.M. Trowbridge, S. Utsumi, O. Uyi, J.L. Vaca-Uribe, A. Valtonen, L.J.A. van Dijk, V. Vandvik, J. Villellas, L.P. Waller, M.G. Weber, A. Yamawo, S. Yim, P.L. Zarnetske, L.N. Zehr, Z. Zhong, and W.C. Wetzel <br><a href="#fnref2" class="footnote-back" role="doc-backlink">â©ï¸</a></p></li> 188</ol> 189</section></div></main> <!-- /main -->
190<script id="quarto-html-after-body" type="application/javascript"> 191 window.document.addEventListener("DOMContentLoaded", function (event) { 192 const icon = "î§"; 193 const anchorJS = new window.AnchorJS(); 194 anchorJS.options = { 195 placement: 'right', 196 icon: icon 197 }; 198 anchorJS.add('.anchored'); 199 const isCodeAnnotation = (el) => { 200 for (const clz of el.classList) { 201 if (clz.startsWith('code-annotation-')) { 202 return true; 203 } 204 } 205 return false; 206 } 207 const onCopySuccess = function(e) { 208 // button target 209 const button = e.trigger; 210 // don't keep focus 211 button.blur(); 212 // flash "checked" 213 button.classList.add('code-copy-button-checked'); 214 var currentTitle = button.getAttribute("title"); 215 button.setAttribute("title", "Copied!"); 216 let tooltip; 217 if (window.bootstrap) { 218 button.setAttribute("data-bs-toggle", "tooltip"); 219 button.setAttribute("data-bs-placement", "left"); 220 button.setAttribute("data-bs-title", "Copied!"); 221 tooltip = new bootstrap.Tooltip(button, 222 { trigger: "manual", 223 customClass: "code-copy-button-tooltip", 224 offset: [0, -8]}); 225 tooltip.show(); 226 } 227 setTimeout(function() { 228 if (tooltip) { 229 tooltip.hide(); 230 button.removeAttribute("data-bs-title"); 231 button.removeAttribute("data-bs-toggle"); 232 button.removeAttribute("data-bs-placement"); 233 } 234 button.setAttribute("title", currentTitle); 235 button.classList.remove('code-copy-button-checked'); 236 }, 1000); 237 // clear code selection 238 e.clearSelection(); 239 } 240 const getTextToCopy = function(trigger) { 241 const outerScaffold = trigger.parentElement.cloneNode(true); 242 const codeEl = outerScaffold.querySelector('code'); 243 for (const childEl of codeEl.children) { 244 if (isCodeAnnotation(childEl)) { 245 childEl.remove(); 246 } 247 } 248 return codeEl.innerText; 249 } 250 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 251 text: getTextToCopy 252 }); 253 clipboard.on('success', onCopySuccess); 254 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 255 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 256 text: getTextToCopy, 257 container: window.document.getElementById('quarto-embedded-source-code-modal') 258 }); 259 clipboardModal.on('success', onCopySuccess); 260 } 261 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 262 var mailtoRegex = new RegExp(/^mailto:/); 263 var filterRegex = new RegExp("https:\/\/eleanorjackson\.com"); 264 var isInternal = (href) => { 265 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 266 } 267 // Inspect non-navigation links and adorn them if external 268 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)'); 269 for (var i=0; i<links.length; i++) { 270 const link = links[i]; 271 if (!isInternal(link.href)) { 272 // undo the damage that might have been done by quarto-nav.js in the case of 273 // links that we want to consider external 274 if (link.dataset.originalHref !== undefined) { 275 link.href = link.dataset.originalHref; 276 } 277 } 278 } 279 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 280 const config = { 281 allowHTML: true, 282 maxWidth: 500, 283 delay: 100, 284 arrow: false, 285 appendTo: function(el) { 286 return el.parentElement; 287 }, 288 interactive: true, 289 interactiveBorder: 10, 290 theme: 'quarto', 291 placement: 'bottom-start', 292 }; 293 if (contentFn) { 294 config.content = contentFn; 295 } 296 if (onTriggerFn) { 297 config.onTrigger = onTriggerFn; 298 } 299 if (onUntriggerFn) { 300 config.onUntrigger = onUntriggerFn; 301 } 302 window.tippy(el, config); 303 } 304 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 305 for (var i=0; i<noterefs.length; i++) { 306 const ref = noterefs[i]; 307 tippyHover(ref, function() { 308 // use id or data attribute instead here 309 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 310 try { href = new URL(href).hash; } catch {} 311 const id = href.replace(/^#\/?/, ""); 312 const note = window.document.getElementById(id); 313 if (note) { 314 return note.innerHTML; 315 } else { 316 return ""; 317 } 318 }); 319 } 320 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 321 const processXRef = (id, note) => { 322 // Strip column container classes 323 const stripColumnClz = (el) => { 324 el.classList.remove("page-full", "page-columns"); 325 if (el.children) { 326 for (const child of el.children) {
327 stripColumnClz(child); 328 } 329 } 330 } 331 stripColumnClz(note) 332 if (id === null || id.startsWith('sec-')) { 333 // Special case sections, only their first couple elements 334 const container = document.createElement("div"); 335 if (note.children && note.children.length > 2) { 336 container.appendChild(note.children[0].cloneNode(true)); 337 for (let i = 1; i < note.children.length; i++) { 338 const child = note.children[i]; 339 if (child.tagName === "P" && child.innerText === "") { 340 continue; 341 } else { 342 container.appendChild(child.cloneNode(true)); 343 break; 344 } 345 } 346 if (window.Quarto?.typesetMath) { 347 window.Quarto.typesetMath(container); 348 } 349 return container.innerHTML 350 } else { 351 if (window.Quarto?.typesetMath) { 352 window.Quarto.typesetMath(note); 353 } 354 return note.innerHTML; 355 } 356 } else { 357 // Remove any anchor links if they are present 358 const anchorLink = note.querySelector('a.anchorjs-link'); 359 if (anchorLink) { 360 anchorLink.remove(); 361 } 362 if (window.Quarto?.typesetMath) { 363 window.Quarto.typesetMath(note); 364 } 365 if (note.classList.contains("callout")) { 366 return note.outerHTML; 367 } else { 368 return note.innerHTML; 369 } 370 } 371 } 372 for (var i=0; i<xrefs.length; i++) { 373 const xref = xrefs[i]; 374 tippyHover(xref, undefined, function(instance) { 375 instance.disable(); 376 let url = xref.getAttribute('href'); 377 let hash = undefined; 378 if (url.startsWith('#')) { 379 hash = url; 380 } else { 381 try { hash = new URL(url).hash; } catch {} 382 } 383 if (hash) { 384 const id = hash.replace(/^#\/?/, ""); 385 const note = window.document.getElementById(id); 386 if (note !== null) { 387 try { 388 const html = processXRef(id, note.cloneNode(true)); 389 instance.setContent(html); 390 } finally { 391 instance.enable(); 392 instance.show(); 393 } 394 } else { 395 // See if we can fetch this 396 fetch(url.split('#')[0]) 397 .then(res => res.text()) 398 .then(html => { 399 const parser = new DOMParser(); 400 const htmlDoc = parser.parseFromString(html, "text/html"); 401 const note = htmlDoc.getElementById(id); 402 if (note !== null) { 403 const html = processXRef(id, note); 404 instance.setContent(html); 405 } 406 }).finally(() => { 407 instance.enable(); 408 instance.show(); 409 }); 410 } 411 } else { 412 // See if we can fetch a full url (with no hash to target) 413 // This is a special case and we should probably do some content thinning / targeting 414 fetch(url) 415 .then(res => res.text()) 416 .then(html => { 417 const parser = new DOMParser(); 418 const htmlDoc = parser.parseFromString(html, "text/html"); 419 const note = htmlDoc.querySelector('main.content'); 420 if (note !== null) { 421 // This should only happen for chapter cross references 422 // (since there is no id in the URL) 423 // remove the first header 424 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 425 note.children[0].remove(); 426 } 427 const html = processXRef(null, note); 428 instance.setContent(html); 429 } 430 }).finally(() => { 431 instance.enable(); 432 instance.show(); 433 }); 434 } 435 }, function(instance) { 436 }); 437 } 438 let selectedAnnoteEl; 439 const selectorForAnnotation = ( cell, annotation) => { 440 let cellAttr = 'data-code-cell="' + cell + '"'; 441 let lineAttr = 'data-code-annotation="' + annotation + '"'; 442 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 443 return selector; 444 } 445 const selectCodeLines = (annoteEl) => { 446 const doc = window.document; 447 const targetCell = annoteEl.getAttribute("data-target-cell"); 448 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 449 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 450 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 451 const lineIds = lines.map((line) => { 452 return targetCell + "-" + line; 453 }) 454 let top = null; 455 let height = null; 456 let parent = null; 457 if (lineIds.length > 0) { 458 //compute the position of the single el (top and bottom and make a div) 459 const el = window.document.getElementById(lineIds[0]); 460 top = el.offsetTop; 461 height = el.offsetHeight; 462 parent = el.parentElement.parentElement; 463 if (lineIds.length > 1) { 464 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 465 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 466 height = bottom - top; 467 } 468 if (top !== null && height !== null && parent !== null) { 469 // cook up a div (if necessary) and position it 470 let div = window.document.getElementById("code-annotation-line-highlight"); 471 if (div === null) { 472 div = window.document.createElement("div"); 473 div.setAttribute("id", "code-annotation-line-highlight"); 474 div.style.position = 'absolute'; 475 parent.appendChild(div); 476 } 477 div.style.top = top - 2 + "px"; 478 div.style.height = height + 4 + "px"; 479 div.style.left = 0; 480 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 481 if (gutterDiv === null) { 482 gutterDiv = window.document.createElement("div"); 483 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 484 gutterDiv.style.position = 'absolute'; 485 const codeCell = window.document.getElementById(targetCell); 486 const gutter = codeCell.querySelector('.code-annotation-gutter'); 487 gutter.appendChild(gutterDiv); 488 } 489 gutterDiv.style.top = top - 2 + "px"; 490 gutterDiv.style.height = height + 4 + "px"; 491 } 492 selectedAnnoteEl = annoteEl; 493 } 494 }; 495 const unselectCodeLines = () => { 496 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 497 elementsIds.forEach((elId) => { 498 const div = window.document.getElementById(elId); 499 if (div) { 500 div.remove(); 501 } 502 }); 503 selectedAnnoteEl = undefined; 504 }; 505 // Handle positioning of the toggle 506 window.addEventListener( 507 "resize", 508 throttle(() => { 509 elRect = undefined; 510 if (selectedAnnoteEl) { 511 selectCodeLines(selectedAnnoteEl); 512 } 513 }, 10) 514 ); 515 function throttle(fn, ms) { 516 let throttle = false;
517 let timer; 518 return (...args) => { 519 if(!throttle) { // first call gets through 520 fn.apply(this, args); 521 throttle = true; 522 } else { // all the others get throttled 523 if(timer) clearTimeout(timer); // cancel #2 524 timer = setTimeout(() => { 525 fn.apply(this, args); 526 timer = throttle = false; 527 }, ms); 528 } 529 }; 530 } 531 // Attach click handler to the DT 532 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 533 for (const annoteDlNode of annoteDls) { 534 annoteDlNode.addEventListener('click', (event) => { 535 const clickedEl = event.target; 536 if (clickedEl !== selectedAnnoteEl) { 537 unselectCodeLines(); 538 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 539 if (activeEl) { 540 activeEl.classList.remove('code-annotation-active'); 541 } 542 selectCodeLines(clickedEl); 543 clickedEl.classList.add('code-annotation-active'); 544 } else { 545 // Unselect the line 546 unselectCodeLines(); 547 clickedEl.classList.remove('code-annotation-active'); 548 } 549 }); 550 } 551 const findCites = (el) => { 552 const parentEl = el.parentElement; 553 if (parentEl) { 554 const cites = parentEl.dataset.cites; 555 if (cites) { 556 return { 557 el, 558 cites: cites.split(' ') 559 }; 560 } else { 561 return findCites(el.parentElement) 562 } 563 } else { 564 return undefined; 565 } 566 }; 567 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 568 for (var i=0; i<bibliorefs.length; i++) { 569 const ref = bibliorefs[i]; 570 const citeInfo = findCites(ref); 571 if (citeInfo) { 572 tippyHover(citeInfo.el, function() { 573 var popup = window.document.createElement('div'); 574 citeInfo.cites.forEach(function(cite) { 575 var citeDiv = window.document.createElement('div'); 576 citeDiv.classList.add('hanging-indent'); 577 citeDiv.classList.add('csl-entry'); 578 var biblioDiv = window.document.getElementById('ref-' + cite); 579 if (biblioDiv) { 580 citeDiv.innerHTML = biblioDiv.innerHTML; 581 } 582 popup.appendChild(citeDiv); 583 }); 584 return popup.innerHTML; 585 }); 586 } 587 } 588 }); 589 </script>
589 590</div> <!-- /content --> 591<footer class="footer"> 592 <div class="nav-footer"> 593 <div class="nav-footer-left"> 594<i class="fa-regular fa-copyright" aria-label="copyright"></i> Eleanor Jackson,
595<script>document.write(/\d{4}/.exec(Date())[0])</script>
595 596</div> 597 <div class="nav-footer-center"> 598 599 </div> 600 <div class="nav-footer-right"> 601<p><a href="https://github.com/ee-jackson/quarto-site" title="source code"><i class="fa-solid fa-code" aria-label="code"></i></a></p> 602</div> 603 </div> 604</footer> 605 606 607 608
609<script data-goatcounter="https://eejackson.goatcounter.com/count" 610 async src="//gc.zgo.at/count.js"></script>
610</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.