初始版本
diff --git a/themes/bootstrap-blog/scripts/bs_paginator.js b/themes/bootstrap-blog/scripts/bs_paginator.js
new file mode 100644
index 0000000..472f450
--- /dev/null
+++ b/themes/bootstrap-blog/scripts/bs_paginator.js
@@ -0,0 +1,120 @@
+'use strict';
+
+function bsPaginatorHelper(options){
+ /* jshint validthis: true */
+ options = options || {};
+
+ var current = options.current || this.page.current || 0;
+ var total = options.total || this.page.total || 1;
+ var endSize = options.hasOwnProperty('end_size') ? +options.end_size : 1;
+ var midSize = options.hasOwnProperty('mid_size') ? +options.mid_size : 2;
+ var space = options.hasOwnProperty('space') ? options.space : '…';
+ var base = options.base || this.page.base || this.config.root || '';
+ var format = options.format || this.config.pagination_dir + '/%d/';
+ var prevText = options.prev_text || 'Prev';
+ var nextText = options.next_text || 'Next';
+ var prevNext = options.hasOwnProperty('prev_next') ? options.prev_next : true;
+ var transform = options.transform;
+ var self = this;
+ var result = '';
+ var i;
+
+ if (!current) return '';
+
+ var currentPage = '<li class="active"><span class="page-number">' +
+ (transform ? transform(current) : current) +
+ '</span></li>';
+
+ function link(i){
+ return self.url_for(i === 1 ? base : base + format.replace('%d', i));
+ }
+
+ function pageLink(i){
+ return '<li><a class="page-number" href="' + link(i) + '">' +
+ (transform ? transform(i) : i) +
+ '</a></li>';
+ }
+
+ // Display the link to the previous page
+ if (prevNext){
+ if (current > 1) {
+ result += '<li><a class="page-prev" rel="prev" ' +
+ 'href="' + link(current - 1) + '">' + prevText + '</a></li>';
+ } else {
+ result += '<li class="disabled"><span class="page-prev">' + prevText + '</a></li>';
+ }
+ }
+
+ if (options.show_all){
+ // Display pages on the left side of the current page
+ for (i = 1; i < current; i++){
+ result += pageLink(i);
+ }
+
+ // Display the current page
+ result += currentPage;
+
+ // Display pages on the right side of the current page
+ for (i = current + 1; i <= total; i++){
+ result += pageLink(i);
+ }
+ } else {
+ // It's too complicated. May need refactor.
+ var leftEnd = current <= endSize ? current - 1 : endSize;
+ var rightEnd = total - current <= endSize ? current + 1 : total - endSize + 1;
+ var leftMid = current - midSize <= endSize ? current - midSize + endSize : current - midSize;
+ var rightMid = current + midSize + endSize > total ? current + midSize - endSize : current + midSize;
+ var spaceHtml = '<li class="disabled"><span class="page-space">' + space + '</span></li>';
+
+ // Display pages on the left edge
+ for (i = 1; i <= leftEnd; i++){
+ result += pageLink(i);
+ }
+
+ // Display spaces between edges and middle pages
+ if (space && current - endSize - midSize > 1){
+ result += spaceHtml;
+ }
+
+ // Display left middle pages
+ if (leftMid > leftEnd){
+ for (i = leftMid; i < current; i++){
+ result += pageLink(i);
+ }
+ }
+
+ // Display the current page
+ result += currentPage;
+
+ // Display right middle pages
+ if (rightMid < rightEnd){
+ for (i = current + 1; i <= rightMid; i++){
+ result += pageLink(i);
+ }
+ }
+
+ // Display spaces between edges and middle pages
+ if (space && total - endSize - midSize > current){
+ result += spaceHtml;
+ }
+
+ // Dispaly pages on the right edge
+ for (i = rightEnd; i <= total; i++){
+ result += pageLink(i);
+ }
+ }
+
+ // Display the link to the next page
+ if (prevNext){
+ if (current < total) {
+ result += '<li><a class="page-next" rel="next" ' +
+ 'href="' + link(current + 1) + '">' + nextText + '</a></li>';
+ } else {
+ result += '<li class="disabled"><span class="page-next">' + nextText + '</a></li>';
+ }
+ }
+
+ return '<nav><ul class="pagination">' + result + '</ul></nav>';
+}
+
+hexo.extend.helper.register('bs_paginator', bsPaginatorHelper);
diff --git a/themes/bootstrap-blog/scripts/callout.js b/themes/bootstrap-blog/scripts/callout.js
new file mode 100644
index 0000000..6413b33
--- /dev/null
+++ b/themes/bootstrap-blog/scripts/callout.js
@@ -0,0 +1,17 @@
+/**
+ * Bootstrap callout style
+ *
+ * Syntax:
+ * {% callout [type] %}
+ * Callout content
+ * {% endcallout %}
+ */
+
+hexo.extend.tag.register('callout', function(args, content) {
+ var calloutType = args.length ? args[0] : 'default';
+ var result = '';
+ result += '<div class="bs-callout bs-callout-' + calloutType + '">';
+ result += hexo.render.renderSync({text: content, engine: 'markdown'});
+ result += '</div>';
+ return result;
+}, true);
\ No newline at end of file
diff --git a/themes/bootstrap-blog/scripts/fancybox.js b/themes/bootstrap-blog/scripts/fancybox.js
new file mode 100644
index 0000000..50c154f
--- /dev/null
+++ b/themes/bootstrap-blog/scripts/fancybox.js
@@ -0,0 +1,24 @@
+var rUrl = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/;
+
+/**
+ * Fancybox tag
+ *
+ * Syntax:
+ * {% fancybox /path/to/image [/path/to/thumbnail] [title] %}
+ */
+
+hexo.extend.tag.register('fancybox', function(args){
+ var original = args.shift(),
+ thumbnail = '';
+
+ if (args.length && rUrl.test(args[0])){
+ thumbnail = args.shift();
+ }
+
+ var title = args.join(' ');
+
+ return '<a class="fancybox" href="' + original + '" title="' + title + '">' +
+ '<img src="' + (thumbnail || original) + '" alt="' + title + '">'
+ '</a>' +
+ (title ? '<span class="caption">' + title + '</span>' : '');
+});
\ No newline at end of file