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.42"> 6 7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 8 9 10<title>J.-P. Renne</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="./img/favicon.png" rel="icon" type="image/png">
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-2f5df379a58b258e96c21c0638c20c03.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-592dba6c80c87bed5231b64218318c97.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light"> 41<link href="site_libs/quarto-contrib/academicons-1.9.2/all.css" rel="stylesheet"> 42<link href="site_libs/quarto-contrib/academicons-1.9.2/size.css" rel="stylesheet">
43<script id="quarto-search-options" type="application/json">{ 44 "location": "navbar", 45 "copy-button": false, 46 "collapse-after": 3, 47 "panel-placement": "end", 48 "type": "textbox", 49 "limit": 50, 50 "keyboard-shortcut": [ 51 "f", 52 "/", 53 "s" 54 ], 55 "language": { 56 "search-no-results-text": "No results", 57 "search-matching-documents-text": "matching documents", 58 "search-copy-link-title": "Copy link to search", 59 "search-hide-matches-text": "Hide additional matches", 60 "search-more-match-text": "more match in this document", 61 "search-more-matches-text": "more matches in this document", 62 "search-clear-button-title": "Clear", 63 "search-text-placeholder": "", 64 "search-detached-cancel-button-title": "Cancel", 65 "search-submit-button-title": "Submit", 66 "search-label": "Search" 67 } 68}</script>
68 69 70 71</head> 72 73<body class="nav-fixed fullcontent"> 74 75<div id="quarto-search-results"></div> 76 <header id="quarto-header" class="headroom fixed-top"> 77 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 78 <div class="navbar-container container-fluid"> 79 <div class="navbar-brand-container mx-auto"> 80 <a href="./index.html" class="navbar-brand navbar-brand-logo"> 81 <img src="./img/logo.png" alt="" class="navbar-logo"> 82 </a> 83 <a class="navbar-brand" href="./index.html"> 84 <span class="navbar-title">J.-P. Renne</span> 85 </a> 86 </div> 87 <div id="quarto-search" class="" title="Search"></div> 88 <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(); }"> 89 <span class="navbar-toggler-icon"></span> 90</button> 91 <div class="collapse navbar-collapse" id="navbarCollapse"> 92 <ul class="navbar-nav navbar-nav-scroll me-auto"> 93 <li class="nav-item"> 94 <a class="nav-link" href="./research.html"> 95<span class="menu-text">Research</span></a> 96 </li> 97 <li class="nav-item"> 98 <a class="nav-link" href="./teaching/index.html"> 99<span class="menu-text">Teaching</span></a> 100 </li> 101 <li class="nav-item"> 102 <a class="nav-link" href="./cv/index.html"> 103<span class="menu-text">CV</span></a> 104 </li> 105 <li class="nav-item"> 106 <a class="nav-link" href="./photography/index.html"> 107<span class="menu-text">Butterflies</span></a> 108 </li> 109</ul> 110 <ul class="navbar-nav navbar-nav-scroll ms-auto"> 111 <li class="nav-item"> 112 <a class="nav-link" href="https://github.com/jrenne"> <i class="bi bi-github" role="img"> 113</i> 114<span class="menu-text">Github</span></a> 115 </li> 116 <li class="nav-item"> 117 <a class="nav-link" href="mailto:[email protected]"> <i class="bi bi-envelope" role="img"> 118</i> 119<span class="menu-text">Email</span></a> 120 </li> 121 <li class="nav-item"> 122 <a class="nav-link" href="https://scholar.google.com/citations?user=DXgArakAAAAJ&hl=en"> <i class="bi bi-book" role="img"> 123</i> 124<span class="menu-text">Google Scholar</span></a> 125 </li> 126</ul> 127 </div> <!-- /navcollapse --> 128 <div class="quarto-navbar-tools"> 129</div> 130 </div> <!-- /container-fluid --> 131 </nav> 132</header> 133<!-- content --> 134<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar"> 135<!-- sidebar --> 136<!-- margin-sidebar --> 137 138<!-- main --> 139<main class="content" id="quarto-document-content"> 140 141 142 143 144<div class="quarto-about-jolla"> 145 <img src="img/my_image.jpg" class="about-image 146 round " style="height: 15em; width: 15em;"> 147 <header id="title-block-header" class="quarto-title-block"></header><div id="about-block"> 148</div> 149 <hr class="about-sep"> 150 <div class="about-links"> 151 <a href="https://github.com/jrenne" class="about-link" rel="" target=""> 152 <i class="bi bi-github"></i> 153 <span class="about-link-text">Github</span> 154 </a> 155 <a href="mailto:[email protected]" class="about-link" rel="" target=""> 156 <i class="bi bi-envelope"></i> 157 <span class="about-link-text">Email</span> 158 </a> 159 <a href="https://scholar.google.com/citations?user=DXgArakAAAAJ&hl=en" class="about-link" rel="" target=""> 160 <i class="bi bi-book"></i> 161 <span class="about-link-text">Google Scholar</span> 162 </a> 163 <a href="https://applicationspub.unil.ch/interpub/noauth/php/Un/UnPers.php?PerNum=1175304&LanCode=8" class="about-link" rel="" target=""> 164 <i class="bi bi-infinity"></i> 165 <span class="about-link-text">Unisciences</span> 166 </a> 167</div> 168</div> 169 170<section id="welcome-to-my-website" class="level1"> 171<h1>Welcome to my website!</h1> 172<!-- --> 173<!-- Pour essai @Hemingway1952 --> 174<!-- [link to image](img/my_image.jpg) [link to CV](cv/cv.pdf) --> 175<!-- ```{r} --> 176<!-- #| label: fig-airquality --> 177<!-- #| fig-cap: "Temperature and ozone level." --> 178<!-- #| warning: false -->
179<!-- plot(rnorm(10)) --> 180<!-- 1000^2 --> 181<!-- ``` --> 182<p>I am a professor of economics at HEC Lausanne, which I joined in 2015. Previously, I worked as a senior economist at the <a href="https://www.banque-france.fr/en/page-sommaire/research">Banque de France</a>, and as the head of operational research at the <a href="https://www.aft.gouv.fr">French Debt Management Office</a> (Agence France Trésor).</p> 183<p>My research focuses on time series modeling, with applications to interest rate dynamics, catastrophe risk pricing, and public debt management.</p> 184<p>I have carried out consulting assignments for various institutions: European Central Bank (ECB), Bank for International Settlements (BIS), Organisation for Economic Co-operation and Development (OECD), Banque de France, Ãlectricité de France (EDF), Swiss Federal Finance Administration (AFF), Swiss State Secretariat for Economic Affairs (SECO).</p> 185<p>On this website, youâll find my published work, my work in progress, and links to related material (codes). Please feel free to <a href="mailto:[email protected]">contact me</a> if you have any questions.</p> 186 187 188 189</section> 190 191</main> <!-- /main -->
192<script> 193(function () { 194 function decodeCategory(category) { 195 try { 196 return decodeURIComponent(window.atob(category)); 197 } catch (_error) { 198 return category; 199 } 200 } 201 202 function setCategoryHash(category) { 203 window.history.pushState(null, null, `#category=${category}`); 204 } 205 206 function activateCategory(category) { 207 const activeEls = window.document.querySelectorAll( 208 ".quarto-listing-category .category.active" 209 ); 210 for (const activeEl of activeEls) { 211 activeEl.classList.remove("active"); 212 } 213 214 const categoryEl = window.document.querySelector( 215 `.quarto-listing-category .category[data-category='${category}']` 216 ); 217 if (categoryEl) { 218 categoryEl.classList.add("active"); 219 } 220 221 filterListingCategory(category); 222 } 223 224 function filterListingCategory(category) { 225 const listings = window["quarto-listings"] || {}; 226 const listingIds = Object.keys(listings); 227 const selectedCategory = decodeCategory(category).trim(); 228 229 for (const listingId of listingIds) { 230 const list = listings[listingId]; 231 if (!list) { 232 continue; 233 } 234 235 if (category === "") { 236 list.filter(); 237 continue; 238 } 239 240 list.filter(function (item) { 241 const itemValues = item.values(); 242 if (itemValues.categories === null) { 243 return false; 244 } 245 246 const rawCategories = itemValues.categories.split(","); 247 const decodedCategories = decodeCategory(itemValues.categories) 248 .split(",") 249 .map((category) => category.trim()); 250 251 return ( 252 rawCategories.includes(category) || 253 decodedCategories.includes(selectedCategory) 254 ); 255 }); 256 } 257 } 258 259 function attachCategoryHandlers() { 260 const categoryEls = window.document.querySelectorAll( 261 ".quarto-listing-category .category" 262 ); 263 for (const categoryEl of categoryEls) { 264 const category = categoryEl.getAttribute("data-category"); 265 categoryEl.onclick = function () { 266 activateCategory(category); 267 setCategoryHash(category); 268 }; 269 } 270 271 const categoryTitleEls = window.document.querySelectorAll( 272 ".quarto-listing-category-title" 273 ); 274 for (const categoryTitleEl of categoryTitleEls) { 275 categoryTitleEl.onclick = function () { 276 activateCategory(""); 277 setCategoryHash(""); 278 }; 279 } 280 } 281 282 window.quartoListingCategory = function (category) { 283 activateCategory(category); 284 setCategoryHash(category); 285 }; 286 287 window.document.addEventListener("DOMContentLoaded", attachCategoryHandlers); 288})(); 289</script>
vendor: 1 bytes, line 289
289
290<script id="quarto-html-after-body" type="application/javascript"> 291window.document.addEventListener("DOMContentLoaded", function (event) { 292 const toggleBodyColorMode = (bsSheetEl) => { 293 const mode = bsSheetEl.getAttribute("data-mode"); 294 const bodyEl = window.document.querySelector("body"); 295 if (mode === "dark") { 296 bodyEl.classList.add("quarto-dark"); 297 bodyEl.classList.remove("quarto-light"); 298 } else { 299 bodyEl.classList.add("quarto-light"); 300 bodyEl.classList.remove("quarto-dark"); 301 } 302 } 303 const toggleBodyColorPrimary = () => { 304 const bsSheetEl = window.document.querySelector("link#quarto-bootstrap"); 305 if (bsSheetEl) { 306 toggleBodyColorMode(bsSheetEl); 307 } 308 } 309 toggleBodyColorPrimary(); 310 const isCodeAnnotation = (el) => { 311 for (const clz of el.classList) { 312 if (clz.startsWith('code-annotation-')) { 313 return true; 314 } 315 } 316 return false; 317 } 318 const onCopySuccess = function(e) { 319 // button target 320 const button = e.trigger; 321 // don't keep focus 322 button.blur(); 323 // flash "checked" 324 button.classList.add('code-copy-button-checked'); 325 var currentTitle = button.getAttribute("title"); 326 button.setAttribute("title", "Copied!"); 327 let tooltip; 328 if (window.bootstrap) { 329 button.setAttribute("data-bs-toggle", "tooltip"); 330 button.setAttribute("data-bs-placement", "left"); 331 button.setAttribute("data-bs-title", "Copied!"); 332 tooltip = new bootstrap.Tooltip(button, 333 { trigger: "manual", 334 customClass: "code-copy-button-tooltip", 335 offset: [0, -8]}); 336 tooltip.show(); 337 } 338 setTimeout(function() { 339 if (tooltip) { 340 tooltip.hide(); 341 button.removeAttribute("data-bs-title"); 342 button.removeAttribute("data-bs-toggle"); 343 button.removeAttribute("data-bs-placement"); 344 } 345 button.setAttribute("title", currentTitle); 346 button.classList.remove('code-copy-button-checked'); 347 }, 1000); 348 // clear code selection 349 e.clearSelection(); 350 } 351 const getTextToCopy = function(trigger) { 352 const codeEl = trigger.previousElementSibling.cloneNode(true); 353 for (const childEl of codeEl.children) { 354 if (isCodeAnnotation(childEl)) { 355 childEl.remove(); 356 } 357 } 358 return codeEl.innerText; 359 } 360 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 361 text: getTextToCopy 362 }); 363 clipboard.on('success', onCopySuccess); 364 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 365 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 366 text: getTextToCopy, 367 container: window.document.getElementById('quarto-embedded-source-code-modal') 368 }); 369 clipboardModal.on('success', onCopySuccess); 370 } 371 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 372 var mailtoRegex = new RegExp(/^mailto:/); 373 var filterRegex = new RegExp('/' + window.location.host + '/'); 374 var isInternal = (href) => { 375 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 376 } 377 // Inspect non-navigation links and adorn them if external 378 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)'); 379 for (var i=0; i<links.length; i++) { 380 const link = links[i]; 381 if (!isInternal(link.href)) { 382 // undo the damage that might have been done by quarto-nav.js in the case of 383 // links that we want to consider external 384 if (link.dataset.originalHref !== undefined) { 385 link.href = link.dataset.originalHref; 386 } 387 } 388 } 389 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 390 const config = { 391 allowHTML: true, 392 maxWidth: 500, 393 delay: 100, 394 arrow: false, 395 appendTo: function(el) { 396 return el.parentElement; 397 }, 398 interactive: true, 399 interactiveBorder: 10, 400 theme: 'quarto', 401 placement: 'bottom-start', 402 }; 403 if (contentFn) { 404 config.content = contentFn; 405 } 406 if (onTriggerFn) { 407 config.onTrigger = onTriggerFn; 408 } 409 if (onUntriggerFn) { 410 config.onUntrigger = onUntriggerFn; 411 } 412 window.tippy(el, config); 413 } 414 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 415 for (var i=0; i<noterefs.length; i++) { 416 const ref = noterefs[i]; 417 tippyHover(ref, function() { 418 // use id or data attribute instead here 419 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
420 try { href = new URL(href).hash; } catch {} 421 const id = href.replace(/^#\/?/, ""); 422 const note = window.document.getElementById(id); 423 if (note) { 424 return note.innerHTML; 425 } else { 426 return ""; 427 } 428 }); 429 } 430 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 431 const processXRef = (id, note) => { 432 // Strip column container classes 433 const stripColumnClz = (el) => { 434 el.classList.remove("page-full", "page-columns"); 435 if (el.children) { 436 for (const child of el.children) { 437 stripColumnClz(child); 438 } 439 } 440 } 441 stripColumnClz(note) 442 if (id === null || id.startsWith('sec-')) { 443 // Special case sections, only their first couple elements 444 const container = document.createElement("div"); 445 if (note.children && note.children.length > 2) { 446 container.appendChild(note.children[0].cloneNode(true)); 447 for (let i = 1; i < note.children.length; i++) { 448 const child = note.children[i]; 449 if (child.tagName === "P" && child.innerText === "") { 450 continue; 451 } else { 452 container.appendChild(child.cloneNode(true)); 453 break; 454 } 455 } 456 if (window.Quarto?.typesetMath) { 457 window.Quarto.typesetMath(container); 458 } 459 return container.innerHTML 460 } else { 461 if (window.Quarto?.typesetMath) { 462 window.Quarto.typesetMath(note); 463 } 464 return note.innerHTML; 465 } 466 } else { 467 // Remove any anchor links if they are present 468 const anchorLink = note.querySelector('a.anchorjs-link'); 469 if (anchorLink) { 470 anchorLink.remove(); 471 } 472 if (window.Quarto?.typesetMath) { 473 window.Quarto.typesetMath(note); 474 } 475 if (note.classList.contains("callout")) { 476 return note.outerHTML; 477 } else { 478 return note.innerHTML; 479 } 480 } 481 } 482 for (var i=0; i<xrefs.length; i++) { 483 const xref = xrefs[i]; 484 tippyHover(xref, undefined, function(instance) { 485 instance.disable(); 486 let url = xref.getAttribute('href'); 487 let hash = undefined; 488 if (url.startsWith('#')) { 489 hash = url; 490 } else { 491 try { hash = new URL(url).hash; } catch {} 492 } 493 if (hash) { 494 const id = hash.replace(/^#\/?/, ""); 495 const note = window.document.getElementById(id); 496 if (note !== null) { 497 try { 498 const html = processXRef(id, note.cloneNode(true)); 499 instance.setContent(html); 500 } finally { 501 instance.enable(); 502 instance.show(); 503 } 504 } else { 505 // See if we can fetch this 506 fetch(url.split('#')[0]) 507 .then(res => res.text()) 508 .then(html => { 509 const parser = new DOMParser(); 510 const htmlDoc = parser.parseFromString(html, "text/html"); 511 const note = htmlDoc.getElementById(id); 512 if (note !== null) { 513 const html = processXRef(id, note); 514 instance.setContent(html); 515 } 516 }).finally(() => { 517 instance.enable(); 518 instance.show(); 519 }); 520 } 521 } else { 522 // See if we can fetch a full url (with no hash to target) 523 // This is a special case and we should probably do some content thinning / targeting 524 fetch(url) 525 .then(res => res.text()) 526 .then(html => { 527 const parser = new DOMParser(); 528 const htmlDoc = parser.parseFromString(html, "text/html"); 529 const note = htmlDoc.querySelector('main.content'); 530 if (note !== null) { 531 // This should only happen for chapter cross references 532 // (since there is no id in the URL) 533 // remove the first header 534 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 535 note.children[0].remove(); 536 } 537 const html = processXRef(null, note); 538 instance.setContent(html); 539 } 540 }).finally(() => { 541 instance.enable(); 542 instance.show(); 543 }); 544 } 545 }, function(instance) { 546 }); 547 } 548 let selectedAnnoteEl; 549 const selectorForAnnotation = ( cell, annotation) => { 550 let cellAttr = 'data-code-cell="' + cell + '"'; 551 let lineAttr = 'data-code-annotation="' + annotation + '"'; 552 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 553 return selector; 554 } 555 const selectCodeLines = (annoteEl) => { 556 const doc = window.document; 557 const targetCell = annoteEl.getAttribute("data-target-cell"); 558 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 559 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 560 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 561 const lineIds = lines.map((line) => { 562 return targetCell + "-" + line; 563 }) 564 let top = null; 565 let height = null; 566 let parent = null; 567 if (lineIds.length > 0) { 568 //compute the position of the single el (top and bottom and make a div) 569 const el = window.document.getElementById(lineIds[0]); 570 top = el.offsetTop; 571 height = el.offsetHeight; 572 parent = el.parentElement.parentElement; 573 if (lineIds.length > 1) { 574 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 575 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 576 height = bottom - top; 577 } 578 if (top !== null && height !== null && parent !== null) { 579 // cook up a div (if necessary) and position it 580 let div = window.document.getElementById("code-annotation-line-highlight"); 581 if (div === null) { 582 div = window.document.createElement("div"); 583 div.setAttribute("id", "code-annotation-line-highlight"); 584 div.style.position = 'absolute'; 585 parent.appendChild(div); 586 } 587 div.style.top = top - 2 + "px"; 588 div.style.height = height + 4 + "px"; 589 div.style.left = 0; 590 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 591 if (gutterDiv === null) { 592 gutterDiv = window.document.createElement("div"); 593 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 594 gutterDiv.style.position = 'absolute'; 595 const codeCell = window.document.getElementById(targetCell); 596 const gutter = codeCell.querySelector('.code-annotation-gutter'); 597 gutter.appendChild(gutterDiv); 598 } 599 gutterDiv.style.top = top - 2 + "px"; 600 gutterDiv.style.height = height + 4 + "px"; 601 } 602 selectedAnnoteEl = annoteEl; 603 } 604 }; 605 const unselectCodeLines = () => { 606 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 607 elementsIds.forEach((elId) => { 608 const div = window.document.getElementById(elId); 609 if (div) { 610 div.remove(); 611 } 612 }); 613 selectedAnnoteEl = undefined; 614 }; 615 // Handle positioning of the toggle 616 window.addEventListener( 617 "resize", 618 throttle(() => { 619 elRect = undefined; 620 if (selectedAnnoteEl) { 621 selectCodeLines(selectedAnnoteEl); 622 } 623 }, 10) 624 ); 625 function throttle(fn, ms) { 626 let throttle = false;
627 let timer; 628 return (...args) => { 629 if(!throttle) { // first call gets through 630 fn.apply(this, args); 631 throttle = true; 632 } else { // all the others get throttled 633 if(timer) clearTimeout(timer); // cancel #2 634 timer = setTimeout(() => { 635 fn.apply(this, args); 636 timer = throttle = false; 637 }, ms); 638 } 639 }; 640 } 641 // Attach click handler to the DT 642 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 643 for (const annoteDlNode of annoteDls) { 644 annoteDlNode.addEventListener('click', (event) => { 645 const clickedEl = event.target; 646 if (clickedEl !== selectedAnnoteEl) { 647 unselectCodeLines(); 648 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 649 if (activeEl) { 650 activeEl.classList.remove('code-annotation-active'); 651 } 652 selectCodeLines(clickedEl); 653 clickedEl.classList.add('code-annotation-active'); 654 } else { 655 // Unselect the line 656 unselectCodeLines(); 657 clickedEl.classList.remove('code-annotation-active'); 658 } 659 }); 660 } 661 const findCites = (el) => { 662 const parentEl = el.parentElement; 663 if (parentEl) { 664 const cites = parentEl.dataset.cites; 665 if (cites) { 666 return { 667 el, 668 cites: cites.split(' ') 669 }; 670 } else { 671 return findCites(el.parentElement) 672 } 673 } else { 674 return undefined; 675 } 676 }; 677 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 678 for (var i=0; i<bibliorefs.length; i++) { 679 const ref = bibliorefs[i]; 680 const citeInfo = findCites(ref); 681 if (citeInfo) { 682 tippyHover(citeInfo.el, function() { 683 var popup = window.document.createElement('div'); 684 citeInfo.cites.forEach(function(cite) { 685 var citeDiv = window.document.createElement('div'); 686 citeDiv.classList.add('hanging-indent'); 687 citeDiv.classList.add('csl-entry'); 688 var biblioDiv = window.document.getElementById('ref-' + cite); 689 if (biblioDiv) { 690 citeDiv.innerHTML = biblioDiv.innerHTML; 691 } 692 popup.appendChild(citeDiv); 693 }); 694 return popup.innerHTML; 695 }); 696 } 697 } 698}); 699</script>
699 700</div> <!-- /content --> 701<footer class="footer"> 702 <div class="nav-footer"> 703 <div class="nav-footer-left"> 704<p><span class="faux-block">Jean-Paul Renne, UNIL, 1015 Lausanne, Switzerland</span></p> 705</div> 706 <div class="nav-footer-center"> 707 708 </div> 709 <div class="nav-footer-right"> 710 711 </div> 712 </div> 713</footer> 714 715 716 717 718</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.