diff --git a/docs/plugins.rst b/docs/plugins.rst index 7fe497e6..717019a8 100644 --- a/docs/plugins.rst +++ b/docs/plugins.rst @@ -83,9 +83,11 @@ article_generator_finalized article_generator invoked at th article_generator_write_article article_generator, content invoked before writing each article, the article is passed as content article_writer_finalized article_generator, writer invoked after all articles and related pages have been written, but before the article generator is closed. -get_generators generators invoked in Pelican.get_generator_classes, +get_generators pelican object invoked in Pelican.get_generator_classes, can return a Generator, or several - generator in a tuple or in a list. + generators in a tuple or in a list. +get_writer pelican object invoked in Pelican.get_writer, + can return a custom Writer. page_generator_context page_generator, metadata page_generator_preread page_generator invoked before a page is read in PageGenerator.generate_context; use if code needs to do something before every page is parsed. @@ -200,8 +202,8 @@ Adding a new generator is also really easy. You might want to have a look at :: - def get_generators(generators): + def get_generators(pelican_object): # define a new generator here if you need to - return generators + return MyGenerator signals.get_generators.connect(get_generators) diff --git a/pelican/__init__.py b/pelican/__init__.py index 8cae468c..5208c317 100644 --- a/pelican/__init__.py +++ b/pelican/__init__.py @@ -209,7 +209,20 @@ class Pelican(object): return generators def get_writer(self): - return Writer(self.output_path, settings=self.settings) + writers = [ w for w in signals.get_writer.send(self) + if isinstance(w, type) ] + writers_found = len(writers) + if writers_found == 0: + return Writer(self.output_path, settings=self.settings) + else: + _, writer = writers[0] + if writers_found == 1: + logger.debug('Found writer: {}'.format(writer)) + else: + logger.warning( + '{} writers found, using only first one: {}'.format( + writers_found, writer)) + return writer(self.output_path, settings=self.settings) def parse_arguments(): diff --git a/pelican/signals.py b/pelican/signals.py index 9eb907dc..e06b89ac 100644 --- a/pelican/signals.py +++ b/pelican/signals.py @@ -6,6 +6,7 @@ from blinker import signal initialized = signal('pelican_initialized') get_generators = signal('get_generators') +get_writer = signal('get_writer') finalized = signal('pelican_finalized') # Reader-level signals