@@ -46,12 +46,29 @@ class Indexes(Task):
46
46
47
47
def set_site (self , site ):
48
48
"""Set Nikola site."""
49
+ self .number_of_pages = dict ()
50
+ self .number_of_pages_section = {lang : dict () for lang in site .config ['TRANSLATIONS' ]}
49
51
site .register_path_handler ('index' , self .index_path )
50
52
site .register_path_handler ('index_atom' , self .index_atom_path )
51
53
site .register_path_handler ('section_index' , self .index_section_path )
52
54
site .register_path_handler ('section_index_atom' , self .index_section_atom_path )
53
55
return super (Indexes , self ).set_site (site )
54
56
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
+
55
72
def gen_tasks (self ):
56
73
"""Render the blog indexes."""
57
74
self .site .scan_posts ()
@@ -72,9 +89,6 @@ def gen_tasks(self):
72
89
}
73
90
74
91
template_name = "index.tmpl"
75
- posts = self .site .posts
76
- self .number_of_pages = dict ()
77
- self .number_of_pages_section = dict ()
78
92
for lang in kw ["translations" ]:
79
93
def page_link (i , displayed_i , num_pages , force_addition , extension = None ):
80
94
feed = "_atom" if extension == ".atom" else ""
@@ -86,13 +100,10 @@ def page_path(i, displayed_i, num_pages, force_addition, extension=None):
86
100
return utils .adjust_name_for_index_path (self .site .path ("index" + feed , None , lang ), i , displayed_i ,
87
101
lang , self .site , force_addition , extension )
88
102
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" ])
93
104
94
105
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' ])
96
107
97
108
context = {}
98
109
context ["pagekind" ] = ["main_index" , "index" ]
@@ -113,9 +124,7 @@ def page_path(i, displayed_i, num_pages, force_addition, extension=None):
113
124
continue
114
125
115
126
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' ])
119
128
120
129
def cat_link (i , displayed_i , num_pages , force_addition , extension = None ):
121
130
feed = "_atom" if extension == ".atom" else ""
@@ -230,11 +239,16 @@ def index_path(self, name, lang, is_feed=False):
230
239
index_file = os .path .splitext (self .site .config ['INDEX_FILE' ])[0 ] + extension
231
240
else :
232
241
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
233
247
return utils .adjust_name_for_index_path_list ([_f for _f in [self .site .config ['TRANSLATIONS' ][lang ],
234
248
self .site .config ['INDEX_PATH' ],
235
249
index_file ] if _f ],
236
250
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 ),
238
252
lang ,
239
253
self .site ,
240
254
extension = extension )
@@ -253,11 +267,17 @@ def index_section_path(self, name, lang, is_feed=False):
253
267
index_file = os .path .splitext (self .site .config ['INDEX_FILE' ])[0 ] + extension
254
268
else :
255
269
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
256
276
return utils .adjust_name_for_index_path_list ([_f for _f in [self .site .config ['TRANSLATIONS' ][lang ],
257
277
name ,
258
278
index_file ] if _f ],
259
279
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 ),
261
281
lang ,
262
282
self .site ,
263
283
extension = extension )
0 commit comments