jQuery.fn.highlight = function (pat) {
function innerHighlight(node, pat) {
var skip = 0;
if (node.nodeType == 3) {
var pos = node.data.toUpperCase().indexOf(pat);
if (pos >= 0) {
var spannode = document.createElement('span');
spannode.className = 'search_highlight';
var middlebit = node.splitText(pos);
var endbit = middlebit.splitText(pat.length);
var middleclone = middlebit.cloneNode(true);
spannode.appendChild(middleclone);
middlebit.parentNode.replaceChild(spannode, middlebit);
skip = 1;
}
}
else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
for (var i = 0; i < node.childNodes.length; ++i) {
i += innerHighlight(node.childNodes[i], pat);
}
}
return skip;
}
return this.each(function () {
innerHighlight(this, pat.toUpperCase());
});
};
window.onload = function(){
}
$(document).ready(function(){
var waiting_search = false;
var search_index = null;
var search_content = {
"curr": null,
"others":{}
}
function onDownloadOk(data, arg1, arg2){
search_index = data;
var pathname = window.location.pathname;
var curr_url = null;
var others_url = [];
for(var url in search_index){
if(pathname.indexOf(url) != -1){
if(!curr_url){
curr_url = url;
}else{ // already have math item, e.g. `/get_started/zh/install/index.html /get_started/zh`
// and now `/get_started/zh/install/index.html /`
// choose longger one
if(url.length > curr_url.length){
others_url.push(curr_url);
curr_url = url;
}else{
others_url.push(url);
}
}
}else{
others_url.push(url);
}
}
if(search_index[curr_url]){
downloadJson(search_index[curr_url][1], onIndexDownloadOk, curr_url, true, search_index[curr_url][0]);
}
for(var i in others_url){
url = others_url[i];
downloadJson(search_index[url][1], onIndexDownloadOk, url, false, search_index[url][0]);
}
}
function onIndexDownloadOk(data, url, is_curr, doc_name){
if(is_curr){
search_content["curr"] = [url, doc_name, data];
}else{
search_content["others"][url] = [url, doc_name, data];
}
if(waiting_search == true){
waiting_search = false;
onSearch();
}
}
downloadJson("/static/search_index/index.json", onDownloadOk);
var input_hint = $("#search_input_hint").html();
var loading_hint = $("#search_loading_hint").html();
var download_err_hint = $("#search_download_err_hint").html();
var other_docs_result_hint = $("#search_other_docs_result_hint").html();
var curr_doc_result_hint = $("#search_curr_doc_result_hint").html();
$("body").append('
');
$("#search").bind("click", function(e){
$("body").css("overflow-y", "hidden");
$("#search_wrapper").show();
$("#search_input").focus();
$("#wrapper").addClass("blur");
$("#navbar").addClass("blur");
});
$("#search_wrapper .close").bind("click", function(e){
$("body").css("overflow-y", "auto");
$("#search_wrapper").hide();
$("#wrapper").removeClass("blur");
$("#navbar").removeClass("blur");
});
$("#search_input").bind("input propertychange", function(){
setTimeout(() => {
onSearch();
}, 1000);
});
function onSearch(){
$("#search_result_name").empty();
$("#search_result_content").empty();
$("#search_result_content").append('');
$("#search_result_content").append('');
if(!search_index){
$("#search_result_content").append(''+ loading_hint +'
');
waiting_search = true;
return;
}
if(!search_content["curr"] && search_content["others"].length == 0){
$("#search_result_content").append(''+ loading_hint +'
');
waiting_search = true;
return;
}
$("#search_curr_result > .hint").addClass("searching");
var search_keywords = $("#search_input").val();
search_doc(search_content["curr"], "#search_curr_result");
var doc_id = 0;
for(var url in search_content["others"]){
search_doc(search_content["others"][url], "#search_others_result", doc_id);
doc_id += 1;
}
addSearchResultClickListener();
function search_doc(data, containerId, doc_id="curr"){
var doc_id_str = 'result_wrapper_' + doc_id;
var findFlag = false;
var items = data[2];
for(var url in items){
var content = items[url];
search_keywords = search_keywords.trim();
if(search_keywords.length <= 0){
return;
}
var keywords = search_keywords.split(" ");
var find = false;
var find_strs = "";
for(var i in keywords){
var keyword = keywords[i];
if(content["title"] && content["title"].indexOf(keyword) >= 0){
find = true;
}
}
if(content["content"] && content["content"].length > 0){
find_strs = search(keywords, content["content"]);
if(find_strs.length > 0){
find = true;
}
}
if(find){
if(!findFlag){
$("#search_result_name").append(''+ data[1] +'');
$(containerId).append('');
findFlag = true;
}
$("#"+doc_id_str).append(''+ (content["title"]?content["title"]:url) +
'
' + find_strs + '
');
}
}
}
$("#search_curr_result > .hint").removeClass("searching");
}
function downloadJson(url, callback, arg1=null, arg2=null, arg3=null){
$.ajax({
type: "GET",
url: url,
contentType: "application/json",
dataType: "json",
success: function(data){
callback(data, arg1, arg2, arg3);
},
error: function(){
$("#search_result_content").empty();
$("#search_result_content").append(''+ download_err_hint + ': '+ url +'
');
}
});
}
highlightKeywords();
});
function focusItems(id, contrainerId, offset=0, classname=null){
var elementTop = 0;
if(classname){
elementTop = $("."+classname)[0].offsetTop - offset;
}else{
elementTop = $("#"+id)[0].offsetTop - offset;
}
$("#"+contrainerId).animate({scrollTop: elementTop},500);
}
function addSearchResultClickListener(){
$("#search_result_name > li").on("click", function(e){
var targetId = e.target.attributes.result_id.value;
focusItems(targetId, "search_result_content", $("#search_title").height() + $("#search_result .hint").height());
});
}
function highlightKeywords(){
var highlight_keywords = getQueryVariable("highlight");
if(highlight_keywords){
// add search result btn
var html = document.getElementsByTagName("html")[0];
var lang = html.lang.split("-")[0].toLowerCase()
let strs = {
"zh": {
"Previous": "上一个",
"Next": "下一个"
}
}
if(lang in strs){
var pre_name = strs[lang]["Previous"];
var next_name = strs[lang]["Next"];
}else{
var pre_name = "Previous";
var next_name = "Next";
}
$("body").append('' +
'
'+ pre_name +'
' +
'
' +
'
' + next_name +'
' +
'
');
var highlight_keywords = decodeURI(highlight_keywords);
highlight_keywords = highlight_keywords.split(" ");
for(var i=0; i .previous").on("click", function(){
let old = currSearchIdx;
currSearchIdx -= 1;
if (currSearchIdx < 0){
currSearchIdx = $(".search_highlight").length - 1;
}
window.scrollTo({
top: $(".search_highlight")[currSearchIdx].offsetTop - window.screen.height / 3,
behavior: "smooth"
});
$($(".search_highlight")[old]).removeClass("selected_highlight")
$($(".search_highlight")[currSearchIdx]).addClass("selected_highlight")
});
$("#search_ctrl_btn > .next").on("click", function(){
let old = currSearchIdx;
currSearchIdx += 1;
if (currSearchIdx >= $(".search_highlight").length){
currSearchIdx = 0;
}
window.scrollTo({
top: $(".search_highlight")[currSearchIdx].offsetTop - window.screen.height / 3,
behavior: "smooth"
});
$($(".search_highlight")[old]).removeClass("selected_highlight")
$($(".search_highlight")[currSearchIdx]).addClass("selected_highlight")
});
}
}
function getQueryVariable(variable)
{
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i= 0){
idxs.push({
"idx": idx + idx_rel,
"len": keyword.length
});
_idxs = _search([keyword], content.substr(idx + keyword.length), idx_rel + idx + keyword.length);
idxs = idxs.concat(_idxs);
}
}
return idxs
}
var find_strs = "";
idxs = _search(keywords, content);
idxs = idxs.sort((a, b)=> a.idx-b.idx);
var idx_last = -1;
var len_last = 0;
for(var i=0; i= 0 && (idx - idx_last -len_last) < show_length){ // last keyword too close
find_strs += content.substr(idx_last + len_last, idx - (idx_last + len_last)) + ''+ content.substr(idx, len) +'
'
}else{
var start_idx = (idx - show_length < 0) ? 0 : (idx - show_length);
find_strs += '...' + content.substr(start_idx, idx - start_idx) +
'' + content.substr(idx, len) +
'
';
}
var idx_next = -1;
if(i < idxs.length -1){
idx_next = idxs[i + 1]['idx'];
}
if(idx_next >= 0 && ((idx_next - idx - len) < show_length) ){ // next keywor too close
}else{
find_strs += content.substr(idx + len, show_length) + '...';
}
idx_last = idx;
len_last = len;
}
return find_strs
}