* * This file was created by splitting up an original file into multiple files, * which in turn was previously part of the project's main repository. The * version control history of these files apply accordingly, available from * the following original locations: * * * * * SPDX-License-Identifier: MIT * License-Filename: LICENSE */ /** * Maintains backward compatibility with themes using API version 1, written * for Pico 1.0 * * @author Daniel Rudolf * @link http://picocms.org * @license http://opensource.org/licenses/MIT The MIT License * @version 2.1 */ class PicoThemeApi1CompatPlugin extends AbstractPicoCompatPlugin { /** * This plugin extends {@see PicoThemeApi2CompatPlugin} * * @var string[] */ protected $dependsOn = array('PicoThemeApi2CompatPlugin'); /** * Lowers the page's meta headers * * @see PicoThemeApi1CompatPlugin::lowerFileMeta() * * @param string[] &$meta parsed meta data */ public function onMetaParsed(array &$meta) { $this->lowerFileMeta($meta); } /** * Lowers the page's meta headers * * @see PicoThemeApi1CompatPlugin::lowerFileMeta() * * @param array &$pageData data of the loaded page */ public function onSinglePageLoaded(array &$pageData) { // don't lower the file meta of the requested page, // it was already lowered during the onMetaParsed event $contentDir = $this->getPico()->getConfig('content_dir'); $contentExt = $this->getPico()->getConfig('content_ext'); if ($contentDir . $pageData['id'] . $contentExt !== $this->getPico()->getRequestFile()) { $this->lowerFileMeta($pageData['meta']); } } /** * Handles .html Twig templates and re-introcudes the Twig variables * rewrite_url and is_front_page * * @param string &$templateName file name of the template * @param array &$twigVariables template variables */ public function onPageRendering(&$templateName, array &$twigVariables) { if (!isset($twigVariables['rewrite_url'])) { $twigVariables['rewrite_url'] = $this->getPico()->isUrlRewritingEnabled(); } if (!isset($twigVariables['is_front_page'])) { $contentDir = $this->getPico()->getConfig('content_dir'); $contentExt = $this->getPico()->getConfig('content_ext'); $requestFile = $this->getPico()->getRequestFile(); $twigVariables['is_front_page'] = ($requestFile === $contentDir . 'index' . $contentExt); } // API v2 requires themes to use .twig as file extension // try to load the template and if this fails, try .html instead (as of API v1) $templateNameInfo = pathinfo($templateName) + array('extension' => ''); $twig = $this->getPico()->getTwig(); try { $twig->loadTemplate($templateName); } catch (Twig_Error_Loader $e) { if ($templateNameInfo['extension'] === 'twig') { try { $twig->loadTemplate($templateNameInfo['filename'] . '.html'); $templateName = $templateNameInfo['filename'] . '.html'; $templateNameInfo['extension'] = 'html'; } catch (Twig_Error_Loader $e) { // template doesn't exist, Twig will very likely fail later } } } } /** * Lowers a page's meta headers as with Pico 1.0 and older * * This makes unregistered meta headers available using lowered array keys * and matches registered meta headers in a case-insensitive manner. * * @param array &$meta meta data */ protected function lowerFileMeta(array &$meta) { $metaHeaders = $this->getPico()->getMetaHeaders(); // get unregistered meta $unregisteredMeta = array(); foreach ($meta as $key => $value) { if (!in_array($key, $metaHeaders)) { $unregisteredMeta[$key] = &$meta[$key]; } } // Pico 1.0 lowered unregistered meta unsolicited... if ($unregisteredMeta) { $metaHeadersLowered = array_change_key_case($metaHeaders, CASE_LOWER); foreach ($unregisteredMeta as $key => $value) { $keyLowered = strtolower($key); if (isset($metaHeadersLowered[$keyLowered])) { $registeredKey = $metaHeadersLowered[$keyLowered]; if ($meta[$registeredKey] === '') { $meta[$registeredKey] = &$unregisteredMeta[$key]; } } elseif (!isset($meta[$keyLowered]) || ($meta[$keyLowered] === '')) { $meta[$keyLowered] = &$unregisteredMeta[$key]; } } } } /** * {@inheritDoc} */ public function getApiVersion() { return PicoDeprecated::API_VERSION_3; } }