diff --git a/.gitignore b/.gitignore index dfcfbf0d..70262de2 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /theme/ /Vagrantfile /.vagrant +.idea/ diff --git a/composer.json b/composer.json index 840ad468..32e90265 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,8 @@ "phine/phar": "~1.0", "mnapoli/front-yaml": "~1.5", "php-di/php-di": "^5.2.1", - "psr/log": "~1.0" + "psr/log": "~1.0", + "league/event": "^2.1" }, "require-dev": { "phpunit/phpunit": "~4.5" diff --git a/couscous.yml b/couscous.yml index 68e09c1d..dcdf8a4f 100644 --- a/couscous.yml +++ b/couscous.yml @@ -13,6 +13,24 @@ scripts: baseUrl: http://couscous.io cname: couscous.io +# This config is for demo purposes only. This will be removed when this feature will be merged. +events: + listeners: + - event: 'couscous.step.after_config' + listener: 'Couscous\Event\Listener\AfterConfigListener' + - event: 'couscous.step.before_parse' + listener: 'Couscous\Event\Listener\BeforeParseListener' + - event: 'couscous.step.after_parse' + listener: 'Couscous\Event\Listener\AfterParseListener' + - event: 'couscous.step.before_render_markdown' + listener: 'Couscous\Event\Listener\BeforeRenderMarkdownListener' + - event: 'couscous.step.after_render_markdown' + listener: 'Couscous\Event\Listener\AfterRenderMarkdownListener' + - event: 'couscous.step.before_write' + listener: 'Couscous\Event\Listener\BeforeWriteListener' + - event: 'couscous.step.after_write' + listener: 'Couscous\Event\Listener\AfterWriteListener' + menu: items: getting-started: diff --git a/src/Application/config.php b/src/Application/config.php index 228beeb6..8583eeb8 100644 --- a/src/Application/config.php +++ b/src/Application/config.php @@ -10,6 +10,9 @@ DI\get('Couscous\Module\Config\Step\LoadConfig'), DI\get('Couscous\Module\Config\Step\OverrideBaseUrlForPreview'), + DI\get('Couscous\Module\Events\Step\InitEventListeners'), + DI\get('Couscous\Module\Events\Step\EmitAfterConfigEvent'), + DI\get('Couscous\Module\Scripts\Step\ExecuteBeforeScripts'), DI\get('Couscous\Module\Template\Step\UseDefaultTemplate'), @@ -25,18 +28,26 @@ DI\get('Couscous\Module\Core\Step\AddFileNameToMetadata'), + DI\get('Couscous\Module\Events\Step\EmitBeforeParseEvent'), DI\get('Couscous\Module\Markdown\Step\ParseMarkdownFrontMatter'), + DI\get('Couscous\Module\Events\Step\EmitAfterParseEvent'), DI\get('Couscous\Module\Markdown\Step\ProcessMarkdownFileName'), DI\get('Couscous\Module\Markdown\Step\RewriteMarkdownLinks'), + DI\get('Couscous\Module\Events\Step\EmitBeforeRenderMarkdownEvent'), DI\get('Couscous\Module\Markdown\Step\RenderMarkdown'), + DI\get('Couscous\Module\Events\Step\EmitAfterRenderMarkdownEvent'), DI\get('Couscous\Module\Markdown\Step\CreateHeadingIds'), DI\get('Couscous\Module\Template\Step\AddPageListToLayoutVariables'), DI\get('Couscous\Module\Template\Step\ProcessTwigLayouts'), + DI\get('Couscous\Module\Events\Step\EmitBeforeWriteEvent'), + DI\get('Couscous\Module\Core\Step\ClearTargetDirectory'), DI\get('Couscous\Module\Core\Step\WriteFiles'), + DI\get('Couscous\Module\Events\Step\EmitAfterWriteEvent'), + DI\get('Couscous\Module\Scripts\Step\ExecuteAfterScripts'), ], diff --git a/src/Event/EventManager.php b/src/Event/EventManager.php new file mode 100644 index 00000000..a6726efe --- /dev/null +++ b/src/Event/EventManager.php @@ -0,0 +1,38 @@ + + */ +class EventManager +{ + /** + * The emitter instance. + * + * @var Emitter + */ + protected static $emitter; + + /** + * Returns the static instance of the emitter. + * + * @return Emitter + */ + public static function &emitter() + { + if(!self::$emitter) { + self::$emitter = new Emitter(); + } + return self::$emitter; + } +} diff --git a/src/Event/Listener/AfterConfigListener.php b/src/Event/Listener/AfterConfigListener.php new file mode 100644 index 00000000..d6b80814 --- /dev/null +++ b/src/Event/Listener/AfterConfigListener.php @@ -0,0 +1,28 @@ + + */ +class AfterConfigListener extends BaseListener +{ + + /** + * Handle the event. + * + * @param EventInterface $event + */ + public function handle(EventInterface $event) + { + $project = func_get_arg(1)['project']; + + var_dump('after_config'); + } +} diff --git a/src/Event/Listener/AfterParseListener.php b/src/Event/Listener/AfterParseListener.php new file mode 100644 index 00000000..9eed0eaf --- /dev/null +++ b/src/Event/Listener/AfterParseListener.php @@ -0,0 +1,28 @@ + + */ +class AfterParseListener extends BaseListener +{ + + /** + * Handle the event. + * + * @param EventInterface $event + */ + public function handle(EventInterface $event) + { + $project = func_get_arg(1)['project']; + + var_dump('after_parse'); + } +} diff --git a/src/Event/Listener/AfterRenderMarkdownListener.php b/src/Event/Listener/AfterRenderMarkdownListener.php new file mode 100644 index 00000000..fbe06bfb --- /dev/null +++ b/src/Event/Listener/AfterRenderMarkdownListener.php @@ -0,0 +1,28 @@ + + */ +class AfterRenderMarkdownListener extends BaseListener +{ + + /** + * Handle the event. + * + * @param EventInterface $event + */ + public function handle(EventInterface $event) + { + $project = func_get_arg(1)['project']; + + var_dump('after_render_markdown'); + } +} diff --git a/src/Event/Listener/AfterWriteListener.php b/src/Event/Listener/AfterWriteListener.php new file mode 100644 index 00000000..14571f5a --- /dev/null +++ b/src/Event/Listener/AfterWriteListener.php @@ -0,0 +1,28 @@ + + */ +class AfterWriteListener extends BaseListener +{ + + /** + * Handle the event. + * + * @param EventInterface $event + */ + public function handle(EventInterface $event) + { + $project = func_get_arg(1)['project']; + + var_dump('after_write'); + } +} diff --git a/src/Event/Listener/BaseListener.php b/src/Event/Listener/BaseListener.php new file mode 100644 index 00000000..a61dc683 --- /dev/null +++ b/src/Event/Listener/BaseListener.php @@ -0,0 +1,42 @@ + + */ +class BaseListener implements ListenerInterface +{ + + /** + * Handle the event. + * + * @param EventInterface $event + * + * @return void + */ + public function handle(EventInterface $event) + { + } + + /** + * Check whether the listener is the given parameter. + * + * @param mixed $listener + * + * @return bool + */ + public function isListener($listener) + { + return $listener === $this; + } +} diff --git a/src/Event/Listener/BeforeParseListener.php b/src/Event/Listener/BeforeParseListener.php new file mode 100644 index 00000000..4199f901 --- /dev/null +++ b/src/Event/Listener/BeforeParseListener.php @@ -0,0 +1,35 @@ + + */ +class BeforeParseListener extends BaseListener +{ + + /** + * Handle the event. + * + * @param EventInterface $event + */ + public function handle(EventInterface $event) + { + $project = func_get_arg(1)['project']; + + var_dump('before_parse'); + + /** @var MarkdownFile[] $markdownFiles */ + $markdownFiles = $project->findFilesByType('Couscous\Module\Markdown\Model\MarkdownFile'); + + foreach ($markdownFiles as $file) { + $file->content = str_replace('Couscous', '**CakePlugins**', $file->content); + } + } +} diff --git a/src/Event/Listener/BeforeRenderMarkdownListener.php b/src/Event/Listener/BeforeRenderMarkdownListener.php new file mode 100644 index 00000000..38147c73 --- /dev/null +++ b/src/Event/Listener/BeforeRenderMarkdownListener.php @@ -0,0 +1,28 @@ + + */ +class BeforeRenderMarkdownListener extends BaseListener +{ + + /** + * Handle the event. + * + * @param EventInterface $event + */ + public function handle(EventInterface $event) + { + $project = func_get_arg(1)['project']; + + var_dump('before_render_markdown'); + } +} diff --git a/src/Event/Listener/BeforeWriteListener.php b/src/Event/Listener/BeforeWriteListener.php new file mode 100644 index 00000000..c46d4eda --- /dev/null +++ b/src/Event/Listener/BeforeWriteListener.php @@ -0,0 +1,28 @@ + + */ +class BeforeWriteListener extends BaseListener +{ + + /** + * Handle the event. + * + * @param EventInterface $event + */ + public function handle(EventInterface $event) + { + $project = func_get_arg(1)['project']; + + var_dump('before_write'); + } +} diff --git a/src/Module/Events/Step/EmitAfterConfigEvent.php b/src/Module/Events/Step/EmitAfterConfigEvent.php new file mode 100644 index 00000000..b6c38ca3 --- /dev/null +++ b/src/Module/Events/Step/EmitAfterConfigEvent.php @@ -0,0 +1,21 @@ + + */ +class EmitAfterConfigEvent implements Step +{ + public function __invoke(Project $project) + { + $emitter = EventManager::emitter(); + $emitter->emit('couscous.step.after_config', ['project' => $project]); + } +} diff --git a/src/Module/Events/Step/EmitAfterParseEvent.php b/src/Module/Events/Step/EmitAfterParseEvent.php new file mode 100644 index 00000000..fef90d8c --- /dev/null +++ b/src/Module/Events/Step/EmitAfterParseEvent.php @@ -0,0 +1,21 @@ + + */ +class EmitAfterParseEvent implements Step +{ + public function __invoke(Project $project) + { + $emitter = EventManager::emitter(); + $emitter->emit('couscous.step.after_parse', ['project' => $project]); + } +} diff --git a/src/Module/Events/Step/EmitAfterRenderMarkdownEvent.php b/src/Module/Events/Step/EmitAfterRenderMarkdownEvent.php new file mode 100644 index 00000000..66c8a0c4 --- /dev/null +++ b/src/Module/Events/Step/EmitAfterRenderMarkdownEvent.php @@ -0,0 +1,21 @@ + + */ +class EmitAfterRenderMarkdownEvent implements Step +{ + public function __invoke(Project $project) + { + $emitter = EventManager::emitter(); + $emitter->emit('couscous.step.after_render_markdown', ['project' => $project]); + } +} diff --git a/src/Module/Events/Step/EmitAfterWriteEvent.php b/src/Module/Events/Step/EmitAfterWriteEvent.php new file mode 100644 index 00000000..f1d7873a --- /dev/null +++ b/src/Module/Events/Step/EmitAfterWriteEvent.php @@ -0,0 +1,21 @@ + + */ +class EmitAfterWriteEvent implements Step +{ + public function __invoke(Project $project) + { + $emitter = EventManager::emitter(); + $emitter->emit('couscous.step.after_write', ['project' => $project]); + } +} diff --git a/src/Module/Events/Step/EmitBeforeParseEvent.php b/src/Module/Events/Step/EmitBeforeParseEvent.php new file mode 100644 index 00000000..11ef6875 --- /dev/null +++ b/src/Module/Events/Step/EmitBeforeParseEvent.php @@ -0,0 +1,21 @@ + + */ +class EmitBeforeParseEvent implements Step +{ + public function __invoke(Project $project) + { + $emitter = EventManager::emitter(); + $emitter->emit('couscous.step.before_parse', ['project' => $project]); + } +} diff --git a/src/Module/Events/Step/EmitBeforeRenderMarkdownEvent.php b/src/Module/Events/Step/EmitBeforeRenderMarkdownEvent.php new file mode 100644 index 00000000..1575851f --- /dev/null +++ b/src/Module/Events/Step/EmitBeforeRenderMarkdownEvent.php @@ -0,0 +1,21 @@ + + */ +class EmitBeforeRenderMarkdownEvent implements Step +{ + public function __invoke(Project $project) + { + $emitter = EventManager::emitter(); + $emitter->emit('couscous.step.before_render_markdown', ['project' => $project]); + } +} diff --git a/src/Module/Events/Step/EmitBeforeWriteEvent.php b/src/Module/Events/Step/EmitBeforeWriteEvent.php new file mode 100644 index 00000000..8b892576 --- /dev/null +++ b/src/Module/Events/Step/EmitBeforeWriteEvent.php @@ -0,0 +1,21 @@ + + */ +class EmitBeforeWriteEvent implements Step +{ + public function __invoke(Project $project) + { + $emitter = EventManager::emitter(); + $emitter->emit('couscous.step.before_write', ['project' => $project]); + } +} diff --git a/src/Module/Events/Step/InitEventListeners.php b/src/Module/Events/Step/InitEventListeners.php new file mode 100644 index 00000000..1cfde0af --- /dev/null +++ b/src/Module/Events/Step/InitEventListeners.php @@ -0,0 +1,30 @@ + + */ +class InitEventListeners implements Step +{ + public function __invoke(Project $project) + { + $emitter = EventManager::emitter(); + + $listeners = (array)$project->metadata['events.listeners']; + + foreach ($listeners as $listener) { + $emitter->addListener( + $listener['event'], + new $listener['listener'], + array_key_exists('priority', $listener) ? $listener['priority'] : null + ); + } + } +}