mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-11-04 01:47:27 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			245 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			245 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
root = document.getElementById("main_div");
 | 
						|
root.innerHTML = `
 | 
						|
<!-- You can append '?q=query' to the URL to default to a search -->
 | 
						|
<input id="searchBox" type="text" onkeyup="updateSearch(event)"
 | 
						|
       placeholder="Search for requests and types…" />
 | 
						|
 | 
						|
<div id="searchDiv">
 | 
						|
    <div id="exactMatch" style="display:none;">
 | 
						|
        <b>Exact match:</b>
 | 
						|
        <ul id="exactList" class="together">
 | 
						|
        </ul>
 | 
						|
    </div>
 | 
						|
 | 
						|
    <details id="methods" open><summary class="title">Methods (<span id="methodsCount">0</span>)</summary>
 | 
						|
        <ul id="methodsList" class="together">
 | 
						|
        </ul>
 | 
						|
    </details>
 | 
						|
 | 
						|
    <details id="types" open><summary class="title">Types (<span id="typesCount">0</span>)</summary>
 | 
						|
        <ul id="typesList" class="together">
 | 
						|
        </ul>
 | 
						|
    </details>
 | 
						|
 | 
						|
    <details id="constructors"><summary class="title">Constructors (<span id="constructorsCount">0</span>)</summary>
 | 
						|
        <ul id="constructorsList" class="together">
 | 
						|
        </ul>
 | 
						|
    </details>
 | 
						|
</div>
 | 
						|
<div id="contentDiv">
 | 
						|
` + root.innerHTML + "</div>";
 | 
						|
 | 
						|
// HTML modified, now load documents
 | 
						|
contentDiv = document.getElementById("contentDiv");
 | 
						|
searchDiv = document.getElementById("searchDiv");
 | 
						|
searchBox = document.getElementById("searchBox");
 | 
						|
 | 
						|
// Search lists
 | 
						|
methodsDetails = document.getElementById("methods");
 | 
						|
methodsList = document.getElementById("methodsList");
 | 
						|
methodsCount = document.getElementById("methodsCount");
 | 
						|
 | 
						|
typesDetails = document.getElementById("types");
 | 
						|
typesList = document.getElementById("typesList");
 | 
						|
typesCount = document.getElementById("typesCount");
 | 
						|
 | 
						|
constructorsDetails = document.getElementById("constructors");
 | 
						|
constructorsList = document.getElementById("constructorsList");
 | 
						|
constructorsCount = document.getElementById("constructorsCount");
 | 
						|
 | 
						|
// Exact match
 | 
						|
exactMatch = document.getElementById("exactMatch");
 | 
						|
exactList = document.getElementById("exactList");
 | 
						|
 | 
						|
try {
 | 
						|
    requests = [{request_names}];
 | 
						|
    types = [{type_names}];
 | 
						|
    constructors = [{constructor_names}];
 | 
						|
 | 
						|
    requestsu = [{request_urls}];
 | 
						|
    typesu = [{type_urls}];
 | 
						|
    constructorsu = [{constructor_urls}];
 | 
						|
} catch (e) {
 | 
						|
    requests = [];
 | 
						|
    types = [];
 | 
						|
    constructors = [];
 | 
						|
    requestsu = [];
 | 
						|
    typesu = [];
 | 
						|
    constructorsu = [];
 | 
						|
}
 | 
						|
 | 
						|
