diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/related_posts/related_posts.py | 92 | 
1 files changed, 56 insertions, 36 deletions
diff --git a/plugins/related_posts/related_posts.py b/plugins/related_posts/related_posts.py index 4000e03..dff03c5 100644 --- a/plugins/related_posts/related_posts.py +++ b/plugins/related_posts/related_posts.py @@ -1,36 +1,56 @@ -"""
 -Related posts plugin for Pelican
 -================================
 -
 -Adds related_posts variable to article's context
 -"""
 -
 -from pelican import signals
 -from collections import Counter
 -
 -
 -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)
 -
 -    for article in generator.articles:
 -        # no tag, no relation
 -        if not hasattr(article, 'tags'):
 -            continue
 -
 -        # score = number of common tags
 -        scores = Counter()
 -        for tag in article.tags:
 -            scores += Counter(generator.tags[tag])
 -
 -        # remove itself
 -        scores.pop(article)
 -
 -        article.related_posts = [other for other, count 
 -            in scores.most_common(numentries)]
 -
 -
 -def register():
 -    signals.article_generator_finalized.connect(add_related_posts)
 -
 +""" +Related posts plugin for Pelican +================================ + +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'): +            # split slugs  +            related_posts = article.related_posts.split(',') +            posts = []  +            # 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 +                    if a.slug == slug: +                        posts.append(a) +                        i += 1 + +            article.related_posts = posts +        else: +            # no tag, no relation +            if not hasattr(article, 'tags'): +                continue + +            # score = number of common tags +            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, None) + +            article.related_posts = [other for other, count  +                in scores.most_common(numentries)] + +def register(): +    signals.article_generator_finalized.connect(add_related_posts)
\ No newline at end of file  | 
