84 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use-strict';
 | 
						|
 | 
						|
let queryBeingDone = null;
 | 
						|
let pattern = null;
 | 
						|
 | 
						|
const escapedRegex = /[-\/\\^$*+?.()|[\]{}]/g;
 | 
						|
function escapeRegex(e) {
 | 
						|
    return e.replace(escapedRegex, '\\$&');
 | 
						|
}
 | 
						|
 | 
						|
// for some reason Sphinx shows some entries twice
 | 
						|
// if something has been scored already I'd rather sort it to the bottom
 | 
						|
const beenScored = new Set();
 | 
						|
 | 
						|
function __score(haystack, regex) {
 | 
						|
    let match = regex.exec(haystack);
 | 
						|
    if (match == null) {
 | 
						|
        return Number.MAX_VALUE;
 | 
						|
    }
 | 
						|
    let subLength = match[0].length;
 | 
						|
    let start = match.index;
 | 
						|
    return (subLength * 1000 + start) / 1000.0;
 | 
						|
}
 | 
						|
 | 
						|
// unused for now
 | 
						|
function __cleanNamespaces(query) {
 | 
						|
    return query.replace(/(discord\.(ext\.)?)?(.+)/, '$3');
 | 
						|
}
 | 
						|
 | 
						|
Scorer = {
 | 
						|
 | 
						|
    // Implement the following function to further tweak the score for each result
 | 
						|
    // The function takes a result array [filename, title, anchor, descr, score]
 | 
						|
    // and returns the new score.
 | 
						|
    score: (result) => {
 | 
						|
        // only inflate the score of things that are actual API reference things
 | 
						|
        const [, title, , , score] = result;
 | 
						|
 | 
						|
        if (pattern !== null && title.startsWith('discord.')) {
 | 
						|
            let _score = __score(title, pattern);
 | 
						|
            if (_score === Number.MAX_VALUE) {
 | 
						|
                return score;
 | 
						|
            }
 | 
						|
            if (beenScored.has(title)) {
 | 
						|
                return 0;
 | 
						|
            }
 | 
						|
            beenScored.add(title);
 | 
						|
            let newScore = 100 + queryBeingDone.length - _score;
 | 
						|
            // console.log(`${title}: ${score} -> ${newScore} (${_score})`);
 | 
						|
            return newScore;
 | 
						|
        }
 | 
						|
        return score;
 | 
						|
    },
 | 
						|
 | 
						|
    // query matches the full name of an object
 | 
						|
    objNameMatch: 15,
 | 
						|
    // or matches in the last dotted part of the object name
 | 
						|
    objPartialMatch: 11,
 | 
						|
    // Additive scores depending on the priority of the object
 | 
						|
    objPrio: {
 | 
						|
        0: 15,  // used to be importantResults
 | 
						|
        1: 7,   // used to be objectResults
 | 
						|
        2: -5   // used to be unimportantResults
 | 
						|
    },
 | 
						|
    //  Used when the priority is not in the mapping.
 | 
						|
    objPrioDefault: 0,
 | 
						|
 | 
						|
    // query found in title
 | 
						|
    title: 15,
 | 
						|
    partialTitle: 7,
 | 
						|
    // query found in terms
 | 
						|
    term: 5,
 | 
						|
    partialTerm: 2
 | 
						|
};
 | 
						|
 | 
						|
document.addEventListener('DOMContentLoaded', () => {
 | 
						|
    const params = new URLSearchParams(window.location.search);
 | 
						|
    queryBeingDone = params.get('q');
 | 
						|
    if (queryBeingDone) {
 | 
						|
        let pattern = Array.from(queryBeingDone).map(escapeRegex).join('.*?');
 | 
						|
        pattern = new RegExp(pattern, 'i');
 | 
						|
    }
 | 
						|
});
 |