diff --git a/pelican/plugins/multi_part.py b/pelican/plugins/multi_part.py new file mode 100644 index 00000000..0581b501 --- /dev/null +++ b/pelican/plugins/multi_part.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +""" +Copyright (c) FELD Boris + +Multiple part support +===================== + +Create a navigation menu for multi-part related_posts + +Article metadata: +------------------ + +:parts: a unique identifier for multi-part posts, must be the same in each +post part. + +Usage +----- + {% if article.metadata.parts_articles %} +
    + {% for part_article in article.metadata.parts_articles %} + {% if part_article == article %} +
  1. + {{ part_article.title }} + +
  2. + {% else %} +
  3. + {{ part_article.title }} + +
  4. + {% endif %} + {% endfor %} +
+ {% endif %} +""" +from collections import defaultdict + +from pelican import signals + + +def aggregate_multi_part(generator): + multi_part = defaultdict(list) + + for article in generator.articles: + if 'parts' in article.metadata: + multi_part[article.metadata['parts']].append(article) + + for part_id in multi_part: + parts = multi_part[part_id] + + # Sort by date + parts.sort(key=lambda x: x.metadata['date']) + + for article in parts: + article.metadata['parts_articles'] = parts + + +def register(): + signals.article_generator_finalized.connect(aggregate_multi_part)