diff options
Diffstat (limited to 'extra_plugins')
20 files changed, 0 insertions, 1463 deletions
diff --git a/extra_plugins/README.txt b/extra_plugins/README.txt deleted file mode 100644 index 2a04614..0000000 --- a/extra_plugins/README.txt +++ /dev/null @@ -1,62 +0,0 @@ -Extra Plugins -============= - -These are plugins that may not be widely used or that are a bit too radical or -experimental for the general public. - -To enable them for you, create a ``plugins/`` folder in your site, and copy -both the ``.plugin`` file and the matching ``.py`` file or folder. - -Planetoid ---------- - -This plugin converts Nikola into the equivalent of `Planet <http://www.planetplanet.org/>`_ -a feed aggregator. It requires `PeeWee <https://github.com/coleifer/peewee>`_ and -`Feedparser <http://code.google.com/p/feedparser/>`_ to work. - -It has a configuration option: PLANETOID_REFRESH which is the number of minutes -before retrying a feed (defaults to 60). - -You need to create a ``feeds`` file containing the data of which feeds you want to -aggregate. The format is very simple:: - - # Roberto Alsina - http://feeds2.feedburner.com/PostsInLateralOpinionAboutPython - Roberto Alsina - -#. Lines that start with ``#`` are comments and ignored. -#. Lines that start with http are feed URLs. -#. URL lines have to be followed by the "real name" of the feed. - -FIXME: explain the planetoid theme stuff - -After all that is in place, just run ``nikola build`` and you'll get -a planet. - -Local Search ------------- - -If you don't want to depend on google or duckduckgo to implement search for you, -or just want it to wok even if you are offline, enable this plugin and the -search will be performed client side. - -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) - - -Mustache --------- - -This task gives you a ``mustache.html`` file which lets you access your whole -blog without reloading the page, using client-side templates. Makes it much -faster and modern ;-) diff --git a/extra_plugins/command_planetoid.plugin b/extra_plugins/command_planetoid.plugin deleted file mode 100644 index 8636d49..0000000 --- a/extra_plugins/command_planetoid.plugin +++ /dev/null @@ -1,9 +0,0 @@ -[Core] -Name = planetoid -Module = command_planetoid - -[Documentation] -Author = Roberto Alsina -Version = 0.1 -Website = http://nikola.ralsina.com.ar -Description = Maintain a planet-like site diff --git a/extra_plugins/command_planetoid/__init__.py b/extra_plugins/command_planetoid/__init__.py deleted file mode 100644 index 2428f10..0000000 --- a/extra_plugins/command_planetoid/__init__.py +++ /dev/null @@ -1,248 +0,0 @@ -# -*- coding: utf-8 -*- -# 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. - -from __future__ import print_function, unicode_literals -import codecs -import datetime -import hashlib -from optparse import OptionParser -import os - -from doit.tools import timeout -import feedparser -import peewee - -from nikola.plugin_categories import Command, Task -from nikola.utils import config_changed - - -class Feed(peewee.Model): - name = peewee.CharField() - url = peewee.CharField(max_length=200) - last_status = peewee.CharField(null=True) - etag = peewee.CharField(max_length=200) - last_modified = peewee.DateTimeField() - - -class Entry(peewee.Model): - date = peewee.DateTimeField() - feed = peewee.ForeignKeyField(Feed) - content = peewee.TextField(max_length=20000) - link = peewee.CharField(max_length=200) - title = peewee.CharField(max_length=200) - guid = peewee.CharField(max_length=200) - - -class Planetoid(Command, Task): - """Maintain a planet-like thing.""" - name = "planetoid" - - def init_db(self): - # setup database - Feed.create_table(fail_silently=True) - Entry.create_table(fail_silently=True) - - def gen_tasks(self): - self.init_db() - for task in self.task_load_feeds(): - yield task - for task in self.task_update_feeds(): - yield task - for task in self.task_generate_posts(): - yield task - - def run(self, *args): - self.init_db() - parser = OptionParser(usage="nikola %s [options]" % self.name) - (options, args) = parser.parse_args(list(args)) - - def task_load_feeds(self): - "Read the feeds file, add it to the database." - feeds = [] - feed = name = None - for line in codecs.open('feeds', 'r', 'utf-8'): - line = line.strip() - if line.startswith("#"): - continue - elif line.startswith('http'): - feed = line - elif line: - name = line - if feed and name: - feeds.append([feed, name]) - feed = name = None - - def add_feed(name, url): - f = Feed.create( - name=name, - url=url, - etag='foo', - last_modified=datetime.datetime(1970, 1, 1), - ) - f.save() - - def update_feed_url(feed, url): - feed.url = url - feed.save() - - for feed, name in feeds: - f = Feed.select().where(Feed.name == name) - if not list(f): - yield { - 'basename': self.name, - 'name': name.encode('utf8'), - 'actions': ((add_feed, (name, feed)), ), - 'file_dep': ['feeds'], - } - elif list(f)[0].url != feed: - yield { - 'basename': self.name, - 'name': ('updating_' + name).encode('utf8'), - 'actions': ((update_feed_url, (list(f)[0], feed)), ), - } - - def task_update_feeds(self): - """Download feed contents, add entries to the database.""" - def update_feed(feed): - modified = feed.last_modified.timetuple() - etag = feed.etag - try: - parsed = feedparser.parse( - feed.url, - etag=etag, - modified=modified - ) - feed.last_status = str(parsed.status) - except: # Probably a timeout - # TODO: log failure - return - if parsed.feed.get('title'): - print(parsed.feed.title) - else: - print(feed.url) - feed.etag = parsed.get('etag', 'foo') - modified = tuple(parsed.get('date_parsed', (1970, 1, 1)))[:6] - print("==========>", modified) - modified = datetime.datetime(*modified) - feed.last_modified = modified - feed.save() - # No point in adding items from missinfg feeds - if parsed.status > 400: - # TODO log failure - return - for entry_data in parsed.entries: - print("=========================================") - date = entry_data.get('published_parsed', None) - if date is None: - date = entry_data.get('updated_parsed', None) - if date is None: - print("Can't parse date from:") - print(entry_data) - return False - print("DATE:===>", date) - date = datetime.datetime(*(date[:6])) - title = "%s: %s" % (feed.name, entry_data.get('title', 'Sin título')) - content = entry_data.get('content', None) - if content: - content = content[0].value - if not content: - content = entry_data.get('description', None) - if not content: - content = entry_data.get('summary', 'Sin contenido') - guid = str(entry_data.get('guid', entry_data.link)) - link = entry_data.link - print(repr([date, title])) - e = list(Entry.select().where(Entry.guid == guid)) - print( - repr(dict( - date=date, - title=title, - content=content, - guid=guid, - feed=feed, - link=link, - )) - ) - if not e: - entry = Entry.create( - date=date, - title=title, - content=content, - guid=guid, - feed=feed, - link=link, - ) - else: - entry = e[0] - entry.date = date - entry.title = title - entry.content = content - entry.link = link - entry.save() - for feed in Feed.select(): - task = { - 'basename': self.name, - 'name': str(feed.url), - 'actions': [(update_feed, (feed, ))], - 'uptodate': [timeout(datetime.timedelta(minutes= - self.site.config.get('PLANETOID_REFRESH', 60)))], - } - yield task - - def task_generate_posts(self): - """Generate post files for the blog entries.""" - def gen_id(entry): - h = hashlib.md5() - h.update(entry.feed.name.encode('utf8')) - h.update(entry.guid) - return h.hexdigest() - - def generate_post(entry): - unique_id = gen_id(entry) - meta_path = os.path.join('posts', unique_id + '.meta') - post_path = os.path.join('posts', unique_id + '.txt') - with codecs.open(meta_path, 'wb+', 'utf8') as fd: - fd.write('%s\n' % entry.title.replace('\n', ' ')) - fd.write('%s\n' % unique_id) - fd.write('%s\n' % entry.date.strftime('%Y/%m/%d %H:%M')) - fd.write('\n') - fd.write('%s\n' % entry.link) - with codecs.open(post_path, 'wb+', 'utf8') as fd: - fd.write('.. raw:: html\n\n') - content = entry.content - if not content: - content = 'Sin contenido' - for line in content.splitlines(): - fd.write(' %s\n' % line) - - for entry in Entry.select().order_by(Entry.date.desc()): - entry_id = gen_id(entry) - yield { - 'basename': self.name, - 'targets': [os.path.join('posts', entry_id + '.meta'), os.path.join('posts', entry_id + '.txt')], - 'name': entry_id, - 'actions': [(generate_post, (entry,))], - 'uptodate': [config_changed({1: entry})] - } diff --git a/extra_plugins/command_planetoid/index.tmpl b/extra_plugins/command_planetoid/index.tmpl deleted file mode 100644 index da9ff5d..0000000 --- a/extra_plugins/command_planetoid/index.tmpl +++ /dev/null @@ -1,26 +0,0 @@ -## -*- coding: utf-8 -*- -<%inherit file="base.tmpl"/> -<%block name="content"> - % for post in posts: - <div style="border: 2px solid darkgrey; margin-bottom: 12px; border-radius: 4px; padding:12px; overflow: auto;"> - <a href="${post.link}"><h1>${post.title(lang)}</a> - <small> - Publicado: ${post.date} - </small></h1> - ${post.text(lang)} - </div> - % endfor - <div> -<ul class="pager"> - %if prevlink: - <li class="previous"> - <a href="${prevlink}">← Posts posteriores</a> - </li> - %endif - %if nextlink: - <li class="next"> - <a href="${nextlink}">Posts anteriores →</a> - </li> - %endif -</ul> -</%block> diff --git a/extra_plugins/command_planetoid/post.tmpl b/extra_plugins/command_planetoid/post.tmpl deleted file mode 100644 index 2c4c220..0000000 --- a/extra_plugins/command_planetoid/post.tmpl +++ /dev/null @@ -1,10 +0,0 @@ -## -*- coding: utf-8 -*- -<html> -<body> -<script type="text/javascript"> -<!-- -window.location = "${post.link}" -//--> -</script> -Redirecting you to <a href="${post.link}">the original location.</a> -</body>
\ No newline at end of file diff --git a/extra_plugins/compile_ipynb.plugin b/extra_plugins/compile_ipynb.plugin deleted file mode 100644 index 51051e0..0000000 --- a/extra_plugins/compile_ipynb.plugin +++ /dev/null @@ -1,10 +0,0 @@ -[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 deleted file mode 100644 index 2cfd45e..0000000 --- a/extra_plugins/compile_ipynb/README.txt +++ /dev/null @@ -1,35 +0,0 @@ -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 deleted file mode 100644 index be83a84..0000000 --- a/extra_plugins/compile_ipynb/__init__.py +++ /dev/null @@ -1,98 +0,0 @@ -# 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 deleted file mode 100644 index 33eb78b..0000000 --- a/extra_plugins/task_localsearch.plugin +++ /dev/null @@ -1,10 +0,0 @@ -[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 deleted file mode 100644 index f131068..0000000 --- a/extra_plugins/task_localsearch/MIT-LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -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/__init__.py b/extra_plugins/task_localsearch/__init__.py deleted file mode 100644 index 9bb0a9e..0000000 --- a/extra_plugins/task_localsearch/__init__.py +++ /dev/null @@ -1,94 +0,0 @@ -# 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 differdeleted file mode 100644 index 9c97738..0000000 --- a/extra_plugins/task_localsearch/files/assets/css/loader.gif +++ /dev/null diff --git a/extra_plugins/task_localsearch/files/assets/css/search.gif b/extra_plugins/task_localsearch/files/assets/css/search.gif Binary files differdeleted file mode 100644 index 644bd17..0000000 --- a/extra_plugins/task_localsearch/files/assets/css/search.gif +++ /dev/null diff --git a/extra_plugins/task_localsearch/files/assets/css/tipuesearch.css b/extra_plugins/task_localsearch/files/assets/css/tipuesearch.css deleted file mode 100755 index 144c97d..0000000 --- a/extra_plugins/task_localsearch/files/assets/css/tipuesearch.css +++ /dev/null @@ -1,182 +0,0 @@ - -/* -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 deleted file mode 100644 index 9a8d58e..0000000 --- a/extra_plugins/task_localsearch/files/assets/js/tipuesearch.js +++ /dev/null @@ -1,367 +0,0 @@ - -/* -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 deleted file mode 100644 index 8989c3c..0000000 --- a/extra_plugins/task_localsearch/files/assets/js/tipuesearch_set.js +++ /dev/null @@ -1,28 +0,0 @@ - -/* -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 deleted file mode 100644 index 6103936..0000000 --- a/extra_plugins/task_mustache.plugin +++ /dev/null @@ -1,10 +0,0 @@ -[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 deleted file mode 100644 index 8b5ec13..0000000 --- a/extra_plugins/task_mustache/__init__.py +++ /dev/null @@ -1,189 +0,0 @@ -# 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(): - # FIXME: not py3 ready - if isinstance(v, (str, unicode)): # NOQA - 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 deleted file mode 100644 index 7f2b34c..0000000 --- a/extra_plugins/task_mustache/mustache-template.html +++ /dev/null @@ -1,29 +0,0 @@ -<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 deleted file mode 100644 index 5dbebef..0000000 --- a/extra_plugins/task_mustache/mustache.html +++ /dev/null @@ -1,36 +0,0 @@ -<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> |
