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');
 | |
|     }
 | |
| });
 |