ydoc
Version:
基于 Markdown 的静态站点生成工具
87 lines (79 loc) • 2.69 kB
JavaScript
$(function(){
var $searchResult = $('.js-search-result'),
$searchInput = $('.js-input');
// 去除空格
String.prototype.trim = function () {
return this.replace(/(^\s*)|(\s*$)/g, '');
};
// 判断是否为空对象
function realObj(obj) {
for (var i in obj) {
return true;
}
return false;
}
// 防抖函数
function debounce(func, wait) {
var timeout;
return function () {
var context = this, args = arguments;
clearTimeout(timeout);
timeout = setTimeout(function() {
func.apply(context, args);
}, wait);
};
}
var highlightTextPrevNum = 6;
var highlightTextNextNum = 20;
// 简化文本内容长度
function simplifyStrDom(str, val) {
var index = str.indexOf(val);
var startIndex = index > highlightTextPrevNum ? index - highlightTextPrevNum : 0;
var sliceStr = str.slice(startIndex, index + val.length + highlightTextNextNum);
var addHighlightStr = sliceStr.replace(val, '<span class="highlight">' + val + '</span>');
var ellipsis = (sliceStr.lastIndexOf(val) != -1) || (sliceStr.lastIndexOf(val) > highlightTextNextNum) ? '...' : '';
return addHighlightStr + ellipsis;
}
// 监听输入的内容
$searchInput.on('input', debounce(function(e) {
var val = e.target.value.trim(),
res = window.ydoc_plugin_search_core(val);
$searchResult.show();
if (realObj(res) || val === '') {
var dom = '';
for (var key in res) {
dom += '<div class="headline">' + key + '</div>';
res[key].forEach(function(item) {
var contentDom = '';
item.children.forEach(function(i) {
i.title = simplifyStrDom(i.title, val);
i.content = simplifyStrDom(i.content, val);
contentDom += '<a class="caption" href="' + i.url + '">'+
'<div class="title">' + i.title + '</div>' +
'<div class="desc">' + i.content + '</div></a>';
});
dom += '<div class="row">' +
'<a class="subtitle" href="' + item.url + '">' + item.title + '</a>' +
'<div class="content">' + contentDom + '</div>' +
'</div>';
});
}
$searchResult.html(dom);
} else {
$searchResult.html('<div class="empty">没有找到关键词 <b>' + val + '</b> 的搜索结果</div>')
}
}, 300));
// 关闭搜索结果
$searchInput.on('blur', function(e) {
setTimeout(function() {
$searchResult.hide();
}, 100);
});
// ESCAPE key pressed
$(document).on('keydown', function (e) {
if (e.keyCode == 27) {
$searchInput[0].value = '';
$searchResult.hide();
}
});
})