Mercurial > hg > isophonics-drupal-site
diff core/lib/Drupal/Core/Path/PathMatcher.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Core/Path/PathMatcher.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,120 @@ +<?php + +namespace Drupal\Core\Path; + +use Drupal\Core\Config\ConfigFactoryInterface; +use Drupal\Core\Routing\RouteMatchInterface; +use Drupal\Core\Url; + +/** + * Provides a path matcher. + */ +class PathMatcher implements PathMatcherInterface { + + /** + * Whether the current page is the front page. + * + * @var bool + */ + protected $isCurrentFrontPage; + + /** + * The default front page. + * + * @var string + */ + protected $frontPage; + + /** + * The cache of regular expressions. + * + * @var array + */ + protected $regexes; + + /** + * The config factory service. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface + */ + protected $configFactory; + + /** + * The current route match. + * + * @var \Drupal\Core\Routing\RouteMatchInterface + */ + protected $routeMatch; + + /** + * Creates a new PathMatcher. + * + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * The config factory. + * @param \Drupal\Core\Routing\RouteMatchInterface $route_match + * The current route match. + */ + public function __construct(ConfigFactoryInterface $config_factory, RouteMatchInterface $route_match) { + $this->configFactory = $config_factory; + $this->routeMatch = $route_match; + } + + /** + * {@inheritdoc} + */ + public function matchPath($path, $patterns) { + + if (!isset($this->regexes[$patterns])) { + // Convert path settings to a regular expression. + $to_replace = [ + // Replace newlines with a logical 'or'. + '/(\r\n?|\n)/', + // Quote asterisks. + '/\\\\\*/', + // Quote <front> keyword. + '/(^|\|)\\\\<front\\\\>($|\|)/', + ]; + $replacements = [ + '|', + '.*', + '\1' . preg_quote($this->getFrontPagePath(), '/') . '\2', + ]; + $patterns_quoted = preg_quote($patterns, '/'); + $this->regexes[$patterns] = '/^(' . preg_replace($to_replace, $replacements, $patterns_quoted) . ')$/'; + } + return (bool) preg_match($this->regexes[$patterns], $path); + } + + /** + * {@inheritdoc} + */ + public function isFrontPage() { + // Cache the result as this is called often. + if (!isset($this->isCurrentFrontPage)) { + $this->isCurrentFrontPage = FALSE; + // Ensure that the code can also be executed when there is no active + // route match, like on exception responses. + if ($this->routeMatch->getRouteName()) { + $url = Url::fromRouteMatch($this->routeMatch); + $this->isCurrentFrontPage = ($url->getRouteName() && '/' . $url->getInternalPath() === $this->getFrontPagePath()); + } + } + return $this->isCurrentFrontPage; + } + + /** + * Gets the current front page path. + * + * @return string + * The front page path. + */ + protected function getFrontPagePath() { + // Lazy-load front page config. + if (!isset($this->frontPage)) { + $this->frontPage = $this->configFactory->get('system.site') + ->get('page.front'); + } + return $this->frontPage; + } + +}