From 85d757302015b53a16b2dff85c50831d46a9d696 Mon Sep 17 00:00:00 2001 From: Daniel Rudolf Date: Fri, 10 Apr 2020 23:11:53 +0200 Subject: [PATCH] Update to Symfony YAML 5.0 and Twig 3.0 Pico now requires PHP 7.2.5+ --- composer.json | 6 +++--- config/config.yml.template | 2 +- content-sample/_meta.md | 2 +- index.php.dist | 4 ++-- lib/Pico.php | 27 +++++++++++++++---------- lib/TwigExtension.php | 41 +++++++++++++++++++++----------------- 6 files changed, 47 insertions(+), 35 deletions(-) diff --git a/composer.json b/composer.json index 2dfe2a4..8be85c6 100644 --- a/composer.json +++ b/composer.json @@ -31,9 +31,9 @@ "source": "https://github.com/picocms/Pico" }, "require": { - "php": ">=7.0.8", - "twig/twig": "^2.12", - "symfony/yaml" : "^3.4", + "php": ">=7.2.5", + "twig/twig": "^3.0", + "symfony/yaml" : "^5.0", "erusev/parsedown": "1.7.4", "erusev/parsedown-extra": "0.8.1" }, diff --git a/config/config.yml.template b/config/config.yml.template index 159585b..4e29227 100644 --- a/config/config.yml.template +++ b/config/config.yml.template @@ -27,7 +27,7 @@ twig_config: # Twig template engine config ## # Content # -date_format: %D %T # Pico's default date format; +date_format: "%D %T" # Pico's default date format; # See https://php.net/manual/en/function.strftime.php for more info pages_order_by_meta: author # Sort pages by meta value "author" (set "pages_order_by" to "meta") pages_order_by: alpha # Change how Pico sorts pages ("alpha" for alphabetical order, "date", or "meta") diff --git a/content-sample/_meta.md b/content-sample/_meta.md index d18f051..b686a84 100644 --- a/content-sample/_meta.md +++ b/content-sample/_meta.md @@ -1,5 +1,5 @@ --- -Logo: %theme_url%/img/pico-white.svg +Logo: "%theme_url%/img/pico-white.svg" Tagline: Making the web easy. Social: - title: Visit us on GitHub diff --git a/index.php.dist b/index.php.dist index 3dc4070..9550c59 100644 --- a/index.php.dist +++ b/index.php.dist @@ -11,8 +11,8 @@ */ // check PHP platform requirements -if (PHP_VERSION_ID < 70008) { - die('Pico requires PHP 7.0.8 or above to run'); +if (PHP_VERSION_ID < 70205) { + die('Pico requires PHP 7.2.5 or above to run'); } if (!extension_loaded('dom')) { die("Pico requires the PHP extension 'dom' to run"); diff --git a/lib/Pico.php b/lib/Pico.php index e3e54de..6cd245f 100644 --- a/lib/Pico.php +++ b/lib/Pico.php @@ -18,6 +18,13 @@ namespace picocms\Pico; +use Symfony\Component\Yaml\Parser as YamlParser; +use Twig\Environment as TwigEnvironment; +use Twig\Extension\DebugExtension as TwigDebugExtension; +use Twig\Loader\FilesystemLoader as TwigFilesystemLoader; +use Twig\Markup as TwigMarkup; +use Twig\TwigFilter; + /** * Pico * @@ -229,7 +236,7 @@ class Pico * Symfony YAML instance used for meta header parsing * * @see Pico::getYamlParser() - * @var \Symfony\Component\Yaml\Parser|null + * @var YamlParser|null */ protected $yamlParser; @@ -309,7 +316,7 @@ class Pico * Twig instance used for template parsing * * @see Pico::getTwig() - * @var \Twig_Environment|null + * @var TwigEnvironment|null */ protected $twig; @@ -1438,12 +1445,12 @@ class Pico * This method triggers the `onYamlParserRegistered` event when the Symfony * YAML parser wasn't initiated yet. * - * @return \Symfony\Component\Yaml\Parser Symfony YAML parser + * @return YamlParser Symfony YAML parser */ public function getYamlParser() { if ($this->yamlParser === null) { - $this->yamlParser = new \Symfony\Component\Yaml\Parser(); + $this->yamlParser = new YamlParser(); $this->triggerEvent('onYamlParserRegistered', [ &$this->yamlParser ]); } @@ -2080,19 +2087,19 @@ class Pico * @see http://twig.sensiolabs.org/ Twig website * @see https://github.com/twigphp/Twig Twig on GitHub * - * @return \Twig_Environment|null Twig template engine + * @return TwigEnvironment|null Twig template engine */ public function getTwig() { if ($this->twig === null) { $twigConfig = $this->getConfig('twig_config'); - $twigLoader = new \Twig_Loader_Filesystem($this->getThemesDir() . $this->getTheme()); - $this->twig = new \Twig_Environment($twigLoader, $twigConfig); + $twigLoader = new TwigFilesystemLoader($this->getThemesDir() . $this->getTheme()); + $this->twig = new TwigEnvironment($twigLoader, $twigConfig); $this->twig->addExtension(new TwigExtension($this)); if (!empty($twigConfig['debug'])) { - $this->twig->addExtension(new \Twig_Extension_Debug()); + $this->twig->addExtension(new TwigDebugExtension()); } // register content filter @@ -2100,7 +2107,7 @@ class Pico // this is the reason why we can't register this filter as part of PicoTwigExtension $pico = $this; $pages = &$this->pages; - $this->twig->addFilter(new \Twig_SimpleFilter( + $this->twig->addFilter(new TwigFilter( 'content', function ($page) use ($pico, &$pages) { if (isset($pages[$page])) { @@ -2141,7 +2148,7 @@ class Pico 'theme_url' => $this->getConfig('themes_url') . $this->getTheme(), 'site_title' => $this->getConfig('site_title'), 'meta' => $this->meta, - 'content' => new \Twig_Markup($this->content, 'UTF-8'), + 'content' => new TwigMarkup($this->content, 'UTF-8'), 'pages' => $this->pages, 'previous_page' => $this->previousPage, 'current_page' => $this->currentPage, diff --git a/lib/TwigExtension.php b/lib/TwigExtension.php index 3f8df6f..eb58274 100644 --- a/lib/TwigExtension.php +++ b/lib/TwigExtension.php @@ -12,6 +12,11 @@ namespace picocms\Pico; +use Twig\Error\RuntimeError as TwigRuntimeError; +use Twig\Extension\AbstractExtension as AbstractTwigExtension; +use Twig\TwigFilter; +use Twig\TwigFunction; + /** * Pico's Twig extension to implement additional filters * @@ -20,7 +25,7 @@ namespace picocms\Pico; * @license http://opensource.org/licenses/MIT The MIT License * @version 3.0 */ -class TwigExtension extends \Twig_Extension +class TwigExtension extends AbstractTwigExtension { /** * Current instance of Pico @@ -69,20 +74,20 @@ class TwigExtension extends \Twig_Extension * * @see Twig_ExtensionInterface::getFilters() * - * @return \Twig_SimpleFilter[] array of Pico's Twig filters + * @return TwigFilter[] array of Pico's Twig filters */ public function getFilters() { return [ - 'markdown' => new \Twig_SimpleFilter( + 'markdown' => new TwigFilter( 'markdown', [ $this, 'markdownFilter' ], [ 'is_safe' => [ 'html' ] ] ), - 'map' => new \Twig_SimpleFilter('map', [ $this, 'mapFilter' ]), - 'sort_by' => new \Twig_SimpleFilter('sort_by', [ $this, 'sortByFilter' ]), - 'link' => new \Twig_SimpleFilter('link', [ $this->pico, 'getPageUrl' ]), - 'url' => new \Twig_SimpleFilter('url', [ $this->pico, 'substituteUrl' ]), + 'map' => new TwigFilter('map', [ $this, 'mapFilter' ]), + 'sort_by' => new TwigFilter('sort_by', [ $this, 'sortByFilter' ]), + 'link' => new TwigFilter('link', [ $this->pico, 'getPageUrl' ]), + 'url' => new TwigFilter('url', [ $this->pico, 'substituteUrl' ]), ]; } @@ -91,14 +96,14 @@ class TwigExtension extends \Twig_Extension * * @see Twig_ExtensionInterface::getFunctions() * - * @return \Twig_SimpleFunction[] array of Pico's Twig functions + * @return TwigFunction[] array of Pico's Twig functions */ public function getFunctions() { return [ - 'url_param' => new \Twig_SimpleFunction('url_param', [ $this, 'urlParamFunction' ]), - 'form_param' => new \Twig_SimpleFunction('form_param', [ $this, 'formParamFunction' ]), - 'pages' => new \Twig_SimpleFunction('pages', [ $this, 'pagesFunction' ]), + 'url_param' => new TwigFunction('url_param', [ $this, 'urlParamFunction' ]), + 'form_param' => new TwigFunction('form_param', [ $this, 'formParamFunction' ]), + 'pages' => new TwigFunction('pages', [ $this, 'pagesFunction' ]), ]; } @@ -138,12 +143,12 @@ class TwigExtension extends \Twig_Extension * * @return array mapped values * - * @throws \Twig_Error_Runtime + * @throws TwigRuntimeError */ public function mapFilter($var, $mapKeyPath) { if (!is_array($var) && (!is_object($var) || !($var instanceof \Traversable))) { - throw new \Twig_Error_Runtime(sprintf( + throw new TwigRuntimeError(sprintf( 'The map filter only works with arrays or "Traversable", got "%s"', is_object($var) ? get_class($var) : gettype($var) )); @@ -180,20 +185,20 @@ class TwigExtension extends \Twig_Extension * * @return array sorted array * - * @throws \Twig_Error_Runtime + * @throws TwigRuntimeError */ public function sortByFilter($var, $sortKeyPath, $fallback = 'bottom') { if (is_object($var) && ($var instanceof \Traversable)) { $var = iterator_to_array($var, true); } elseif (!is_array($var)) { - throw new \Twig_Error_Runtime(sprintf( + throw new TwigRuntimeError(sprintf( 'The sort_by filter only works with arrays or "Traversable", got "%s"', is_object($var) ? get_class($var) : gettype($var) )); } if (($fallback !== 'top') && ($fallback !== 'bottom') && ($fallback !== 'keep') && ($fallback !== "remove")) { - throw new \Twig_Error_Runtime( + throw new TwigRuntimeError( 'The sort_by filter only supports the "top", "bottom", "keep" and "remove" fallbacks' ); } @@ -423,7 +428,7 @@ class TwigExtension extends \Twig_Extension * * @return array[] the data of the matched pages * - * @throws \Twig_Error_Runtime + * @throws TwigRuntimeError */ public function pagesFunction($start = '', $depth = 0, $depthOffset = 0, $offset = 1) { @@ -445,7 +450,7 @@ class TwigExtension extends \Twig_Extension $depthOffset = $depthOffset + $offset; if (($depth !== null) && ($depth < 0)) { - throw new \Twig_Error_Runtime('The pages function doesn\'t support negative depths'); + throw new TwigRuntimeError('The pages function doesn\'t support negative depths'); } $pageTree = $this->getPico()->getPageTree();