Created
April 21, 2017 22:47
-
-
Save ntot/8fd9cf73301e010be65dd07f9fb45ccc to your computer and use it in GitHub Desktop.
Tipue Hexo Search
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var util = require('hexo-util'); | |
hexo.extend.generator.register('tipue-search-json', hexo_generator_tipue_search_json); | |
function hexo_generator_tipue_search_json(site) { | |
var minify = function (str) { | |
return util.stripHTML(str).trim().replace(/\n/g, ' ').replace(/\s+/g, ' '); | |
}, | |
keys = { | |
title: true, | |
url: true, | |
text: true, | |
image: true | |
}, | |
json = {}; | |
var catags = function (item) { | |
return item.name.replace(/\s+/g, '-').toLowerCase(); | |
}, | |
postsContent = site.posts.sort('-date').filter(function (post) { | |
return post.published; | |
}).map(function (post) { | |
var actualPost = {}; | |
Object.getOwnPropertyNames(keys).forEach(function (item) { | |
switch (item) { | |
case 'text': | |
return actualPost[item] = minify(post.content); | |
case 'image': | |
return actualPost[item] = post['image']; | |
case 'url': | |
return actualPost[item] = '/' + post['path']; | |
default: | |
return actualPost[item] = post[item]; | |
} | |
}); | |
return actualPost; | |
}); | |
json.pages = postsContent; | |
return { | |
path: '/tipuesearch/tipuesearch_content.json', | |
data: JSON.stringify(json) | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Tipue Search 5.0 | |
Copyright (c) 2015 Tipue | |
Tipue Search is released under the MIT License | |
http://www.tipue.com/search | |
*/ | |
(function($) { | |
$.fn.tipuesearch = function(options) { | |
var set = $.extend( { | |
'show' : 7, | |
'newWindow' : false, | |
'showURL' : true, | |
'showTitleCount' : true, | |
'minimumLength' : 3, | |
'descriptiveWords' : 50, | |
'highlightTerms' : true, | |
'highlightEveryTerm' : false, | |
'mode' : 'static', | |
'liveDescription' : '*', | |
'liveContent' : '*', | |
'contentLocation' : 'tipuesearch/tipuesearch_content.json', | |
'debug' : false | |
}, options); | |
return this.each(function() { | |
var tipuesearch_in = { | |
pages: [] | |
}; | |
$.ajaxSetup({ | |
async: false | |
}); | |
var tipuesearch_t_c = 0; | |
if (set.mode == 'live') | |
{ | |
for (var i = 0; i < tipuesearch_pages.length; i++) | |
{ | |
$.get(tipuesearch_pages[i]) | |
.done(function(html) | |
{ | |
var cont = $(set.liveContent, html).text(); | |
cont = cont.replace(/\s+/g, ' '); | |
var desc = $(set.liveDescription, html).text(); | |
desc = desc.replace(/\s+/g, ' '); | |
var t_1 = html.toLowerCase().indexOf('<title>'); | |
var t_2 = html.toLowerCase().indexOf('</title>', t_1 + 7); | |
if (t_1 != -1 && t_2 != -1) | |
{ | |
var tit = html.slice(t_1 + 7, t_2); | |
} | |
else | |
{ | |
var tit = tipuesearch_string_1; | |
} | |
tipuesearch_in.pages.push( | |
{ | |
"title": tit, | |
"text": desc, | |
"image": cont, | |
"url": tipuesearch_pages[i] | |
}); | |
}); | |
} | |
} | |
if (set.mode == 'json') | |
{ | |
$.getJSON(set.contentLocation) | |
.done(function(json) | |
{ | |
tipuesearch_in = $.extend({}, json); | |
}); | |
} | |
if (set.mode == 'static') | |
{ | |
tipuesearch_in = $.extend({}, tipuesearch); | |
} | |
var tipue_search_w = ''; | |
if (set.newWindow) | |
{ | |
tipue_search_w = ' target="_blank"'; | |
} | |
function getURLP(name) | |
{ | |
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20')) || null; | |
} | |
if (getURLP('q')) | |
{ | |
$('#tipue_search_input').val(getURLP('q')); | |
getTipueSearch(0, true); | |
} | |
$(this).keyup(function(event) | |
{ | |
if(event.keyCode == '13') | |
{ | |
getTipueSearch(0, true); | |
} | |
}); | |
function getTipueSearch(start, replace) | |
{ | |
$('#tipue_search_content').hide(); | |
$('#tipue_search_content').html('<div class="tipue_search_spinner"><div class="tipue_search_rect1"></div><div class="tipue_search_rect2"></div><div class="rect3"></div></div>'); | |
$('#tipue_search_content').show(); | |
var out = ''; | |
var results = ''; | |
var show_replace = false; | |
var show_stop = false; | |
var standard = true; | |
var c = 0; | |
found = []; | |
var d = $('#tipue_search_input').val().toLowerCase(); | |
d = $.trim(d); | |
if ((d.match("^\"") && d.match("\"$")) || (d.match("^'") && d.match("'$"))) | |
{ | |
standard = false; | |
} | |
if (standard) | |
{ | |
var d_w = d.split(' '); | |
d = ''; | |
for (var i = 0; i < d_w.length; i++) | |
{ | |
var a_w = true; | |
for (var f = 0; f < tipuesearch_stop_words.length; f++) | |
{ | |
if (d_w[i] == tipuesearch_stop_words[f]) | |
{ | |
a_w = false; | |
show_stop = true; | |
} | |
} | |
if (a_w) | |
{ | |
d = d + ' ' + d_w[i]; | |
} | |
} | |
d = $.trim(d); | |
d_w = d.split(' '); | |
} | |
else | |
{ | |
d = d.substring(1, d.length - 1); | |
} | |
if (d.length >= set.minimumLength) | |
{ | |
if (standard) | |
{ | |
if (replace) | |
{ | |
var d_r = d; | |
for (var i = 0; i < d_w.length; i++) | |
{ | |
for (var f = 0; f < tipuesearch_replace.words.length; f++) | |
{ | |
if (d_w[i] == tipuesearch_replace.words[f].word) | |
{ | |
d = d.replace(d_w[i], tipuesearch_replace.words[f].replace_with); | |
show_replace = true; | |
} | |
} | |
} | |
d_w = d.split(' '); | |
} | |
var d_t = d; | |
for (var i = 0; i < d_w.length; i++) | |
{ | |
for (var f = 0; f < tipuesearch_stem.words.length; f++) | |
{ | |
if (d_w[i] == tipuesearch_stem.words[f].word) | |
{ | |
d_t = d_t + ' ' + tipuesearch_stem.words[f].stem; | |
} | |
} | |
} | |
d_w = d_t.split(' '); | |
for (var i = 0; i < tipuesearch_in.pages.length; i++) | |
{ | |
var score = 0; | |
var s_t = tipuesearch_in.pages[i].text; | |
for (var f = 0; f < d_w.length; f++) | |
{ | |
var pat = new RegExp(d_w[f], 'gi'); | |
if (tipuesearch_in.pages[i].title.search(pat) != -1) | |
{ | |
var m_c = tipuesearch_in.pages[i].title.match(pat).length; | |
score += (20 * m_c); | |
} | |
if (tipuesearch_in.pages[i].text.search(pat) != -1) | |
{ | |
var m_c = tipuesearch_in.pages[i].text.match(pat).length; | |
score += (20 * m_c); | |
} | |
if (set.highlightTerms) | |
{ | |
if (set.highlightEveryTerm) | |
{ | |
var patr = new RegExp('(' + d_w[f] + ')', 'gi'); | |
} | |
else | |
{ | |
var patr = new RegExp('(' + d_w[f] + ')', 'i'); | |
} | |
s_t = s_t.replace(patr, "<span class=\"h01\">$1</span>"); | |
} | |
if (tipuesearch_in.pages[i].image.search(pat) != -1) | |
{ | |
var m_c = tipuesearch_in.pages[i].image.match(pat).length; | |
score += (10 * m_c); | |
} | |
if (tipuesearch_in.pages[i].url.search(pat) != -1) | |
{ | |
score += 20; | |
} | |
if (score != 0) | |
{ | |
for (var e = 0; e < tipuesearch_weight.weight.length; e++) | |
{ | |
if (tipuesearch_in.pages[i].url == tipuesearch_weight.weight[e].url) | |
{ | |
score += tipuesearch_weight.weight[e].score; | |
} | |
} | |
} | |
if (d_w[f].match('^-')) | |
{ | |
pat = new RegExp(d_w[f].substring(1), 'i'); | |
if (tipuesearch_in.pages[i].title.search(pat) != -1 || tipuesearch_in.pages[i].text.search(pat) != -1 || tipuesearch_in.pages[i].image.search(pat) != -1) | |
{ | |
score = 0; | |
} | |
} | |
} | |
if (score != 0) | |
{ | |
found.push( | |
{ | |
"score": score, | |
"title": tipuesearch_in.pages[i].title, | |
"desc": s_t, | |
"url": tipuesearch_in.pages[i].url | |
}); | |
c++; | |
} | |
} | |
} | |
else | |
{ | |
for (var i = 0; i < tipuesearch_in.pages.length; i++) | |
{ | |
var score = 0; | |
var s_t = tipuesearch_in.pages[i].text; | |
var pat = new RegExp(d, 'gi'); | |
if (tipuesearch_in.pages[i].title.search(pat) != -1) | |
{ | |
var m_c = tipuesearch_in.pages[i].title.match(pat).length; | |
score += (20 * m_c); | |
} | |
if (tipuesearch_in.pages[i].text.search(pat) != -1) | |
{ | |
var m_c = tipuesearch_in.pages[i].text.match(pat).length; | |
score += (20 * m_c); | |
} | |
if (set.highlightTerms) | |
{ | |
if (set.highlightEveryTerm) | |
{ | |
var patr = new RegExp('(' + d + ')', 'gi'); | |
} | |
else | |
{ | |
var patr = new RegExp('(' + d + ')', 'i'); | |
} | |
s_t = s_t.replace(patr, "<span class=\"h01\">$1</span>"); | |
} | |
if (tipuesearch_in.pages[i].image.search(pat) != -1) | |
{ | |
var m_c = tipuesearch_in.pages[i].image.match(pat).length; | |
score += (10 * m_c); | |
} | |
if (tipuesearch_in.pages[i].url.search(pat) != -1) | |
{ | |
score += 20; | |
} | |
if (score != 0) | |
{ | |
for (var e = 0; e < tipuesearch_weight.weight.length; e++) | |
{ | |
if (tipuesearch_in.pages[i].url == tipuesearch_weight.weight[e].url) | |
{ | |
score += tipuesearch_weight.weight[e].score; | |
} | |
} | |
} | |
if (score != 0) | |
{ | |
found.push( | |
{ | |
"score": score, | |
"title": tipuesearch_in.pages[i].title, | |
"desc": s_t, | |
"url": tipuesearch_in.pages[i].url | |
}); | |
c++; | |
} | |
} | |
} | |
if (c != 0) | |
{ | |
if (set.showTitleCount && tipuesearch_t_c == 0) | |
{ | |
var title = document.title; | |
document.title = '(' + c + ') ' + title; | |
tipuesearch_t_c++; | |
} | |
if (show_replace == 1) | |
{ | |
out += '<div id="tipue_search_warning">' + tipuesearch_string_2 + ' ' + d + '. ' + tipuesearch_string_3 + ' <a id="tipue_search_replaced">' + d_r + '</a></div>'; | |
} | |
if (c == 1) | |
{ | |
out += '<div id="tipue_search_results_count">' + tipuesearch_string_4 + '</div>'; | |
} | |
else | |
{ | |
c_c = c.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); | |
out += '<div id="tipue_search_results_count">' + c_c + ' ' + tipuesearch_string_5 + '</div>'; | |
} | |
found.sort(function(a, b) { return b.score - a.score } ); | |
var l_o = 0; | |
for (var i = 0; i < found.length; i++) | |
{ | |
if (l_o >= start && l_o < set.show + start) | |
{ | |
out += '<div class="tipue_search_content_title"><a href="' + found[i].url + '"' + tipue_search_w + '>' + found[i].title + found[i].image'</a></div>'; | |
if (set.debug) | |
{ | |
out += '<div class="tipue_search_content_debug">Score: ' + found[i].score + '</div>'; | |
} | |
if (set.showURL) | |
{ | |
var s_u = found[i].url.toLowerCase(); | |
if(s_u.indexOf('http://') == 0) | |
{ | |
s_u = s_u.slice(7); | |
} | |
out += '<div class="tipue_search_content_url"><a href="' + found[i].url + '"' + tipue_search_w + '>' + s_u + '</a></div>'; | |
} | |
if (found[i].desc) | |
{ | |
var _r= new RegExp( | |
'[.,\/#!$%\^&\*;:{}=`~(),。]+|'+ | |
'[A-Za-z0-9_-]+|'+ // ASCII letters (no accents) | |
'[\u3040-\u309F]+|'+ // Hiragana | |
'[\u30A0-\u30FF]+|'+ // Katakana | |
'[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF]', // Single CJK ideographs | |
'g'); | |
var t = found[i].desc; | |
var t_d = ''; | |
var t_w = t.match(_r); | |
if (t_w.length < set.descriptiveWords) | |
{ | |
t_d = t; | |
} | |
else | |
{ | |
for (var f = 0; f < set.descriptiveWords; f++) | |
{ | |
t_d += t_w[f]; | |
if(!t_w[f].match(/[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF]/)){ | |
t_d+= ' '; | |
} | |
} | |
} | |
t_d = $.trim(t_d); | |
if (t_d.charAt(t_d.length - 1) != '.') | |
{ | |
t_d += ' ...'; | |
} | |
out += '<div class="tipue_search_content_text">' + t_d + '</div>'; | |
} | |
} | |
l_o++; | |
} | |
if (c > set.show) | |
{ | |
var pages = Math.ceil(c / set.show); | |
var page = (start / set.show); | |
out += '<div id="tipue_search_foot"><ul id="tipue_search_foot_boxes">'; | |
if (start > 0) | |
{ | |
out += '<li><a class="tipue_search_foot_box" id="' + (start - set.show) + '_' + replace + '">' + tipuesearch_string_6 + '</a></li>'; | |
} | |
if (page <= 2) | |
{ | |
var p_b = pages; | |
if (pages > 3) | |
{ | |
p_b = 3; | |
} | |
for (var f = 0; f < p_b; f++) | |
{ | |
if (f == page) | |
{ | |
out += '<li class="current">' + (f + 1) + '</li>'; | |
} | |
else | |
{ | |
out += '<li><a class="tipue_search_foot_box" id="' + (f * set.show) + '_' + replace + '">' + (f + 1) + '</a></li>'; | |
} | |
} | |
} | |
else | |
{ | |
var p_b = page + 2; | |
if (p_b > pages) | |
{ | |
p_b = pages; | |
} | |
for (var f = page - 1; f < p_b; f++) | |
{ | |
if (f == page) | |
{ | |
out += '<li class="current">' + (f + 1) + '</li>'; | |
} | |
else | |
{ | |
out += '<li><a class="tipue_search_foot_box" id="' + (f * set.show) + '_' + replace + '">' + (f + 1) + '</a></li>'; | |
} | |
} | |
} | |
if (page + 1 != pages) | |
{ | |
out += '<li><a class="tipue_search_foot_box" id="' + (start + set.show) + '_' + replace + '">' + tipuesearch_string_7 + '</a></li>'; | |
} | |
out += '</ul></div>'; | |
} | |
} | |
else | |
{ | |
out += '<div id="tipue_search_warning">' + tipuesearch_string_8 + '</div>'; | |
} | |
} | |
else | |
{ | |
if (show_stop) | |
{ | |
out += '<div id="tipue_search_warning">' + tipuesearch_string_8 + '. ' + tipuesearch_string_9 + '</div>'; | |
} | |
else | |
{ | |
out += '<div id="tipue_search_warning">' + tipuesearch_string_10 + '</div>'; | |
if (set.minimumLength == 1) | |
{ | |
out += '<div id="tipue_search_warning">' + tipuesearch_string_11 + '</div>'; | |
} | |
else | |
{ | |
out += '<div id="tipue_search_warning">' + tipuesearch_string_12 + ' ' + set.minimumLength + ' ' + tipuesearch_string_13 + '</div>'; | |
} | |
} | |
} | |
$('#tipue_search_content').hide(); | |
$('#tipue_search_content').html(out); | |
$('#tipue_search_content').slideDown(200); | |
$('#tipue_search_replaced').click(function() | |
{ | |
getTipueSearch(0, false); | |
}); | |
$('.tipue_search_foot_box').click(function() | |
{ | |
var id_v = $(this).attr('id'); | |
var id_a = id_v.split('_'); | |
getTipueSearch(parseInt(id_a[0]), id_a[1]); | |
}); | |
} | |
}); | |
}; | |
})(jQuery); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment