From 058b32f2d365744364a70381fa230a5dffa34f62 Mon Sep 17 00:00:00 2001 From: squidfunk Date: Fri, 24 Nov 2023 09:42:57 +0100 Subject: [PATCH] Fixed non-deterministic order of categories in blog plugin --- material/plugins/blog/plugin.py | 22 +++++++++++---------- material/plugins/blog/structure/__init__.py | 14 ++++++++++--- src/plugins/blog/plugin.py | 22 +++++++++++---------- src/plugins/blog/structure/__init__.py | 14 ++++++++++--- 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/material/plugins/blog/plugin.py b/material/plugins/blog/plugin.py index 081f190ba..ab0605b2a 100644 --- a/material/plugins/blog/plugin.py +++ b/material/plugins/blog/plugin.py @@ -138,13 +138,17 @@ class BlogPlugin(BasePlugin[BlogConfig]): # Generate views for archive if self.config.archive: - views = self._generate_archive(config, files) - self.blog.views.extend(views) + self.blog.views.extend( + self._generate_archive(config, files) + ) # Generate views for categories if self.config.categories: - views = self._generate_categories(config, files) - self.blog.views.extend(views) + self.blog.views.extend(sorted( + self._generate_categories(config, files), + key = lambda view: view.name, + reverse = False + )) # Generate pages for views if self.config.pagination: @@ -573,10 +577,9 @@ class BlogPlugin(BasePlugin[BlogConfig]): self._save_to_file(file.abs_src_path, f"# {name}") file.inclusion = InclusionLevel.EXCLUDED - # Create and yield view - we don't explicitly set the title of - # the view, so authors can override them in the page's content + # Create and yield view if not isinstance(file.page, Archive): - yield Archive(None, file, config) + yield Archive(name, file, config) # Assign post to archive assert isinstance(file.page, Archive) @@ -610,10 +613,9 @@ class BlogPlugin(BasePlugin[BlogConfig]): self._save_to_file(file.abs_src_path, f"# {name}") file.inclusion = InclusionLevel.EXCLUDED - # Create and yield view - we don't explicitly set the title of - # the view, so authors can override them in the page's content + # Create and yield view if not isinstance(file.page, Category): - yield Category(None, file, config) + yield Category(name, file, config) # Assign post to category and vice versa assert isinstance(file.page, Category) diff --git a/material/plugins/blog/structure/__init__.py b/material/plugins/blog/structure/__init__.py index 2fc541fee..985b9f539 100644 --- a/material/plugins/blog/structure/__init__.py +++ b/material/plugins/blog/structure/__init__.py @@ -212,10 +212,18 @@ class Excerpt(Page): # View class View(Page): + # Parent view + parent: View | Section + # Initialize view - def __init__(self, title: str | None, file: File, config: MkDocsConfig): - super().__init__(title, file, config) - self.parent: View | Section + def __init__(self, name: str | None, file: File, config: MkDocsConfig): + super().__init__(None, file, config) + + # Initialize name of the view - note that views never pass a title to + # the parent constructor, so the author can always override the title + # that is used for rendering. However, for some purposes, like for + # example sorting, we need something to compare. + self.name = name # Initialize posts and views self.posts: list[Post] = [] diff --git a/src/plugins/blog/plugin.py b/src/plugins/blog/plugin.py index 081f190ba..ab0605b2a 100644 --- a/src/plugins/blog/plugin.py +++ b/src/plugins/blog/plugin.py @@ -138,13 +138,17 @@ class BlogPlugin(BasePlugin[BlogConfig]): # Generate views for archive if self.config.archive: - views = self._generate_archive(config, files) - self.blog.views.extend(views) + self.blog.views.extend( + self._generate_archive(config, files) + ) # Generate views for categories if self.config.categories: - views = self._generate_categories(config, files) - self.blog.views.extend(views) + self.blog.views.extend(sorted( + self._generate_categories(config, files), + key = lambda view: view.name, + reverse = False + )) # Generate pages for views if self.config.pagination: @@ -573,10 +577,9 @@ class BlogPlugin(BasePlugin[BlogConfig]): self._save_to_file(file.abs_src_path, f"# {name}") file.inclusion = InclusionLevel.EXCLUDED - # Create and yield view - we don't explicitly set the title of - # the view, so authors can override them in the page's content + # Create and yield view if not isinstance(file.page, Archive): - yield Archive(None, file, config) + yield Archive(name, file, config) # Assign post to archive assert isinstance(file.page, Archive) @@ -610,10 +613,9 @@ class BlogPlugin(BasePlugin[BlogConfig]): self._save_to_file(file.abs_src_path, f"# {name}") file.inclusion = InclusionLevel.EXCLUDED - # Create and yield view - we don't explicitly set the title of - # the view, so authors can override them in the page's content + # Create and yield view if not isinstance(file.page, Category): - yield Category(None, file, config) + yield Category(name, file, config) # Assign post to category and vice versa assert isinstance(file.page, Category) diff --git a/src/plugins/blog/structure/__init__.py b/src/plugins/blog/structure/__init__.py index 2fc541fee..985b9f539 100644 --- a/src/plugins/blog/structure/__init__.py +++ b/src/plugins/blog/structure/__init__.py @@ -212,10 +212,18 @@ class Excerpt(Page): # View class View(Page): + # Parent view + parent: View | Section + # Initialize view - def __init__(self, title: str | None, file: File, config: MkDocsConfig): - super().__init__(title, file, config) - self.parent: View | Section + def __init__(self, name: str | None, file: File, config: MkDocsConfig): + super().__init__(None, file, config) + + # Initialize name of the view - note that views never pass a title to + # the parent constructor, so the author can always override the title + # that is used for rendering. However, for some purposes, like for + # example sorting, we need something to compare. + self.name = name # Initialize posts and views self.posts: list[Post] = []