if (typeof prependPath !== 'undefined') {
 | 
						|
    for (var i = 0; i != requestsu.length; ++i) {
 | 
						|
        requestsu[i] = prependPath + requestsu[i];
 | 
						|
    }
 | 
						|
    for (var i = 0; i != typesu.length; ++i) {
 | 
						|
        typesu[i] = prependPath + typesu[i];
 | 
						|
    }
 | 
						|
    for (var i = 0; i != constructorsu.length; ++i) {
 | 
						|
        constructorsu[i] = prependPath + constructorsu[i];
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// Assumes haystack has no whitespace and both are lowercase.
 | 
						|
//
 | 
						|
// Returns the penalty for finding the needle in the haystack
 | 
						|
// or -1 if the needle wasn't found at all.
 | 
						|
function find(haystack, needle) {
 | 
						|
    if (haystack.indexOf(needle) != -1) {
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
    var hi = 0;
 | 
						|
    var ni = 0;
 | 
						|
    var penalty = 0;
 | 
						|
    var started = false;
 | 
						|
    while (true) {
 | 
						|
        while (needle[ni] < 'a' || needle[ni] > 'z') {
 | 
						|
            ++ni;
 | 
						|
            if (ni == needle.length) {
 | 
						|
                return penalty;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        while (haystack[hi] != needle[ni]) {
 | 
						|
            ++hi;
 | 
						|
            if (started) {
 | 
						|
                ++penalty;
 | 
						|
            }
 | 
						|
            if (hi == haystack.length) {
 | 
						|
                return -1;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        ++hi;
 | 
						|
        ++ni;
 | 
						|
        started = true;
 | 
						|
        if (ni == needle.length) {
 | 
						|
            return penalty;
 | 
						|
        }
 | 
						|
        if (hi == haystack.length) {
 | 
						|
            return -1;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// Given two input arrays "original" and "original urls" and a query,
 | 
						|
// return a pair of arrays with matching "query" elements from "original".
 | 
						|
//
 | 
						|
// TODO Perhaps return an array of pairs instead a pair of arrays (for cache).
 | 
						|
function getSearchArray(original, originalu, query) {
 | 
						|
    var destination = [];
 | 
						|
    var destinationu = [];
 | 
						|
 | 
						|
    for (var i = 0; i < original.length; ++i) {
 | 
						|
        var penalty = find(original[i].toLowerCase(), query);
 | 
						|
        if (penalty > -1 && penalty < original[i].length / 3) {
 | 
						|
            destination.push(original[i]);
 | 
						|
            destinationu.push(originalu[i]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return [destination, destinationu];
 | 
						|
}
 | 
						|
 | 
						|
// Modify "countSpan" and "resultList" accordingly based on the elements
 | 
						|
// given as [[elements], [element urls]] (both with the same length)
 | 
						|
function buildList(countSpan, resultList, foundElements) {
 | 
						|
    var result = "";
 | 
						|
    for (var i = 0; i < foundElements[0].length; ++i) {
 | 
						|
        result += '<li>';
 | 
						|
        result += '<a href="' + foundElements[1][i] + '">';
 | 
						|
        result += foundElements[0][i];
 | 
						|
        result += '</a></li>';
 | 
						|
    }
 | 
						|
 | 
						|
    if (countSpan) {
 | 
						|
        countSpan.innerHTML = "" + foundElements[0].length;
 | 
						|
    }
 | 
						|
    resultList.innerHTML = result;
 | 
						|
}
 | 
						|
 | 
						|
function updateSearch(event) {
 | 
						|
    var query = searchBox.value.toLowerCase();
 | 
						|
    if (!query) {
 | 
						|
        contentDiv.style.display = "";
 | 
						|
        searchDiv.style.display = "none";
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    contentDiv.style.display = "none";
 | 
						|
    searchDiv.style.display = "";
 | 
						|
 | 
						|
    var foundRequests = getSearchArray(requests, requestsu, query);
 | 
						|
    var foundTypes = getSearchArray(types, typesu, query);
 | 
						|
    var foundConstructors = getSearchArray(constructors, constructorsu, query);
 | 
						|
 | 
						|
    var original = requests.concat(constructors);
 | 
						|
    var originalu = requestsu.concat(constructorsu);
 | 
						|
    var destination = [];
 | 
						|
    var destinationu = [];
 | 
						|
 | 
						|
    for (var i = 0; i < original.length; ++i) {
 | 
						|
        if (original[i].toLowerCase().replace("request", "") == query) {
 | 
						|
            destination.push(original[i]);
 | 
						|
            destinationu.push(originalu[i]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if (event && event.keyCode == 13) {
 | 
						|
        if (destination.length != 0) {
 | 
						|
            window.location = destinationu[0];
 | 
						|
        } else if (methodsDetails.open && foundRequests[1].length) {
 | 
						|
            window.location = foundRequests[1][0];
 | 
						|
        } else if (typesDetails.open && foundTypes[1].length) {
 | 
						|
            window.location = foundTypes[1][0];
 | 
						|
        } else if (constructorsDetails.open && foundConstructors[1].length) {
 | 
						|
            window.location = foundConstructors[1][0];
 | 
						|
        }
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    buildList(methodsCount, methodsList, foundRequests);
 | 
						|
    buildList(typesCount, typesList, foundTypes);
 | 
						|
    buildList(constructorsCount, constructorsList, foundConstructors);
 | 
						|
 | 
						|
    // Now look for exact matches
 | 
						|
    if (destination.length == 0) {
 | 
						|
        exactMatch.style.display = "none";
 | 
						|
    } else {
 | 
						|
        exactMatch.style.display = "";
 | 
						|
        buildList(null, exactList, [destination, destinationu]);
 | 
						|
        return destinationu[0];
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
function getQuery(name) {
 | 
						|
    var query = window.location.search.substring(1);
 | 
						|
    var vars = query.split("&");
 | 
						|
    for (var i = 0; i != vars.length; ++i) {
 | 
						|
        var pair = vars[i].split("=");
 | 
						|
        if (pair[0] == name)
 | 
						|
            return decodeURI(pair[1]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
document.onkeydown = function (e) {
 | 
						|
    if (e.key == '/' || e.key == 's' || e.key == 'S') {
 | 
						|
        if (document.activeElement != searchBox) {
 | 
						|
            searchBox.focus();
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
    } else if (e.key == '?') {
 | 
						|
        alert('Pressing any of: /sS\nWill focus the search bar\n\n' +
 | 
						|
              'Pressing: enter\nWill navigate to the first match')
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
var query = getQuery('q');
 | 
						|
if (query) {
 | 
						|
    searchBox.value = query;
 | 
						|
}
 | 
						|
 | 
						|
var exactUrl = updateSearch();
 | 
						|
var redirect = getQuery('redirect');
 | 
						|
if (exactUrl && redirect != 'no') {
 | 
						|
    window.location = exactUrl;
 | 
						|
}
 |