aboutsummaryrefslogtreecommitdiffstats
path: root/extra_plugins
diff options
context:
space:
mode:
authorLibravatarAgustin Henze <tin@sluc.org.ar>2013-02-13 18:35:39 -0300
committerLibravatarAgustin Henze <tin@sluc.org.ar>2013-02-13 18:35:39 -0300
commita40930043121a4b60de8526d58417761a54ab718 (patch)
tree383c5cf8e320761ee942619282fe51be625179a7 /extra_plugins
parent9c5708cc92af894e414bc76ee35ec2230de5d288 (diff)
Imported Upstream version 5.2upstream/5.2
Diffstat (limited to 'extra_plugins')
-rw-r--r--extra_plugins/compile_ipynb.plugin10
-rw-r--r--extra_plugins/compile_ipynb/README.txt35
-rw-r--r--extra_plugins/compile_ipynb/__init__.py98
-rw-r--r--extra_plugins/task_localsearch.plugin10
-rw-r--r--extra_plugins/task_localsearch/MIT-LICENSE.txt20
-rw-r--r--extra_plugins/task_localsearch/README.txt12
-rw-r--r--extra_plugins/task_localsearch/__init__.py94
-rw-r--r--extra_plugins/task_localsearch/files/assets/css/loader.gifbin0 -> 4178 bytes
-rw-r--r--extra_plugins/task_localsearch/files/assets/css/search.gifbin0 -> 208 bytes
-rwxr-xr-xextra_plugins/task_localsearch/files/assets/css/tipuesearch.css182
-rw-r--r--extra_plugins/task_localsearch/files/assets/js/tipuesearch.js367
-rw-r--r--extra_plugins/task_localsearch/files/assets/js/tipuesearch_set.js28
-rw-r--r--extra_plugins/task_mustache.plugin10
-rw-r--r--extra_plugins/task_mustache/__init__.py189
-rw-r--r--extra_plugins/task_mustache/mustache-template.html29
-rw-r--r--extra_plugins/task_mustache/mustache.html36
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
new file mode 100644
index 0000000..9c97738
--- /dev/null
+++ b/extra_plugins/task_localsearch/files/assets/css/loader.gif
Binary files differ
diff --git a/extra_plugins/task_localsearch/files/assets/css/search.gif b/extra_plugins/task_localsearch/files/assets/css/search.gif
new file mode 100644
index 0000000..644bd17
--- /dev/null
+++ b/extra_plugins/task_localsearch/files/assets/css/search.gif
Binary files differ
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 + '">&#171; 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 &#187;</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}}&nbsp;</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>