diff --git a/scss/tipuesearch.scss b/scss/tipuesearch.scss new file mode 100755 index 0000000..29e29b1 --- /dev/null +++ b/scss/tipuesearch.scss @@ -0,0 +1,127 @@ +/*! + * Tipue Search 4.0 + * Copyright (c) 2014 Tipue + * Tipue Search is released under the MIT License + * http://www.tipue.com/search + * + * This is a modified version of the Tipue Search plugin style sheet, + * edited for the pelican mg theme. + * If you are looking for the original Tipue Search plugin style sheet + * check the project home at http://www.tipue.com/search. + */ + +$baseText: #444; + +@mixin animation($values) { + -webkit-animation: $values; + -moz-animation: $values; + -o-animation: $values; + animation: $values; +} + +#tipue_search_content { + max-width: 650px; + padding-top: 15px; + margin: 0; +} + +#tipue_search_loading:before { + padding-top: 60px; + font-family: FontAwesome; + content: "\f013"; + background: #fff no-repeat left; + @include animation(fa-spin 2s infinite linear); +} + +#tipue_search_warning_head { + font: 300 15px/1.6 'Open Sans', sans-serif; + color: #555; +} + +#tipue_search_warning { + font: 300 13px/1.6 'Open Sans', sans-serif; + color: #333; + margin: 7px 0; +} + +#tipue_search_warning a { + color: #36c; + font-weight: 300; + text-decoration: none; +} + +#tipue_search_warning a:hover { + color: #333; +} + +.tipue_search_content_title { + font-size: 2em; + line-height: 42px; + font-weight: 400; + text-transform: none; + margin-top: 0.5em; +} + +.tipue_search_content_title a { + color: $baseText; + text-decoration: none; + &:hover { + color: $baseText; + text-decoration: underline; + } +} + +.tipue_search_content_url { + display: none; +} + +.tipue_search_content_text { + margin-top: 3px; +} + +.h01 { + font-weight: bold; +} + +#tipue_search_foot { + margin: 51px 0 21px 0; +} + +#tipue_search_foot_boxes { + padding: 0; + margin: 0; + font: 12px/1 'Open Sans', sans-serif; +} + +#tipue_search_foot_boxes li { + list-style: none; + margin: 0; + padding: 0; + display: inline; +} + +#tipue_search_foot_boxes li a { + padding: 9px 15px 10px 15px; + background-color: #f1f1f1; + border: 1px solid #dcdcdc; + border-radius: 1px; + color: #333; + margin-right: 7px; + text-decoration: none; + text-align: center; +} + +#tipue_search_foot_boxes li.current { + padding: 9px 15px 10px 15px; + background: #fff; + border: 1px solid #dcdcdc; + border-radius: 1px; + color: #333; + margin-right: 7px; + text-align: center; +} + +#tipue_search_foot_boxes li a:hover { + border: 1px solid #ccc; + background-color: #f3f3f3; +} diff --git a/static/css/tipuesearch.css b/static/css/tipuesearch.css new file mode 100644 index 0000000..48b1da6 --- /dev/null +++ b/static/css/tipuesearch.css @@ -0,0 +1,103 @@ +/*! + * Tipue Search 4.0 + * Copyright (c) 2014 Tipue + * Tipue Search is released under the MIT License + * http://www.tipue.com/search + * + * This is a modified version of the Tipue Search plugin style sheet, + * edited for the pelican mg theme. + * If you are looking for the original Tipue Search plugin style sheet + * check the project home at http://www.tipue.com/search. + */ +#tipue_search_content { + max-width: 650px; + padding-top: 15px; + margin: 0; } + +#tipue_search_loading:before { + padding-top: 60px; + font-family: FontAwesome; + content: "\f013"; + background: #fff no-repeat left; + -webkit-animation: fa-spin 2s infinite linear; + -moz-animation: fa-spin 2s infinite linear; + -o-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +#tipue_search_warning_head { + font: 300 15px/1.6 'Open Sans', sans-serif; + color: #555; } + +#tipue_search_warning { + font: 300 13px/1.6 'Open Sans', sans-serif; + color: #333; + margin: 7px 0; } + +#tipue_search_warning a { + color: #36c; + font-weight: 300; + text-decoration: none; } + +#tipue_search_warning a:hover { + color: #333; } + +.tipue_search_content_title { + font-size: 2em; + line-height: 42px; + font-weight: 400; + text-transform: none; + margin-top: 0.5em; } + +.tipue_search_content_title a { + color: #444; + text-decoration: none; } + .tipue_search_content_title a:hover { + color: #444; + text-decoration: underline; } + +.tipue_search_content_url { + display: none; } + +.tipue_search_content_text { + margin-top: 3px; } + +.h01 { + font-weight: bold; } + +#tipue_search_foot { + margin: 51px 0 21px 0; } + +#tipue_search_foot_boxes { + padding: 0; + margin: 0; + font: 12px/1 'Open Sans', sans-serif; } + +#tipue_search_foot_boxes li { + list-style: none; + margin: 0; + padding: 0; + display: inline; } + +#tipue_search_foot_boxes li a { + padding: 9px 15px 10px 15px; + background-color: #f1f1f1; + border: 1px solid #dcdcdc; + border-radius: 1px; + color: #333; + margin-right: 7px; + text-decoration: none; + text-align: center; } + +#tipue_search_foot_boxes li.current { + padding: 9px 15px 10px 15px; + background: #fff; + border: 1px solid #dcdcdc; + border-radius: 1px; + color: #333; + margin-right: 7px; + text-align: center; } + +#tipue_search_foot_boxes li a:hover { + border: 1px solid #ccc; + background-color: #f3f3f3; } + diff --git a/static/js/main.js b/static/js/main.js index a7eb07a..a6690b3 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -3,4 +3,13 @@ $(document).ready(function() { $('.mg-container-social').height($('article').height()); $('#mg-panel-social').stick_in_parent({offset_top: 35}); + + $('#tipue_search_input').tipuesearch({ + 'show': 10, + 'mode': 'json', + 'showURL': false, + 'descriptiveWords': 75, + 'highlightEveryTerm': true, + 'contentLocation': '/tipue_search.json' + }); }); diff --git a/static/js/tipuesearch.js b/static/js/tipuesearch.js new file mode 100644 index 0000000..4ef1dee --- /dev/null +++ b/static/js/tipuesearch.js @@ -0,0 +1,444 @@ + +/* +Tipue Search 4.0 +Copyright (c) 2014 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, + 'minimumLength' : 3, + 'descriptiveWords' : 25, + 'highlightTerms' : true, + 'highlightEveryTerm' : false, + 'mode' : 'static', + 'liveDescription' : '*', + 'liveContent' : '*', + 'contentLocation' : 'tipuesearch/tipuesearch_content.json' + + }, options); + + return this.each(function() { + + var tipuesearch_in = { + pages: [] + }; + $.ajaxSetup({ + async: false + }); + + if (set.mode == 'live') + { + for (var i = 0; i < tipuesearch_pages.length; i++) + { + $.get(tipuesearch_pages[i], '', + 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 = 'No title'; + } + + tipuesearch_in.pages.push({ + "title": tit, + "text": desc, + "tags": cont, + "loc": tipuesearch_pages[i] + }); + } + ); + } + } + + if (set.mode == 'json') + { + $.getJSON(set.contentLocation, + 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(); + var out = ''; + var results = ''; + var show_replace = false; + var show_stop = false; + var standard = true; + var c = 0; + found = new Array(); + + 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 = 1000000000; + var s_t = tipuesearch_in.pages[i].text; + for (var f = 0; f < d_w.length; f++) + { + var pat = new RegExp(d_w[f], 'i'); + if (tipuesearch_in.pages[i].title.search(pat) != -1) + { + score -= (200000 - i); + } + if (tipuesearch_in.pages[i].text.search(pat) != -1) + { + score -= (150000 - i); + } + + 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) + { + score -= (100000 - i); + } + + 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 = 1000000000; + } + } + } + + if (score < 1000000000) + { + found[c++] = score + '^' + tipuesearch_in.pages[i].title + '^' + s_t + '^' + tipuesearch_in.pages[i].loc; + } + } + } + else + { + for (var i = 0; i < tipuesearch_in.pages.length; i++) + { + var score = 1000000000; + var s_t = tipuesearch_in.pages[i].text; + var pat = new RegExp(d, 'i'); + if (tipuesearch_in.pages[i].title.search(pat) != -1) + { + score -= (200000 - i); + } + if (tipuesearch_in.pages[i].text.search(pat) != -1) + { + score -= (150000 - i); + } + + 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) + { + score -= (100000 - i); + } + + if (score < 1000000000) + { + found[c++] = score + '^' + tipuesearch_in.pages[i].title + '^' + s_t + '^' + tipuesearch_in.pages[i].loc; + } + } + } + + if (c != 0) + { + if (show_replace == 1) + { + out += '
Showing results for ' + d + '
'; + out += '
Search instead for ' + d_r + '
'; + } + if (c == 1) + { + out += '
1 result
'; + } + else + { + c_c = c.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + out += '
' + c_c + ' results
'; + } + + found.sort(); + var l_o = 0; + for (var i = 0; i < found.length; i++) + { + var fo = found[i].split('^'); + if (l_o >= start && l_o < set.show + start) + { + out += '
' + fo[1] + '
'; + + if (set.showURL) + { + out += '
' + fo[3] + '
'; + } + + var t = fo[2]; + 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 += '
Nothing found
'; + } + } + else + { + if (show_stop) + { + out += '
Nothing found
Common words are largely ignored
'; + } + else + { + out += '
Search too short
'; + if (set.minimumLength == 1) + { + out += '
Should be one character or more
'; + } + else + { + out += '
Should be ' + set.minimumLength + ' characters or more
'; + } + } + } + + $('#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); + + + + diff --git a/static/js/tipuesearch_set.js b/static/js/tipuesearch_set.js new file mode 100644 index 0000000..0b6234b --- /dev/null +++ b/static/js/tipuesearch_set.js @@ -0,0 +1,21 @@ + +/* +Tipue Search 4.0 +Copyright (c) 2014 Tipue +Tipue Search is released under the MIT License +http://www.tipue.com/search +*/ + + +var tipuesearch_stop_words = ["and", "be", "by", "do", "for", "he", "how", "if", "is", "it", "my", "not", "of", "or", "the", "to", "up", "what", "when"]; + +var tipuesearch_replace = {"words": [ + {"word": "tipua", "replace_with": "tipue"}, + {"word": "javscript", "replace_with": "javascript"} +]}; + +var tipuesearch_stem = {"words": [ + {"word": "e-mail", "stem": "email"}, + {"word": "javascript", "stem": "js"} +]}; + diff --git a/templates/base.html b/templates/base.html index d81c491..d1b1d6e 100644 --- a/templates/base.html +++ b/templates/base.html @@ -34,6 +34,8 @@ + + @@ -74,8 +76,14 @@ {% endblock %}
+ +
+ +
+
-