custom_article_urls.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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 import contents
  11. from pelican.contents import Content, Category
  12. from functools import partial
  13. from six import text_type
  14. def recursive_name(self):
  15. if type(self) is Category:
  16. return self.name
  17. else:
  18. return '{}/{}'.format(recursive_name(self.parent), self.name)
  19. def custom_url(generator, metadata):
  20. if 'CUSTOM_ARTICLE_URLS' in generator.settings:
  21. custom_urls = generator.settings['CUSTOM_ARTICLE_URLS']
  22. category = text_type(metadata['category'])
  23. pattern_matched = {}
  24. if category in custom_urls:
  25. pattern_matched = custom_urls[category]
  26. if 'subcategories' in metadata: #using subcategory plugin
  27. for subcategory in metadata['subcategories']:
  28. subcategory_name = recursive_name(subcategory)
  29. if subcategory_name in custom_urls:
  30. pattern_matched = custom_urls[subcategory_name]
  31. if pattern_matched:
  32. #only alter url if hasn't been set in the metdata
  33. if ('url', 'save_as') in metadata:
  34. """ if both url and save_as are set in the metadata already
  35. then there is already a custom url set, skip this one
  36. """
  37. pass
  38. else:
  39. temp_article = Content(None, metadata=metadata)
  40. url_format = pattern_matched['URL']
  41. save_as_format = pattern_matched['SAVE_AS']
  42. url = url_format.format(**temp_article.url_format)
  43. save_as = save_as_format.format(**temp_article.url_format)
  44. metadata.update({'url': url, 'save_as': save_as})
  45. def register():
  46. signals.article_generator_context.connect(custom_url)