12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- # -*- coding: utf-8 -*-
- """
- Neighbor Articles Plugin for Pelican
- ====================================
- This plugin adds ``next_article`` (newer) and ``prev_article`` (older)
- variables to the article's context
- """
- from pelican import signals
- def iter3(seq):
- it = iter(seq)
- nxt = None
- cur = next(it)
- for prv in it:
- yield nxt, cur, prv
- nxt, cur = cur, prv
- yield nxt, cur, None
- def get_translation(article, prefered_language):
- if not article:
- return None
- for translation in article.translations:
- if translation.lang == prefered_language:
- return translation
- return article
- def set_neighbors(articles, next_name, prev_name):
- for nxt, cur, prv in iter3(articles):
- exec("cur.{} = nxt".format(next_name))
- exec("cur.{} = prv".format(prev_name))
- for translation in cur.translations:
- exec(
- "translation.{} = get_translation(nxt, translation.lang)".format(
- next_name))
- exec(
- "translation.{} = get_translation(prv, translation.lang)".format(
- prev_name))
-
- def neighbors(generator):
- set_neighbors(generator.articles, 'next_article', 'prev_article')
-
- for category, articles in generator.categories:
- articles.sort(key=(lambda x: x.date), reverse=(True))
- set_neighbors(
- articles, 'next_article_in_category', 'prev_article_in_category')
-
- for subcategory, articles in generator.subcategories:
- articles.sort(key=(lambda x: x.date), reverse=(True))
- index = subcategory.name.count('/')
- next_name = 'next_article_in_subcategory{}'.format(index)
- prev_name = 'prev_article_in_subcategory{}'.format(index)
- set_neighbors(articles, next_name, prev_name)
- def register():
- signals.article_generator_finalized.connect(neighbors)
|