mirror of
https://github.com/almet/notmyidea.git
synced 2025-04-28 11:32:39 +02:00
71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
"""
|
|
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)
|