summaryrefslogtreecommitdiffstats
path: root/nikola/plugins/task/indexes.py
diff options
context:
space:
mode:
Diffstat (limited to 'nikola/plugins/task/indexes.py')
-rw-r--r--nikola/plugins/task/indexes.py167
1 files changed, 167 insertions, 0 deletions
diff --git a/nikola/plugins/task/indexes.py b/nikola/plugins/task/indexes.py
new file mode 100644
index 0000000..0d20422
--- /dev/null
+++ b/nikola/plugins/task/indexes.py
@@ -0,0 +1,167 @@
+# -*- coding: utf-8 -*-
+
+# Copyright © 2012-2013 Roberto Alsina and others.
+
+# 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 unicode_literals
+import glob
+import itertools
+import os
+
+from nikola.plugin_categories import Task
+from nikola.utils import config_changed
+
+
+class Indexes(Task):
+ """Render the blog indexes."""
+
+ name = "render_indexes"
+
+ def set_site(self, site):
+ site.register_path_handler('index', self.index_path)
+ return super(Indexes, self).set_site(site)
+
+ def gen_tasks(self):
+ self.site.scan_posts()
+ yield self.group_task()
+
+ 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'],
+ "hide_untranslated_posts": self.site.config['HIDE_UNTRANSLATED_POSTS'],
+ "indexes_title": self.site.config['INDEXES_TITLE'],
+ "indexes_pages": self.site.config['INDEXES_PAGES'],
+ "blog_title": self.site.config["BLOG_TITLE"],
+ }
+
+ template_name = "index.tmpl"
+ posts = [x for x in self.site.timeline if x.use_in_feeds]
+ for lang in kw["translations"]:
+ # Split in smaller lists
+ lists = []
+ if kw["hide_untranslated_posts"]:
+ filtered_posts = [x for x in posts if x.is_translation_available(lang)]
+ else:
+ filtered_posts = posts
+ lists.append(filtered_posts[:kw["index_display_post_count"]])
+ filtered_posts = filtered_posts[kw["index_display_post_count"]:]
+ while filtered_posts:
+ lists.append(filtered_posts[-kw["index_display_post_count"]:])
+ filtered_posts = filtered_posts[:-kw["index_display_post_count"]]
+ num_pages = len(lists)
+ for i, post_list in enumerate(lists):
+ context = {}
+ indexes_title = kw['indexes_title'] or kw['blog_title']
+ if kw["indexes_pages"]:
+ indexes_pages = kw["indexes_pages"] % i
+ else:
+ indexes_pages = " (" + \
+ kw["messages"][lang]["old posts page %d"] % i + ")"
+ if i > 0:
+ context["title"] = indexes_title + indexes_pages
+ else:
+ context["title"] = indexes_title
+ context["prevlink"] = None
+ context["nextlink"] = None
+ context['index_teasers'] = kw['index_teasers']
+ if i == 0: # index.html page
+ context["prevlink"] = None
+ if num_pages > 1:
+ context["nextlink"] = "index-{0}.html".format(num_pages - 1)
+ else:
+ context["nextlink"] = None
+ else: # index-x.html pages
+ if i > 1:
+ context["nextlink"] = "index-{0}.html".format(i - 1)
+ if i < num_pages - 1:
+ context["prevlink"] = "index-{0}.html".format(i + 1)
+ elif i == num_pages - 1:
+ context["prevlink"] = "index.html"
+ context["permalink"] = self.site.link("index", i, lang)
+ output_name = os.path.join(
+ kw['output_folder'], self.site.path("index", i,
+ lang))
+ task = self.site.generic_post_list_renderer(
+ lang,
+ post_list,
+ output_name,
+ template_name,
+ kw['filters'],
+ context,
+ )
+ task_cfg = {1: task['uptodate'][0].config, 2: kw}
+ task['uptodate'] = [config_changed(task_cfg)]
+ task['basename'] = 'render_indexes'
+ yield task
+
+ if not self.site.config["STORY_INDEX"]:
+ return
+ kw = {
+ "translations": self.site.config['TRANSLATIONS'],
+ "post_pages": self.site.config["post_pages"],
+ "output_folder": self.site.config['OUTPUT_FOLDER'],
+ "filters": self.site.config['FILTERS'],
+ }
+ template_name = "list.tmpl"
+ for lang in kw["translations"]:
+ # Need to group by folder to avoid duplicated tasks (Issue #758)
+ for dirname, wildcards in itertools.groupby((w for w, d, x, i in kw["post_pages"] if not i), os.path.dirname):
+ context = {}
+ # vim/pyflakes thinks it's unused
+ # src_dir = os.path.dirname(wildcard)
+ files = []
+ for wildcard in wildcards:
+ files += glob.glob(wildcard)
+ post_list = [self.site.global_data[p] for p in files]
+ output_name = os.path.join(kw["output_folder"],
+ self.site.path("post_path",
+ wildcard,
+ lang)).encode('utf8')
+ context["items"] = [(post.title(lang), post.permalink(lang))
+ for post in post_list]
+ task = self.site.generic_post_list_renderer(lang, post_list,
+ output_name,
+ template_name,
+ kw['filters'],
+ context)
+ task_cfg = {1: task['uptodate'][0].config, 2: kw}
+ task['uptodate'] = [config_changed(task_cfg)]
+ task['basename'] = self.name
+ yield task
+
+ def index_path(self, name, lang):
+ if name not in [None, 0]:
+ return [_f for _f in [self.site.config['TRANSLATIONS'][lang],
+ self.site.config['INDEX_PATH'],
+ 'index-{0}.html'.format(name)] if _f]
+ else:
+ return [_f for _f in [self.site.config['TRANSLATIONS'][lang],
+ self.site.config['INDEX_PATH'],
+ self.site.config['INDEX_FILE']]
+ if _f]