From a78950bce7a2c220f0ee25d617562852a6eba180 Mon Sep 17 00:00:00 2001 From: Oliver Urs Lenz Date: Thu, 5 Jul 2018 13:55:51 +0200 Subject: [PATCH] tweak paginator to accomodate {slug}.html patterns --- docs/changelog.rst | 2 ++ docs/settings.rst | 32 +++++++++++++++++++------------- pelican/paginator.py | 22 ++++++++-------------- pelican/settings.py | 3 ++- pelican/tests/test_paginator.py | 4 ++-- 5 files changed, 33 insertions(+), 30 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 13ef570e..58521e61 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -8,6 +8,8 @@ Next release * Replace Fabric by Invoke and ``fabfile.py`` template by ``tasks.py``. * Replace ``SLUG_SUBSTITUTIONS`` (and friends) by ``SLUG_REGEX_SUBSTITUTIONS`` for more finegrained control +* ``'{base_name}'`` value in ``PAGINATION_PATTERNS`` setting no longer strips + ``'bar'`` from ``'foo/bar.html'`` (unless ``'bar' == 'index'``). 3.7.1 (2017-01-10) ================== diff --git a/docs/settings.rst b/docs/settings.rst index a026f914..c397255c 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -994,7 +994,10 @@ You can use the following settings to configure the pagination. The templates to use pagination with, and the number of articles to include on a page. If this value is ``None``, it defaults to ``DEFAULT_PAGINATION``. -.. data:: PAGINATION_PATTERNS +.. data:: PAGINATION_PATTERNS = ( + (1, '{name}{extension}', '{name}{extension}'), + (2, '{name}{number}{extension}', '{name}{number}{extension}'), + ) A set of patterns that are used to determine advanced pagination output. @@ -1002,25 +1005,28 @@ You can use the following settings to configure the pagination. Using Pagination Patterns ------------------------- -The ``PAGINATION_PATTERNS`` setting can be used to configure where -subsequent pages are created. The setting is a sequence of three -element tuples, where each tuple consists of:: +By default, pages subsequent to ``.../foo.html`` are created as +``.../foo2.html``, etc. The ``PAGINATION_PATTERNS`` setting can be used to +change this. It takes a sequence of triples, where each triple consists of:: - (minimum page, URL setting, SAVE_AS setting,) + (minimum_page, page_url, page_save_as,) -For example, if you wanted the first page to just be ``/``, and the -second (and subsequent) pages to be ``/page/2/``, you would set -``PAGINATION_PATTERNS`` as follows:: +For ``page_url`` and ``page_save_as``, you may use a number of variables. +``{url}`` and ``{save_as}`` correspond respectively to the ``*_URL`` and +``*_SAVE_AS`` values of the corresponding page type (e.g. ``ARTICLE_SAVE_AS``). +If ``{save_as} == foo/bar.html``, then ``{name} == foo/bar`` and +``{extension} == .html``. ``{base_name}`` equals ``{name}`` except that it +strips trailing ``/index`` if present. ``{number}`` equals the page number. + +For example, if you want to leave the first page unchanged, but place +subsequent pages at ``.../page/2/`` etc, you could set ``PAGINATION_PATTERNS`` +as follows:: PAGINATION_PATTERNS = ( - (1, '{base_name}/', '{base_name}/index.html'), + (1, '{url}', '{save_as}`, (2, '{base_name}/page/{number}/', '{base_name}/page/{number}/index.html'), ) -This would cause the first page to be written to -``{base_name}/index.html``, and subsequent ones would be written into -``page/{number}`` directories. - Translations ============ diff --git a/pelican/paginator.py b/pelican/paginator.py index a0ce7c95..ceabf43b 100644 --- a/pelican/paginator.py +++ b/pelican/paginator.py @@ -66,7 +66,10 @@ class Paginator(object): class Page(object): def __init__(self, name, url, object_list, number, paginator, settings): + self.full_name = name self.name, self.extension = os.path.splitext(name) + dn, fn = os.path.split(name) + self.base_name = dn if fn in ('index.htm', 'index.html') else self.name self.base_url = url self.object_list = object_list self.number = number @@ -134,25 +137,16 @@ class Page(object): # URL or SAVE_AS is a string, format it with a controlled context context = { - 'name': self.name.replace(os.sep, '/'), + 'save_as': self.full_name, 'url': self.base_url, - 'object_list': self.object_list, - 'number': self.number, - 'paginator': self.paginator, - 'settings': self.settings, - 'base_name': os.path.dirname(self.name), - 'number_sep': '/', + 'name': self.name, + 'base_name': self.base_name, 'extension': self.extension, + 'number': self.number, } - if self.number == 1: - # no page numbers on the first page - context['number'] = '' - context['number_sep'] = '' - ret = prop_value.format(**context) - if ret[0] == '/': - ret = ret[1:] + ret = ret.lstrip('/') return ret url = property(functools.partial(_from_settings, key='URL')) diff --git a/pelican/settings.py b/pelican/settings.py index 5128ff6d..a58052c3 100644 --- a/pelican/settings.py +++ b/pelican/settings.py @@ -97,7 +97,8 @@ DEFAULT_CONFIG = { 'AUTHOR_URL': 'author/{slug}.html', 'AUTHOR_SAVE_AS': posix_join('author', '{slug}.html'), 'PAGINATION_PATTERNS': [ - (0, '{name}{number}{extension}', '{name}{number}{extension}'), + (1, '{name}{extension}', '{name}{extension}'), + (2, '{name}{number}{extension}', '{name}{number}{extension}'), ], 'YEAR_ARCHIVE_URL': '', 'YEAR_ARCHIVE_SAVE_AS': '', diff --git a/pelican/tests/test_paginator.py b/pelican/tests/test_paginator.py index 6174dca1..e06075fe 100644 --- a/pelican/tests/test_paginator.py +++ b/pelican/tests/test_paginator.py @@ -74,7 +74,7 @@ class TestPage(unittest.TestCase): object_list, settings, 1) page1 = paginator.page(1) self.assertEqual(page1.save_as, 'blog/index.html') - self.assertEqual(page1.url, '//blog.my.site/') + self.assertEqual(page1.url, 'blog.my.site/') page2 = paginator.page(2) self.assertEqual(page2.save_as, 'blog/2/index.html') - self.assertEqual(page2.url, '//blog.my.site/2/') + self.assertEqual(page2.url, 'blog.my.site/2/')