diff --git a/docs/settings.rst b/docs/settings.rst index db5c01643..a8627dbc6 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -219,6 +219,11 @@ 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_ORDER_BY` (``'slug'``) The metadata attribute used to sort articles. By default + the articles_page.object_list template variable is + ordered by slug. If you modify this, make sure all + articles contain the attribute you specify. You can + also specify a sorting function. `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 @@ -227,6 +232,13 @@ Setting name (default value) What does it do? `PAGE_SAVE_AS` (``'pages/{slug}.html'``) The location we will save the page. This value has to be the same as PAGE_URL or you need to use a rewrite in your server config. +`PAGE_ORDER_BY` (``'filename'``) The metadata attribute used to sort pages. By default + the PAGES template variable is ordered by filename + (path not included). Note that the option 'filename' + is a special option supported in the source code. If + you modify this settings, make sure all pages contain + the attribute you specify. You can also specify a + sorting function. `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 diff --git a/pelican/generators.py b/pelican/generators.py index 02412440e..e7f3fed37 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -425,7 +425,8 @@ def generate_context(self): (repr(article.status), repr(f))) - self.articles, self.translations = process_translations(all_articles) + self.articles, self.translations = process_translations(all_articles, + order_by=self.settings['ARTICLE_ORDER_BY']) for article in self.articles: # only main articles are listed in categories and tags @@ -529,7 +530,8 @@ def generate_context(self): (repr(page.status), repr(f))) - self.pages, self.translations = process_translations(all_pages) + self.pages, self.translations = process_translations(all_pages, + order_by=self.settings['PAGE_ORDER_BY']) self.hidden_pages, self.hidden_translations = ( process_translations(hidden_pages)) diff --git a/pelican/settings.py b/pelican/settings.py index df1de0c78..9af78fbcd 100644 --- a/pelican/settings.py +++ b/pelican/settings.py @@ -48,10 +48,12 @@ 'DELETE_OUTPUT_DIRECTORY': False, 'ARTICLE_URL': '{slug}.html', 'ARTICLE_SAVE_AS': '{slug}.html', + 'ARTICLE_ORDER_BY': 'slug', 'ARTICLE_LANG_URL': '{slug}-{lang}.html', 'ARTICLE_LANG_SAVE_AS': '{slug}-{lang}.html', 'PAGE_URL': 'pages/{slug}.html', 'PAGE_SAVE_AS': os.path.join('pages', '{slug}.html'), + 'PAGE_ORDER_BY': 'filename', 'PAGE_LANG_URL': 'pages/{slug}-{lang}.html', 'PAGE_LANG_SAVE_AS': os.path.join( 'pages', '{slug}-{lang}.html'), diff --git a/pelican/utils.py b/pelican/utils.py index 3ae884023..bd2719269 100644 --- a/pelican/utils.py +++ b/pelican/utils.py @@ -390,7 +390,7 @@ def truncate_html_words(s, num, end_text='...'): return out -def process_translations(content_list): +def process_translations(content_list, order_by=None): """ Finds translation and returns them. Returns a tuple with two lists (index, translations). Index list includes @@ -398,6 +398,14 @@ def process_translations(content_list): language. For each content_list item, sets the 'translations' attribute. + + order_by can be a string of an attribute or sorting function. If order_by + is defined, content will be ordered by that attribute or sorting function. + By default, content is ordered by slug. + + Different content types can have default order_by attributes defined + in settings, e.g. PAGES_ORDER_BY='sort-order', in which case `sort-order` + should be a defined metadata attribute in each page. """ content_list.sort(key=attrgetter('slug')) grouped_by_slugs = groupby(content_list, attrgetter('slug')) @@ -426,6 +434,22 @@ def process_translations(content_list): translations.extend([x for x in items if x not in default_lang_items]) for a in items: a.translations = [x for x in items if x != a] + + if order_by: + if hasattr(order_by, '__call__'): + try: + index.sort(key=order_by) + except: + if hasattr(order_by, 'func_name'): + logger.error("Error sorting with function %s" % order_by.func_name) + else: + logger.error("Error sorting with function %r" % order_by) + elif order_by == 'filename': + index.sort(key=lambda x:os.path.basename( + x.source_path or '')) + elif order_by != 'slug': + index.sort(key=attrgetter(order_by)) + return index, translations