manetta
4 years ago
6 changed files with 2 additions and 216 deletions
@ -1,101 +0,0 @@ |
|||||
Neighbor Articles Plugin for Pelican |
|
||||
==================================== |
|
||||
|
|
||||
**NOTE:** `This plugin has been moved to its own repository <https://github.com/pelican-plugins/neighbors>`_. Please file any issues/PRs there. Once all plugins have been migrated to the `new Pelican Plugins organization <https://github.com/pelican-plugins>`_, this monolithic repository will be archived. |
|
||||
|
|
||||
------------------------------------------------------------------------------- |
|
||||
|
|
||||
This plugin adds ``next_article`` (newer) and ``prev_article`` (older) |
|
||||
variables to the article's context. |
|
||||
|
|
||||
Also adds ``next_article_in_category`` and ``prev_article_in_category``. |
|
||||
|
|
||||
|
|
||||
Usage |
|
||||
----- |
|
||||
|
|
||||
.. code-block:: html+jinja |
|
||||
|
|
||||
<ul> |
|
||||
{% if article.prev_article %} |
|
||||
<li> |
|
||||
<a href="{{ SITEURL }}/{{ article.prev_article.url}}"> |
|
||||
{{ article.prev_article.title }} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% endif %} |
|
||||
{% if article.next_article %} |
|
||||
<li> |
|
||||
<a href="{{ SITEURL }}/{{ article.next_article.url}}"> |
|
||||
{{ article.next_article.title }} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% endif %} |
|
||||
</ul> |
|
||||
<ul> |
|
||||
{% if article.prev_article_in_category %} |
|
||||
<li> |
|
||||
<a href="{{ SITEURL }}/{{ article.prev_article_in_category.url}}"> |
|
||||
{{ article.prev_article_in_category.title }} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% endif %} |
|
||||
{% if article.next_article_in_category %} |
|
||||
<li> |
|
||||
<a href="{{ SITEURL }}/{{ article.next_article_in_category.url}}"> |
|
||||
{{ article.next_article_in_category.title }} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% endif %} |
|
||||
</ul> |
|
||||
|
|
||||
Usage with the Subcategory plugin |
|
||||
--------------------------------- |
|
||||
|
|
||||
If you want to get the neigbors within a subcategory it's a little different. |
|
||||
Since an article can belong to more than one subcategory, subcategories are |
|
||||
stored in a list. If you have an article with subcategories like |
|
||||
|
|
||||
``Category/Foo/Bar`` |
|
||||
|
|
||||
it will belong to both subcategory Foo, and Foo/Bar. Subcategory neighbors are |
|
||||
added to an article as ``next_article_in_subcategory#`` and |
|
||||
``prev_article_in_subcategory#`` where ``#`` is the level of subcategory. So using |
|
||||
the example from above, subcategory1 will be Foo, and subcategory2 Foo/Bar. |
|
||||
Therefor the usage with subcategories is: |
|
||||
|
|
||||
.. code-block:: html+jinja |
|
||||
|
|
||||
<ul> |
|
||||
{% if article.prev_article_in_subcategory1 %} |
|
||||
<li> |
|
||||
<a href="{{ SITEURL }}/{{ article.prev_article_in_subcategory1.url}}"> |
|
||||
{{ article.prev_article_in_subcategory1.title }} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% endif %} |
|
||||
{% if article.next_article_in_subcategory1 %} |
|
||||
<li> |
|
||||
<a href="{{ SITEURL }}/{{ article.next_article_in_subcategory1.url}}"> |
|
||||
{{ article.next_article_in_subcategory1.title }} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% endif %} |
|
||||
</ul> |
|
||||
<ul> |
|
||||
{% if article.prev_article_in_subcategory2 %} |
|
||||
<li> |
|
||||
<a href="{{ SITEURL }}/{{ article.prev_article_in_subcategory2.url}}"> |
|
||||
{{ article.prev_article_in_subcategory2.title }} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% endif %} |
|
||||
{% if article.next_article_in_subcategory2 %} |
|
||||
<li> |
|
||||
<a href="{{ SITEURL }}/{{ article.next_article_in_subcategory2.url}}"> |
|
||||
{{ article.next_article_in_subcategory2.title }} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% endif %} |
|
||||
</ul> |
|
||||
|
|
@ -1 +0,0 @@ |
|||||
from .neighbors import * |
|
@ -1,63 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
""" |
|
||||
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') |
|
||||
|
|
||||
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 = 'next_article_in_subcategory{}'.format(index) |
|
||||
prev_name = 'prev_article_in_subcategory{}'.format(index) |
|
||||
set_neighbors(articles, next_name, prev_name) |
|
||||
|
|
||||
|
|
||||
def register(): |
|
||||
signals.article_generator_finalized.connect(neighbors) |
|
@ -1,14 +0,0 @@ |
|||||
Title: Test md File |
|
||||
Category: test |
|
||||
Tags: foo, bar, foobar |
|
||||
Date: 2010-12-02 10:14 |
|
||||
Modified: 2010-12-02 10:20 |
|
||||
Summary: I have a lot to test |
|
||||
|
|
||||
Test Markdown File Header |
|
||||
========================= |
|
||||
|
|
||||
Used for pelican test |
|
||||
--------------------- |
|
||||
|
|
||||
The quick brown fox jumped over the lazy dog's back. |
|
@ -1,35 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
from os.path import dirname, join |
|
||||
from tempfile import TemporaryDirectory |
|
||||
|
|
||||
from pelican.generators import ArticlesGenerator |
|
||||
from pelican.tests.support import get_settings, unittest |
|
||||
|
|
||||
from .neighbors import neighbors |
|
||||
|
|
||||
|
|
||||
CUR_DIR = dirname(__file__) |
|
||||
|
|
||||
|
|
||||
class NeighborsTest(unittest.TestCase): |
|
||||
def test_neighbors_basic(self): |
|
||||
with TemporaryDirectory() as tmpdirname: |
|
||||
generator = _build_article_generator(join(CUR_DIR, '..', 'test_data'), tmpdirname) |
|
||||
neighbors(generator) |
|
||||
def test_neighbors_with_single_article(self): |
|
||||
with TemporaryDirectory() as tmpdirname: |
|
||||
generator = _build_article_generator(join(CUR_DIR, 'test_data'), tmpdirname) |
|
||||
neighbors(generator) |
|
||||
|
|
||||
|
|
||||
def _build_article_generator(content_path, output_path): |
|
||||
settings = get_settings(filenames={}) |
|
||||
settings['PATH'] = content_path |
|
||||
context = settings.copy() |
|
||||
context['generated_content'] = dict() |
|
||||
context['static_links'] = set() |
|
||||
article_generator = ArticlesGenerator( |
|
||||
context=context, settings=settings, |
|
||||
path=settings['PATH'], theme=settings['THEME'], output_path=output_path) |
|
||||
article_generator.generate_context() |
|
||||
return article_generator |
|
Loading…
Reference in new issue