multi_part.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. # -*- coding: utf-8 -*-
  2. """
  3. Copyright (c) FELD Boris <lothiraldan@gmail.com>
  4. Multiple part support
  5. =====================
  6. Create a navigation menu for multi-part related_posts
  7. Article metadata:
  8. ------------------
  9. :parts: a unique identifier for multi-part posts, must be the same in each
  10. post part.
  11. Usage
  12. -----
  13. {% if article.metadata.parts_articles %}
  14. <ol>
  15. {% for part_article in article.metadata.parts_articles %}
  16. {% if part_article == article %}
  17. <li>
  18. <a href='{{ SITEURL }}/{{ part_article.url }}'><b>{{ part_article.title }}</b>
  19. </a>
  20. </li>
  21. {% else %}
  22. <li>
  23. <a href='{{ SITEURL }}/{{ part_article.url }}'>{{ part_article.title }}
  24. </a>
  25. </li>
  26. {% endif %}
  27. {% endfor %}
  28. </ol>
  29. {% endif %}
  30. """
  31. from collections import defaultdict
  32. from pelican import signals
  33. def aggregate_multi_part(generator):
  34. multi_part = defaultdict(list)
  35. for article in generator.articles:
  36. if 'parts' in article.metadata:
  37. multi_part[article.metadata['parts']].append(article)
  38. for part_id in multi_part:
  39. parts = multi_part[part_id]
  40. # Sort by date
  41. parts.sort(key=lambda x: x.metadata['date'])
  42. for article in parts:
  43. article.metadata['parts_articles'] = parts
  44. def register():
  45. signals.article_generator_finalized.connect(aggregate_multi_part)