|
@@ -137,6 +137,14 @@ class Pico
|
|
|
*/
|
|
|
protected $meta;
|
|
|
|
|
|
+ /**
|
|
|
+ * Parsedown Extra instance used for markdown parsing
|
|
|
+ *
|
|
|
+ * @see Pico::getParsedown()
|
|
|
+ * @var ParsedownExtra|null
|
|
|
+ */
|
|
|
+ protected $parsedown;
|
|
|
+
|
|
|
/**
|
|
|
* Parsed content being served
|
|
|
*
|
|
@@ -304,6 +312,10 @@ class Pico
|
|
|
$this->meta = $this->parseFileMeta($this->rawContent, $headers);
|
|
|
$this->triggerEvent('onMetaParsed', array(&$this->meta));
|
|
|
|
|
|
+ // register parsedown
|
|
|
+ $this->triggerEvent('onParsedownRegistration');
|
|
|
+ $this->registerParsedown();
|
|
|
+
|
|
|
// parse file content
|
|
|
$this->triggerEvent('onContentParsing', array(&$this->rawContent));
|
|
|
|
|
@@ -355,9 +367,15 @@ class Pico
|
|
|
/**
|
|
|
* Loads plugins from Pico::$pluginsDir in alphabetical order
|
|
|
*
|
|
|
- * Plugin files may be prefixed by a number (e.g. 00-PicoDeprecated.php)
|
|
|
- * to indicate their processing order. You MUST NOT use prefixes between
|
|
|
- * 00 and 19 (reserved for built-in plugins).
|
|
|
+ * Plugin files MAY be prefixed by a number (e.g. 00-PicoDeprecated.php)
|
|
|
+ * to indicate their processing order. Plugins without a prefix will be
|
|
|
+ * loaded last. If you want to use a prefix, you MUST consider the
|
|
|
+ * following directives:
|
|
|
+ * - 00 to 19: Reserved
|
|
|
+ * - 20 to 39: Low level code helper plugins
|
|
|
+ * - 40 to 59: Plugins manipulating routing or the pages array
|
|
|
+ * - 60 to 79: Plugins hooking into template or markdown parsing
|
|
|
+ * - 80 to 99: Plugins using the `onPageRendered` event
|
|
|
*
|
|
|
* @see Pico::getPlugin()
|
|
|
* @see Pico::getPlugins()
|
|
@@ -779,6 +797,28 @@ class Pico
|
|
|
return $this->meta;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Registers the Parsedown Extra markdown parser
|
|
|
+ *
|
|
|
+ * @see Pico::getParsedown()
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ protected function registerParsedown()
|
|
|
+ {
|
|
|
+ $this->parsedown = new ParsedownExtra();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Returns the Parsedown Extra markdown parser
|
|
|
+ *
|
|
|
+ * @see Pico::registerParsedown()
|
|
|
+ * @return ParsedownExtra|null Parsedown Extra markdown parser
|
|
|
+ */
|
|
|
+ public function getParsedown()
|
|
|
+ {
|
|
|
+ return $this->parsedown;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Applies some static preparations to the raw contents of a page,
|
|
|
* e.g. removing the meta header and replacing %base_url%
|
|
@@ -839,8 +879,11 @@ class Pico
|
|
|
*/
|
|
|
public function parseFileContent($content)
|
|
|
{
|
|
|
- $parsedown = new ParsedownExtra();
|
|
|
- return $parsedown->text($content);
|
|
|
+ if ($this->parsedown === null) {
|
|
|
+ throw new LogicException("Unable to parse file contents: Parsedown instance wasn't registered yet");
|
|
|
+ }
|
|
|
+
|
|
|
+ return $this->parsedown->text($content);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1075,22 +1118,42 @@ class Pico
|
|
|
$this->twig = new Twig_Environment($twigLoader, $this->getConfig('twig_config'));
|
|
|
$this->twig->addExtension(new Twig_Extension_Debug());
|
|
|
|
|
|
- // register link filter
|
|
|
- $this->twig->addFilter(new Twig_SimpleFilter('link', array($this, 'getPageUrl')));
|
|
|
+ $this->registerTwigFilter();
|
|
|
+ }
|
|
|
|
|
|
- // register content filter
|
|
|
+ /**
|
|
|
+ * Registers Picos additional Twig filters
|
|
|
+ *
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ protected function registerTwigFilter()
|
|
|
+ {
|
|
|
$pico = $this;
|
|
|
+
|
|
|
+ // link filter
|
|
|
+ $this->twig->addFilter(new Twig_SimpleFilter('link', array($this, 'getPageUrl')));
|
|
|
+
|
|
|
+ // content filter
|
|
|
$pages = &$this->pages;
|
|
|
- $this->twig->addFilter(new Twig_SimpleFilter('content', function ($pageId) use ($pico, &$pages) {
|
|
|
- if (isset($pages[$pageId])) {
|
|
|
- $pageData = &$pages[$pageId];
|
|
|
+ $this->twig->addFilter(new Twig_SimpleFilter('content', function ($page) use ($pico, &$pages) {
|
|
|
+ if (isset($pages[$page])) {
|
|
|
+ $pageData = &$pages[$page];
|
|
|
if (!isset($pageData['content'])) {
|
|
|
$pageData['content'] = $pico->prepareFileContent($pageData['raw_content'], $pageData['meta']);
|
|
|
$pageData['content'] = $pico->parseFileContent($pageData['content']);
|
|
|
}
|
|
|
return $pageData['content'];
|
|
|
}
|
|
|
- return '';
|
|
|
+ return null;
|
|
|
+ }));
|
|
|
+
|
|
|
+ // markdown filter
|
|
|
+ $this->twig->addFilter(new Twig_SimpleFilter('markdown', function ($markdown) use ($pico) {
|
|
|
+ if ($pico->getParsedown() === null) {
|
|
|
+ throw new LogicException("Unable to parse file contents: Parsedown instance wasn't registered yet");
|
|
|
+ }
|
|
|
+
|
|
|
+ return $pico->getParsedown()->text($markdown);
|
|
|
}));
|
|
|
}
|
|
|
|
|
@@ -1098,7 +1161,7 @@ class Pico
|
|
|
* Returns the twig template engine
|
|
|
*
|
|
|
* @see Pico::registerTwig()
|
|
|
- * @return Twig_Environment|null twig template engine
|
|
|
+ * @return Twig_Environment|null Twig template engine
|
|
|
*/
|
|
|
public function getTwig()
|
|
|
{
|