custom_article_urls.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Author: Alistair Magee
  4. Adds ability to specify custom urls for different categories
  5. (or subcategories if using subcategory plugin) of article
  6. using a dictionary stored in pelican settings file as
  7. {category: {article_url_structure: stirng, article_save_as: string}}
  8. """
  9. from pelican import signals
  10. from pelican.contents import Content, Category
  11. from six import text_type
  12. def recursive_name(self):
  13. if type(self) is Category:
  14. return self.name
  15. else:
  16. return '{}/{}'.format(recursive_name(self.parent), self.name)
  17. def custom_url(generator, metadata):
  18. if 'CUSTOM_ARTICLE_URLS' in generator.settings:
  19. custom_urls = generator.settings['CUSTOM_ARTICLE_URLS']
  20. category = text_type(metadata['category'])
  21. pattern_matched = {}
  22. if category in custom_urls:
  23. pattern_matched = custom_urls[category]
  24. if 'subcategories' in metadata: #using subcategory plugin
  25. for subcategory in metadata['subcategories']:
  26. subcategory_name = recursive_name(subcategory)
  27. if subcategory_name in custom_urls:
  28. pattern_matched = custom_urls[subcategory_name]
  29. if pattern_matched:
  30. #only alter url if hasn't been set in the metdata
  31. if ('url', 'save_as') in metadata:
  32. """ if both url and save_as are set in the metadata already
  33. then there is already a custom url set, skip this one
  34. """
  35. pass
  36. else:
  37. temp_article = Content(None, metadata=metadata)
  38. url_format = pattern_matched['URL']
  39. save_as_format = pattern_matched['SAVE_AS']
  40. url = url_format.format(**temp_article.url_format)
  41. save_as = save_as_format.format(**temp_article.url_format)
  42. metadata.update({'url': url, 'save_as': save_as})
  43. def register():
  44. signals.article_generator_context.connect(custom_url)