diff --git a/pelican/__init__.py b/pelican/__init__.py index fa636bb0..5c02ceb1 100644 --- a/pelican/__init__.py +++ b/pelican/__init__.py @@ -182,8 +182,17 @@ class Pelican(object): articles_generator = next(g for g in generators if isinstance(g, ArticlesGenerator)) - pages_generator = next(g for g in generators - if isinstance(g, PagesGenerator)) + + page_length = 0 + translation_length = 0 + hidden_page_length = 0 + hidden_translation_length = 0 + for g in generators: + if isinstance(g, PagesGenerator): + page_length += len(g.pages) + translation_length += len(g.translations) + hidden_page_length += len(g.hidden_pages) + hidden_translation_length += len(g.hidden_translations) pluralized_articles = maybe_pluralize( (len(articles_generator.articles) + @@ -196,13 +205,11 @@ class Pelican(object): 'draft', 'drafts') pluralized_pages = maybe_pluralize( - (len(pages_generator.pages) + - len(pages_generator.translations)), + (page_length + translation_length), 'page', 'pages') pluralized_hidden_pages = maybe_pluralize( - (len(pages_generator.hidden_pages) + - len(pages_generator.hidden_translations)), + (hidden_page_length + hidden_translation_length), 'hidden page', 'hidden pages') diff --git a/pelican/generators.py b/pelican/generators.py index 88752392..9d0c23dd 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -11,6 +11,8 @@ from functools import partial from itertools import chain, groupby from operator import attrgetter +from blinker import signal + from jinja2 import (BaseLoader, ChoiceLoader, Environment, FileSystemLoader, PrefixLoader, TemplateNotFound) @@ -60,6 +62,7 @@ class Generator(object): simple_loader = FileSystemLoader(os.path.join(theme_path, "themes", "simple", "templates")) + self.env = Environment( loader=ChoiceLoader([ FileSystemLoader(self._templates_path), @@ -604,28 +607,57 @@ class ArticlesGenerator(CachingGenerator): class PagesGenerator(CachingGenerator): """Generate pages""" + content_class = Page + def __init__(self, *args, **kwargs): self.pages = [] self.hidden_pages = [] self.hidden_translations = [] + self._init_signals() super(PagesGenerator, self).__init__(*args, **kwargs) signals.page_generator_init.send(self) + def _get_settings(self, key): + key = ('%s_%s' % (self.content_class.__name__, key)).upper() + return self.settings[key] + + def _get_signal_name(self, method, key): + return '%s_%s_%s' % ( + self.content_class.__name__.lower(), + method, + key + ) + + def _get_signal(self, *args, **kw): + signal_name = self._get_signal_name(*args, **kw) + return getattr(signals, signal_name) + + def _init_signals(self): + for name in ['init', 'preread', 'context', 'finalized']: + signal_name = self._get_signal_name('generator', name) + setattr(signals, signal_name, signal(signal_name)) + + signal_name = self._get_signal_name('writer', 'finalized') + setattr(signals, signal_name, signal(signal_name)) + def generate_context(self): all_pages = [] hidden_pages = [] for f in self.get_files( - self.settings['PAGE_PATHS'], - exclude=self.settings['PAGE_EXCLUDES']): + self._get_settings('paths'), + exclude=self._get_settings('excludes')): page = self.get_cached_data(f, None) if page is None: try: page = self.readers.read_file( - base_path=self.path, path=f, content_class=Page, + base_path=self.path, path=f, + content_class=self.content_class, context=self.context, - preread_signal=signals.page_generator_preread, + preread_signal=self._get_signal('generator', + 'preread'), preread_sender=self, - context_signal=signals.page_generator_context, + context_signal=self._get_signal('generator', + 'context'), context_sender=self) except Exception as e: logger.error( @@ -655,25 +687,31 @@ class PagesGenerator(CachingGenerator): self.pages, self.translations = process_translations( all_pages, - order_by=self.settings['PAGE_ORDER_BY']) + order_by=self._get_settings('order_by')) self.hidden_pages, self.hidden_translations = \ process_translations(hidden_pages) - self._update_context(('pages', 'hidden_pages')) + plurial_name = '%ss' % self.content_class.__name__.lower() + # Set aliases to access to the objects in the templates + setattr(self, plurial_name, self.pages) + setattr(self, 'hidden_%s' % plurial_name, self.hidden_pages) + self._update_context((plurial_name, 'hidden_%s' % plurial_name)) self.save_cache() self.readers.save_cache() - signals.page_generator_finalized.send(self) + self._get_signal('generator', 'finalized').send(self) def generate_output(self, writer): for page in chain(self.translations, self.pages, self.hidden_translations, self.hidden_pages): writer.write_file( page.save_as, self.get_template(page.template), - self.context, page=page, + self.context, relative_urls=self.settings['RELATIVE_URLS'], - override_output=hasattr(page, 'override_save_as')) - signals.page_writer_finalized.send(self, writer=writer) + override_output=hasattr(page, 'override_save_as'), + **{self.content_class.__name__.lower(): page} + ) + self._get_signal('writer', 'finalized').send(self, writer=writer) class StaticGenerator(Generator): diff --git a/pelican/signals.py b/pelican/signals.py index 0b10fdfa..96dfe80b 100644 --- a/pelican/signals.py +++ b/pelican/signals.py @@ -25,9 +25,10 @@ article_generator_finalized = signal('article_generator_finalized') article_generator_write_article = signal('article_generator_write_article') article_writer_finalized = signal('article_writer_finalized') -page_generator_init = signal('page_generator_init') -page_generator_finalized = signal('page_generator_finalized') -page_writer_finalized = signal('page_writer_finalized') +# Generated in PagesGenerator +# page_generator_init = signal('page_generator_init') +# page_generator_finalized = signal('page_generator_finalized') +# page_writer_finalized = signal('page_writer_finalized') static_generator_init = signal('static_generator_init') static_generator_finalized = signal('static_generator_finalized') @@ -37,8 +38,9 @@ static_generator_finalized = signal('static_generator_finalized') article_generator_preread = signal('article_generator_preread') article_generator_context = signal('article_generator_context') -page_generator_preread = signal('page_generator_preread') -page_generator_context = signal('page_generator_context') +# Generated in PagesGenerator +# page_generator_preread = signal('page_generator_preread') +# page_generator_context = signal('page_generator_context') static_generator_preread = signal('static_generator_preread') static_generator_context = signal('static_generator_context')