# -*- coding: utf-8 -*- """ @Author: Alistair Magee Adds ability to specify custom urls for different categories (or subcategories if using subcategory plugin) of article using a dictionary stored in pelican settings file as {category: {article_url_structure: stirng, article_save_as: string}} """ from pelican import signals from pelican.contents import Article, Category from six import text_type def custom_url(generator, metadata): if 'CUSTOM_ARTICLE_URLS' in generator.settings: custom_urls = generator.settings['CUSTOM_ARTICLE_URLS'] category = text_type(metadata['category']) pattern_matched = {} if category in custom_urls: pattern_matched = custom_urls[category] if 'subcategories' in metadata: #using subcategory plugin for subcategory in metadata['subcategories']: if subcategory in custom_urls: pattern_matched = custom_urls[subcategory] if pattern_matched: #only alter url if hasn't been set in the metdata ignore = False if ('url', 'save_as') in metadata: """ if both url and save_as are set in the metadata already then there is already a custom url set, skip this one """ ignore = True elif ('status' in metadata) and (metadata['status'] == 'draft'): ignore = True if not ignore: temp_article = Article("", metadata=metadata) url_format = pattern_matched['URL'] save_as_format = pattern_matched['SAVE_AS'] url = url_format.format(**temp_article.url_format) save_as = save_as_format.format(**temp_article.url_format) metadata.update({'url': url, 'save_as': save_as}) def register(): signals.article_generator_context.connect(custom_url)