79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var jumpToCode = (function init() {
 | 
						|
    // Classes of code we would like to highlight in the file view
 | 
						|
    var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
 | 
						|
 | 
						|
    // Elements to highlight in the file listing view
 | 
						|
    var fileListingElements = ['td.pct.low'];
 | 
						|
 | 
						|
    // We don't want to select elements that are direct descendants of another match
 | 
						|
    var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
 | 
						|
 | 
						|
    // Selecter that finds elements on the page to which we can jump
 | 
						|
    var selector =
 | 
						|
        fileListingElements.join(', ') +
 | 
						|
        ', ' +
 | 
						|
        notSelector +
 | 
						|
        missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
 | 
						|
 | 
						|
    // The NodeList of matching elements
 | 
						|
    var missingCoverageElements = document.querySelectorAll(selector);
 | 
						|
 | 
						|
    var currentIndex;
 | 
						|
 | 
						|
    function toggleClass(index) {
 | 
						|
        missingCoverageElements
 | 
						|
            .item(currentIndex)
 | 
						|
            .classList.remove('highlighted');
 | 
						|
        missingCoverageElements.item(index).classList.add('highlighted');
 | 
						|
    }
 | 
						|
 | 
						|
    function makeCurrent(index) {
 | 
						|
        toggleClass(index);
 | 
						|
        currentIndex = index;
 | 
						|
        missingCoverageElements.item(index).scrollIntoView({
 | 
						|
            behavior: 'smooth',
 | 
						|
            block: 'center',
 | 
						|
            inline: 'center'
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    function goToPrevious() {
 | 
						|
        var nextIndex = 0;
 | 
						|
        if (typeof currentIndex !== 'number' || currentIndex === 0) {
 | 
						|
            nextIndex = missingCoverageElements.length - 1;
 | 
						|
        } else if (missingCoverageElements.length > 1) {
 | 
						|
            nextIndex = currentIndex - 1;
 | 
						|
        }
 | 
						|
 | 
						|
        makeCurrent(nextIndex);
 | 
						|
    }
 | 
						|
 | 
						|
    function goToNext() {
 | 
						|
        var nextIndex = 0;
 | 
						|
 | 
						|
        if (
 | 
						|
            typeof currentIndex === 'number' &&
 | 
						|
            currentIndex < missingCoverageElements.length - 1
 | 
						|
        ) {
 | 
						|
            nextIndex = currentIndex + 1;
 | 
						|
        }
 | 
						|
 | 
						|
        makeCurrent(nextIndex);
 | 
						|
    }
 | 
						|
 | 
						|
    return function jump(event) {
 | 
						|
        switch (event.which) {
 | 
						|
            case 78: // n
 | 
						|
            case 74: // j
 | 
						|
                goToNext();
 | 
						|
                break;
 | 
						|
            case 66: // b
 | 
						|
            case 75: // k
 | 
						|
            case 80: // p
 | 
						|
                goToPrevious();
 | 
						|
                break;
 | 
						|
        }
 | 
						|
    };
 | 
						|
})();
 | 
						|
window.addEventListener('keydown', jumpToCode);
 |