diff options
Diffstat (limited to 'plugins/neighbors/neighbors.py')
-rw-r--r-- | plugins/neighbors/neighbors.py | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/plugins/neighbors/neighbors.py b/plugins/neighbors/neighbors.py new file mode 100644 index 0000000..b3c6e99 --- /dev/null +++ b/plugins/neighbors/neighbors.py @@ -0,0 +1,59 @@ +# -*- 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') + + if hasattr(generator, 'subcategories'): + 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) |