| /* http://gregfranko.com/blog/jquery-best-practices/ */ |
| (function($) { |
| $(function() { |
| |
| $('nav.navbar').headroom(); |
| |
| Toc.init({ |
| $nav: $("#toc"), |
| $scope: $("main h2, main h3, main h4, main h5, main h6") |
| }); |
| |
| if ($('#toc').length) { |
| $('body').scrollspy({ |
| target: '#toc', |
| offset: $("nav.navbar").outerHeight() + 1 |
| }); |
| } |
| |
| // Activate popovers |
| $('[data-bs-toggle="popover"]').popover({ |
| container: 'body', |
| html: true, |
| trigger: 'focus', |
| placement: "top", |
| sanitize: false, |
| }); |
| |
| $('[data-bs-toggle="tooltip"]').tooltip(); |
| |
| /* Clipboard --------------------------*/ |
| |
| function changeTooltipMessage(element, msg) { |
| var tooltipOriginalTitle=element.getAttribute('data-bs-original-title'); |
| element.setAttribute('data-bs-original-title', msg); |
| $(element).tooltip('show'); |
| element.setAttribute('data-bs-original-title', tooltipOriginalTitle); |
| } |
| |
| if(ClipboardJS.isSupported()) { |
| $(document).ready(function() { |
| var copyButton = "<button type='button' class='btn btn-primary btn-copy-ex' title='Copy to clipboard' aria-label='Copy to clipboard' data-toggle='tooltip' data-placement='left' data-trigger='hover' data-clipboard-copy><i class='fa fa-copy'></i></button>"; |
| |
| $("div.sourceCode").addClass("hasCopyButton"); |
| |
| // Insert copy buttons: |
| $(copyButton).prependTo(".hasCopyButton"); |
| |
| // Initialize tooltips: |
| $('.btn-copy-ex').tooltip({container: 'body'}); |
| |
| // Initialize clipboard: |
| var clipboard = new ClipboardJS('[data-clipboard-copy]', { |
| text: function(trigger) { |
| return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, ""); |
| } |
| }); |
| |
| clipboard.on('success', function(e) { |
| changeTooltipMessage(e.trigger, 'Copied!'); |
| e.clearSelection(); |
| }); |
| |
| clipboard.on('error', function(e) { |
| changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); |
| }); |
| |
| }); |
| } |
| |
| /* Search marking --------------------------*/ |
| var url = new URL(window.location.href); |
| var toMark = url.searchParams.get("q"); |
| var mark = new Mark("main#main"); |
| if (toMark) { |
| mark.mark(toMark, { |
| accuracy: { |
| value: "complementary", |
| limiters: [",", ".", ":", "/"], |
| } |
| }); |
| } |
| |
| /* Search --------------------------*/ |
| /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */ |
| // Initialise search index on focus |
| var fuse; |
| $("#search-input").focus(async function(e) { |
| if (fuse) { |
| return; |
| } |
| |
| $(e.target).addClass("loading"); |
| var response = await fetch($("#search-input").data("search-index")); |
| var data = await response.json(); |
| |
| var options = { |
| keys: ["what", "text", "code"], |
| ignoreLocation: true, |
| threshold: 0.1, |
| includeMatches: true, |
| includeScore: true, |
| }; |
| fuse = new Fuse(data, options); |
| |
| $(e.target).removeClass("loading"); |
| }); |
| |
| // Use algolia autocomplete |
| var options = { |
| autoselect: true, |
| debug: true, |
| hint: false, |
| minLength: 2, |
| }; |
| var q; |
| async function searchFuse(query, callback) { |
| await fuse; |
| |
| var items; |
| if (!fuse) { |
| items = []; |
| } else { |
| q = query; |
| var results = fuse.search(query, { limit: 20 }); |
| items = results |
| .filter((x) => x.score <= 0.75) |
| .map((x) => x.item); |
| if (items.length === 0) { |
| items = [{dir:"Sorry 😿",previous_headings:"",title:"No results found.",what:"No results found.",path:window.location.href}]; |
| } |
| } |
| callback(items); |
| } |
| $("#search-input").autocomplete(options, [ |
| { |
| name: "content", |
| source: searchFuse, |
| templates: { |
| suggestion: (s) => { |
| if (s.title == s.what) { |
| return `${s.dir} > <div class="search-details"> ${s.title}</div>`; |
| } else if (s.previous_headings == "") { |
| return `${s.dir} > <div class="search-details"> ${s.title}</div> > ${s.what}`; |
| } else { |
| return `${s.dir} > <div class="search-details"> ${s.title}</div> > ${s.previous_headings} > ${s.what}`; |
| } |
| }, |
| }, |
| }, |
| ]).on('autocomplete:selected', function(event, s) { |
| window.location.href = s.path + "?q=" + q + "#" + s.id; |
| }); |
| }); |
| })(window.jQuery || window.$) |
| |
| |