Przeglądaj źródła

Add a multi_part plugin

It list all parts of a blog post, helping to create a navigation menu between all the parts
FELD Boris 12 lat temu
rodzic
commit
d5b5b4f545

+ 30 - 0
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 %}
+        <ol class="parts">
+        <li>Post parts</li>
+        {% for part_article in article.metadata.parts_articles %}
+            {% if part_article == article %}
+                <li class="active">
+                    <a href='{{ SITEURL }}/{{ part_article.url }}'>{{ part_article.title }}
+                    </a>
+                </li>
+            {% else %}
+                <li>
+                    <a href='{{ SITEURL }}/{{ part_article.url }}'>{{ part_article.title }}
+                    </a>
+                </li>
+            {% endif %}
+        {% endfor %}
+        </ol>
+    {% endif %}

+ 59 - 0
pelicanext/multi_part/multi_part.py

@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+"""
+Copyright (c) FELD Boris <lothiraldan@gmail.com>
+
+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 %}
+        <ol>
+        {% for part_article in article.metadata.parts_articles %}
+            {% if part_article == article %}
+                <li>
+                    <a href='{{ SITEURL }}/{{ part_article.url }}'><b>{{ part_article.title }}</b>
+                    </a>
+                </li>
+            {% else %}
+                <li>
+                    <a href='{{ SITEURL }}/{{ part_article.url }}'>{{ part_article.title }}
+                    </a>
+                </li>
+            {% endif %}
+        {% endfor %}
+        </ol>
+    {% 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)