diff --git a/pelicanext/multi_part/README.md b/pelicanext/multi_part/README.md new file mode 100644 index 0000000..ec553eb --- /dev/null +++ b/pelicanext/multi_part/README.md @@ -0,0 +1,30 @@ +Multi parts posts +----------------- + +The multi-part posts plugin allow you to write multi-part posts. + +In order to mark posts as part of a multi-part post, use the `:parts:` metadata: + + :parts: MY_AWESOME_MULTI_PART_POST + +You can then use the `article.related_posts` variable in your templates to display other parts of current post. +For example: + + {% if article.metadata.parts_articles %} +
    +
  1. Post parts
  2. + {% for part_article in article.metadata.parts_articles %} + {% if part_article == article %} +
  3. + {{ part_article.title }} + +
  4. + {% else %} +
  5. + {{ part_article.title }} + +
  6. + {% endif %} + {% endfor %} +
+ {% endif %} diff --git a/pelicanext/multi_part/multi_part.py b/pelicanext/multi_part/multi_part.py new file mode 100644 index 0000000..0581b50 --- /dev/null +++ b/pelicanext/multi_part/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)