12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import math
- import random
- from collections import defaultdict
- from operator import attrgetter, itemgetter
- def regenerate_context_articles(generator):
- """Helper to regenerate context after modifying articles draft state
- essentially just a copy from pelican.generators.ArticlesGenerator.generate_context
- after process_translations up to signal sending
- This has to be kept in sync untill a better solution is found
- This is for Pelican version 3.3.0
- """
- # Simulate __init__ for fields that need it
- generator.dates = {}
- generator.tags = defaultdict(list)
- generator.categories = defaultdict(list)
- generator.authors = defaultdict(list)
-
- # Simulate ArticlesGenerator.generate_context
- for article in generator.articles:
- # only main articles are listed in categories and tags
- # not translations
- generator.categories[article.category].append(article)
- if hasattr(article, 'tags'):
- for tag in article.tags:
- generator.tags[tag].append(article)
- # ignore blank authors as well as undefined
- if hasattr(article, 'author') and article.author.name != '':
- generator.authors[article.author].append(article)
- # sort the articles by date
- generator.articles.sort(key=attrgetter('date'), reverse=True)
- generator.dates = list(generator.articles)
- generator.dates.sort(key=attrgetter('date'),
- reverse=generator.context['NEWEST_FIRST_ARCHIVES'])
- # create tag cloud
- tag_cloud = defaultdict(int)
- for article in generator.articles:
- for tag in getattr(article, 'tags', []):
- tag_cloud[tag] += 1
- tag_cloud = sorted(tag_cloud.items(), key=itemgetter(1), reverse=True)
- tag_cloud = tag_cloud[:generator.settings.get('TAG_CLOUD_MAX_ITEMS')]
- tags = list(map(itemgetter(1), tag_cloud))
- if tags:
- max_count = max(tags)
- steps = generator.settings.get('TAG_CLOUD_STEPS')
- # calculate word sizes
- generator.tag_cloud = [
- (
- tag,
- int(math.floor(steps - (steps - 1) * math.log(count)
- / (math.log(max_count)or 1)))
- )
- for tag, count in tag_cloud
- ]
- # put words in chaos
- random.shuffle(generator.tag_cloud)
- # and generate the output :)
- # order the categories per name
- generator.categories = list(generator.categories.items())
- generator.categories.sort(
- reverse=generator.settings['REVERSE_CATEGORY_ORDER'])
- generator.authors = list(generator.authors.items())
- generator.authors.sort()
- generator._update_context(('articles', 'dates', 'tags', 'categories',
- 'tag_cloud', 'authors', 'related_posts'))
-
|