diff --git a/Rules b/Rules
index 742a764..2bc8e54 100644
--- a/Rules
+++ b/Rules
@@ -126,8 +126,9 @@ end
#
# GENERIC ERB PAGES
#
-compile '/tipuesearch_content.js' do
+compile '/*_search.json' do
filter :erb
+ write @item.identifier.to_s
end
compile '/**/*.ics' do
@@ -157,6 +158,7 @@ compile '/assets/stylesheets/**/*.scss' do
end
passthrough '/assets/images/*.{png,svg}'
+passthrough '/assets/**/*.js'
#
#
diff --git a/content/assets/scripts/tipuesearch.js b/content/assets/scripts/tipuesearch.js
new file mode 100644
index 0000000..29539fe
--- /dev/null
+++ b/content/assets/scripts/tipuesearch.js
@@ -0,0 +1,521 @@
+
+/*
+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' : 25,
+ 'highlightTerms' : true,
+ 'highlightEveryTerm' : false,
+ 'mode' : 'static',
+ 'liveDescription' : '*',
+ 'liveContent' : '*',
+ 'contentLocation' : 'tipuesearch/tipuesearch_content.json',
+ 'debug' : false,
+ 'tipue_search_content' : '#tipue_search_content'
+
+ }, 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('
');
+ var t_2 = html.toLowerCase().indexOf('', 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,
+ "tags": 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)
+ {
+ $(set.tipue_search_content).hide();
+ $(set.tipue_search_content).html('');
+ $(set.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, "$1");
+ }
+
+ if (tipuesearch_in.pages[i].tags.search(pat) != -1)
+ {
+ var m_c = tipuesearch_in.pages[i].tags.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].tags.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, "$1");
+ }
+
+ if (tipuesearch_in.pages[i].tags.search(pat) != -1)
+ {
+ var m_c = tipuesearch_in.pages[i].tags.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 += '' + tipuesearch_string_2 + ' ' + d + '. ' + tipuesearch_string_3 + '
' + d_r + ' ';
+ }
+ if (c == 1)
+ {
+ out += '' + tipuesearch_string_4 + '
';
+ }
+ else
+ {
+ c_c = c.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+ out += '' + c_c + ' ' + tipuesearch_string_5 + '
';
+ }
+
+ 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 += '';
+
+ if (set.debug)
+ {
+ out += 'Score: ' + found[i].score + '
';
+ }
+
+ if (set.showURL)
+ {
+ var s_u = found[i].url.toLowerCase();
+ if(s_u.indexOf('http://') == 0)
+ {
+ s_u = s_u.slice(7);
+ }
+ out += '';
+ }
+
+ if (found[i].desc)
+ {
+ var t = found[i].desc;
+ var t_d = '';
+ var t_w = t.split(' ');
+ if (t_w.length < set.descriptiveWords)
+ {
+ t_d = t;
+ }
+ else
+ {
+ for (var f = 0; f < set.descriptiveWords; f++)
+ {
+ t_d += t_w[f] + ' ';
+ }
+ }
+ t_d = $.trim(t_d);
+ if (t_d.charAt(t_d.length - 1) != '.')
+ {
+ t_d += ' ...';
+ }
+ out += '' + t_d + '
';
+ }
+ }
+ l_o++;
+ }
+
+ if (c > set.show)
+ {
+ var pages = Math.ceil(c / set.show);
+ var page = (start / set.show);
+ out += '';
+ }
+ }
+ else
+ {
+ out += '' + tipuesearch_string_8 + '
';
+ }
+ }
+ else
+ {
+ if (show_stop)
+ {
+ out += '' + tipuesearch_string_8 + '. ' + tipuesearch_string_9 + '
';
+ }
+ else
+ {
+ out += '' + tipuesearch_string_10 + '
';
+ if (set.minimumLength == 1)
+ {
+ out += '' + tipuesearch_string_11 + '
';
+ }
+ else
+ {
+ out += '' + tipuesearch_string_12 + ' ' + set.minimumLength + ' ' + tipuesearch_string_13 + '
';
+ }
+ }
+ }
+
+ $(set.tipue_search_content).hide();
+ $(set.tipue_search_content).html(out);
+ $(set.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);
diff --git a/content/blog_search.json b/content/blog_search.json
new file mode 100644
index 0000000..11e4f33
--- /dev/null
+++ b/content/blog_search.json
@@ -0,0 +1,14 @@
+{ "pages": [
+ <% articles.each_with_index do |e, i| %>
+ {
+ "title": "<%= e[:title] %>",
+ "url": "<%= url_for(e) %>",
+ "text": "<%= excerptize(e.reps[:text].compiled_content, length: 200).gsub(/\n/, ' ') %>",
+ "tags": ""
+ <% if i < articles.size - 1 %>
+ },
+ <% else %>
+ }
+ <% end %>
+ <% end %>
+]}
diff --git a/content/event_search.json b/content/event_search.json
new file mode 100644
index 0000000..c88e806
--- /dev/null
+++ b/content/event_search.json
@@ -0,0 +1,14 @@
+{ "pages": [
+ <% all_events.each_with_index do |e, i| %>
+ {
+ "title": "<%= e[:title] %>",
+ "url": "<%= url_for(e) %>",
+ "text": "<%= excerptize(e.reps[:text].compiled_content, length: 200).gsub(/\n/, ' ') %>",
+ "tags": ""
+ <% if i < articles.size %>
+ },
+ <% else %>
+ }
+ <% end %>
+ <% end %>
+]}
diff --git a/content/search.erb b/content/search.erb
index ce4c1fa..33d1e70 100644
--- a/content/search.erb
+++ b/content/search.erb
@@ -1,15 +1,34 @@
---
-navigable: false
title: Search
---
-
-
+
diff --git a/content/tipuesearch_content.js b/content/tipuesearch_content.js
deleted file mode 100644
index 603a248..0000000
--- a/content/tipuesearch_content.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var tipuesearch = { "pages": [
- <% articles.each do |e| %>
- {
- "title": "<%= e[:title] %>",
- "url": "<%= url_for(e) %>",
- "text": '<%= excerptize(e.reps[:text].compiled_content, length: 200).gsub(/\n/, ' ') %>',
- "tags": ""
- },
- <% end %>
-]}
diff --git a/layouts/default.erb b/layouts/default.erb
index 5cb0b63..0e48926 100644
--- a/layouts/default.erb
+++ b/layouts/default.erb
@@ -28,10 +28,9 @@
-
-
+ <%= asset :js, :tipuesearch %>
diff --git a/layouts/partials/_navbar.erb b/layouts/partials/_navbar.erb
index 358ae2c..856abfc 100644
--- a/layouts/partials/_navbar.erb
+++ b/layouts/partials/_navbar.erb
@@ -17,6 +17,10 @@
<% end %>
+
+
diff --git a/nanoc.yaml b/nanoc.yaml
index b39b2a3..fc0fbec 100644
--- a/nanoc.yaml
+++ b/nanoc.yaml
@@ -13,7 +13,7 @@ string_pattern_type: glob
# A list of file extensions that Nanoc will consider to be textual rather than
# binary. If an item with an extension not in this list is found, the file
# will be considered as binary.
-text_extensions: [ 'adoc', 'asciidoc', 'atom', 'coffee', 'css', 'erb', 'haml', 'handlebars', 'hb', 'htm', 'html', 'ics', 'js', 'less', 'markdown', 'md', 'ms', 'mustache', 'php', 'rb', 'rdoc', 'sass', 'scss', 'slim', 'txt', 'xhtml', 'xml' ]
+text_extensions: [ 'adoc', 'asciidoc', 'atom', 'coffee', 'css', 'erb', 'haml', 'handlebars', 'hb', 'htm', 'html', 'ics', 'js', 'json', 'less', 'markdown', 'md', 'ms', 'mustache', 'php', 'rb', 'rdoc', 'sass', 'scss', 'slim', 'txt', 'xhtml', 'xml' ]
# The path to the directory where all generated files will be written to. This
# can be an absolute path starting with a slash, but it can also be path