初始版本
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