Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    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