forked from github/pelican
Allow definition of pagination rules by page index.
This commit is contained in:
parent
71e83635ea
commit
95890a2a61
2 changed files with 31 additions and 4 deletions
|
|
@ -3,6 +3,7 @@ from __future__ import unicode_literals, print_function
|
||||||
import six
|
import six
|
||||||
|
|
||||||
# From django.core.paginator
|
# From django.core.paginator
|
||||||
|
from collections import namedtuple
|
||||||
import functools
|
import functools
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
|
@ -11,6 +12,13 @@ from math import ceil
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
PaginationRule = namedtuple(
|
||||||
|
'PaginationRule',
|
||||||
|
'min_page URL SAVE_AS',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Paginator(object):
|
class Paginator(object):
|
||||||
def __init__(self, name, object_list, settings):
|
def __init__(self, name, object_list, settings):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
|
@ -109,8 +117,16 @@ class Page(object):
|
||||||
"""Returns URL information as defined in settings. Similar to
|
"""Returns URL information as defined in settings. Similar to
|
||||||
URLWrapper._from_settings, but specialized to deal with pagination
|
URLWrapper._from_settings, but specialized to deal with pagination
|
||||||
logic."""
|
logic."""
|
||||||
setting = "%s_%s" % ('PAGINATION', key)
|
|
||||||
value = self.settings[setting]
|
rule = None
|
||||||
|
|
||||||
|
# find the last matching pagination rule
|
||||||
|
for p in self.settings['PAGINATION_PATTERNS']:
|
||||||
|
if p.min_page <= self.number:
|
||||||
|
rule = p
|
||||||
|
|
||||||
|
value = getattr(rule, key)
|
||||||
|
|
||||||
if not isinstance(value, six.string_types):
|
if not isinstance(value, six.string_types):
|
||||||
logger.warning('%s is set to %s' % (setting, value))
|
logger.warning('%s is set to %s' % (setting, value))
|
||||||
return value
|
return value
|
||||||
|
|
|
||||||
|
|
@ -73,8 +73,9 @@ DEFAULT_CONFIG = {
|
||||||
'TAG_SAVE_AS': os.path.join('tag', '{slug}.html'),
|
'TAG_SAVE_AS': os.path.join('tag', '{slug}.html'),
|
||||||
'AUTHOR_URL': 'author/{slug}.html',
|
'AUTHOR_URL': 'author/{slug}.html',
|
||||||
'AUTHOR_SAVE_AS': os.path.join('author', '{slug}.html'),
|
'AUTHOR_SAVE_AS': os.path.join('author', '{slug}.html'),
|
||||||
'PAGINATION_URL': '{name}{number}.html',
|
'PAGINATION_PATTERNS': [
|
||||||
'PAGINATION_SAVE_AS': '{name}{number}.html',
|
(0, '{name}{number}.html', '{name}{number}.html'),
|
||||||
|
],
|
||||||
'YEAR_ARCHIVE_SAVE_AS': False,
|
'YEAR_ARCHIVE_SAVE_AS': False,
|
||||||
'MONTH_ARCHIVE_SAVE_AS': False,
|
'MONTH_ARCHIVE_SAVE_AS': False,
|
||||||
'DAY_ARCHIVE_SAVE_AS': False,
|
'DAY_ARCHIVE_SAVE_AS': False,
|
||||||
|
|
@ -238,6 +239,16 @@ def configure_settings(settings):
|
||||||
'http://docs.getpelican.com/en/latest/settings.html#timezone '
|
'http://docs.getpelican.com/en/latest/settings.html#timezone '
|
||||||
'for more information')
|
'for more information')
|
||||||
|
|
||||||
|
# fix up pagination rules
|
||||||
|
from pelican.paginator import PaginationRule
|
||||||
|
pagination_rules = [
|
||||||
|
PaginationRule(*r) for r in settings['PAGINATION_PATTERNS']
|
||||||
|
]
|
||||||
|
settings['PAGINATION_PATTERNS'] = sorted(
|
||||||
|
pagination_rules,
|
||||||
|
key=lambda r: r[0],
|
||||||
|
)
|
||||||
|
|
||||||
# Save people from accidentally setting a string rather than a list
|
# Save people from accidentally setting a string rather than a list
|
||||||
path_keys = (
|
path_keys = (
|
||||||
'ARTICLE_EXCLUDES',
|
'ARTICLE_EXCLUDES',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue