def _generate_classification_overview_kw_context(self, taxonomy, lang): """Create context and kw for a classification overview page.""" context, kw = taxonomy.provide_overview_context_and_uptodate(lang) context = copy(context) kw = copy(kw) kw["messages"] = self.site.MESSAGES kw["translations"] = self.site.config['TRANSLATIONS'] kw["filters"] = self.site.config['FILTERS'] kw["minimum_post_count"] = taxonomy.minimum_post_count_per_classification_in_overview kw["output_folder"] = self.site.config['OUTPUT_FOLDER'] kw["pretty_urls"] = self.site.config['PRETTY_URLS'] kw["strip_indexes"] = self.site.config['STRIP_INDEXES'] kw["index_file"] = self.site.config['INDEX_FILE'] # Collect all relevant classifications if taxonomy.has_hierarchy: def acceptor(node): return len(self._filter_list(self.site.posts_per_classification[taxonomy.classification_name][lang][node.classification_name], lang)) >= kw["minimum_post_count"] clipped_root_list = [utils.clone_treenode(node, parent=None, acceptor=acceptor) for node in self.site.hierarchy_per_classification[taxonomy.classification_name][lang]] clipped_root_list = [node for node in clipped_root_list if node] clipped_flat_hierarchy = utils.flatten_tree_structure(clipped_root_list) classifications = [cat.classification_name for cat in clipped_flat_hierarchy] else: classifications = natsort.natsorted([tag for tag, posts in self.site.posts_per_classification[taxonomy.classification_name][lang].items() if len(self._filter_list(posts, lang)) >= kw["minimum_post_count"]], alg=natsort.ns.F | natsort.ns.IC) taxonomy.sort_classifications(classifications, lang) # Set up classifications in context context[taxonomy.overview_page_variable_name] = classifications context["has_hierarchy"] = taxonomy.has_hierarchy if taxonomy.overview_page_items_variable_name: items = [(classification, self.site.link(taxonomy.classification_name, classification, lang)) for classification in classifications] items_with_postcount = [ (classification, self.site.link(taxonomy.classification_name, classification, lang), len(self._filter_list(self.site.posts_per_classification[taxonomy.classification_name][lang][classification], lang))) for classification in classifications ] context[taxonomy.overview_page_items_variable_name] = items context[taxonomy.overview_page_items_variable_name + "_with_postcount"] = items_with_postcount if taxonomy.has_hierarchy and taxonomy.overview_page_hierarchy_variable_name: hier_items = [ (node.name, node.classification_name, node.classification_path, self.site.link(taxonomy.classification_name, node.classification_name, lang), node.indent_levels, node.indent_change_before, node.indent_change_after) for node in clipped_flat_hierarchy ] hier_items_with_postcount = [ (node.name, node.classification_name, node.classification_path, self.site.link(taxonomy.classification_name, node.classification_name, lang), node.indent_levels, node.indent_change_before, node.indent_change_after, len(node.children), len(self._filter_list(self.site.posts_per_classification[taxonomy.classification_name][lang][node.classification_name], lang))) for node in clipped_flat_hierarchy ] context[taxonomy.overview_page_hierarchy_variable_name] = hier_items context[taxonomy.overview_page_hierarchy_variable_name + '_with_postcount'] = hier_items_with_postcount return context, kw
def _generate_classification_overview_kw_context(self, taxonomy, lang): """Create context and kw for a classification overview page.""" context, kw = taxonomy.provide_overview_context_and_uptodate(lang) context = copy(context) kw = copy(kw) kw["messages"] = self.site.MESSAGES kw["translations"] = self.site.config['TRANSLATIONS'] kw["filters"] = self.site.config['FILTERS'] kw["minimum_post_count"] = taxonomy.minimum_post_count_per_classification_in_overview kw["output_folder"] = self.site.config['OUTPUT_FOLDER'] kw["pretty_urls"] = self.site.config['PRETTY_URLS'] kw["strip_indexes"] = self.site.config['STRIP_INDEXES'] kw["index_file"] = self.site.config['INDEX_FILE'] # Collect all relevant classifications if taxonomy.has_hierarchy: def acceptor(node): return len( self._filter_list( self.site.posts_per_classification[ taxonomy.classification_name][lang][ node.classification_name], lang)) >= kw["minimum_post_count"] clipped_root_list = [ utils.clone_treenode(node, parent=None, acceptor=acceptor) for node in self.site.hierarchy_per_classification[ taxonomy.classification_name][lang] ] clipped_root_list = [node for node in clipped_root_list if node] clipped_flat_hierarchy = utils.flatten_tree_structure( clipped_root_list) classifications = [ cat.classification_name for cat in clipped_flat_hierarchy ] else: classifications = natsort.natsorted([ tag for tag, posts in self.site.posts_per_classification[ taxonomy.classification_name][lang].items() if len(self._filter_list(posts, lang)) >= kw["minimum_post_count"] ], alg=natsort.ns.F | natsort.ns.IC) taxonomy.sort_classifications(classifications, lang) # Set up classifications in context context[taxonomy.overview_page_variable_name] = classifications context["has_hierarchy"] = taxonomy.has_hierarchy if taxonomy.overview_page_items_variable_name: items = [(classification, self.site.link(taxonomy.classification_name, classification, lang)) for classification in classifications] items_with_postcount = [ (classification, self.site.link(taxonomy.classification_name, classification, lang), len( self._filter_list( self.site.posts_per_classification[ taxonomy.classification_name][lang] [classification], lang))) for classification in classifications ] context[taxonomy.overview_page_items_variable_name] = items context[taxonomy.overview_page_items_variable_name + "_with_postcount"] = items_with_postcount if taxonomy.has_hierarchy and taxonomy.overview_page_hierarchy_variable_name: hier_items = [ (node.name, node.classification_name, node.classification_path, self.site.link(taxonomy.classification_name, node.classification_name, lang), node.indent_levels, node.indent_change_before, node.indent_change_after) for node in clipped_flat_hierarchy ] hier_items_with_postcount = [ (node.name, node.classification_name, node.classification_path, self.site.link(taxonomy.classification_name, node.classification_name, lang), node.indent_levels, node.indent_change_before, node.indent_change_after, len(node.children), len( self._filter_list( self.site.posts_per_classification[ taxonomy.classification_name][lang][ node.classification_name], lang))) for node in clipped_flat_hierarchy ] context[ taxonomy.overview_page_hierarchy_variable_name] = hier_items context[taxonomy.overview_page_hierarchy_variable_name + '_with_postcount'] = hier_items_with_postcount return context, kw
def _build_taxonomy_list_and_hierarchy(self, taxonomy_name, lang): """Build taxonomy list and hierarchy for the given taxnonmy name and language.""" if taxonomy_name not in self.site.posts_per_classification or taxonomy_name not in self.site.taxonomy_plugins: return None, None posts_per_tag = self.site.posts_per_classification[taxonomy_name][lang] taxonomy = self.site.taxonomy_plugins[taxonomy_name] def acceptor(post): return True if self.site.config[ 'SHOW_UNTRANSLATED_POSTS'] else post.is_translation_available( lang) # Build classification list classifications = [(taxonomy.get_classification_friendly_name( tag, lang, only_last_component=False), tag) for tag in posts_per_tag.keys()] if classifications: # Sort classifications classifications = natsort.humansorted(classifications) # Build items list result = list() for classification_name, classification in classifications: count = len([ post for post in posts_per_tag[classification] if acceptor(post) ]) result.append((classification_name, count, self.site.link(taxonomy_name, classification, lang))) # Build hierarchy if taxonomy.has_hierarchy: # Special post-processing for archives: get rid of root and cut off tree at month level if taxonomy_name == 'archive': root_list = self.site.hierarchy_per_classification[ taxonomy_name][lang] root_list = utils.clone_treenode(root_list[0]).children def cut_depth(node, cutoff): if cutoff <= 1: node.children = [] else: for node in node.children: cut_depth(node, cutoff - 1) def invert_order(node): node.children.reverse() for node in node.children: invert_order(node) # Make sure that days don't creep in for node in root_list: cut_depth(node, 2) invert_order(node) root_list.reverse() flat_hierarchy = utils.flatten_tree_structure(root_list) else: flat_hierarchy = self.site.flat_hierarchy_per_classification[ taxonomy_name][lang] else: root_list = [] for classification_name, classification in classifications: node = utils.TreeNode(classification_name) node.classification_name = classification node.classification_path = taxonomy.extract_hierarchy( classification) root_list.append(node) flat_hierarchy = utils.flatten_tree_structure(root_list) # Build flattened hierarchy list hierarchy = [ (taxonomy.get_classification_friendly_name( node.classification_name, lang, only_last_component=False), node.classification_name, node.classification_path, self.site.link(taxonomy_name, node.classification_name, lang), node.indent_levels, node.indent_change_before, node.indent_change_after, len(node.children), len([ post for post in posts_per_tag[node.classification_name] if acceptor(post) ])) for node in flat_hierarchy ] return result, hierarchy else: return None, None
def _build_taxonomy_list_and_hierarchy(self, taxonomy_name, lang): """Build taxonomy list and hierarchy for the given taxnonmy name and language.""" if taxonomy_name not in self.site.posts_per_classification or taxonomy_name not in self.site.taxonomy_plugins: return None, None posts_per_tag = self.site.posts_per_classification[taxonomy_name][lang] taxonomy = self.site.taxonomy_plugins[taxonomy_name] def acceptor(post): return True if self.site.config['SHOW_UNTRANSLATED_POSTS'] else post.is_translation_available(lang) # Build classification list classifications = [(taxonomy.get_classification_friendly_name(tag, lang, only_last_component=False), tag) for tag in posts_per_tag.keys()] if classifications: # Sort classifications classifications = natsort.humansorted(classifications) # Build items list result = list() for classification_name, classification in classifications: count = len([post for post in posts_per_tag[classification] if acceptor(post)]) result.append((classification_name, count, self.site.link(taxonomy_name, classification, lang))) # Build hierarchy if taxonomy.has_hierarchy: # Special post-processing for archives: get rid of root and cut off tree at month level if taxonomy_name == 'archive': root_list = self.site.hierarchy_per_classification[taxonomy_name][lang] root_list = utils.clone_treenode(root_list[0]).children def cut_depth(node, cutoff): if cutoff <= 1: node.children = [] else: for node in node.children: cut_depth(node, cutoff - 1) def invert_order(node): node.children.reverse() for node in node.children: invert_order(node) # Make sure that days don't creep in for node in root_list: cut_depth(node, 2) invert_order(node) root_list.reverse() flat_hierarchy = utils.flatten_tree_structure(root_list) else: flat_hierarchy = self.site.flat_hierarchy_per_classification[taxonomy_name][lang] else: root_list = [] for classification_name, classification in classifications: node = utils.TreeNode(classification_name) node.classification_name = classification node.classification_path = taxonomy.extract_hierarchy(classification) root_list.append(node) flat_hierarchy = utils.flatten_tree_structure(root_list) # Build flattened hierarchy list hierarchy = [(taxonomy.get_classification_friendly_name(node.classification_name, lang, only_last_component=False), node.classification_name, node.classification_path, self.site.link(taxonomy_name, node.classification_name, lang), node.indent_levels, node.indent_change_before, node.indent_change_after, len(node.children), len([post for post in posts_per_tag[node.classification_name] if acceptor(post)])) for node in flat_hierarchy] return result, hierarchy else: return None, None