simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

block-navigation.js (2387B)


      1 /* eslint-disable */
      2 var jumpToCode = (function init() {
      3     // Classes of code we would like to highlight in the file view
      4     var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
      5 
      6     // Elements to highlight in the file listing view
      7     var fileListingElements = ['td.pct.low'];
      8 
      9     // We don't want to select elements that are direct descendants of another match
     10     var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
     11 
     12     // Selecter that finds elements on the page to which we can jump
     13     var selector =
     14         fileListingElements.join(', ') +
     15         ', ' +
     16         notSelector +
     17         missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
     18 
     19     // The NodeList of matching elements
     20     var missingCoverageElements = document.querySelectorAll(selector);
     21 
     22     var currentIndex;
     23 
     24     function toggleClass(index) {
     25         missingCoverageElements
     26             .item(currentIndex)
     27             .classList.remove('highlighted');
     28         missingCoverageElements.item(index).classList.add('highlighted');
     29     }
     30 
     31     function makeCurrent(index) {
     32         toggleClass(index);
     33         currentIndex = index;
     34         missingCoverageElements.item(index).scrollIntoView({
     35             behavior: 'smooth',
     36             block: 'center',
     37             inline: 'center'
     38         });
     39     }
     40 
     41     function goToPrevious() {
     42         var nextIndex = 0;
     43         if (typeof currentIndex !== 'number' || currentIndex === 0) {
     44             nextIndex = missingCoverageElements.length - 1;
     45         } else if (missingCoverageElements.length > 1) {
     46             nextIndex = currentIndex - 1;
     47         }
     48 
     49         makeCurrent(nextIndex);
     50     }
     51 
     52     function goToNext() {
     53         var nextIndex = 0;
     54 
     55         if (
     56             typeof currentIndex === 'number' &&
     57             currentIndex < missingCoverageElements.length - 1
     58         ) {
     59             nextIndex = currentIndex + 1;
     60         }
     61 
     62         makeCurrent(nextIndex);
     63     }
     64 
     65     return function jump(event) {
     66         switch (event.which) {
     67             case 78: // n
     68             case 74: // j
     69                 goToNext();
     70                 break;
     71             case 66: // b
     72             case 75: // k
     73             case 80: // p
     74                 goToPrevious();
     75                 break;
     76         }
     77     };
     78 })();
     79 window.addEventListener('keydown', jumpToCode);