|
@@ -7,12 +7,15 @@ Adds related_posts variable to article's context
|
|
|
|
|
|
from pelican import signals
|
|
|
from collections import Counter
|
|
|
+from itertools import chain
|
|
|
|
|
|
|
|
|
def add_related_posts(generator):
|
|
|
# get the max number of entries from settings
|
|
|
# or fall back to default (5)
|
|
|
numentries = generator.settings.get('RELATED_POSTS_MAX', 5)
|
|
|
+ # Skip all posts in the same category as the article
|
|
|
+ skipcategory = generator.settings.get('RELATED_POSTS_SKIP_SAME_CATEGORY', False)
|
|
|
for article in generator.articles:
|
|
|
# set priority in case of forced related posts
|
|
|
if hasattr(article,'related_posts'):
|
|
@@ -22,6 +25,7 @@ def add_related_posts(generator):
|
|
|
# get related articles
|
|
|
for slug in related_posts:
|
|
|
i = 0
|
|
|
+ slug = slug.strip()
|
|
|
for a in generator.articles:
|
|
|
if i >= numentries: # break in case there are max related psots
|
|
|
break
|
|
@@ -36,12 +40,14 @@ def add_related_posts(generator):
|
|
|
continue
|
|
|
|
|
|
# score = number of common tags
|
|
|
- scores = Counter()
|
|
|
- for tag in article.tags:
|
|
|
- scores += Counter(generator.tags[tag])
|
|
|
+ related = chain(*(generator.tags[tag] for tag in article.tags))
|
|
|
+ if skipcategory:
|
|
|
+ related = (other for other in related
|
|
|
+ if other.category != article.category)
|
|
|
+ scores = Counter(related)
|
|
|
|
|
|
# remove itself
|
|
|
- scores.pop(article)
|
|
|
+ scores.pop(article, None)
|
|
|
|
|
|
article.related_posts = [other for other, count
|
|
|
in scores.most_common(numentries)]
|