diff --git a/plugins/00-PicoDeprecated.php b/plugins/00-PicoDeprecated.php new file mode 100644 index 0000000..92fb73b --- /dev/null +++ b/plugins/00-PicoDeprecated.php @@ -0,0 +1,319 @@ +isStatusChanged()) { + $this->setEnabled(true, true, true); + } + break; + } + } + + if ($this->isEnabled()) { + $this->triggerEvent('plugins_loaded'); + } + } + + /** + * Triggers the deprecated event config_loaded($config), tries to read + * {@path "config.php"} in Picos root dir, enables the plugins + * {@link PicoParsePagesContent} and {@link PicoExcerpt} and defines the + * deprecated constants CONTENT_DIR and CONTENT_EXT + * + * @see DummyPlugin::onConfigLoaded() + */ + public function onConfigLoaded(&$config) + { + if (file_exists(ROOT_DIR . 'config.php')) { + // config.php in ROOT_DIR is deprecated; use CONFIG_DIR instead + $newConfig = require(ROOT_DIR . 'config.php'); + if (is_array($newConfig)) { + $config = $newConfig + $config; + } + } + + // enable PicoParsePagesContent and PicoExcerpt + // we can't enable them during onPluginsLoaded because we can't know + // if the user disabled us (PicoDeprecated) manually in the config + if (isset($plugins['PicoParsePagesContent'])) { + // parse all pages content if this plugin hasn't + // be explicitly enabled/disabled yet + if (!$plugins['PicoParsePagesContent']->isStatusChanged()) { + $plugins['PicoParsePagesContent']->setEnabled(true, true, true); + } + } + if (isset($plugins['PicoExcerpt'])) { + // enable excerpt plugin if it hasn't be explicitly enabled/disabled yet + if (!$plugins['PicoExcerpt']->isStatusChanged()) { + $plugins['PicoExcerpt']->setEnabled(true, true, true); + } + } + + // CONTENT_DIR constant is deprecated since v0.9, + // CONTENT_EXT constant since v1.0 + if (!defined('CONTENT_DIR')) { + define('CONTENT_DIR', $config['content_dir']); + } + if (!defined('CONTENT_EXT')) { + define('CONTENT_EXT', $config['content_ext']); + } + + $this->triggerEvent('config_loaded', array(&$config)); + } + + /** + * Triggers the deprecated event request_url($url) + * + * @see DummyPlugin::onRequestUrl() + */ + public function onRequestUrl(&$url) + { + $this->triggerEvent('request_url', array(&$url)); + } + + /** + * Sets {@link PicoDeprecated::$requestFile} to trigger the deprecated + * events after_load_content() and after_404_load_content() + * + * @see DummyPlugin::onRequestFile() + */ + public function onRequestFile(&$file) + { + $this->requestFile = &$file; + } + + /** + * Triggers the deprecated before_load_content($file) + * + * @see DummyPlugin::onContentLoading() + */ + public function onContentLoading(&$file) + { + $this->triggerEvent('before_load_content', array(&$file)); + } + + /** + * Triggers the deprecated event after_load_content($file, $rawContent) + * + * @see DummyPlugin::onContentLoaded() + */ + public function onContentLoaded(&$rawContent) + { + $this->triggerEvent('after_load_content', array(&$this->requestFile, &$rawContent)); + } + + /** + * Triggers the deprecated before_404_load_content($file) + * + * @see DummyPlugin::on404ContentLoading() + */ + public function on404ContentLoading(&$file) + { + $this->triggerEvent('before_404_load_content', array(&$file)); + } + + /** + * Triggers the deprecated event after_404_load_content($file, $rawContent) + * + * @see DummyPlugin::on404ContentLoaded() + */ + public function on404ContentLoaded(&$rawContent) + { + $this->triggerEvent('after_404_load_content', array(&$this->requestFile, &$rawContent)); + } + + /** + * Triggers the deprecated event before_read_file_meta($headers) + * + * @see DummyPlugin::onMetaHeaders() + */ + public function onMetaHeaders(&$headers) + { + $this->triggerEvent('before_read_file_meta', array(&$headers)); + } + + /** + * Triggers the deprecated event file_meta($meta) + * + * @see DummyPlugin::onMetaParsed() + */ + public function onMetaParsed(&$meta) + { + $this->triggerEvent('file_meta', array(&$meta)); + } + + /** + * Triggers the deprecated event before_parse_content($rawContent) + * + * @see DummyPlugin::onContentParsing() + */ + public function onContentParsing(&$rawContent) + { + $this->triggerEvent('before_parse_content', array(&$rawContent)); + } + + /** + * Triggers the deprecated events after_parse_content($content) and + * content_parsed($content) + * + * @see DummyPlugin::onContentParsed() + */ + public function onContentParsed(&$content) + { + $this->triggerEvent('after_parse_content', array(&$content)); + + // deprecated since v0.8 + $this->triggerEvent('content_parsed', array(&$content)); + } + + /** + * Triggers the deprecated event get_page_data($pages, $meta) + * + * @see DummyPlugin::onSinglePageLoaded() + */ + public function onSinglePageLoaded(&$pageData) + { + // remove array keys + $pages = array(); + foreach ($pageData as &$page) { + $pages[] = &$page; + } + + $this->triggerEvent('get_page_data', array(&$pages, $pageData['meta'])); + } + + /** + * Triggers the deprecated event get_pages($pages, $currentPage, $previousPage, $nextPage) + * + * @see DummyPlugin::onPagesLoaded() + */ + public function onPagesLoaded(&$pages, &$currentPage, &$previousPage, &$nextPage) + { + $this->triggerEvent('get_pages', array(&$pages, &$currentPage, &$previousPage, &$nextPage)); + } + + /** + * Triggers the deprecated event before_twig_register() + * + * @see DummyPlugin::onTwigRegistration() + */ + public function onTwigRegistration() + { + $this->triggerEvent('before_twig_register'); + } + + /** + * Triggers the deprecated event before_render($twigVariables, $twig, $templateName) + * + * @see DummyPlugin::onPageRendering() + */ + public function onPageRendering(&$twig, &$twigVariables, &$templateName) + { + // template name contains file extension since Pico 1.0 + $fileExtension = ''; + if (($fileExtensionPos = strrpos($templateName, '.')) !== false) { + $fileExtension = substr($templateName, $fileExtensionPos); + $templateName = substr($templateName, 0, $fileExtensionPos); + } + + $this->triggerEvent('before_render', array(&$twigVariables, &$twig, &$templateName)); + + // add original file extension + $templateName = $templateName . $fileExtension; + } + + /** + * Triggers the deprecated event after_render($output) + * + * @see DummyPlugin::onPageRendered() + */ + public function onPageRendered(&$output) + { + $this->triggerEvent('after_render', array(&$output)); + } + + /** + * Triggers a deprecated event on all plugins + * + * @param string $eventName event to trigger + * @param array $params parameters to pass + * @return void + */ + protected function triggerEvent($eventName, array $params = array()) + { + foreach ($this->getPlugins() as $plugin) { + if (method_exists($plugin, $eventName)) { + call_user_func_array(array($plugin, $eventName), $params); + } + } + } +} diff --git a/plugins/01-PicoParsePagesContent.php b/plugins/01-PicoParsePagesContent.php new file mode 100644 index 0000000..5b2ea36 --- /dev/null +++ b/plugins/01-PicoParsePagesContent.php @@ -0,0 +1,40 @@ +prepareFileContent($pageData['raw_content']); + $pageData['content'] = $this->parseFileContent($pageData['content']); + } + } +} diff --git a/plugins/02-PicoExcerpt.php b/plugins/02-PicoExcerpt.php new file mode 100644 index 0000000..3767cc7 --- /dev/null +++ b/plugins/02-PicoExcerpt.php @@ -0,0 +1,79 @@ +. + * + * @author Daniel Rudolf + * @link http://picocms.org + * @license http://opensource.org/licenses/MIT + * @version 1.0 + */ +class PicoExcerpt extends AbstractPicoPlugin +{ + /** + * This plugin is disabled by default + * + * @see AbstractPicoPlugin::$enabled + */ + protected $enabled = false; + + /** + * This plugin depends on {@link PicoParsePagesContent} + * + * @see AbstractPicoPlugin::$dependsOn + */ + protected $dependsOn = array('PicoParsePagesContent'); + + /** + * Adds the default excerpt length of 50 words to the config + * + * @see DummyPlugin::onConfigLoaded() + */ + public function onConfigLoaded(&$config) + { + if (!isset($config['excerpt_length'])) { + $config['excerpt_length'] = 50; + } + } + + /** + * Creates a excerpt for the contents of each page + * + * @see DummyPlugin::onSinglePageLoaded() + */ + public function onSinglePageLoaded(&$pageData) + { + if (!isset($pageData['excerpt'])) { + $pageData['excerpt'] = $this->createExcerpt( + strip_tags($pageData['content']), + $this->getConfig('excerpt_length') + ); + } + } + + /** + * Helper function to create a excerpt of a string + * + * @param string $string the string to create a excerpt from + * @param int $wordLimit the maximum number of words the excerpt should be long + * @return string excerpt of $string + */ + protected function createExcerpt($string, $wordLimit) + { + $words = explode(' ', $string); + if (count($words) > $wordLimit) { + return trim(implode(' ', array_slice($words, 0, $wordLimit))) . '…'; + } + return $string; + } +}