""" 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): """Generate one triplet per element in 'seq' following PEP-479.""" nxt, cur = None, None for prv in seq: if cur: yield nxt, cur, prv nxt, cur = cur, prv # Don't yield anything if empty seq if cur: # Yield last element in seq (also if len(seq) == 1) 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): setattr(cur, next_name, nxt) setattr(cur, prev_name, prv) for translation in cur.translations: setattr(translation, next_name, get_translation(nxt, translation.lang)) setattr(translation, prev_name, get_translation(prv, translation.lang)) 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") # support for the More Categories plugin for category, articles in generator.categories: articles.sort(key=lambda x: x.date, reverse=True) index = category.name.count("/") next_name = f"next_article_in_subcategory{index}" prev_name = f"prev_article_in_subcategory{index}" set_neighbors(articles, next_name, prev_name) # support for the Subcategory Plugin 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 = f"next_article_in_subcategory{index}" prev_name = f"prev_article_in_subcategory{index}" set_neighbors(articles, next_name, prev_name) def register(): signals.article_generator_finalized.connect(neighbors)