Skip to content

Instantly share code, notes, and snippets.

@mba811
Forked from liberize/static-blog-search.html
Last active August 29, 2015 14:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mba811/bd8312d4e48195204183 to your computer and use it in GitHub Desktop.
Save mba811/bd8312d4e48195204183 to your computer and use it in GitHub Desktop.
Jekyll: Static Blog Search Based On Feed
<form id="search-form">
<input id="query" type="text" placeholder="正则搜索"></input>
<button type="submit"><i class="icon-search"></i></button>
</form>
<script type="text/javascript">
$(document).ready(function() {
var entries = null;
function htmlEscape(s) {
return String(s).replace(/[&<>"'\/]/g, function(s) {
var entityMap = {
"&": "&amp;",
"<": "&lt;",
">": "&gt;",
'"': '&quot;',
"'": '&#39;',
"/": '&#x2F;'
};
return entityMap[s];
});
}
function xmlDateToJavascriptDate(xmlDate) {
var re = /^([0-9]{4,})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(\.[0-9]+)?(Z|([+-])([0-9]{2}):([0-9]{2}))?$/;
var match = xmlDate.match(re);
if (!match)
return null;
var all = match[0];
var year = match[1]; var month = match[2]; var day = match[3];
var hour = match[4]; var minute = match[5]; var second = match[6];
var milli = match[7];
var z_or_offset = match[8]; var offset_sign = match[9];
var offset_hour = match[10]; var offset_minute = match[11];
if (offset_sign) {
var direction = (offset_sign == "+" ? 1 : -1);
hour = parseInt(hour) + parseInt(offset_hour) * direction;
minute = parseInt(minute) + parseInt(offset_minute) * direction;
}
month = parseInt(month) - 1;
var utcDate = Date.UTC(year, month, day, hour, minute, second, (milli || 0));
return new Date(utcDate);
}
function formatDate(date) {
var monthNames = [ "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December" ];
return date.getDate() + ' ' + monthNames[date.getMonth()] + ' ' + date.getFullYear();
}
function findEntries(q) {
var matches = [];
var rq = new RegExp(q, 'im');
var rl = /^http:\/\/liberize\.me\/post\/(.+)\.html$/;
for (var i = 0; i < entries.length; i++) {
var entry = entries[i];
var title = $(entry.getElementsByTagName('title')[0]).text();
var link = $(entry.getElementsByTagName('link')[0]).attr('href');
var title_en = rl.exec(link)[1].replace(/-/g, ' ');
var content = $(entry.getElementsByTagName('content')[0]).text();
if (rq.test(title) || rq.test(title_en) || rq.test(content)) {
var updated = formatDate(xmlDateToJavascriptDate($(entry.getElementsByTagName('updated')[0]).text()));
matches.push({'title': title, 'link': link, 'date': updated, 'content': content});
}
}
var html = '';
for (var i = 0; i < matches.length; i++) {
var match = matches[i];
html += '<article class="nested">';
html += '<header><h2><a href="' + match.link + '">' + htmlEscape(match.title) + '</a></h2></header>';
html += '<section><p>' + htmlEscape(match.content) + '</p></section>';
html += '<footer><p>更新日期:' + match.date + '</p></footer>';
html += '</article>';
}
$('#main-content').html(html);
$('#loader').hide();
$('#main-content').show();
}
$('#search-form').submit(function() {
var query = $('#query').val();
$('#query').blur().attr('disabled', true);
$('#main-content').hide();
$('#loader').show();
if (entries == null) {
$.ajax({url: '/atom.xml?r=' + (Math.random() * 99999999999), dataType: 'xml', success: function(data) {
entries = data.getElementsByTagName('entry');
findEntries(query);
}});
} else {
findEntries(query);
}
$('#query').blur().attr('disabled', false);
return false;
});
});
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment