Add settings to change the URL's and SAVE_AS paths

Example usage:

* ARTICLE_URL = 'posts/{date:%Y}/{date:%b}/{date:%d}/{slug}/'
* ARTICLE_SAVE_AS = 'posts/{date:%Y}/{date:%b}/{date:%d}/{slug}/index.html'

This removes CLEAN_URLS and ARTICLE_PERMALINK_STRUCTURE because these
new settings can produce the same result.
This commit is contained in:
Kyle Fuller 2011-12-23 22:01:32 +00:00
commit a39787c1a2
4 changed files with 82 additions and 60 deletions

View file

@ -24,12 +24,7 @@ Basic settings
================================================ ===================================================== ================================================ =====================================================
Setting name (default value) What does it do? Setting name (default value) What does it do?
================================================ ===================================================== ================================================ =====================================================
`ARTICLE_PERMALINK_STRUCTURE` (``''``) Empty by default. Enables some customization of URL
structure (see below for more detail).
`AUTHOR` Default author (put your name) `AUTHOR` Default author (put your name)
`CLEAN_URLS` (``False``) If set to `True`, the URLs will not be suffixed by
`.html`, so you will have to setup URL rewriting on
your web server.
`DATE_FORMATS` (``{}``) If you do manage multiple languages, you can `DATE_FORMATS` (``{}``) If you do manage multiple languages, you can
set the date formatting here. See "Date format and locales" set the date formatting here. See "Date format and locales"
section below for details. section below for details.
@ -79,16 +74,14 @@ Setting name (default value) What does it do?
.. [#] Default is the system locale. .. [#] Default is the system locale.
Article permalink structure URL Settings
--------------------------- ------------
This setting allows you to output your articles sorted by date, provided that You can customize the URL's and locations where files will be saved. The URL's and
you specify a format as specified below. This format follows the Python SAVE_AS variables use python's format strings. These variables allow you to place
``datetime`` directives: your articles in a location such as '{slug}/index.html' and link to then as
'{slug}' for clean urls. These settings give you the flexibility to place your
* %Y: Year with century as a decimal number. articles and pages anywhere you want.
* %m: Month as a decimal number [01,12].
* %d: Day of the month as a decimal number [01,31].
Note: If you specify a datetime directive, it will be substituted using the Note: If you specify a datetime directive, it will be substituted using the
input files' date metadata attribute. If the date is not specified for a input files' date metadata attribute. If the date is not specified for a
@ -99,15 +92,36 @@ information.
Also, you can use other file metadata attributes as well: Also, you can use other file metadata attributes as well:
* category: '%(category)s' * slug
* author: '%(author)s' * date
* tags: '%(tags)s' * lang
* date: '%(date)s' * author
* category
Example usage: Example usage:
* '/%Y/%m/' will render something like '/2011/07/sample-post.html'. * ARTICLE_URL = 'posts/{date:%Y}/{date:%b}/{date:%d}/{slug}/'
* '/%Y/%(category)s/' will render something like '/2011/life/sample-post.html'. * ARTICLE_SAVE_AS = 'posts/{date:%Y}/{date:%b}/{date:%d}/{slug}/index.html'
This would save your articles in something like '/posts/2011/Aug/07/sample-post/index.html',
and the URL to this would be '/posts/2011/Aug/07/sample-post/'.
================================================ =====================================================
Setting name (default value) what does it do?
================================================ =====================================================
`ARTICLE_URL` ('{slug}.html') The URL to refer to an ARTICLE.
`ARTICLE_SAVE_AS` ('{slug}.html') The place where we will save an article.
`ARTICLE_LANG_URL` ('{slug}-{lang}.html') The URL to refer to an ARTICLE which doesn't use the
default language.
`ARTICLE_LANG_SAVE_AS` ('{slug}-{lang}.html' The place where we will save an article which
doesn't use the default language.
`PAGE_URL` ('pages/{slug}.html') The URL we will use to link to a page.
`PAGE_SAVE_AS` ('pages/{slug}.html') The location we will save the page.
`PAGE_LANG_URL` ('pages/{slug}-{lang}.html') The URL we will use to link to a page which doesn't
use the default language.
`PAGE_LANG_SAVE_AS` ('pages/{slug}-{lang}.html') The location we will save the page which doesn't
use the default language.
================================================ =====================================================
Timezone Timezone
-------- --------

View file

@ -24,6 +24,7 @@ class Page(object):
if not settings: if not settings:
settings = _DEFAULT_CONFIG settings = _DEFAULT_CONFIG
self.settings = settings
self._content = content self._content = content
self.translations = [] self.translations = []
@ -55,29 +56,6 @@ class Page(object):
if not hasattr(self, 'slug') and hasattr(self, 'title'): if not hasattr(self, 'slug') and hasattr(self, 'title'):
self.slug = slugify(self.title) self.slug = slugify(self.title)
# create save_as from the slug (+lang)
if not hasattr(self, 'save_as') and hasattr(self, 'slug'):
if self.in_default_lang:
if settings.get('CLEAN_URLS', False):
self.save_as = '%s/index.html' % self.slug
else:
self.save_as = '%s.html' % self.slug
clean_url = '%s/' % self.slug
else:
if settings.get('CLEAN_URLS', False):
self.save_as = '%s-%s/index.html' % (self.slug, self.lang)
else:
self.save_as = '%s-%s.html' % (self.slug, self.lang)
clean_url = '%s-%s/' % (self.slug, self.lang)
# change the save_as regarding the settings
if settings.get('CLEAN_URLS', False):
self.url = clean_url
elif hasattr(self, 'save_as'):
self.url = self.save_as
if filename: if filename:
self.filename = filename self.filename = filename
@ -115,6 +93,30 @@ class Page(object):
if not hasattr(self, prop): if not hasattr(self, prop):
raise NameError(prop) raise NameError(prop)
@property
def url_format(self):
return {
'slug': getattr(self, 'slug', ''),
'lang': getattr(self, 'lang', 'en'),
'date': getattr(self, 'date', datetime.now()),
'author': self.author,
'category': getattr(self, 'category', 'misc'),
}
@property
def url(self):
if self.in_default_lang:
return self.settings.get('PAGE_URL', 'pages/{slug}.html').format(**self.url_format)
return self.settings.get('PAGE_LANG_URL', 'pages/{slug}-{lang}.html').format(**self.url_format)
@property
def save_as(self):
if self.in_default_lang:
return self.settings.get('PAGE_SAVE_AS', 'pages/{slug}.html').format(**self.url_format)
return self.settings.get('PAGE_LANG_SAVE_AS', 'pages/{slug}-{lang}.html').format(**self.url_format)
@property @property
def content(self): def content(self):
if hasattr(self, "_get_content"): if hasattr(self, "_get_content"):
@ -138,6 +140,20 @@ class Page(object):
class Article(Page): class Article(Page):
mandatory_properties = ('title', 'date', 'category') mandatory_properties = ('title', 'date', 'category')
@property
def url(self):
if self.in_default_lang:
return self.settings.get('ARTICLE_URL', '{slug}.html').format(**self.url_format)
return self.settings.get('ARTICLE_LANG_URL', '{slug}-{lang}.html').format(**self.url_format)
@property
def save_as(self):
if self.in_default_lang:
return self.settings.get('ARTICLE_SAVE_AS', '{slug}.html').format(**self.url_format)
return self.settings.get('ARTICLE_LANG_SAVE_AS', '{slug}-{lang}.html').format(**self.url_format)
class Quote(Page): class Quote(Page):
base_properties = ('author', 'date') base_properties = ('author', 'date')

View file

@ -239,21 +239,6 @@ class ArticlesGenerator(Generator):
if not is_valid_content(article, f): if not is_valid_content(article, f):
continue continue
add_to_url = u''
if 'ARTICLE_PERMALINK_STRUCTURE' in self.settings:
article_permalink_structure = self.settings['ARTICLE_PERMALINK_STRUCTURE']
article_permalink_structure = article_permalink_structure.lstrip('/').replace('%(', "%%(")
# try to substitute any python datetime directive
add_to_url = article.date.strftime(article_permalink_structure)
# try to substitute any article metadata in rest file
add_to_url = add_to_url % article.__dict__
add_to_url = [slugify(i) for i in add_to_url.split('/')]
add_to_url = os.path.join(*add_to_url)
article.url = urlparse.urljoin(add_to_url, article.url)
article.save_as = urlparse.urljoin(add_to_url, article.save_as)
if article.status == "published": if article.status == "published":
if hasattr(article, 'tags'): if hasattr(article, 'tags'):
for tag in article.tags: for tag in article.tags:
@ -348,7 +333,7 @@ class PagesGenerator(Generator):
def generate_output(self, writer): def generate_output(self, writer):
for page in chain(self.translations, self.pages): for page in chain(self.translations, self.pages):
writer.write_file('pages/%s' % page.save_as, self.get_template('page'), writer.write_file(page.save_as, self.get_template('page'),
self.context, page=page, self.context, page=page,
relative_urls = self.settings.get('RELATIVE_URLS')) relative_urls = self.settings.get('RELATIVE_URLS'))

View file

@ -26,7 +26,14 @@ _DEFAULT_CONFIG = {'PATH': None,
'REVERSE_ARCHIVE_ORDER': False, 'REVERSE_ARCHIVE_ORDER': False,
'REVERSE_CATEGORY_ORDER': False, 'REVERSE_CATEGORY_ORDER': False,
'DELETE_OUTPUT_DIRECTORY': False, 'DELETE_OUTPUT_DIRECTORY': False,
'CLEAN_URLS': False, # use /blah/ instead /blah.html in urls 'ARTICLE_URL': '{slug}.html',
'ARTICLE_SAVE_AS': '{slug}.html',
'ARTICLE_LANG_URL': '{slug}-{lang}.html',
'ARTICLE_LANG_SAVE_AS': '{slug}-{lang}.html',
'PAGE_URL': 'pages/{slug}.html',
'PAGE_SAVE_AS': 'pages/{slug}.html',
'PAGE_LANG_URL': 'pages/{slug}-{lang}.html',
'PAGE_LANG_SAVE_AS': 'pages/{slug}-{lang}.html',
'RELATIVE_URLS': True, 'RELATIVE_URLS': True,
'DEFAULT_LANG': 'en', 'DEFAULT_LANG': 'en',
'TAG_CLOUD_STEPS': 4, 'TAG_CLOUD_STEPS': 4,