diff options
| author | 2013-02-13 18:35:39 -0300 | |
|---|---|---|
| committer | 2013-02-13 18:35:39 -0300 | |
| commit | a40930043121a4b60de8526d58417761a54ab718 (patch) | |
| tree | 383c5cf8e320761ee942619282fe51be625179a7 /extra_plugins | |
| parent | 9c5708cc92af894e414bc76ee35ec2230de5d288 (diff) | |
Imported Upstream version 5.2upstream/5.2
Diffstat (limited to 'extra_plugins')
| -rw-r--r-- | extra_plugins/compile_ipynb.plugin | 10 | ||||
| -rw-r--r-- | extra_plugins/compile_ipynb/README.txt | 35 | ||||
| -rw-r--r-- | extra_plugins/compile_ipynb/__init__.py | 98 | ||||
| -rw-r--r-- | extra_plugins/task_localsearch.plugin | 10 | ||||
| -rw-r--r-- | extra_plugins/task_localsearch/MIT-LICENSE.txt | 20 | ||||
| -rw-r--r-- | extra_plugins/task_localsearch/README.txt | 12 | ||||
| -rw-r--r-- | extra_plugins/task_localsearch/__init__.py | 94 | ||||
| -rw-r--r-- | extra_plugins/task_localsearch/files/assets/css/loader.gif | bin | 0 -> 4178 bytes | |||
| -rw-r--r-- | extra_plugins/task_localsearch/files/assets/css/search.gif | bin | 0 -> 208 bytes | |||
| -rwxr-xr-x | extra_plugins/task_localsearch/files/assets/css/tipuesearch.css | 182 | ||||
| -rw-r--r-- | extra_plugins/task_localsearch/files/assets/js/tipuesearch.js | 367 | ||||
| -rw-r--r-- | extra_plugins/task_localsearch/files/assets/js/tipuesearch_set.js | 28 | ||||
| -rw-r--r-- | extra_plugins/task_mustache.plugin | 10 | ||||
| -rw-r--r-- | extra_plugins/task_mustache/__init__.py | 189 | ||||
| -rw-r--r-- | extra_plugins/task_mustache/mustache-template.html | 29 | ||||
| -rw-r--r-- | extra_plugins/task_mustache/mustache.html | 36 |
16 files changed, 1120 insertions, 0 deletions
diff --git a/extra_plugins/compile_ipynb.plugin b/extra_plugins/compile_ipynb.plugin new file mode 100644 index 0000000..51051e0 --- /dev/null +++ b/extra_plugins/compile_ipynb.plugin @@ -0,0 +1,10 @@ +[Core] +Name = ipynb +Module = compile_ipynb + +[Documentation] +Author = Damián Avila +Version = 0.1 +Website = http://www.oquanta.info +Description = Compile IPython notebooks into HTML + diff --git a/extra_plugins/compile_ipynb/README.txt b/extra_plugins/compile_ipynb/README.txt new file mode 100644 index 0000000..2cfd45e --- /dev/null +++ b/extra_plugins/compile_ipynb/README.txt @@ -0,0 +1,35 @@ +To make this work... + +1- First, you have to put this plugin in your_site/plugins/ folder. + +2- Then, you have to download the custom nbconvert from here: https://github.com/damianavila/compile_ipynb-for-Nikola.git +and put it inside your_site/plugins/compile_ipynb/ folder + +3- Also, you have to use the site-ipython theme (or make a new one containing the ipython css, mathjax.js and the proper template). +You can get it here: https://github.com/damianavila/site-ipython-theme-for-Nikola + +4- Finally, you have to put: + +post_pages = ( + ("posts/*.ipynb", "posts", "post.tmpl", True), + ("stories/*.ipynb", "stories", "story.tmpl", False), +) + +in your conf.py + +Then... to use it: + +$nikola new_page -f ipynb + +**NOTE**: Just IGNORE the "-1" and "-2" options in nikola new_page command, by default this compiler +create one metadata file and the corresponding naive IPython notebook. + +$nikola build + +And deploy the output folder... to see it locally: $nikola serve + +If you have any doubts, just ask: @damianavila + +Cheers. + +Damián diff --git a/extra_plugins/compile_ipynb/__init__.py b/extra_plugins/compile_ipynb/__init__.py new file mode 100644 index 0000000..be83a84 --- /dev/null +++ b/extra_plugins/compile_ipynb/__init__.py @@ -0,0 +1,98 @@ +# Copyright (c) 2013 Damian Avila. + +# Permission is hereby granted, free of charge, to any +# person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice +# shall be included in all copies or substantial portions of +# the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +# OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +"""Implementation of compile_html based on nbconvert.""" + +from __future__ import unicode_literals, print_function +import codecs +import os + +try: + from .nbformat import current as nbformat + from .nbconvert.converters import bloggerhtml as nbconverter + bloggerhtml = True +except ImportError: + bloggerhtml = None + +from nikola.plugin_categories import PageCompiler + + +class CompileIPynb(PageCompiler): + """Compile IPynb into HTML.""" + + name = "ipynb" + + def compile_html(self, source, dest): + if bloggerhtml is None: + raise Exception('To build this site, you also need ' + 'https://github.com/damianavila/com' + 'pile_ipynb-for-Nikola.git.') + try: + os.makedirs(os.path.dirname(dest)) + except: + pass + converter = nbconverter.ConverterBloggerHTML() + with codecs.open(dest, "w+", "utf8") as out_file: + with codecs.open(source, "r", "utf8") as in_file: + data = in_file.read() + converter.nb = nbformat.reads_json(data) + output = converter.convert() + out_file.write(output) + + def create_post(self, path, onefile=False, title="", slug="", date="", + tags=""): + d_name = os.path.dirname(path) + if not os.path.isdir(d_name): + os.makedirs(os.path.dirname(path)) + meta_path = os.path.join(d_name, slug + ".meta") + with codecs.open(meta_path, "wb+", "utf8") as fd: + if onefile: + fd.write('%s\n' % title) + fd.write('%s\n' % slug) + fd.write('%s\n' % date) + fd.write('%s\n' % tags) + print("Your post's metadata is at: ", meta_path) + with codecs.open(path, "wb+", "utf8") as fd: + fd.write("""{ + "metadata": { + "name": "%s" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +}""" % slug) diff --git a/extra_plugins/task_localsearch.plugin b/extra_plugins/task_localsearch.plugin new file mode 100644 index 0000000..33eb78b --- /dev/null +++ b/extra_plugins/task_localsearch.plugin @@ -0,0 +1,10 @@ +[Core] +Name = local_search +Module = task_localsearch + +[Documentation] +Author = Roberto Alsina +Version = 0.1 +Website = http://nikola.ralsina.com.ar +Description = Create data files for local search via Tipue + diff --git a/extra_plugins/task_localsearch/MIT-LICENSE.txt b/extra_plugins/task_localsearch/MIT-LICENSE.txt new file mode 100644 index 0000000..f131068 --- /dev/null +++ b/extra_plugins/task_localsearch/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Tipue Search Copyright (c) 2012 Tipue + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/extra_plugins/task_localsearch/README.txt b/extra_plugins/task_localsearch/README.txt new file mode 100644 index 0000000..f6f2d64 --- /dev/null +++ b/extra_plugins/task_localsearch/README.txt @@ -0,0 +1,12 @@ +This plugin implements a Tipue-based local search for your site. + +To use it, copy task_localsearch.plugin and task_localsearch +into a plugins/ folder in your nikola site. + +After you build your site, you will have several new files in assets/css and assets/js +and a search.html that you can use as a basis for using this in your site. + +For more information about how to customize it and use it, please refer to the tipue +docs at http://www.tipue.com/search/ + +Tipue is under an MIT license (see MIT-LICENSE.txt) diff --git a/extra_plugins/task_localsearch/__init__.py b/extra_plugins/task_localsearch/__init__.py new file mode 100644 index 0000000..9bb0a9e --- /dev/null +++ b/extra_plugins/task_localsearch/__init__.py @@ -0,0 +1,94 @@ +# Copyright (c) 2012 Roberto Alsina y otros. + +# Permission is hereby granted, free of charge, to any +# person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice +# shall be included in all copies or substantial portions of +# the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +# OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import json +import os + +from nikola.plugin_categories import LateTask +from nikola.utils import config_changed, copy_tree + +# This is what we need to produce: +#var tipuesearch = {"pages": [ + #{"title": "Tipue Search, a jQuery site search engine", "text": "Tipue + #Search is a site search engine jQuery plugin. It's free for both commercial and + #non-commercial use and released under the MIT License. Tipue Search includes + #features such as word stemming and word replacement.", "tags": "JavaScript", + #"loc": "http://www.tipue.com/search"}, + #{"title": "Tipue Search demo", "text": "Tipue Search demo. Tipue Search is + #a site search engine jQuery plugin.", "tags": "JavaScript", "loc": + #"http://www.tipue.com/search/demo"}, + #{"title": "About Tipue", "text": "Tipue is a small web development/design + #studio based in North London. We've been around for over a decade.", "tags": "", + #"loc": "http://www.tipue.com/about"} +#]}; + + +class Tipue(LateTask): + """Render the blog posts as JSON data.""" + + name = "local_search" + + def gen_tasks(self): + self.site.scan_posts() + + kw = { + "translations": self.site.config['TRANSLATIONS'], + "output_folder": self.site.config['OUTPUT_FOLDER'], + } + + posts = self.site.timeline[:] + dst_path = os.path.join(kw["output_folder"], "assets", "js", + "tipuesearch_content.json") + + def save_data(): + pages = [] + for lang in kw["translations"]: + for post in posts: + data = {} + data["title"] = post.title(lang) + data["text"] = post.text(lang) + data["tags"] = ",".join(post.tags) + data["loc"] = post.permalink(lang) + pages.append(data) + output = json.dumps({"pages": pages}, indent=2) + try: + os.makedirs(os.path.dirname(dst_path)) + except: + pass + with open(dst_path, "wb+") as fd: + fd.write(output) + + yield { + "basename": str(self.name), + "name": os.path.join("assets", "js", "tipuesearch_content.js"), + "targets": [dst_path], + "actions": [(save_data, [])], + 'uptodate': [config_changed(kw)] + } + + # Copy all the assets to the right places + asset_folder = os.path.join(os.path.dirname(__file__), "files") + for task in copy_tree(asset_folder, kw["output_folder"]): + task["basename"] = str(self.name) + yield task diff --git a/extra_plugins/task_localsearch/files/assets/css/loader.gif b/extra_plugins/task_localsearch/files/assets/css/loader.gif Binary files differnew file mode 100644 index 0000000..9c97738 --- /dev/null +++ b/extra_plugins/task_localsearch/files/assets/css/loader.gif diff --git a/extra_plugins/task_localsearch/files/assets/css/search.gif b/extra_plugins/task_localsearch/files/assets/css/search.gif Binary files differnew file mode 100644 index 0000000..644bd17 --- /dev/null +++ b/extra_plugins/task_localsearch/files/assets/css/search.gif diff --git a/extra_plugins/task_localsearch/files/assets/css/tipuesearch.css b/extra_plugins/task_localsearch/files/assets/css/tipuesearch.css new file mode 100755 index 0000000..144c97d --- /dev/null +++ b/extra_plugins/task_localsearch/files/assets/css/tipuesearch.css @@ -0,0 +1,182 @@ + +/* +Tipue Search 2.0 +Copyright (c) 2012 Tipue +Tipue Search is released under the MIT License +http://www.tipue.com/search +*/ + + +em +{ + font: inherit; + font-weight: 400; +} +#tipue_search_input +{ + font: 13px/1.5 'open sans', sans-serif; + color: #333; + padding: 7px; + margin: 0; + width: 160px; + border: 1px solid #d3d3d3; + border-radius: 3px; + -moz-appearance: none; + -webkit-appearance: none; + outline: none; +} +#tipue_search_input:focus +{ + border-color: #c3c3c3; + box-shadow: 0 0 3px rgba(0,0,0,.2); +} +#tipue_search_button +{ + width: 60px; + height: 33px; + margin-top: 1px; + border: 1px solid #dcdcdc; + border-radius: 3px; + background: #f1f1f1 url('search.gif') no-repeat center; + outline: none; +} +#tipue_search_button:hover +{ + border: 1px solid #c3c3c3; + -moz-box-shadow: 1px 1px 2px #e3e3e3; + -webkit-box-shadow: 1px 1px 2px #e3e3e3; + box-shadow: 1px 1px 2px #e3e3e3; +} + +#tipue_search_content +{ + clear: left; + width: 650px; + padding: 25px 0 13px 0; + margin: 0; +} +#tipue_search_loading +{ + padding-top: 60px; + background: #fff url('loader.gif') no-repeat left; +} + +#tipue_search_warning_head +{ + font: 14px/1.5 'open sans', sans-serif; + color: #333; +} +#tipue_search_warning +{ + font: 13px/1.5 'open sans', sans-serif; + color: #333; + font-weight: 300; + margin: 13px 0; +} +#tipue_search_warning a +{ + color: #36c; + text-decoration: none; +} +#tipue_search_warning a:hover +{ + padding-bottom: 1px; + border-bottom: 1px solid #ccc; +} + +#tipue_search_results_count +{ + font: 13px/1.5 'open sans', sans-serif; + color: #333; + font-weight: 300; +} + +#tipue_search_content_title +{ + font: 16px/1.5 'open sans', sans-serif; + color: #333; + margin-top: 27px; +} +#tipue_search_content_title a +{ + color: #36c; + text-decoration: none; +} +#tipue_search_content_title a:hover +{ + padding-bottom: 1px; + border-bottom: 1px solid #ccc; +} +#tipue_search_content_text +{ + font: 13px/1.5 'open sans', sans-serif; + color: #333; + font-weight: 300; + line-height: 21px; + padding: 9px 0; +} +#tipue_search_content_loc +{ + font: 13px/1.5 'open sans', sans-serif; + color: #333; + font-weight: 300; +} +#tipue_search_content_loc a +{ + color: #777; + text-decoration: none; +} +#tipue_search_content_loc a:hover +{ + padding-bottom: 1px; + border-bottom: 1px solid #ccc; +} + +#tipue_search_foot +{ + margin: 43px 0 31px 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: 7px 10px 8px 10px; + background-color: #f5f5f5; + background: -webkit-linear-gradient(top, #f7f7f7, #f1f1f1); + background: -moz-linear-gradient(top, #f7f7f7, #f1f1f1); + background: -ms-linear-gradient(top, #f7f7f7, #f1f1f1); + background: -o-linear-gradient(top, #f7f7f7, #f1f1f1); + background: linear-gradient(top, #f7f7f7, #f1f1f1); + border: 1px solid #dcdcdc; + border-radius: 3px; + color: #333; + margin-right: 7px; + text-decoration: none; + text-align: center; +} +#tipue_search_foot_boxes li.current +{ + padding: 7px 10px 8px 10px; + background: #fff; + border: 1px solid #dcdcdc; + border-radius: 3px; + color: #333; + margin-right: 7px; + text-align: center; +} +#tipue_search_foot_boxes li a:hover +{ + border: 1px solid #c3c3c3; + box-shadow: 1px 1px 2px #e3e3e3; +} diff --git a/extra_plugins/task_localsearch/files/assets/js/tipuesearch.js b/extra_plugins/task_localsearch/files/assets/js/tipuesearch.js new file mode 100644 index 0000000..9a8d58e --- /dev/null +++ b/extra_plugins/task_localsearch/files/assets/js/tipuesearch.js @@ -0,0 +1,367 @@ + +/* +Tipue Search 2.0 +Copyright (c) 2012 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', + '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 = $('*', html).text(); + cont = cont.replace(/\s+/g, ' '); + + var t_1 = html.toLowerCase().indexOf('<title>'); + var t_2 = html.toLowerCase().indexOf('</title>', t_1 + 7); + if (t_1 != -1 && t_2 != -1) + { + var tit = html.slice(t_1 + 7, t_2); + } + else + { + var tit = 'No title'; + } + var t_1 = html.toLowerCase().indexOf('<meta name="description"'); + var t_2 = html.toLowerCase().indexOf('"', t_1 + 34); + if (t_1 != -1 && t_2 != -1) + { + var desc = html.slice(t_1 + 34, t_2); + } + else + { + var desc = cont; + } + + 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); + } + + $('#tipue_search_button').click(function() + { + 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 d = $('#tipue_search_input').val().toLowerCase(); + d = $.trim(d); + var d_w = d.split(' '); + + if (d.length >= set.minimumLength) + { + 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(' '); + + var c = 0; + found = new Array(); + for (var i = 0; i < tipuesearch_in.pages.length; i++) + { + var score = 10000000; + 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 -= (2000 - i); + } + if (tipuesearch_in.pages[i].text.search(pat) != -1) + { + score -= (1500 - 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, "<em>$1</em>"); + } + + if (tipuesearch_in.pages[i].tags.search(pat) != -1) + { + score -= (1000 - i); + } + } + if (score < 10000000) + { + found[c++] = score + '^' + tipuesearch_in.pages[i].title + '^' + s_t + '^' + tipuesearch_in.pages[i].loc; + } + } + + if (c != 0) + { + if (show_replace == 1) + { + out += '<div id="tipue_search_warning_head">Showing results for ' + d + '</div>'; + out += '<div id="tipue_search_warning">Show results for <a href="javascript:void(0)" id="tipue_search_replaced">' + d_r + '</a></div>'; + } + if (c == 1) + { + out += '<div id="tipue_search_results_count">1 result</div>'; + } + else + { + c_c = c.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + out += '<div id="tipue_search_results_count">' + c_c + ' results</div>'; + } + + 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 += '<div id="tipue_search_content_title"><a href="' + fo[3] + '"' + tipue_search_w + '>' + fo[1] + '</a></div>'; + + 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 += '<div id="tipue_search_content_text">' + t_d + '</div>'; + + if (set.showURL) + { + out += '<div id="tipue_search_content_loc"><a href="' + fo[3] + '"' + tipue_search_w + '>' + fo[3] + '</a></div>'; + } + } + l_o++; + } + + if (c > set.show) + { + var pages = Math.ceil(c / set.show); + var page = (start / set.show); + out += '<div id="tipue_search_foot"><ul id="tipue_search_foot_boxes">'; + + if (start > 0) + { + out += '<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="' + (start - set.show) + '_' + replace + '">« Previous</a></li>'; + } + + if (page <= 4) + { + var p_b = pages; + if (pages > 5) + { + p_b = 5; + } + for (var f = 0; f < p_b; f++) + { + if (f == page) + { + out += '<li class="current">' + (f + 1) + '</li>'; + } + else + { + out += '<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="' + (f * set.show) + '_' + replace + '">' + (f + 1) + '</a></li>'; + } + } + } + else + { + var p_b = pages + 4; + if (p_b > pages) + { + p_b = pages; + } + for (var f = page; f < p_b; f++) + { + if (f == page) + { + out += '<li class="current">' + (f + 1) + '</li>'; + } + else + { + out += '<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="' + (f * set.show) + '_' + replace + '">' + (f + 1) + '</a></li>'; + } + } + } + + if (page + 1 != pages) + { + out += '<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="' + (start + set.show) + '_' + replace + '">Next »</a></li>'; + } + + out += '</ul></div>'; + } + } + else + { + out += '<div id="tipue_search_warning_head">Nothing found</div>'; + } + } + else + { + if (show_stop) + { + out += '<div id="tipue_search_warning_head">Nothing found</div><div id="tipue_search_warning">Common words are largely ignored</div>'; + } + else + { + out += '<div id="tipue_search_warning_head">Search too short</div>'; + if (set.minimumLength == 1) + { + out += '<div id="tipue_search_warning">Should be one character or more</div>'; + } + else + { + out += '<div id="tipue_search_warning">Should be ' + set.minimumLength + ' characters or more</div>'; + } + } + } + + $('#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/extra_plugins/task_localsearch/files/assets/js/tipuesearch_set.js b/extra_plugins/task_localsearch/files/assets/js/tipuesearch_set.js new file mode 100644 index 0000000..8989c3c --- /dev/null +++ b/extra_plugins/task_localsearch/files/assets/js/tipuesearch_set.js @@ -0,0 +1,28 @@ + +/* +Tipue Search 2.0 +Copyright (c) 2012 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: "script"}, + {"word": "javascript", stem: "js"} +]}; + +/* +Include the following variable listing the pages on your site if you're using Live mode +*/ + +var tipuesearch_pages = ["http://foo.com/", "http://foo.com/about/", "http://foo.com/blog/", "http://foo.com/tos/"]; + diff --git a/extra_plugins/task_mustache.plugin b/extra_plugins/task_mustache.plugin new file mode 100644 index 0000000..6103936 --- /dev/null +++ b/extra_plugins/task_mustache.plugin @@ -0,0 +1,10 @@ +[Core] +Name = render_mustache +Module = task_mustache + +[Documentation] +Author = Roberto Alsina +Version = 0.1 +Website = http://nikola.ralsina.com.ar +Description = Generates the blog's index pages in json. + diff --git a/extra_plugins/task_mustache/__init__.py b/extra_plugins/task_mustache/__init__.py new file mode 100644 index 0000000..98e52d1 --- /dev/null +++ b/extra_plugins/task_mustache/__init__.py @@ -0,0 +1,189 @@ +# Copyright (c) 2012 Roberto Alsina y otros. + +# Permission is hereby granted, free of charge, to any +# person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice +# shall be included in all copies or substantial portions of +# the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +# OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import json +import os + +from nikola.plugin_categories import Task +from nikola.utils import config_changed, copy_file + + +class Mustache(Task): + """Render the blog posts as JSON data.""" + + name = "render_mustache" + + def gen_tasks(self): + self.site.scan_posts() + + kw = { + "translations": self.site.config['TRANSLATIONS'], + "index_display_post_count": + self.site.config['INDEX_DISPLAY_POST_COUNT'], + "messages": self.site.MESSAGES, + "index_teasers": self.site.config['INDEX_TEASERS'], + "output_folder": self.site.config['OUTPUT_FOLDER'], + "filters": self.site.config['FILTERS'], + "blog_title": self.site.config['BLOG_TITLE'], + "content_footer": self.site.config['CONTENT_FOOTER'], + } + + # TODO: timeline is global, get rid of it + posts = [x for x in self.site.timeline if x.use_in_feeds] + if not posts: + yield { + 'basename': 'render_mustache', + 'actions': [], + } + return + + def write_file(path, post, lang): + + # Prev/Next links + prev_link = False + if post.prev_post: + prev_link = post.prev_post.permalink(lang).replace(".html", + ".json") + next_link = False + if post.next_post: + next_link = post.next_post.permalink(lang).replace(".html", + ".json") + data = {} + + # Configuration + for k, v in self.site.config.items(): + if isinstance(v, (str, unicode)): + data[k] = v + + # Tag data + tags = [] + for tag in post.tags: + tags.append({'name': tag, 'link': self.site.link("tag", tag, + lang)}) + data.update({ + "tags": tags, + "tags?": True if tags else False, + }) + + # Template strings + for k, v in kw["messages"][lang].items(): + data["message_" + k] = v + + # Post data + data.update({ + "title": post.title(lang), + "text": post.text(lang), + "prev": prev_link, + "next": next_link, + "date": + post.date.strftime(self.site.GLOBAL_CONTEXT['date_format']), + }) + + # Disqus comments + data["disqus_html"] = ('<div id="disqus_thread"></div> <script ' + 'type="text/javascript">var disqus_' + 'shortname="%s";var disqus_url="%s";' + '(function(){var a=document.createElement' + '("script");a.type="text/javascript";' + 'a.async=true;a.src="http://"+disqus_' + 'shortname+".disqus.com/embed.js";(' + 'document.getElementsByTagName("head")' + '[0]||document.getElementsByTagName("body")' + '[0]).appendChild(a)})(); </script>' + '<noscript>Please enable JavaScript to view' + ' the <a href="http://disqus.com/' + '?ref_noscript">comments powered by DISQUS.' + '</a></noscript><a href="http://disqus.com"' + 'class="dsq-brlink">comments powered by <sp' + 'an class="logo-disqus">DISQUS</span></a>' % + (self.site.config['DISQUS_FORUM'], + post.permalink(absolute=True))) + + # Post translations + translations = [] + for langname in kw["translations"]: + if langname == lang: + continue + translations.append({'name': + kw["messages"][langname]["Read in" + "English"], + 'link': "javascript:load_data('%s');" + % post.permalink(langname).replace( + ".html", ".json")}) + data["translations"] = translations + + try: + os.makedirs(os.path.dirname(path)) + except: + pass + with open(path, 'wb+') as fd: + fd.write(json.dumps(data)) + + for lang in kw["translations"]: + for i, post in enumerate(posts): + out_path = post.destination_path(lang, ".json") + out_file = os.path.join(kw['output_folder'], out_path) + task = { + 'basename': 'render_mustache', + 'name': str(out_path), + 'file_dep': post.fragment_deps(lang), + 'targets': [out_file], + 'actions': [(write_file, (out_file, post, lang))], + 'task_dep': ['render_posts'], + } + yield task + + if posts: + first_post_data = posts[0].permalink( + self.site.config["DEFAULT_LANG"]).replace(".html", ".json") + + # Copy mustache template + src = os.path.join(os.path.dirname(__file__), 'mustache-template.html') + dst = os.path.join(kw['output_folder'], 'mustache-template.html') + yield { + 'basename': 'render_mustache', + 'name': 'mustache-template.html', + 'targets': [dst], + 'file_dep': [src], + 'actions': [(copy_file, (src, dst))], + } + + # Copy mustache.html with the right starting file in it + src = os.path.join(os.path.dirname(__file__), 'mustache.html') + dst = os.path.join(kw['output_folder'], 'mustache.html') + + def copy_mustache(): + with open(src, 'rb') as in_file: + with open(dst, 'wb+') as out_file: + data = in_file.read().replace('{{first_post_data}}', + first_post_data) + out_file.write(data) + yield { + 'basename': 'render_mustache', + 'name': 'mustache.html', + 'targets': [dst], + 'file_dep': [src], + 'uptodate': [config_changed({1: first_post_data})], + 'actions': [(copy_mustache, [])], + } diff --git a/extra_plugins/task_mustache/mustache-template.html b/extra_plugins/task_mustache/mustache-template.html new file mode 100644 index 0000000..7f2b34c --- /dev/null +++ b/extra_plugins/task_mustache/mustache-template.html @@ -0,0 +1,29 @@ +<script id="view" type="text/html"> +<div class="container" id="container"> + <div class="postbox"> + <h1>{{BLOG_TITLE}}</h1> + <hr> + <h2>{{title}}</h2> + Posted on: {{date}}</br> + {{#tags?}} More posts about: + {{#tags}}<a class="tag" href={{link}}><span class="badge badge-info">{{name}}</span></a>{{/tags}} + </br> + {{/tags?}} + {{#translations}}<a href={{link}}>{{name}}</a>{{/translations}} </br> + <hr> + {{{text}}} + <ul class="pager"> + {{#prev}} + <li class="previous"><a href="javascript:load_data('{{prev}}')">{{message_Previous post}}</a></li> + {{/prev}} + {{#next}} + <li class="next"><a href="javascript:load_data('{{next}}')">{{message_Next post}}</a></li> + {{/next}} + </ul> + {{{disqus_html}}} + </div> + <div class="footerbox"> + {{{CONTENT_FOOTER}}} + </div> +</div> +</script> diff --git a/extra_plugins/task_mustache/mustache.html b/extra_plugins/task_mustache/mustache.html new file mode 100644 index 0000000..5dbebef --- /dev/null +++ b/extra_plugins/task_mustache/mustache.html @@ -0,0 +1,36 @@ +<head> + <link href="/assets/css/bootstrap.css" rel="stylesheet" type="text/css"> + <link href="/assets/css/bootstrap-responsive.css" rel="stylesheet" type="text/css"> + <link href="/assets/css/rst.css" rel="stylesheet" type="text/css"> + <link href="/assets/css/code.css" rel="stylesheet" type="text/css"> + <link href="/assets/css/colorbox.css" rel="stylesheet" type="text/css"/> + <link href="/assets/css/slides.css" rel="stylesheet" type="text/css"/> + <link href="/assets/css/theme.css" rel="stylesheet" type="text/css"/> + <link href="/assets/css/custom.css" rel="stylesheet" type="text/css"> + <script src="/assets/js/jquery-1.7.2.min.js" type="text/javascript"></script> + <script src="https://raw.github.com/jonnyreeves/jquery-Mustache/master/src/jquery.mustache.js"></script> + <script src="https://raw.github.com/janl/mustache.js/master/mustache.js"></script> + <script src="/assets/js/jquery.colorbox-min.js" type="text/javascript"></script> + <script src="/assets/js/slides.min.jquery.js" type="text/javascript"></script> + <script type="text/javascript"> +function load_data(dataurl) { + jQuery.getJSON(dataurl, function(data) { + $('body').mustache('view', data, { method: 'html' }); + window.location.hash = '#' + dataurl; + }) +}; +$(document).ready(function() { +$.Mustache.load('/mustache-template.html') + .done(function () { + if (window.location.hash != '') { + load_data(window.location.hash.slice(1)); + } + else { + load_data('{{first_post_data}}'); + }; + }) +}); +</script> +</head> +<body style="padding-top: 0;"> +</body> |
