50 lines
1.9 KiB
Python
50 lines
1.9 KiB
Python
|
# -*- 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)
|