diff --git a/pelican/contents.py b/pelican/contents.py index 5a40326175..d175eb752a 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -547,9 +547,29 @@ def refresh_metadata_intersite_links(self) -> None: self._summary = self.metadata["summary"] +class SkipStub(Content): + # Stub class representing content that should not be processed in any way + + def __init__( + self, content, metadata=None, settings=None, source_path=None, context=None + ): + self.source_path = source_path + + def is_valid(self): + return False + + @property + def content(self): + raise NotImplementedError("Stub content should not be read") + + @property + def save_as(self): + raise NotImplementedError("Stub content cannot be saved") + + class Page(Content): mandatory_properties = ("title",) - allowed_statuses = ("published", "hidden", "draft") + allowed_statuses = ("published", "hidden", "draft", "skip") default_status = "published" default_template = "page" @@ -560,7 +580,7 @@ def _expand_settings(self, key: str) -> str: class Article(Content): mandatory_properties = ("title", "date", "category") - allowed_statuses = ("published", "hidden", "draft") + allowed_statuses = ("published", "hidden", "draft", "skip") default_status = "published" default_template = "article" diff --git a/pelican/generators.py b/pelican/generators.py index 548c494fee..7ff8a7a088 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -19,7 +19,7 @@ ) from pelican.cache import FileStampDataCacher -from pelican.contents import Article, Page, Static +from pelican.contents import Article, Page, Static, SkipStub from pelican.plugins import signals from pelican.plugins._utils import plugin_enabled from pelican.readers import Readers @@ -690,6 +690,10 @@ def generate_context(self): self._add_failed_source_path(f) continue + if isinstance(article, SkipStub): + logger.debug("Safely skipping %s", f) + continue + if not article.is_valid(): self._add_failed_source_path(f) continue @@ -702,6 +706,8 @@ def generate_context(self): all_drafts.append(article) elif article.status == "hidden": hidden_articles.append(article) + elif article.status == "skip": + raise AssertionError("Documents with 'skip' status should be skipped") self.add_source_path(article) self.add_static_links(article) @@ -899,6 +905,10 @@ def generate_context(self): self._add_failed_source_path(f) continue + if isinstance(page, SkipStub): + logger.debug("Safely skipping %s", f) + continue + if not page.is_valid(): self._add_failed_source_path(f) continue @@ -911,6 +921,9 @@ def generate_context(self): hidden_pages.append(page) elif page.status == "draft": draft_pages.append(page) + elif page.status == "skip": + raise AssertionError("Documents with 'skip' status should be skipped") + self.add_source_path(page) self.add_static_links(page) diff --git a/pelican/readers.py b/pelican/readers.py index 3d0e8d5807..ffe707758f 100644 --- a/pelican/readers.py +++ b/pelican/readers.py @@ -15,7 +15,7 @@ from pelican import rstdirectives # NOQA from pelican.cache import FileStampDataCacher -from pelican.contents import Author, Category, Page, Tag +from pelican.contents import Author, Category, Page, Tag, SkipStub from pelican.plugins import signals from pelican.utils import file_suffix, get_date, pelican_open, posixize_path @@ -669,6 +669,9 @@ def typogrify_wrapper(text): ) context_signal.send(context_sender, metadata=metadata) + if metadata.get("status") == "skip": + content_class = SkipStub + return content_class( content=content, metadata=metadata,