Skip to content

Commit c370d97

Browse files
committedSep 13, 2015
Merge pull request #2047 from getnikola/fix-indexes
Making path handlers of indexes plugin work before get_tasks() is run.
2 parents e19661c + ff6a71b commit c370d97

File tree

1 file changed

+33
-13
lines changed

1 file changed

+33
-13
lines changed
 

‎nikola/plugins/task/indexes.py

+33-13
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,29 @@ class Indexes(Task):
4646

4747
def set_site(self, site):
4848
"""Set Nikola site."""
49+
self.number_of_pages = dict()
50+
self.number_of_pages_section = {lang: dict() for lang in site.config['TRANSLATIONS']}
4951
site.register_path_handler('index', self.index_path)
5052
site.register_path_handler('index_atom', self.index_atom_path)
5153
site.register_path_handler('section_index', self.index_section_path)
5254
site.register_path_handler('section_index_atom', self.index_section_atom_path)
5355
return super(Indexes, self).set_site(site)
5456

57+
def _get_filtered_posts(self, lang, show_untranslated_posts):
58+
"""Return a filtered list of all posts for the given language.
59+
60+
If show_untranslated_posts is True, will only include posts which
61+
are translated to the given language. Otherwise, returns all posts.
62+
"""
63+
if show_untranslated_posts:
64+
return self.site.posts
65+
else:
66+
return [x for x in self.site.posts if x.is_translation_available(lang)]
67+
68+
def _compute_number_of_pages(self, filtered_posts, posts_count):
69+
"""Given a list of posts and the maximal number of posts per page, computes the number of pages needed."""
70+
return min(1, (len(filtered_posts) + posts_count - 1) // posts_count)
71+
5572
def gen_tasks(self):
5673
"""Render the blog indexes."""
5774
self.site.scan_posts()
@@ -72,9 +89,6 @@ def gen_tasks(self):
7289
}
7390

7491
template_name = "index.tmpl"
75-
posts = self.site.posts
76-
self.number_of_pages = dict()
77-
self.number_of_pages_section = dict()
7892
for lang in kw["translations"]:
7993
def page_link(i, displayed_i, num_pages, force_addition, extension=None):
8094
feed = "_atom" if extension == ".atom" else ""
@@ -86,13 +100,10 @@ def page_path(i, displayed_i, num_pages, force_addition, extension=None):
86100
return utils.adjust_name_for_index_path(self.site.path("index" + feed, None, lang), i, displayed_i,
87101
lang, self.site, force_addition, extension)
88102

89-
if kw["show_untranslated_posts"]:
90-
filtered_posts = posts
91-
else:
92-
filtered_posts = [x for x in posts if x.is_translation_available(lang)]
103+
filtered_posts = self._get_filtered_posts(lang, kw["show_untranslated_posts"])
93104

94105
indexes_title = kw['indexes_title'](lang) or kw['blog_title'](lang)
95-
self.number_of_pages[lang] = (len(filtered_posts) + kw['index_display_post_count'] - 1) // kw['index_display_post_count']
106+
self.number_of_pages[lang] = self._compute_number_of_pages(filtered_posts, kw['index_display_post_count'])
96107

97108
context = {}
98109
context["pagekind"] = ["main_index", "index"]
@@ -113,9 +124,7 @@ def page_path(i, displayed_i, num_pages, force_addition, extension=None):
113124
continue
114125

115126
for section_slug, post_list in groups.items():
116-
if lang not in self.number_of_pages_section:
117-
self.number_of_pages_section[lang] = dict()
118-
self.number_of_pages_section[lang][section_slug] = (len(post_list) + kw['index_display_post_count'] - 1) // kw['index_display_post_count']
127+
self.number_of_pages_section[lang][section_slug] = self._compute_number_of_pages(post_list, kw['index_display_post_count'])
119128

120129
def cat_link(i, displayed_i, num_pages, force_addition, extension=None):
121130
feed = "_atom" if extension == ".atom" else ""
@@ -230,11 +239,16 @@ def index_path(self, name, lang, is_feed=False):
230239
index_file = os.path.splitext(self.site.config['INDEX_FILE'])[0] + extension
231240
else:
232241
index_file = self.site.config['INDEX_FILE']
242+
if lang in self.number_of_pages:
243+
number_of_pages = self.number_of_pages[lang]
244+
else:
245+
number_of_pages = self._compute_number_of_pages(self._get_filtered_posts(lang, self.site.config['SHOW_UNTRANSLATED_POSTS']), self.site.config['INDEX_DISPLAY_POST_COUNT'])
246+
self.number_of_pages[lang] = number_of_pages
233247
return utils.adjust_name_for_index_path_list([_f for _f in [self.site.config['TRANSLATIONS'][lang],
234248
self.site.config['INDEX_PATH'],
235249
index_file] if _f],
236250
name,
237-
utils.get_displayed_page_number(name, self.number_of_pages[lang], self.site),
251+
utils.get_displayed_page_number(name, number_of_pages, self.site),
238252
lang,
239253
self.site,
240254
extension=extension)
@@ -253,11 +267,17 @@ def index_section_path(self, name, lang, is_feed=False):
253267
index_file = os.path.splitext(self.site.config['INDEX_FILE'])[0] + extension
254268
else:
255269
index_file = self.site.config['INDEX_FILE']
270+
if name in self.number_of_pages_section[lang]:
271+
number_of_pages = self.number_of_pages_section[lang][name]
272+
else:
273+
posts = [post for post in self._get_filtered_posts(lang, self.site.config['SHOW_UNTRANSLATED_POSTS']) if post.section_slug(lang) == name]
274+
number_of_pages = self._compute_number_of_pages(posts, self.site.config['INDEX_DISPLAY_POST_COUNT'])
275+
self.number_of_pages_section[lang][name] = number_of_pages
256276
return utils.adjust_name_for_index_path_list([_f for _f in [self.site.config['TRANSLATIONS'][lang],
257277
name,
258278
index_file] if _f],
259279
None,
260-
utils.get_displayed_page_number(None, self.number_of_pages_section[lang][name], self.site),
280+
utils.get_displayed_page_number(None, number_of_pages, self.site),
261281
lang,
262282
self.site,
263283
extension=extension)

0 commit comments

Comments
 (0)
Please sign in to comment.