1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- """
- 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:
- # 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
- 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
- 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)
|