1<!DOCTYPE html> 2 3<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang=""> 4 5<head> 6 <meta charset="utf-8"/> 7 <meta name="viewport" content="width=device-width, initial-scale=1"/> 8 <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"/> 9 <meta name="generator" content="distill" /> 10 <link rel="alternate" type="application/rss+xml" href="https://www.fizzics.ie/projects.xml" /> 11 12 <style type="text/css"> 13 /* Hide doc at startup (prevent jankiness while JS renders/transforms) */ 14 body { 15 visibility: hidden; 16 } 17 </style> 18 19 <!--radix_placeholder_import_source--> 20 <!--/radix_placeholder_import_source--> 21 22<style type="text/css">code{white-space: pre;}</style> 23<style type="text/css" data-origin="pandoc"> 24pre > code.sourceCode { white-space: pre; position: relative; } 25pre > code.sourceCode > span { line-height: 1.25; } 26pre > code.sourceCode > span:empty { height: 1.2em; } 27.sourceCode { overflow: visible; } 28code.sourceCode > span { color: inherit; text-decoration: inherit; } 29div.sourceCode { margin: 1em 0; } 30pre.sourceCode { margin: 0; } 31@media screen { 32div.sourceCode { overflow: auto; } 33} 34@media print { 35pre > code.sourceCode { white-space: pre-wrap; } 36pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; } 37} 38pre.numberSource code 39 { counter-reset: source-line 0; } 40pre.numberSource code > span 41 { position: relative; left: -4em; counter-increment: source-line; } 42pre.numberSource code > span > a:first-child::before 43 { content: counter(source-line); 44 position: relative; left: -1em; text-align: right; vertical-align: baseline; 45 border: none; display: inline-block; 46 -webkit-touch-callout: none; -webkit-user-select: none; 47 -khtml-user-select: none; -moz-user-select: none; 48 -ms-user-select: none; user-select: none; 49 padding: 0 4px; width: 4em; 50 color: #aaaaaa; 51 } 52pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; } 53div.sourceCode 54 { color: #00769e; background-color: #f1f3f5; } 55@media screen { 56pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; } 57} 58code span { color: #00769e; } /* Normal */ 59code span.al { color: #ad0000; } /* Alert */ 60code span.an { color: #5e5e5e; } /* Annotation */ 61code span.at { color: #657422; } /* Attribute */ 62code span.bn { color: #ad0000; } /* BaseN */ 63code span.bu { } /* BuiltIn */ 64code span.cf { color: #00769e; } /* ControlFlow */ 65code span.ch { color: #20794d; } /* Char */ 66code span.cn { color: #8f5902; } /* Constant */ 67code span.co { color: #5e5e5e; } /* Comment */ 68code span.cv { color: #5e5e5e; font-style: italic; } /* CommentVar */ 69code span.do { color: #5e5e5e; font-style: italic; } /* Documentation */ 70code span.dt { color: #ad0000; } /* DataType */ 71code span.dv { color: #ad0000; } /* DecVal */ 72code span.er { color: #ad0000; } /* Error */ 73code span.ex { } /* Extension */ 74code span.fl { color: #ad0000; } /* Float */ 75code span.fu { color: #4758ab; } /* Function */ 76code span.im { } /* Import */ 77code span.in { color: #5e5e5e; } /* Information */ 78code span.kw { color: #00769e; } /* Keyword */ 79code span.op { color: #5e5e5e; } /* Operator */ 80code span.ot { color: #00769e; } /* Other */ 81code span.pp { color: #ad0000; } /* Preprocessor */ 82code span.sc { color: #5e5e5e; } /* SpecialChar */ 83code span.ss { color: #20794d; } /* SpecialString */ 84code span.st { color: #20794d; } /* String */ 85code span.va { color: #111111; } /* Variable */ 86code span.vs { color: #20794d; } /* VerbatimString */ 87code span.wa { color: #5e5e5e; font-style: italic; } /* Warning */ 88</style> 89 90 91 <!--radix_placeholder_meta_tags--> 92 <title>Euge: Projects</title> 93 94 <meta property="description" itemprop="description" content="Some of other stuff I'm working on right now, or in the recent past"/> 95 96 <link rel="license" href="https://creativecommons.org/licenses/by/4.0/"/> 97 <link rel="icon" type="image/vnd.microsoft.icon" href="images/favicon.ico"/> 98 99 100 <!-- https://developers.facebook.com/docs/sharing/webmasters#markup --> 101 <meta property="og:title" content="Euge: Projects"/> 102 <meta property="og:type" content="article"/> 103 <meta property="og:description" content="Some of other stuff I'm working on right now, or in the recent past"/> 104 <meta property="og:locale" content="en_US"/> 105 <meta property="og:site_name" content="Euge"/> 106 107 <!-- https://dev.twitter.com/cards/types/summary --> 108 <meta property="twitter:card" content="summary"/> 109 <meta property="twitter:title" content="Euge: Projects"/> 110 <meta property="twitter:description" content="Some of other stuff I'm working on right now, or in the recent past"/> 111 <meta property="twitter:site" content="@eugene100hickey"/> 112 113 <!--/radix_placeholder_meta_tags--> 114 <!--radix_placeholder_rmarkdown_metadata--> 115 116
116<script type="text/json" id="radix-rmarkdown-metadata"> 117 {"type":"list","attributes":{"names":{"type":"character","attributes":{},"value":["title","description","listing"]}},"value":[{"type":"character","attributes":{},"value":["Projects"]},{"type":"character","attributes":{},"value":["Some of other stuff I'm working on right now, or in the recent past\n"]},{"type":"character","attributes":{},"value":["projects"]}]} 118 </script>
118 119 <!--/radix_placeholder_rmarkdown_metadata--> 120 <!--radix_placeholder_navigation_in_header--> 121 <meta name="distill:offset" content=""/> 122 123
123<script type="application/javascript"> 124 125 window.headroom_prevent_pin = false; 126 127 window.document.addEventListener("DOMContentLoaded", function (event) { 128 129 // initialize headroom for banner 130 var header = $('header').get(0); 131 var headerHeight = header.offsetHeight; 132 var headroom = new Headroom(header, { 133 tolerance: 5, 134 onPin : function() { 135 if (window.headroom_prevent_pin) { 136 window.headroom_prevent_pin = false; 137 headroom.unpin(); 138 } 139 } 140 }); 141 headroom.init(); 142 if(window.location.hash) 143 headroom.unpin(); 144 $(header).addClass('headroom--transition'); 145 146 // offset scroll location for banner on hash change 147 // (see: https://github.com/WickyNilliams/headroom.js/issues/38) 148 window.addEventListener("hashchange", function(event) { 149 window.scrollTo(0, window.pageYOffset - (headerHeight + 25)); 150 }); 151 152 // responsive menu 153 $('.distill-site-header').each(function(i, val) { 154 var topnav = $(this); 155 var toggle = topnav.find('.nav-toggle'); 156 toggle.on('click', function() { 157 topnav.toggleClass('responsive'); 158 }); 159 }); 160 161 // nav dropdowns 162 $('.nav-dropbtn').click(function(e) { 163 $(this).next('.nav-dropdown-content').toggleClass('nav-dropdown-active'); 164 $(this).parent().siblings('.nav-dropdown') 165 .children('.nav-dropdown-content').removeClass('nav-dropdown-active'); 166 }); 167 $("body").click(function(e){ 168 $('.nav-dropdown-content').removeClass('nav-dropdown-active'); 169 }); 170 $(".nav-dropdown").click(function(e){ 171 e.stopPropagation(); 172 }); 173 }); 174 </script>
174 175 176 <style type="text/css"> 177 178 /* Theme (user-documented overrideables for nav appearance) */ 179 180 .distill-site-nav { 181 color: rgba(255, 255, 255, 0.8); 182 background-color: #0F2E3D; 183 font-size: 15px; 184 font-weight: 300; 185 } 186 187 .distill-site-nav a { 188 color: inherit; 189 text-decoration: none; 190 } 191 192 .distill-site-nav a:hover { 193 color: white; 194 } 195 196 @media print { 197 .distill-site-nav { 198 display: none; 199 } 200 } 201 202 .distill-site-header { 203 204 } 205 206 .distill-site-footer { 207 208 } 209 210 211 /* Site Header */ 212 213 .distill-site-header { 214 width: 100%; 215 box-sizing: border-box; 216 z-index: 3; 217 } 218 219 .distill-site-header .nav-left { 220 display: inline-block; 221 margin-left: 8px; 222 } 223 224 @media screen and (max-width: 768px) { 225 .distill-site-header .nav-left { 226 margin-left: 0; 227 } 228 } 229 230 231 .distill-site-header .nav-right { 232 float: right; 233 margin-right: 8px; 234 } 235 236 .distill-site-header a, 237 .distill-site-header .title { 238 display: inline-block; 239 text-align: center; 240 padding: 14px 10px 14px 10px; 241 } 242 243 .distill-site-header .title { 244 font-size: 18px; 245 min-width: 150px; 246 } 247 248 .distill-site-header .logo { 249 padding: 0; 250 } 251 252 .distill-site-header .logo img { 253 display: none; 254 max-height: 20px; 255 width: auto; 256 margin-bottom: -4px; 257 } 258 259 .distill-site-header .nav-image img { 260 max-height: 18px; 261 width: auto; 262 display: inline-block; 263 margin-bottom: -3px; 264 } 265 266 267 268 @media screen and (min-width: 1000px) { 269 .distill-site-header .logo img { 270 display: inline-block; 271 } 272 .distill-site-header .nav-left { 273 margin-left: 20px; 274 } 275 .distill-site-header .nav-right { 276 margin-right: 20px; 277 } 278 .distill-site-header .title { 279 padding-left: 12px; 280 } 281 } 282 283 284 .distill-site-header .nav-toggle { 285 display: none; 286 } 287 288 .nav-dropdown { 289 display: inline-block; 290 position: relative; 291 } 292 293 .nav-dropdown .nav-dropbtn { 294 border: none; 295 outline: none; 296 color: rgba(255, 255, 255, 0.8); 297 padding: 16px 10px; 298 background-color: transparent; 299 font-family: inherit; 300 font-size: inherit; 301 font-weight: inherit; 302 margin: 0;
303 margin-top: 1px; 304 z-index: 2; 305 } 306 307 .nav-dropdown-content { 308 display: none; 309 position: absolute; 310 background-color: white; 311 min-width: 200px; 312 border: 1px solid rgba(0,0,0,0.15); 313 border-radius: 4px; 314 box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.1); 315 z-index: 1; 316 margin-top: 2px; 317 white-space: nowrap; 318 padding-top: 4px; 319 padding-bottom: 4px; 320 } 321 322 .nav-dropdown-content hr { 323 margin-top: 4px; 324 margin-bottom: 4px; 325 border: none; 326 border-bottom: 1px solid rgba(0, 0, 0, 0.1); 327 } 328 329 .nav-dropdown-active { 330 display: block; 331 } 332 333 .nav-dropdown-content a, .nav-dropdown-content .nav-dropdown-header { 334 color: black; 335 padding: 6px 24px; 336 text-decoration: none; 337 display: block; 338 text-align: left; 339 } 340 341 .nav-dropdown-content .nav-dropdown-header { 342 display: block; 343 padding: 5px 24px; 344 padding-bottom: 0; 345 text-transform: uppercase; 346 font-size: 14px; 347 color: #999999; 348 white-space: nowrap; 349 } 350 351 .nav-dropdown:hover .nav-dropbtn { 352 color: white; 353 } 354 355 .nav-dropdown-content a:hover { 356 background-color: #ddd; 357 color: black; 358 } 359 360 .nav-right .nav-dropdown-content { 361 margin-left: -45%; 362 right: 0; 363 } 364 365 @media screen and (max-width: 768px) { 366 .distill-site-header a, .distill-site-header .nav-dropdown {display: none;} 367 .distill-site-header a.nav-toggle { 368 float: right; 369 display: block; 370 } 371 .distill-site-header .title { 372 margin-left: 0; 373 } 374 .distill-site-header .nav-right { 375 margin-right: 0; 376 } 377 .distill-site-header { 378 overflow: hidden; 379 } 380 .nav-right .nav-dropdown-content { 381 margin-left: 0; 382 } 383 } 384 385 386 @media screen and (max-width: 768px) { 387 .distill-site-header.responsive {position: relative; min-height: 500px; } 388 .distill-site-header.responsive a.nav-toggle { 389 position: absolute; 390 right: 0; 391 top: 0; 392 } 393 .distill-site-header.responsive a, 394 .distill-site-header.responsive .nav-dropdown { 395 display: block; 396 text-align: left; 397 } 398 .distill-site-header.responsive .nav-left, 399 .distill-site-header.responsive .nav-right { 400 width: 100%; 401 } 402 .distill-site-header.responsive .nav-dropdown {float: none;} 403 .distill-site-header.responsive .nav-dropdown-content {position: relative;} 404 .distill-site-header.responsive .nav-dropdown .nav-dropbtn { 405 display: block; 406 width: 100%; 407 text-align: left; 408 } 409 } 410 411 /* Site Footer */ 412 413 .distill-site-footer { 414 width: 100%; 415 overflow: hidden; 416 box-sizing: border-box; 417 z-index: 3; 418 margin-top: 30px; 419 padding-top: 30px; 420 padding-bottom: 30px; 421 text-align: center; 422 } 423 424 /* Headroom */ 425 426 d-title { 427 padding-top: 6rem; 428 } 429 430 @media print { 431 d-title { 432 padding-top: 4rem; 433 } 434 } 435 436 .headroom { 437 z-index: 1000; 438 position: fixed; 439 top: 0; 440 left: 0; 441 right: 0; 442 } 443 444 .headroom--transition { 445 transition: all .4s ease-in-out; 446 } 447 448 .headroom--unpinned { 449 top: -100px; 450 } 451 452 .headroom--pinned { 453 top: 0; 454 } 455 456 /* adjust viewport for navbar height */ 457 /* helps vertically center bootstrap (non-distill) content */ 458 .min-vh-100 { 459 min-height: calc(100vh - 100px) !important; 460 } 461 462 </style> 463 464
464<script src="site_libs/jquery-3.6.0/jquery-3.6.0.min.js"></script>
464 465 <link href="site_libs/font-awesome-6.5.2/css/all.min.css" rel="stylesheet"/> 466 <link href="site_libs/font-awesome-6.5.2/css/v4-shims.min.css" rel="stylesheet"/> 467
467<script src="site_libs/headroom-0.9.4/headroom.min.js"></script>
467 468
468<script src="site_libs/autocomplete-0.37.1/autocomplete.min.js"></script>
468 469
469<script src="site_libs/fuse-6.4.1/fuse.min.js"></script>
469 470 471
471<script type="application/javascript"> 472 473 function getMeta(metaName) { 474 var metas = document.getElementsByTagName('meta'); 475 for (let i = 0; i < metas.length; i++) { 476 if (metas[i].getAttribute('name') === metaName) { 477 return metas[i].getAttribute('content'); 478 } 479 } 480 return ''; 481 } 482 483 function offsetURL(url) { 484 var offset = getMeta('distill:offset'); 485 return offset ? offset + '/' + url : url; 486 } 487 488 function createFuseIndex() { 489 490 // create fuse index 491 var options = { 492 keys: [ 493 { name: 'title', weight: 20 }, 494 { name: 'categories', weight: 15 }, 495 { name: 'description', weight: 10 }, 496 { name: 'contents', weight: 5 }, 497 ], 498 ignoreLocation: true, 499 threshold: 0 500 }; 501 var fuse = new window.Fuse([], options); 502 503 // fetch the main search.json 504 return fetch(offsetURL('search.json')) 505 .then(function(response) { 506 if (response.status == 200) { 507 return response.json().then(function(json) { 508 // index main articles 509 json.articles.forEach(function(article) { 510 fuse.add(article); 511 }); 512 // download collections and index their articles 513 return Promise.all(json.collections.map(function(collection) { 514 return fetch(offsetURL(collection)).then(function(response) { 515 if (response.status === 200) { 516 return response.json().then(function(articles) { 517 articles.forEach(function(article) { 518 fuse.add(article); 519 }); 520 }) 521 } else { 522 return Promise.reject( 523 new Error('Unexpected status from search index request: ' + 524 response.status) 525 ); 526 } 527 }); 528 })).then(function() { 529 return fuse; 530 }); 531 }); 532 533 } else { 534 return Promise.reject( 535 new Error('Unexpected status from search index request: ' + 536 response.status) 537 ); 538 } 539 }); 540 } 541 542 window.document.addEventListener("DOMContentLoaded", function (event) { 543 544 // get search element (bail if we don't have one) 545 var searchEl = window.document.getElementById('distill-search'); 546 if (!searchEl) 547 return; 548 549 createFuseIndex() 550 .then(function(fuse) { 551 552 // make search box visible 553 searchEl.classList.remove('hidden'); 554 555 // initialize autocomplete 556 var options = { 557 autoselect: true, 558 hint: false, 559 minLength: 2, 560 }; 561 window.autocomplete(searchEl, options, [{ 562 source: function(query, callback) { 563 const searchOptions = { 564 isCaseSensitive: false, 565 shouldSort: true, 566 minMatchCharLength: 2, 567 limit: 10, 568 }; 569 var results = fuse.search(query, searchOptions); 570 callback(results 571 .map(function(result) { return result.item; }) 572 ); 573 }, 574 templates: { 575 suggestion: function(suggestion) { 576 var img = suggestion.preview && Object.keys(suggestion.preview).length > 0 577 ? `<img src="${offsetURL(suggestion.preview)}"</img>` 578 : ''; 579 var html = ` 580 <div class="search-item"> 581 <h3>${suggestion.title}</h3> 582 <div class="search-item-description"> 583 ${suggestion.description || ''} 584 </div> 585 <div class="search-item-preview"> 586 ${img} 587 </div> 588 </div> 589 `; 590 return html; 591 } 592 } 593 }]).on('autocomplete:selected', function(event, suggestion) { 594 window.location.href = offsetURL(suggestion.path); 595 }); 596 // remove inline display style on autocompleter (we want to 597 // manage responsive display via css) 598 $('.algolia-autocomplete').css("display", ""); 599 }) 600 .catch(function(error) { 601 console.log(error); 602 }); 603 604 }); 605 606 </script>
606 607 608 <style type="text/css"> 609 610 .nav-search { 611 font-size: x-small; 612 } 613 614 /* Algolioa Autocomplete */ 615 616 .algolia-autocomplete { 617 display: inline-block; 618 margin-left: 10px; 619 vertical-align: sub; 620 background-color: white; 621 color: black; 622 padding: 6px; 623 padding-top: 8px; 624 padding-bottom: 0; 625 border-radius: 6px; 626 border: 1px #0F2E3D solid; 627 width: 180px; 628 } 629 630 631 @media screen and (max-width: 768px) { 632 .distill-site-nav .algolia-autocomplete { 633 display: none; 634 visibility: hidden; 635 } 636 .distill-site-nav.responsive .algolia-autocomplete { 637 display: inline-block; 638 visibility: visible; 639 } 640 .distill-site-nav.responsive .algolia-autocomplete .aa-dropdown-menu { 641 margin-left: 0; 642 width: 400px; 643 max-height: 400px; 644 } 645 } 646 647 .algolia-autocomplete .aa-input, .algolia-autocomplete .aa-hint { 648 width: 90%; 649 outline: none; 650 border: none; 651 } 652 653 .algolia-autocomplete .aa-hint { 654 color: #999; 655 } 656 .algolia-autocomplete .aa-dropdown-menu { 657 width: 550px; 658 max-height: 70vh; 659 overflow-x: visible; 660 overflow-y: scroll; 661 padding: 5px; 662 margin-top: 3px; 663 margin-left: -150px; 664 background-color: #fff; 665 border-radius: 5px; 666 border: 1px solid #999; 667 border-top: none; 668 } 669 670 .algolia-autocomplete .aa-dropdown-menu .aa-suggestion { 671 cursor: pointer; 672 padding: 5px 4px; 673 border-bottom: 1px solid #eee; 674 } 675 676 .algolia-autocomplete .aa-dropdown-menu .aa-suggestion:last-of-type { 677 border-bottom: none; 678 margin-bottom: 2px; 679 } 680 681 .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item { 682 overflow: hidden; 683 font-size: 0.8em; 684 line-height: 1.4em; 685 } 686 687 .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item h3 { 688 font-size: 1rem; 689 margin-block-start: 0; 690 margin-block-end: 5px; 691 } 692 693 .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item-description { 694 display: inline-block; 695 overflow: hidden; 696 height: 2.8em; 697 width: 80%; 698 margin-right: 4%; 699 } 700 701 .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item-preview { 702 display: inline-block; 703 width: 15%; 704 } 705 706 .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item-preview img { 707 height: 3em; 708 width: auto; 709 display: none; 710 } 711 712 .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item-preview img[src] { 713 display: initial; 714 } 715 716 .algolia-autocomplete .aa-dropdown-menu .aa-suggestion.aa-cursor { 717 background-color: #eee; 718 } 719 .algolia-autocomplete .aa-dropdown-menu .aa-suggestion em { 720 font-weight: bold; 721 font-style: normal; 722 } 723 724 </style> 725 726 727 <!--/radix_placeholder_navigation_in_header--> 728 <!--radix_placeholder_distill--> 729 730 <style type="text/css"> 731 732 body { 733 background-color: white; 734 } 735 736 .pandoc-table { 737 width: 100%; 738 } 739 740 .pandoc-table>caption { 741 margin-bottom: 10px; 742 } 743 744 .pandoc-table th:not([align]) { 745 text-align: left; 746 } 747 748 .pagedtable-footer { 749 font-size: 15px; 750 } 751 752 d-byline .byline { 753 grid-template-columns: 2fr 2fr; 754 } 755 756 d-byline .byline h3 { 757 margin-block-start: 1.5em; 758 } 759 760 d-byline .byline .authors-affiliations h3 { 761 margin-block-start: 0.5em; 762 } 763 764 .authors-affiliations .orcid-id { 765 width: 16px; 766 height:16px; 767 margin-left: 4px; 768 margin-right: 4px; 769 vertical-align: middle; 770 padding-bottom: 2px; 771 } 772 773 d-title .dt-tags { 774 margin-top: 1em; 775 grid-column: text; 776 } 777 778 .dt-tags .dt-tag { 779 text-decoration: none; 780 display: inline-block; 781 color: rgba(0,0,0,0.6); 782 padding: 0em 0.4em; 783 margin-right: 0.5em; 784 margin-bottom: 0.4em; 785 font-size: 70%; 786 border: 1px solid rgba(0,0,0,0.2); 787 border-radius: 3px; 788 text-transform: uppercase; 789 font-weight: 500; 790 } 791 792 d-article table.gt_table td, 793 d-article table.gt_table th { 794 border-bottom: none; 795 font-size: 100%; 796 } 797 798 .html-widget { 799 margin-bottom: 2.0em; 800 } 801 802 .l-screen-inset { 803 padding-right: 16px; 804 } 805 806 .l-screen .caption { 807 margin-left: 10px; 808 } 809 810 .shaded { 811 background: rgb(247, 247, 247); 812 padding-top: 20px; 813 padding-bottom: 20px; 814 border-top: 1px solid rgba(0, 0, 0, 0.1); 815 border-bottom: 1px solid rgba(0, 0, 0, 0.1); 816 } 817 818 .shaded .html-widget { 819 margin-bottom: 0; 820 border: 1px solid rgba(0, 0, 0, 0.1); 821 } 822 823 .shaded .shaded-content { 824 background: white; 825 } 826 827 .text-output { 828 margin-top: 0; 829 line-height: 1.5em; 830 } 831 832 .hidden { 833 display: none !important; 834 } 835 836 hr.section-separator { 837 border: none; 838 border-top: 1px solid rgba(0, 0, 0, 0.1); 839 margin: 0px; 840 } 841 842 843 d-byline { 844 border-top: none; 845 } 846 847 d-article { 848 padding-top: 2.5rem; 849 padding-bottom: 30px; 850 border-top: none; 851 } 852 853 d-appendix { 854 padding-top: 30px; 855 } 856 857 d-article>p>img { 858 width: 100%; 859 } 860 861 d-article h2 { 862 margin: 1rem 0 1.5rem 0; 863 } 864 865 d-article h3 { 866 margin-top: 1.5rem; 867 } 868 869 d-article iframe { 870 border: 1px solid rgba(0, 0, 0, 0.1); 871 margin-bottom: 2.0em; 872 width: 100%; 873 } 874 875 /* Tweak code blocks */ 876 877 d-article div.sourceCode code, 878 d-article pre code {
879 font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 880 } 881 882 d-article pre, 883 d-article div.sourceCode, 884 d-article div.sourceCode pre { 885 overflow: auto; 886 } 887 888 d-article div.sourceCode { 889 background-color: white; 890 } 891 892 d-article div.sourceCode pre { 893 padding-left: 10px; 894 font-size: 12px; 895 border-left: 2px solid rgba(0,0,0,0.1); 896 } 897 898 d-article pre { 899 font-size: 12px; 900 color: black; 901 background: none; 902 margin-top: 0; 903 text-align: left; 904 white-space: pre; 905 word-spacing: normal; 906 word-break: normal; 907 word-wrap: normal; 908 line-height: 1.5; 909 910 -moz-tab-size: 4; 911 -o-tab-size: 4; 912 tab-size: 4; 913 914 -webkit-hyphens: none; 915 -moz-hyphens: none; 916 -ms-hyphens: none; 917 hyphens: none; 918 } 919 920 d-article pre a { 921 border-bottom: none; 922 } 923 924 d-article pre a:hover { 925 border-bottom: none; 926 text-decoration: underline; 927 } 928 929 d-article details { 930 grid-column: text; 931 margin-bottom: 0.8em; 932 } 933 934 @media(min-width: 768px) { 935 936 d-article pre, 937 d-article div.sourceCode, 938 d-article div.sourceCode pre { 939 overflow: visible !important; 940 } 941 942 d-article div.sourceCode pre { 943 padding-left: 18px; 944 font-size: 14px; 945 } 946 947 /* tweak for Pandoc numbered line within distill */ 948 d-article pre.numberSource code > span { 949 left: -2em; 950 } 951 952 d-article pre { 953 font-size: 14px; 954 } 955 956 } 957 958 figure img.external { 959 background: white; 960 border: 1px solid rgba(0, 0, 0, 0.1); 961 box-shadow: 0 1px 8px rgba(0, 0, 0, 0.1); 962 padding: 18px; 963 box-sizing: border-box; 964 } 965 966 /* CSS for d-contents */ 967 968 .d-contents { 969 grid-column: text; 970 color: rgba(0,0,0,0.8); 971 font-size: 0.9em; 972 padding-bottom: 1em; 973 margin-bottom: 1em; 974 padding-bottom: 0.5em; 975 margin-bottom: 1em; 976 padding-left: 0.25em; 977 justify-self: start; 978 } 979 980 @media(min-width: 1000px) { 981 .d-contents.d-contents-float { 982 height: 0; 983 grid-column-start: 1; 984 grid-column-end: 4; 985 justify-self: center; 986 padding-right: 3em; 987 padding-left: 2em; 988 } 989 } 990 991 .d-contents nav h3 { 992 font-size: 18px; 993 margin-top: 0; 994 margin-bottom: 1em; 995 } 996 997 .d-contents li { 998 list-style-type: none 999 } 1000 1001 .d-contents nav > ul { 1002 padding-left: 0; 1003 } 1004 1005 .d-contents ul { 1006 padding-left: 1em 1007 } 1008 1009 .d-contents nav ul li { 1010 margin-top: 0.6em; 1011 margin-bottom: 0.2em; 1012 } 1013 1014 .d-contents nav a { 1015 font-size: 13px; 1016 border-bottom: none; 1017 text-decoration: none 1018 color: rgba(0, 0, 0, 0.8); 1019 } 1020 1021 .d-contents nav a:hover { 1022 text-decoration: underline solid rgba(0, 0, 0, 0.6) 1023 } 1024 1025 .d-contents nav > ul > li > a { 1026 font-weight: 600; 1027 } 1028 1029 .d-contents nav > ul > li > ul { 1030 font-weight: inherit; 1031 } 1032 1033 .d-contents nav > ul > li > ul > li { 1034 margin-top: 0.2em; 1035 } 1036 1037 1038 .d-contents nav ul { 1039 margin-top: 0; 1040 margin-bottom: 0.25em; 1041 } 1042 1043 .d-article-with-toc h2:nth-child(2) { 1044 margin-top: 0; 1045 } 1046 1047 1048 /* Figure */ 1049 1050 .figure { 1051 position: relative; 1052 margin-bottom: 2.5em; 1053 margin-top: 1.5em; 1054 } 1055 1056 .figure .caption { 1057 color: rgba(0, 0, 0, 0.6); 1058 font-size: 12px; 1059 line-height: 1.5em; 1060 } 1061 1062 .figure img.external { 1063 background: white; 1064 border: 1px solid rgba(0, 0, 0, 0.1); 1065 box-shadow: 0 1px 8px rgba(0, 0, 0, 0.1); 1066 padding: 18px; 1067 box-sizing: border-box; 1068 } 1069 1070 .figure .caption a { 1071 color: rgba(0, 0, 0, 0.6); 1072 } 1073 1074 .figure .caption b, 1075 .figure .caption strong, { 1076 font-weight: 600; 1077 color: rgba(0, 0, 0, 1.0); 1078 } 1079 1080 /* Citations */ 1081 1082 d-article .citation { 1083 color: inherit; 1084 cursor: inherit; 1085 } 1086 1087 div.hanging-indent{ 1088 margin-left: 1em; text-indent: -1em; 1089 } 1090 1091 /* Citation hover box */ 1092 1093 .tippy-box[data-theme~=light-border] { 1094 background-color: rgba(250, 250, 250, 0.95); 1095 } 1096 1097 .tippy-content > p { 1098 margin-bottom: 0; 1099 padding: 2px; 1100 } 1101 1102 1103 /* Tweak 1000px media break to show more text */ 1104 1105 @media(min-width: 1000px) { 1106 .base-grid, 1107 distill-header, 1108 d-title, 1109 d-abstract, 1110 d-article, 1111 d-appendix, 1112 distill-appendix, 1113 d-byline, 1114 d-footnote-list, 1115 d-citation-list, 1116 distill-footer { 1117 grid-template-columns: [screen-start] 1fr [page-start kicker-start] 80px [middle-start] 50px [text-start kicker-end] 65px 65px 65px 65px 65px 65px 65px 65px [text-end gutter-start] 65px [middle-end] 65px [page-end gutter-end] 1fr [screen-end]; 1118 grid-column-gap: 16px; 1119 } 1120 1121 .grid { 1122 grid-column-gap: 16px; 1123 } 1124 1125 d-article { 1126 font-size: 1.06rem; 1127 line-height: 1.7em; 1128 } 1129 figure .caption, .figure .caption, figure figcaption { 1130 font-size: 13px; 1131 } 1132 } 1133 1134 @media(min-width: 1180px) { 1135 .base-grid, 1136 distill-header, 1137 d-title, 1138 d-abstract, 1139 d-article, 1140 d-appendix, 1141 distill-appendix, 1142 d-byline, 1143 d-footnote-list, 1144 d-citation-list, 1145 distill-footer { 1146 grid-template-columns: [screen-start] 1fr [page-start kicker-start] 60px [middle-start] 60px [text-start kicker-end] 60px 60px 60px 60px 60px 60px 60px 60px [text-end gutter-start] 60px [middle-end] 60px [page-end gutter-end] 1fr [screen-end]; 1147 grid-column-gap: 32px; 1148 } 1149 1150 .grid { 1151 grid-column-gap: 32px; 1152 } 1153 } 1154 1155 1156 /* Get the citation styles for the appendix (not auto-injected on render since 1157 we do our own rendering of the citation appendix) */ 1158 1159 d-appendix .citation-appendix, 1160 .d-appendix .citation-appendix { 1161 font-size: 11px; 1162 line-height: 15px; 1163 border-left: 1px solid rgba(0, 0, 0, 0.1); 1164 padding-left: 18px; 1165 border: 1px solid rgba(0,0,0,0.1); 1166 background: rgba(0, 0, 0, 0.02); 1167 padding: 10px 18px; 1168 border-radius: 3px; 1169 color: rgba(150, 150, 150, 1); 1170 overflow: hidden; 1171 margin-top: -12px; 1172 white-space: pre-wrap; 1173 word-wrap: break-word; 1174 } 1175 1176 /* Include appendix styles here so they can be overridden */ 1177 1178 d-appendix { 1179 contain: layout style; 1180 font-size: 0.8em; 1181 line-height: 1.7em; 1182 margin-top: 60px; 1183 margin-bottom: 0; 1184 border-top: 1px solid rgba(0, 0, 0, 0.1); 1185 color: rgba(0,0,0,0.5); 1186 padding-top: 60px; 1187 padding-bottom: 48px; 1188 } 1189 1190 d-appendix h3 { 1191 grid-column: page-start / text-start; 1192 font-size: 15px; 1193 font-weight: 500; 1194 margin-top: 1em; 1195 margin-bottom: 0; 1196 color: rgba(0,0,0,0.65); 1197 } 1198 1199 d-appendix h3 + * { 1200 margin-top: 1em; 1201 } 1202 1203 d-appendix ol { 1204 padding: 0 0 0 15px; 1205 } 1206 1207 @media (min-width: 768px) { 1208 d-appendix ol { 1209 padding: 0 0 0 30px; 1210 margin-left: -30px; 1211 } 1212 } 1213 1214 d-appendix li { 1215 margin-bottom: 1em; 1216 } 1217 1218 d-appendix a { 1219 color: rgba(0, 0, 0, 0.6); 1220 } 1221 1222 d-appendix > * { 1223 grid-column: text; 1224 } 1225 1226 d-appendix > d-footnote-list, 1227 d-appendix > d-citation-list, 1228 d-appendix > distill-appendix { 1229 grid-column: screen; 1230 } 1231 1232 /* Include footnote styles here so they can be overridden */ 1233 1234 d-footnote-list { 1235 contain: layout style; 1236 } 1237 1238 d-footnote-list > * { 1239 grid-column: text; 1240 } 1241
1242 d-footnote-list a.footnote-backlink { 1243 color: rgba(0,0,0,0.3); 1244 padding-left: 0.5em; 1245 } 1246 1247 1248 1249 /* Anchor.js */ 1250 1251 .anchorjs-link { 1252 /*transition: all .25s linear; */ 1253 text-decoration: none; 1254 border-bottom: none; 1255 } 1256 *:hover > .anchorjs-link { 1257 margin-left: -1.125em !important; 1258 text-decoration: none; 1259 border-bottom: none; 1260 } 1261 1262 /* Social footer */ 1263 1264 .social_footer { 1265 margin-top: 30px; 1266 margin-bottom: 0; 1267 color: rgba(0,0,0,0.67); 1268 } 1269 1270 .disqus-comments { 1271 margin-right: 30px; 1272 } 1273 1274 .disqus-comment-count { 1275 border-bottom: 1px solid rgba(0, 0, 0, 0.4); 1276 cursor: pointer; 1277 } 1278 1279 #disqus_thread { 1280 margin-top: 30px; 1281 } 1282 1283 .article-sharing a { 1284 border-bottom: none; 1285 margin-right: 8px; 1286 } 1287 1288 .article-sharing a:hover { 1289 border-bottom: none; 1290 } 1291 1292 .sidebar-section.subscribe { 1293 font-size: 12px; 1294 line-height: 1.6em; 1295 } 1296 1297 .subscribe p { 1298 margin-bottom: 0.5em; 1299 } 1300 1301 1302 .article-footer .subscribe { 1303 font-size: 15px; 1304 margin-top: 45px; 1305 } 1306 1307 1308 .sidebar-section.custom { 1309 font-size: 12px; 1310 line-height: 1.6em; 1311 } 1312 1313 .custom p { 1314 margin-bottom: 0.5em; 1315 } 1316 1317 /* Styles for listing layout (hide title) */ 1318 .layout-listing d-title, .layout-listing .d-title { 1319 display: none; 1320 } 1321 1322 /* Styles for posts lists (not auto-injected) */ 1323 1324 1325 .posts-with-sidebar { 1326 padding-left: 45px; 1327 padding-right: 45px; 1328 } 1329 1330 .posts-list .description h2, 1331 .posts-list .description p { 1332 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif; 1333 } 1334 1335 .posts-list .description h2 { 1336 font-weight: 700; 1337 border-bottom: none; 1338 padding-bottom: 0; 1339 } 1340 1341 .posts-list h2.post-tag { 1342 border-bottom: 1px solid rgba(0, 0, 0, 0.2); 1343 padding-bottom: 12px; 1344 } 1345 .posts-list { 1346 margin-top: 60px; 1347 margin-bottom: 24px; 1348 } 1349 1350 .posts-list .post-preview { 1351 text-decoration: none; 1352 overflow: hidden; 1353 display: block; 1354 border-bottom: 1px solid rgba(0, 0, 0, 0.1); 1355 padding: 24px 0; 1356 } 1357 1358 .post-preview-last { 1359 border-bottom: none !important; 1360 } 1361 1362 .posts-list .posts-list-caption { 1363 grid-column: screen; 1364 font-weight: 400; 1365 } 1366 1367 .posts-list .post-preview h2 { 1368 margin: 0 0 6px 0; 1369 line-height: 1.2em; 1370 font-style: normal; 1371 font-size: 24px; 1372 } 1373 1374 .posts-list .post-preview p { 1375 margin: 0 0 12px 0; 1376 line-height: 1.4em; 1377 font-size: 16px; 1378 } 1379 1380 .posts-list .post-preview .thumbnail { 1381 box-sizing: border-box; 1382 margin-bottom: 24px; 1383 position: relative; 1384 max-width: 500px; 1385 } 1386 .posts-list .post-preview img { 1387 width: 100%; 1388 display: block; 1389 } 1390 1391 .posts-list .metadata { 1392 font-size: 12px; 1393 line-height: 1.4em; 1394 margin-bottom: 18px; 1395 } 1396 1397 .posts-list .metadata > * { 1398 display: inline-block; 1399 } 1400 1401 .posts-list .metadata .publishedDate { 1402 margin-right: 2em; 1403 } 1404 1405 .posts-list .metadata .dt-authors { 1406 display: block; 1407 margin-top: 0.3em; 1408 margin-right: 2em; 1409 } 1410 1411 .posts-list .dt-tags { 1412 display: block; 1413 line-height: 1em; 1414 } 1415 1416 .posts-list .dt-tags .dt-tag { 1417 display: inline-block; 1418 color: rgba(0,0,0,0.6); 1419 padding: 0.3em 0.4em; 1420 margin-right: 0.2em; 1421 margin-bottom: 0.4em; 1422 font-size: 60%; 1423 border: 1px solid rgba(0,0,0,0.2); 1424 border-radius: 3px; 1425 text-transform: uppercase; 1426 font-weight: 500; 1427 } 1428 1429 .posts-list img { 1430 opacity: 1; 1431 } 1432 1433 .posts-list img[data-src] { 1434 opacity: 0; 1435 } 1436 1437 .posts-more { 1438 clear: both; 1439 } 1440 1441 1442 .posts-sidebar { 1443 font-size: 16px; 1444 } 1445 1446 .posts-sidebar h3 { 1447 font-size: 16px; 1448 margin-top: 0; 1449 margin-bottom: 0.5em; 1450 font-weight: 400; 1451 text-transform: uppercase; 1452 } 1453 1454 .sidebar-section { 1455 margin-bottom: 30px; 1456 } 1457 1458 .categories ul { 1459 list-style-type: none; 1460 margin: 0; 1461 padding: 0; 1462 } 1463 1464 .categories li { 1465 color: rgba(0, 0, 0, 0.8); 1466 margin-bottom: 0; 1467 } 1468 1469 .categories li>a { 1470 border-bottom: none; 1471 } 1472 1473 .categories li>a:hover { 1474 border-bottom: 1px solid rgba(0, 0, 0, 0.4); 1475 } 1476 1477 .categories .active { 1478 font-weight: 600; 1479 } 1480 1481 .categories .category-count { 1482 color: rgba(0, 0, 0, 0.4); 1483 } 1484 1485 1486 @media(min-width: 768px) { 1487 .posts-list .post-preview h2 { 1488 font-size: 26px; 1489 } 1490 .posts-list .post-preview .thumbnail { 1491 float: right; 1492 width: 30%; 1493 margin-bottom: 0; 1494 } 1495 .posts-list .post-preview .description { 1496 float: left; 1497 width: 45%; 1498 } 1499 .posts-list .post-preview .metadata { 1500 float: left; 1501 width: 20%; 1502 margin-top: 8px; 1503 } 1504 .posts-list .post-preview p { 1505 margin: 0 0 12px 0; 1506 line-height: 1.5em; 1507 font-size: 16px; 1508 } 1509 .posts-with-sidebar .posts-list { 1510 float: left; 1511 width: 75%; 1512 } 1513 .posts-with-sidebar .posts-sidebar { 1514 float: right; 1515 width: 20%; 1516 margin-top: 60px; 1517 padding-top: 24px; 1518 padding-bottom: 24px; 1519 } 1520 } 1521 1522 1523 /* Improve display for browsers without grid (IE/Edge <= 15) */ 1524 1525 .downlevel { 1526 line-height: 1.6em; 1527 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif; 1528 margin: 0; 1529 } 1530 1531 .downlevel .d-title { 1532 padding-top: 6rem; 1533 padding-bottom: 1.5rem; 1534 } 1535 1536 .downlevel .d-title h1 { 1537 font-size: 50px; 1538 font-weight: 700; 1539 line-height: 1.1em; 1540 margin: 0 0 0.5rem; 1541 } 1542 1543 .downlevel .d-title p { 1544 font-weight: 300; 1545 font-size: 1.2rem; 1546 line-height: 1.55em; 1547 margin-top: 0; 1548 } 1549 1550 .downlevel .d-byline { 1551 padding-top: 0.8em; 1552 padding-bottom: 0.8em; 1553 font-size: 0.8rem; 1554 line-height: 1.8em; 1555 } 1556 1557 .downlevel .section-separator { 1558 border: none; 1559 border-top: 1px solid rgba(0, 0, 0, 0.1); 1560 } 1561 1562 .downlevel .d-article { 1563 font-size: 1.06rem; 1564 line-height: 1.7em; 1565 padding-top: 1rem; 1566 padding-bottom: 2rem; 1567 } 1568 1569 1570 .downlevel .d-appendix { 1571 padding-left: 0; 1572 padding-right: 0; 1573 max-width: none; 1574 font-size: 0.8em; 1575 line-height: 1.7em; 1576 margin-bottom: 0; 1577 color: rgba(0,0,0,0.5); 1578 padding-top: 40px; 1579 padding-bottom: 48px; 1580 } 1581 1582 .downlevel .footnotes ol { 1583 padding-left: 13px; 1584 } 1585 1586 .downlevel .base-grid, 1587 .downlevel .distill-header, 1588 .downlevel .d-title, 1589 .downlevel .d-abstract, 1590 .downlevel .d-article, 1591 .downlevel .d-appendix, 1592 .downlevel .distill-appendix, 1593 .downlevel .d-byline, 1594 .downlevel .d-footnote-list, 1595 .downlevel .d-citation-list, 1596 .downlevel .distill-footer, 1597 .downlevel .appendix-bottom, 1598 .downlevel .posts-container { 1599 padding-left: 40px; 1600 padding-right: 40px; 1601 } 1602 1603 @media(min-width: 768px) { 1604 .downlevel .base-grid, 1605 .downlevel .distill-header, 1606 .downlevel .d-title, 1607 .downlevel .d-abstract, 1608 .downlevel .d-article, 1609 .downlevel .d-appendix, 1610 .downlevel .distill-appendix, 1611 .downlevel .d-byline, 1612 .downlevel .d-footnote-list, 1613 .downlevel .d-citation-list, 1614 .downlevel .distill-footer, 1615 .downlevel .appendix-bottom, 1616 .downlevel .posts-container { 1617 padding-left: 150px; 1618 padding-right: 150px; 1619 max-width: 900px; 1620 } 1621 } 1622 1623 .downlevel pre code { 1624 display: block; 1625 border-left: 2px solid rgba(0, 0, 0, .1); 1626 padding: 0 0 0 20px; 1627 font-size: 14px; 1628 } 1629 1630 .downlevel code, .downlevel pre { 1631 color: black; 1632 background: none;
1633 font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 1634 text-align: left; 1635 white-space: pre; 1636 word-spacing: normal; 1637 word-break: normal; 1638 word-wrap: normal; 1639 line-height: 1.5; 1640 1641 -moz-tab-size: 4; 1642 -o-tab-size: 4; 1643 tab-size: 4; 1644 1645 -webkit-hyphens: none; 1646 -moz-hyphens: none; 1647 -ms-hyphens: none; 1648 hyphens: none; 1649 } 1650 1651 .downlevel .posts-list .post-preview { 1652 color: inherit; 1653 } 1654 1655 1656 1657 </style> 1658 1659
1659<script type="application/javascript"> 1660 1661 function is_downlevel_browser() { 1662 if (bowser.isUnsupportedBrowser({ msie: "12", msedge: "16"}, 1663 window.navigator.userAgent)) { 1664 return true; 1665 } else { 1666 return window.load_distill_framework === undefined; 1667 } 1668 } 1669 1670 // show body when load is complete 1671 function on_load_complete() { 1672 1673 // add anchors 1674 if (window.anchors) { 1675 window.anchors.options.placement = 'left'; 1676 window.anchors.add('d-article > h2, d-article > h3, d-article > h4, d-article > h5'); 1677 } 1678 1679 1680 // set body to visible 1681 document.body.style.visibility = 'visible'; 1682 1683 // force redraw for leaflet widgets 1684 if (window.HTMLWidgets) { 1685 var maps = window.HTMLWidgets.findAll(".leaflet"); 1686 $.each(maps, function(i, el) { 1687 var map = this.getMap(); 1688 map.invalidateSize(); 1689 map.eachLayer(function(layer) { 1690 if (layer instanceof L.TileLayer) 1691 layer.redraw(); 1692 }); 1693 }); 1694 } 1695 1696 // trigger 'shown' so htmlwidgets resize 1697 $('d-article').trigger('shown'); 1698 } 1699 1700 function init_distill() { 1701 1702 init_common(); 1703 1704 // create front matter 1705 var front_matter = $('<d-front-matter></d-front-matter>'); 1706 $('#distill-front-matter').wrap(front_matter); 1707 1708 // create d-title 1709 $('.d-title').changeElementType('d-title'); 1710 1711 // separator 1712 var separator = '<hr class="section-separator" style="clear: both"/>'; 1713 // prepend separator above appendix 1714 $('.d-byline').before(separator); 1715 $('.d-article').before(separator); 1716 1717 // create d-byline 1718 var byline = $('<d-byline></d-byline>'); 1719 $('.d-byline').replaceWith(byline); 1720 1721 // create d-article 1722 var article = $('<d-article></d-article>'); 1723 $('.d-article').wrap(article).children().unwrap(); 1724 1725 // move posts container into article 1726 $('.posts-container').appendTo($('d-article')); 1727 1728 // create d-appendix 1729 $('.d-appendix').changeElementType('d-appendix'); 1730 1731 // flag indicating that we have appendix items 1732 var appendix = $('.appendix-bottom').children('h3').length > 0; 1733 1734 // replace footnotes with <d-footnote> 1735 $('.footnote-ref').each(function(i, val) { 1736 appendix = true; 1737 var href = $(this).attr('href'); 1738 var id = href.replace('#', ''); 1739 var fn = $('#' + id); 1740 var fn_p = $('#' + id + '>p'); 1741 fn_p.find('.footnote-back').remove(); 1742 var text = fn_p.html(); 1743 var dtfn = $('<d-footnote></d-footnote>'); 1744 dtfn.html(text); 1745 $(this).replaceWith(dtfn); 1746 }); 1747 // remove footnotes 1748 $('.footnotes').remove(); 1749 1750 // move refs into #references-listing 1751 $('#references-listing').replaceWith($('#refs')); 1752 1753 $('h1.appendix, h2.appendix').each(function(i, val) { 1754 $(this).changeElementType('h3'); 1755 }); 1756 $('h3.appendix').each(function(i, val) { 1757 var id = $(this).attr('id'); 1758 $('.d-contents a[href="#' + id + '"]').parent().remove(); 1759 appendix = true; 1760 $(this).nextUntil($('h1, h2, h3')).addBack().appendTo($('d-appendix')); 1761 }); 1762 1763 // show d-appendix if we have appendix content 1764 $("d-appendix").css('display', appendix ? 'grid' : 'none'); 1765 1766 // localize layout chunks to just output 1767 $('.layout-chunk').each(function(i, val) { 1768 1769 // capture layout 1770 var layout = $(this).attr('data-layout'); 1771 1772 // apply layout to markdown level block elements 1773 var elements = $(this).children().not('details, div.sourceCode, pre, script'); 1774 elements.each(function(i, el) { 1775 var layout_div = $('<div class="' + layout + '"></div>'); 1776 if (layout_div.hasClass('shaded')) { 1777 var shaded_content = $('<div class="shaded-content"></div>'); 1778 $(this).wrap(shaded_content); 1779 $(this).parent().wrap(layout_div); 1780 } else { 1781 $(this).wrap(layout_div); 1782 } 1783 }); 1784 1785 1786 // unwrap the layout-chunk div 1787 $(this).children().unwrap(); 1788 }); 1789 1790 // remove code block used to force highlighting css 1791 $('.distill-force-highlighting-css').parent().remove(); 1792 1793 // remove empty line numbers inserted by pandoc when using a 1794 // custom syntax highlighting theme, except when numbering line 1795 // in code chunk 1796 $('pre:not(.numberLines) code.sourceCode a:empty').remove(); 1797 1798 // load distill framework 1799 load_distill_framework(); 1800 1801 // wait for window.distillRunlevel == 4 to do post processing 1802 function distill_post_process() { 1803 1804 if (!window.distillRunlevel || window.distillRunlevel < 4) 1805 return; 1806 1807 // hide author/affiliations entirely if we have no authors 1808 var front_matter = JSON.parse($("#distill-front-matter").html()); 1809 var have_authors = front_matter.authors && front_matter.authors.length > 0; 1810 if (!have_authors) 1811 $('d-byline').addClass('hidden'); 1812 1813 // article with toc class 1814 $('.d-contents').parent().addClass('d-article-with-toc'); 1815 1816 // strip links that point to # 1817 $('.authors-affiliations').find('a[href="#"]').removeAttr('href'); 1818 1819 // add orcid ids 1820 $('.authors-affiliations').find('.author').each(function(i, el) {
1821 var orcid_id = front_matter.authors[i].orcidID; 1822 var author_name = front_matter.authors[i].author 1823 if (orcid_id) { 1824 var a = $('<a></a>'); 1825 a.attr('href', 'https://orcid.org/' + orcid_id); 1826 var img = $('<img></img>'); 1827 img.addClass('orcid-id'); 1828 img.attr('alt', author_name ? 'ORCID ID for ' + author_name : 'ORCID ID'); 1829 img.attr('src','data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMjA4MDI1MjA2ODExOTk0QzkzNTEzRjZEQTg1NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozM0NDOEJGNEZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozM0NDOEJGM0ZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZDN0YxMTc0MDcyMDY4MTE5NUZFRDc5MUM2MUUwNEREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU3Q0QyMDgwMjUyMDY4MTE5OTRDOTM1MTNGNkRBODU3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+84NovQAAAR1JREFUeNpiZEADy85ZJgCpeCB2QJM6AMQLo4yOL0AWZETSqACk1gOxAQN+cAGIA4EGPQBxmJA0nwdpjjQ8xqArmczw5tMHXAaALDgP1QMxAGqzAAPxQACqh4ER6uf5MBlkm0X4EGayMfMw/Pr7Bd2gRBZogMFBrv01hisv5jLsv9nLAPIOMnjy8RDDyYctyAbFM2EJbRQw+aAWw/LzVgx7b+cwCHKqMhjJFCBLOzAR6+lXX84xnHjYyqAo5IUizkRCwIENQQckGSDGY4TVgAPEaraQr2a4/24bSuoExcJCfAEJihXkWDj3ZAKy9EJGaEo8T0QSxkjSwORsCAuDQCD+QILmD1A9kECEZgxDaEZhICIzGcIyEyOl2RkgwAAhkmC+eAm0TAAAAABJRU5ErkJggg=='); 1830 a.append(img); 1831 $(this).append(a); 1832 } 1833 }); 1834 1835 // hide elements of author/affiliations grid that have no value 1836 function hide_byline_column(caption) { 1837 $('d-byline').find('h3:contains("' + caption + '")').parent().css('visibility', 'hidden'); 1838 } 1839 1840 // affiliations 1841 var have_affiliations = false; 1842 for (var i = 0; i<front_matter.authors.length; ++i) { 1843 var author = front_matter.authors[i]; 1844 if (author.affiliation !== " ") { 1845 have_affiliations = true; 1846 break; 1847 } 1848 } 1849 if (!have_affiliations) 1850 $('d-byline').find('h3:contains("Affiliations")').css('visibility', 'hidden'); 1851 1852 // published date 1853 if (!front_matter.publishedDate) 1854 hide_byline_column("Published"); 1855 1856 // document object identifier 1857 var doi = $('d-byline').find('h3:contains("DOI")'); 1858 var doi_p = doi.next().empty(); 1859 if (!front_matter.doi) { 1860 // if we have a citation and valid citationText then link to that 1861 if ($('#citation').length > 0 && front_matter.citationText) { 1862 doi.html('Citation'); 1863 $('<a href="#citation"></a>') 1864 .text(front_matter.citationText) 1865 .appendTo(doi_p); 1866 } else { 1867 hide_byline_column("DOI"); 1868 } 1869 } else { 1870 $('<a></a>') 1871 .attr('href', "https://doi.org/" + front_matter.doi) 1872 .html(front_matter.doi) 1873 .appendTo(doi_p); 1874 } 1875 1876 // change plural form of authors/affiliations 1877 if (front_matter.authors.length === 1) { 1878 var grid = $('.authors-affiliations'); 1879 grid.children('h3:contains("Authors")').text('Author'); 1880 grid.children('h3:contains("Affiliations")').text('Affiliation'); 1881 } 1882 1883 // remove d-appendix and d-footnote-list local styles 1884 $('d-appendix > style:first-child').remove(); 1885 $('d-footnote-list > style:first-child').remove(); 1886 1887 // move appendix-bottom entries to the bottom 1888 $('.appendix-bottom').appendTo('d-appendix').children().unwrap(); 1889 $('.appendix-bottom').remove(); 1890 1891 // hoverable references 1892 $('span.citation[data-cites]').each(function() { 1893 const citeChild = $(this).children()[0]
1894 // Do not process if @xyz has been used without escaping and without bibliography activated 1895 // https://github.com/rstudio/distill/issues/466 1896 if (citeChild === undefined) return true 1897 1898 if (citeChild.nodeName == "D-FOOTNOTE") { 1899 var fn = citeChild 1900 $(this).html(fn.shadowRoot.querySelector("sup")) 1901 $(this).id = fn.id 1902 fn.remove() 1903 } 1904 var refs = $(this).attr('data-cites').split(" "); 1905 var refHtml = refs.map(function(ref) { 1906 // Could use CSS.escape too here, we insure backward compatibility in navigator 1907 return "<p>" + $('div[id="ref-' + ref + '"]').html() + "</p>"; 1908 }).join("\n"); 1909 window.tippy(this, { 1910 allowHTML: true, 1911 content: refHtml, 1912 maxWidth: 500, 1913 interactive: true, 1914 interactiveBorder: 10, 1915 theme: 'light-border', 1916 placement: 'bottom-start' 1917 }); 1918 }); 1919 1920 // fix footnotes in tables (#411) 1921 // replacing broken distill.pub feature 1922 $('table d-footnote').each(function() { 1923 // we replace internal showAtNode methode which is triggered when hovering a footnote 1924 this.hoverBox.showAtNode = function(node) { 1925 // ported from https://github.com/distillpub/template/pull/105/files 1926 calcOffset = function(elem) { 1927 let x = elem.offsetLeft; 1928 let y = elem.offsetTop; 1929 // Traverse upwards until an `absolute` element is found or `elem` 1930 // becomes null. 1931 while (elem = elem.offsetParent && elem.style.position != 'absolute') { 1932 x += elem.offsetLeft; 1933 y += elem.offsetTop; 1934 } 1935 1936 return { left: x, top: y }; 1937 } 1938 // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetTop 1939 const bbox = node.getBoundingClientRect(); 1940 const offset = calcOffset(node); 1941 this.show([offset.left + bbox.width, offset.top + bbox.height]); 1942 } 1943 }) 1944 1945 // clear polling timer 1946 clearInterval(tid); 1947 1948 // show body now that everything is ready 1949 on_load_complete(); 1950 } 1951 1952 var tid = setInterval(distill_post_process, 50); 1953 distill_post_process(); 1954 1955 } 1956 1957 function init_downlevel() { 1958 1959 init_common(); 1960 1961 // insert hr after d-title 1962 $('.d-title').after($('<hr class="section-separator"/>')); 1963 1964 // check if we have authors 1965 var front_matter = JSON.parse($("#distill-front-matter").html()); 1966 var have_authors = front_matter.authors && front_matter.authors.length > 0; 1967
1968 // manage byline/border 1969 if (!have_authors) 1970 $('.d-byline').remove(); 1971 $('.d-byline').after($('<hr class="section-separator"/>')); 1972 $('.d-byline a').remove(); 1973 1974 // remove toc 1975 $('.d-contents').remove(); 1976 1977 // move appendix elements 1978 $('h1.appendix, h2.appendix').each(function(i, val) { 1979 $(this).changeElementType('h3'); 1980 }); 1981 $('h3.appendix').each(function(i, val) { 1982 $(this).nextUntil($('h1, h2, h3')).addBack().appendTo($('.d-appendix')); 1983 }); 1984 1985 1986 // inject headers into references and footnotes 1987 var refs_header = $('<h3></h3>'); 1988 refs_header.text('References'); 1989 $('#refs').prepend(refs_header); 1990 1991 var footnotes_header = $('<h3></h3'); 1992 footnotes_header.text('Footnotes'); 1993 $('.footnotes').children('hr').first().replaceWith(footnotes_header); 1994 1995 // move appendix-bottom entries to the bottom 1996 $('.appendix-bottom').appendTo('.d-appendix').children().unwrap(); 1997 $('.appendix-bottom').remove(); 1998 1999 // remove appendix if it's empty 2000 if ($('.d-appendix').children().length === 0) 2001 $('.d-appendix').remove(); 2002 2003 // prepend separator above appendix 2004 $('.d-appendix').before($('<hr class="section-separator" style="clear: both"/>')); 2005 2006 // trim code 2007 $('pre>code').each(function(i, val) { 2008 $(this).html($.trim($(this).html())); 2009 }); 2010 2011 // move posts-container right before article 2012 $('.posts-container').insertBefore($('.d-article')); 2013 2014 $('body').addClass('downlevel'); 2015 2016 on_load_complete(); 2017 } 2018 2019 2020 function init_common() { 2021 2022 // jquery plugin to change element types 2023 (function($) { 2024 $.fn.changeElementType = function(newType) { 2025 var attrs = {}; 2026 2027 $.each(this[0].attributes, function(idx, attr) { 2028 attrs[attr.nodeName] = attr.nodeValue; 2029 }); 2030 2031 this.replaceWith(function() { 2032 return $("<" + newType + "/>", attrs).append($(this).contents()); 2033 }); 2034 }; 2035 })(jQuery); 2036 2037 // prevent underline for linked images 2038 $('a > img').parent().css({'border-bottom' : 'none'}); 2039 2040 // mark non-body figures created by knitr chunks as 100% width 2041 $('.layout-chunk').each(function(i, val) { 2042 var figures = $(this).find('img, .html-widget'); 2043 // ignore leaflet img layers (#106) 2044 figures = figures.filter(':not(img[class*="leaflet"])') 2045 if ($(this).attr('data-layout') !== "l-body") { 2046 figures.css('width', '100%'); 2047 } else { 2048 figures.css('max-width', '100%'); 2049 figures.filter("[width]").each(function(i, val) { 2050 var fig = $(this); 2051 fig.css('width', fig.attr('width') + 'px'); 2052 }); 2053 2054 } 2055 }); 2056 2057 // auto-append index.html to post-preview links in file: protocol 2058 // and in rstudio ide preview 2059 $('.post-preview').each(function(i, val) { 2060 if (window.location.protocol === "file:") 2061 $(this).attr('href', $(this).attr('href') + "index.html"); 2062 }); 2063 2064 // get rid of index.html references in header 2065 if (window.location.protocol !== "file:") { 2066 $('.distill-site-header a[href]').each(function(i,val) { 2067 $(this).attr('href', $(this).attr('href').replace(/^index[.]html/, "./")); 2068 }); 2069 } 2070 2071 // add class to pandoc style tables 2072 $('tr.header').parent('thead').parent('table').addClass('pandoc-table'); 2073 $('.kable-table').children('table').addClass('pandoc-table'); 2074 2075 // add figcaption style to table captions 2076 $('caption').parent('table').addClass("figcaption"); 2077 2078 // initialize posts list 2079 if (window.init_posts_list) 2080 window.init_posts_list(); 2081 2082 // implmement disqus comment link 2083 $('.disqus-comment-count').click(function() { 2084 window.headroom_prevent_pin = true; 2085 $('#disqus_thread').toggleClass('hidden'); 2086 if (!$('#disqus_thread').hasClass('hidden')) { 2087 var offset = $(this).offset(); 2088 $(window).resize(); 2089 $('html, body').animate({ 2090 scrollTop: offset.top - 35 2091 }); 2092 } 2093 }); 2094 } 2095 2096 document.addEventListener('DOMContentLoaded', function() { 2097 if (is_downlevel_browser()) 2098 init_downlevel(); 2099 else 2100 window.addEventListener('WebComponentsReady', init_distill); 2101 }); 2102 2103 </script>
2103 2104 2105 <style type="text/css"> 2106 /* base variables */ 2107 2108 /* Edit the CSS properties in this file to create a custom 2109 Distill theme. Only edit values in the right column 2110 for each row; values shown are the CSS defaults. 2111 To return any property to the default, 2112 you may set its value to: unset 2113 All rows must end with a semi-colon. */ 2114 2115 /* Optional: embed custom fonts here with `@import` */ 2116 /* This must remain at the top of this file. */ 2117 2118 2119 2120 html { 2121 /*-- Main font sizes --*/ 2122 --title-size: 50px; 2123 --body-size: 1.06rem; 2124 --code-size: 14px; 2125 --aside-size: 12px; 2126 --fig-cap-size: 13px; 2127 /*-- Main font colors --*/ 2128 --title-color: #000000; 2129 --header-color: rgba(0, 0, 0, 0.8); 2130 --body-color: rgba(0, 0, 0, 0.8); 2131 --aside-color: rgba(0, 0, 0, 0.6); 2132 --fig-cap-color: rgba(0, 0, 0, 0.6); 2133 /*-- Specify custom fonts ~~~ must be imported above --*/ 2134 --heading-font: sans-serif; 2135 --mono-font: monospace; 2136 --body-font: sans-serif; 2137 --navbar-font: sans-serif; /* websites + blogs only */ 2138 } 2139 2140 /*-- ARTICLE METADATA --*/ 2141 d-byline { 2142 --heading-size: 0.6rem; 2143 --heading-color: rgba(0, 0, 0, 0.5); 2144 --body-size: 0.8rem; 2145 --body-color: rgba(0, 0, 0, 0.8); 2146 } 2147 2148 /*-- ARTICLE TABLE OF CONTENTS --*/ 2149 .d-contents { 2150 --heading-size: 18px; 2151 --contents-size: 13px; 2152 } 2153 2154 /*-- ARTICLE APPENDIX --*/ 2155 d-appendix { 2156 --heading-size: 15px; 2157 --heading-color: rgba(0, 0, 0, 0.65); 2158 --text-size: 0.8em; 2159 --text-color: rgba(0, 0, 0, 0.5); 2160 } 2161 2162 /*-- WEBSITE HEADER + FOOTER --*/ 2163 /* These properties only apply to Distill sites and blogs */ 2164 2165 .distill-site-header { 2166 --title-size: 18px; 2167 --text-color: rgba(255, 255, 255, 0.8); 2168 --text-size: 15px; 2169 --hover-color: white; 2170 --bkgd-color: #0F2E3D; 2171 } 2172 2173 .distill-site-footer { 2174 --text-color: rgba(255, 255, 255, 0.8); 2175 --text-size: 15px; 2176 --hover-color: white; 2177 --bkgd-color: #0F2E3D; 2178 } 2179 2180 /*-- Additional custom styles --*/ 2181 /* Add any additional CSS rules below */ 2182 </style> 2183 <style type="text/css">@import url('https://fonts.googleapis.com/css2?family=Annie+Use+Your+Telescope&family=Fuzzy+Bubbles&family=Shizuru&display=swap'); 2184 2185 /* Edit the CSS properties in this file to create a custom 2186 Distill theme. Only edit values in the right column 2187 for each row; values shown are the CSS defaults. 2188 To return any property to the default, 2189 you may set its value to: unset 2190 All rows must end with a semi-colon. */ 2191 2192 /* Optional: embed custom fonts here with `@import` */ 2193 /* This must remain at the top of this file. */ 2194 2195 2196 2197 html { 2198 /*-- Main font sizes --*/ 2199 --title-size: 50px; 2200 --text-size: 20px; 2201 /* --body-size: 1.06rem; */ 2202 --code-size: 14px; 2203 --aside-size: 12px; 2204 --fig-cap-size: 13px; 2205 /*-- Main font colors --*/ 2206 --title-color: white; 2207 --header-color: rgba(0, 0, 0, 0.8); 2208 --body-color: rgba(0, 0, 0, 0.8); 2209 --aside-color: rgba(0, 0, 0, 0.6); 2210 --fig-cap-color: rgba(0, 0, 0, 0.6); 2211 /*-- Specify custom fonts ~~~ must be imported above --*/ 2212 --heading-font: Atma; 2213 --mono-font: monospace; 2214 --body-font: sans-serif; 2215 --navbar-font: "Annie Use Your Telescope", serif; 2216 } 2217 2218 .distill-site-header { 2219 --title-size: 50px; 2220 --text-color: #176940; 2221 --text-size: 22px; 2222 --hover-color: black; 2223 --bkgd-color: #eeeeee; 2224 } 2225 2226 /*-- Additional custom styles --*/ 2227 /* Add any additional CSS rules below */ 2228 2229 .distill-site-nav { /* shdow line under banner */ 2230 border-bottom: 2px solid #DECF40; 2231 -webkit-box-shadow: 1px 1px 18px #4d4d4d; 2232 -moz-box-shadow: 1px 1px 18px #4d4d4d; 2233 box-shadow: 1px 1px 18px #4d4d4d; 2234 } 2235 2236 .distill-site-header .logo img { /* logo size */ 2237 max-height: 50px; 2238 width: auto; 2239 margin-top: 10px; 2240 } 2241 2242 2243 .posts-list > h1 { 2244 color: black!important; /* prints "Test Blog" */ 2245 } 2246 2247 2248 p a { /* underlines links */ 2249 text-decoration: none; 2250 color: black; 2251 border-bottom: 3px solid #9ae28f; 2252 box-shadow: inset 0 -4px 0 #9ae28f; 2253 background: transparent; 2254 transition: background 150ms ease; 2255 font-style: italic; 2256 font-family: menu; 2257 font-stretch: extra-expanded; 2258 } 2259 2260 p a:hover { /* makes links go green on hover */ 2261 text-decoration: none; 2262 --bg-opacity: 1; 2263 background-color: #9ae28f; 2264 background-color: rgba(154, 226, 143, var(--bg-opacity)); 2265 } 2266 2267 2268 .thumbnail { 2269 padding: 0px!important; 2270 margin: 0px!important; 2271 max-width: 25%!important; 2272 height: 10%!important; 2273 vertical-align: text-top!important; 2274 }</style> 2275 <style type="text/css"> 2276 /* base style */ 2277 2278 /* FONT FAMILIES */ 2279 2280 :root { 2281 --heading-default: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif;
2282 --mono-default: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 2283 --body-default: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif; 2284 } 2285 2286 body, 2287 .posts-list .post-preview p, 2288 .posts-list .description p { 2289 font-family: var(--body-font), var(--body-default); 2290 } 2291 2292 h1, h2, h3, h4, h5, h6, 2293 .posts-list .post-preview h2, 2294 .posts-list .description h2 { 2295 font-family: var(--heading-font), var(--heading-default); 2296 } 2297 2298 d-article div.sourceCode code, 2299 d-article pre code { 2300 font-family: var(--mono-font), var(--mono-default); 2301 } 2302 2303 2304 /*-- TITLE --*/ 2305 d-title h1, 2306 .posts-list > h1 { 2307 color: var(--title-color, black); 2308 } 2309 2310 d-title h1 { 2311 font-size: var(--title-size, 50px); 2312 } 2313 2314 /*-- HEADERS --*/ 2315 d-article h1, 2316 d-article h2, 2317 d-article h3, 2318 d-article h4, 2319 d-article h5, 2320 d-article h6 { 2321 color: var(--header-color, rgba(0, 0, 0, 0.8)); 2322 } 2323 2324 /*-- BODY --*/ 2325 d-article > p, /* only text inside of <p> tags */ 2326 d-article > ul, /* lists */ 2327 d-article > ol { 2328 color: var(--body-color, rgba(0, 0, 0, 0.8)); 2329 font-size: var(--body-size, 1.06rem); 2330 } 2331 2332 2333 /*-- CODE --*/ 2334 d-article div.sourceCode code, 2335 d-article pre code { 2336 font-size: var(--code-size, 14px); 2337 } 2338 2339 /*-- ASIDE --*/ 2340 d-article aside { 2341 font-size: var(--aside-size, 12px); 2342 color: var(--aside-color, rgba(0, 0, 0, 0.6)); 2343 } 2344 2345 /*-- FIGURE CAPTIONS --*/ 2346 figure .caption, 2347 figure figcaption, 2348 .figure .caption { 2349 font-size: var(--fig-cap-size, 13px); 2350 color: var(--fig-cap-color, rgba(0, 0, 0, 0.6)); 2351 } 2352 2353 /*-- METADATA --*/ 2354 d-byline h3 { 2355 font-size: var(--heading-size, 0.6rem); 2356 color: var(--heading-color, rgba(0, 0, 0, 0.5)); 2357 } 2358 2359 d-byline { 2360 font-size: var(--body-size, 0.8rem); 2361 color: var(--body-color, rgba(0, 0, 0, 0.8)); 2362 } 2363 2364 d-byline a, 2365 d-article d-byline a { 2366 color: var(--body-color, rgba(0, 0, 0, 0.8)); 2367 } 2368 2369 /*-- TABLE OF CONTENTS --*/ 2370 .d-contents nav h3 { 2371 font-size: var(--heading-size, 18px); 2372 } 2373 2374 .d-contents nav a { 2375 font-size: var(--contents-size, 13px); 2376 } 2377 2378 /*-- APPENDIX --*/ 2379 d-appendix h3 { 2380 font-size: var(--heading-size, 15px); 2381 color: var(--heading-color, rgba(0, 0, 0, 0.65)); 2382 } 2383 2384 d-appendix { 2385 font-size: var(--text-size, 0.8em); 2386 color: var(--text-color, rgba(0, 0, 0, 0.5)); 2387 } 2388 2389 d-appendix d-footnote-list a.footnote-backlink { 2390 color: var(--text-color, rgba(0, 0, 0, 0.5)); 2391 } 2392 2393 /*-- WEBSITE HEADER + FOOTER --*/ 2394 .distill-site-header .title { 2395 font-size: var(--title-size, 18px); 2396 font-family: var(--navbar-font), var(--heading-default); 2397 } 2398 2399 .distill-site-header a, 2400 .nav-dropdown .nav-dropbtn { 2401 font-family: var(--navbar-font), var(--heading-default); 2402 } 2403 2404 .nav-dropdown .nav-dropbtn { 2405 color: var(--text-color, rgba(255, 255, 255, 0.8)); 2406 font-size: var(--text-size, 15px); 2407 } 2408 2409 .distill-site-header a:hover, 2410 .nav-dropdown:hover .nav-dropbtn { 2411 color: var(--hover-color, white); 2412 } 2413 2414 .distill-site-header { 2415 font-size: var(--text-size, 15px); 2416 color: var(--text-color, rgba(255, 255, 255, 0.8)); 2417 background-color: var(--bkgd-color, #0F2E3D); 2418 } 2419 2420 .distill-site-footer { 2421 font-size: var(--text-size, 15px); 2422 color: var(--text-color, rgba(255, 255, 255, 0.8)); 2423 background-color: var(--bkgd-color, #0F2E3D); 2424 } 2425 2426 .distill-site-footer a:hover { 2427 color: var(--hover-color, white); 2428 }</style> 2429 <!--/radix_placeholder_distill--> 2430
2430<script src="site_libs/header-attrs-2.29/header-attrs.js"></script>
2430 2431
2431<script src="site_libs/popper-2.6.0/popper.min.js"></script>
2431 2432 <link href="site_libs/tippy-6.2.7/tippy.css" rel="stylesheet" /> 2433 <link href="site_libs/tippy-6.2.7/tippy-light-border.css" rel="stylesheet" /> 2434
2434<script src="site_libs/tippy-6.2.7/tippy.umd.min.js"></script>
2434 2435
2435<script src="site_libs/anchor-4.2.2/anchor.min.js"></script>
2435 2436
2436<script src="site_libs/bowser-1.9.3/bowser.min.js"></script>
2436 2437
2437<script src="site_libs/webcomponents-2.0.0/webcomponents.js"></script>
2437 2438
2438<script src="site_libs/distill-2.2.21/template.v2.js"></script>
2438 2439 <!--radix_placeholder_site_in_header--> 2440 <style type="text/css"> 2441 @import url('https://fonts.googleapis.com/css2?family=Annie+Use+Your+Telescope&family=Fuzzy+Bubbles&family=Shizuru&display=swap'); 2442 2443 /* Edit the CSS properties in this file to create a custom 2444 Distill theme. Only edit values in the right column 2445 for each row; values shown are the CSS defaults. 2446 To return any property to the default, 2447 you may set its value to: unset 2448 All rows must end with a semi-colon. */ 2449 2450 /* Optional: embed custom fonts here with `@import` */ 2451 /* This must remain at the top of this file. */ 2452 2453 2454 2455 html { 2456 /*-- Main font sizes --*/ 2457 --title-size: 50px; 2458 --text-size: 20px; 2459 /* --body-size: 1.06rem; */ 2460 --code-size: 14px; 2461 --aside-size: 12px; 2462 --fig-cap-size: 13px; 2463 /*-- Main font colors --*/ 2464 --title-color: white; 2465 --header-color: rgba(0, 0, 0, 0.8); 2466 --body-color: rgba(0, 0, 0, 0.8); 2467 --aside-color: rgba(0, 0, 0, 0.6); 2468 --fig-cap-color: rgba(0, 0, 0, 0.6); 2469 /*-- Specify custom fonts ~~~ must be imported above --*/ 2470 --heading-font: Atma; 2471 --mono-font: monospace; 2472 --body-font: sans-serif; 2473 --navbar-font: "Annie Use Your Telescope", serif; 2474 } 2475 2476 .distill-site-header { 2477 --title-size: 50px; 2478 --text-color: #176940; 2479 --text-size: 22px; 2480 --hover-color: black; 2481 --bkgd-color: #eeeeee; 2482 } 2483 2484 /*-- Additional custom styles --*/ 2485 /* Add any additional CSS rules below */ 2486 2487 .distill-site-nav { /* shdow line under banner */ 2488 border-bottom: 2px solid #DECF40; 2489 -webkit-box-shadow: 1px 1px 18px #4d4d4d; 2490 -moz-box-shadow: 1px 1px 18px #4d4d4d; 2491 box-shadow: 1px 1px 18px #4d4d4d; 2492 } 2493 2494 .distill-site-header .logo img { /* logo size */ 2495 max-height: 50px; 2496 width: auto; 2497 margin-top: 10px; 2498 } 2499 2500 2501 .posts-list > h1 { 2502 color: black!important; /* prints "Test Blog" */ 2503 } 2504 2505 2506 p a { /* underlines links */ 2507 text-decoration: none; 2508 color: black; 2509 border-bottom: 3px solid #9ae28f; 2510 box-shadow: inset 0 -4px 0 #9ae28f; 2511 background: transparent; 2512 transition: background 150ms ease; 2513 font-style: italic; 2514 font-family: menu; 2515 font-stretch: extra-expanded; 2516 } 2517 2518 p a:hover { /* makes links go green on hover */ 2519 text-decoration: none; 2520 --bg-opacity: 1; 2521 background-color: #9ae28f; 2522 background-color: rgba(154, 226, 143, var(--bg-opacity)); 2523 } 2524 2525 2526 .thumbnail { 2527 padding: 0px!important; 2528 margin: 0px!important; 2529 max-width: 25%!important; 2530 height: 10%!important; 2531 vertical-align: text-top!important; 2532 } 2533 </style> 2534 <!--/radix_placeholder_site_in_header--> 2535 2536 <link rel="stylesheet" href="theme.css" type="text/css"/> 2537 2538</head> 2539 2540<body class="layout-listing"> 2541 2542<!--radix_placeholder_front_matter--> 2543
2544<script id="distill-front-matter" type="text/json"> 2545{"title":"Projects","description":"Some of other stuff I'm working on right now, or in the recent past","authors":[]} 2546</script>
2546 2547 2548<!--/radix_placeholder_front_matter--> 2549<!--radix_placeholder_navigation_before_body--> 2550<header class="header header--fixed" role="banner"> 2551<nav class="distill-site-nav distill-site-header"> 2552<div class="nav-left"> 2553<a class="logo" href="https://www.fizzics.ie/"> 2554<img src="images/atlantic.png" alt="Logo"/> 2555</a> 2556<a class='title' href='/'>Euge</a> 2557<a href='/'>Home</a> 2558<a href='/projects'>Projects</a> 2559<a href='/teaching'>Teaching</a> 2560<a href='/talks'>Talks</a> 2561<a href='/publications'>Publications</a> 2562<a href='/resources'>Resources</a> 2563<a href='/about'>About</a> 2564<input id="distill-search" class="nav-search hidden" type="text" placeholder="Search..."/> 2565</div> 2566<div class="nav-right"> 2567<a href="https://github.com/eugene100hickey"> 2568<i class="fab fa-github" aria-hidden="true"></i> 2569</a> 2570<a href="https://mastodon.social/@eugene100hickey"> 2571<i class="fab fa-mastodon" aria-hidden="true"></i> 2572</a> 2573<a href="https://www.linkedin.com/in/eugene100hickey/"> 2574<i class="fab fa-linkedin" aria-hidden="true"></i> 2575</a> 2576<a href="https://orcid.org/my-orcid?orcid=0000-0001-9813-9323"> 2577<i class="fab fa-orcid" aria-hidden="true"></i> 2578</a> 2579<a href="blog.xml"> 2580<i class="fa fa-rss" aria-hidden="true"></i> 2581</a> 2582<a href="javascript:void(0);" class="nav-toggle">☰</a> 2583</div> 2584</nav> 2585</header> 2586<!--/radix_placeholder_navigation_before_body--> 2587<!--radix_placeholder_site_before_body--> 2588<!--/radix_placeholder_site_before_body--> 2589<!--radix_placeholder_article_listing--> 2590 2591
2592<script type="application/javascript"> 2593 2594function init_posts_list() { 2595 2596 function load_image(img) { 2597 var src = $(img).attr('data-src'); 2598 if (src) { 2599 $(img).attr('src', src); 2600 $(img).on("load", function() { 2601 img.removeAttribute('data-src'); 2602 }); 2603 } 2604 } 2605 2606 function set_posts_visible(posts, visible) { 2607 if (visible) { 2608 2609 // show bottom border by default 2610 $(posts).removeClass('post-preview-last'); 2611 2612 // apply limits if need be 2613 var max_posts = 25; 2614 var apply_limits = $('.posts-container').hasClass('posts-apply-limit'); 2615 if (apply_limits && posts.length > max_posts) { 2616 posts = $(posts).slice(0, max_posts); 2617 } else { 2618 $('.posts-more a').addClass('hidden'); 2619 } 2620 2621 // apply last style 2622 $(posts.slice(-1)[0]).addClass('post-preview-last'); 2623 2624 $(posts).removeClass('hidden'); 2625 $(posts).find('img[data-src]').each(function(i, img) { 2626 load_image(img); 2627 }); 2628 } else { 2629 $(posts).addClass('hidden'); 2630 } 2631 } 2632 2633 function apply_hash_filter() { 2634 2635 // clear active state 2636 $('.categories .active').removeClass('active'); 2637 2638 // mark all posts invisible to start 2639 set_posts_visible($('.posts-list').children('a'), false); 2640 2641 // if we have a hash filter 2642 if (window.location.hash && window.location.hash.startsWith("#category:")) { 2643 2644 // mark posts that match the category visible 2645 var page_category = window.location.hash.replace(/^#category:/, ""); 2646 page_category = decodeURIComponent(page_category) 2647 var posts = $('.post-metadata').map(function(idx, script) { 2648 var metadata = $.parseJSON($(script).html()); 2649 var post = null; 2650 $.each(metadata.categories, function(idx, category) { 2651 category = category.replace(/ /g,"_"); 2652 if ((page_category || '').toLowerCase() === "articles" || category === page_category) { 2653 post = $(script).parent().get(); 2654 return false; 2655 } 2656 }); 2657 return post; 2658 }); 2659 set_posts_visible(posts, true); 2660 2661 // mark the hash active 2662 $('.categories li>a[href="' + decodeURIComponent(window.location.hash) + '"]').addClass('active'); 2663 2664 // update the list_caption 2665 var list_caption = $('.posts-list-caption'); 2666 var caption = (page_category || '').toLowerCase() === "articles" 2667 ? list_caption.attr('data-caption') 2668 : ('Category: ' + page_category.replace(/_/g," ")); 2669 list_caption.text(caption); 2670 2671 } else { 2672 2673 // no hash filter, make all posts visible (subject to max display) 2674 set_posts_visible($('.posts-list').children(), true); 2675 2676 // reset list caption 2677 var list_caption = $('.posts-list-caption'); 2678 list_caption.text(list_caption.attr('data-caption')); 2679 2680 2681 } 2682 } 2683 2684 // more articles 2685 function apply_post_limits(apply) { 2686 if (apply) { 2687 $('.posts-container').addClass('posts-apply-limit'); 2688 $('.posts-more a').removeClass('hidden'); 2689 } else { 2690 $('.posts-container').removeClass('posts-apply-limit'); 2691 $('.posts-more a').addClass('hidden'); 2692 } 2693 } 2694 2695 // click handling for tags 2696 $('.dt-tag').click(function(ev) { 2697 window.location.hash = '#category:' + $(this).text().replace(/ /g, "_"); 2698 return false; 2699 }) 2700 2701 // hash filter handling 2702 apply_hash_filter(); 2703 $(window).on('hashchange',function() { 2704 apply_post_limits(true); 2705 apply_hash_filter(); 2706 }); 2707 2708 // more articles link 2709 $('.posts-more a').click(function(e) { 2710 e.preventDefault(); 2711 apply_post_limits(false); 2712 apply_hash_filter(); 2713 return false; 2714 }); 2715 2716} 2717 2718</script>
2718 2719 2720 2721 2722<div class="posts-container posts-with-sidebar posts-apply-limit l-screen-inset"> 2723<div class="posts-list"> 2724<h1 class="posts-list-caption" data-caption="Projects">Projects</h1> 2725<a href="projects/2021-09-04-THE/" class="post-preview">
2726<script class="post-metadata" type="text/json">{"categories":["R","Academia"]}</script>
2726 2727<div class="metadata"> 2728<div class="publishedDate">Sept. 4, 2021</div> 2729</div> 2730<div class="thumbnail"> 2731<img src="projects/2021-09-04-THE/SDG7/img/rankings-map.png"/> 2732</div> 2733<div class="description"> 2734<h2>University Rankings</h2> 2735<div class="dt-tags"> 2736<div class="dt-tag">R</div> 2737<div class="dt-tag">Academia</div> 2738</div> 2739<p>Looking at the status of TU Dublin within the university rankings world</p> 2740</div> 2741</a> 2742<a href="projects/2021-04-04-DifTU/" class="post-preview">
2743<script class="post-metadata" type="text/json">{"categories":["R","Academia"]}</script>
2743 2744<div class="metadata"> 2745<div class="publishedDate">April 4, 2021</div> 2746</div> 2747<div class="thumbnail"> 2748<img src="projects/2021-04-04-DifTU/img/Q24.png"/> 2749</div> 2750<div class="description"> 2751<h2>Data Insights for TU Dublin (DifTU)</h2> 2752<div class="dt-tags"> 2753<div class="dt-tag">R</div> 2754<div class="dt-tag">Academia</div> 2755</div> 2756<p>Looking at how the COVID pandemic has impacted the use of digital technologies in TU Dublin</p> 2757</div> 2758</a> 2759<a href="projects/2020-03-20-RExams/" class="post-preview">
2760<script class="post-metadata" type="text/json">{"categories":["R","Academia"]}</script>
2760 2761<div class="metadata"> 2762<div class="publishedDate">March 25, 2020</div> 2763</div> 2764<div class="thumbnail"> 2765<img src="projects/2020-03-20-RExams/img/hex.png"/> 2766</div> 2767<div class="description"> 2768<h2>R/Exams</h2> 2769<div class="dt-tags"> 2770<div class="dt-tag">R</div> 2771<div class="dt-tag">Academia</div> 2772</div> 2773<p>Using R to improve the quality of online assessments</p> 2774</div> 2775</a> 2776</div> 2777<div class="posts-sidebar"> 2778<div class="sidebar-section categories"> 2779<h3>Categories</h3> 2780<ul> 2781<li> 2782<a href="#category:Articles">Articles</a> 2783<span class="category-count">(3)</span> 2784</li> 2785<li> 2786<a href="#category:Academia">Academia</a> 2787<span class="category-count">(3)</span> 2788</li> 2789<li> 2790<a href="#category:R">R</a> 2791<span class="category-count">(3)</span> 2792</li> 2793</ul> 2794</div> 2795</div> 2796<div class="posts-more"> 2797<a href="#">More articles »</a> 2798</div> 2799</div> 2800<!--/radix_placeholder_article_listing--> 2801 2802<div class="d-title"> 2803<h1>Projects</h1> 2804 2805<!--radix_placeholder_categories--> 2806<!--/radix_placeholder_categories--> 2807<p><p>Some of other stuff Iâm working on right now, or in the recent past</p></p> 2808</div> 2809 2810 2811<div class="d-article"> 2812<div class="layout-chunk" data-layout="l-body"> 2813<style type="text/css"> 2814.thumbnail { 2815 border: 1px solid black; 2816} 2817</style> 2818</div> 2819<div class="sourceCode" id="cb1"><pre class="sourceCode r distill-force-highlighting-css"><code class="sourceCode r"></code></pre></div> 2820<!--radix_placeholder_article_footer--> 2821<!--/radix_placeholder_article_footer--> 2822</div> 2823 2824<div class="d-appendix"> 2825</div> 2826 2827 2828<!--radix_placeholder_site_after_body--> 2829<!--/radix_placeholder_site_after_body--> 2830<!--radix_placeholder_appendices--> 2831<div class="appendix-bottom"> 2832<h3 id="updates-and-corrections">Corrections</h3> 2833<p>If you see mistakes or want to suggest changes, please <a href="https://github.com/eugene100hickey/fizzics/issues/new">create an issue</a> on the source repository.</p> 2834<h3 id="reuse">Reuse</h3> 2835<p>Text and figures are licensed under Creative Commons Attribution <a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>. Source code is available at <a href="https://github.com/eugene100hickey/fizzics">https://github.com/eugene100hickey/fizzics</a>, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".</p> 2836</div> 2837<!--/radix_placeholder_appendices--> 2838<!--radix_placeholder_navigation_after_body--> 2839<!--/radix_placeholder_navigation_after_body--> 2840 2841</body> 2842 2843</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.