157 lines
3.3 KiB
PHP
157 lines
3.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @author Tassos Marinos <info@tassos.gr>
|
|
* @link https://www.tassos.gr
|
|
* @copyright Copyright © 2024 Tassos All Rights Reserved
|
|
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
|
|
*/
|
|
|
|
namespace NRFramework;
|
|
|
|
defined('_JEXEC') or die('Restricted access');
|
|
|
|
use NRFramework\Factory;
|
|
use Joomla\CMS\Uri\Uri;
|
|
|
|
class URL
|
|
{
|
|
/**
|
|
* The path.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $path;
|
|
|
|
/**
|
|
* The Factory.
|
|
*
|
|
* @var Factory
|
|
*/
|
|
private $factory;
|
|
|
|
/**
|
|
* Class constructor
|
|
*/
|
|
public function __construct($path, $factory = null)
|
|
{
|
|
$this->path = trim($path ?? '');
|
|
$this->factory = $factory ? $factory : new Factory();
|
|
}
|
|
|
|
public function getInstance()
|
|
{
|
|
return clone Uri::getInstance($this->path);
|
|
}
|
|
|
|
public function getDomainName()
|
|
{
|
|
return strtolower(str_ireplace('www.', '', $this->getInstance()->getHost()));
|
|
}
|
|
|
|
public function isAbsolute()
|
|
{
|
|
return !is_null($this->getInstance()->getScheme());
|
|
}
|
|
|
|
public function isInternal()
|
|
{
|
|
if (!$this->path)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
$host = $this->getInstance()->getHost();
|
|
|
|
if (is_null($host))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
$siteHost = $this->factory->getURI()->getHost();
|
|
|
|
return preg_match('#' . preg_quote($siteHost, '#') . '#', $host) ? true : false;
|
|
}
|
|
|
|
/**
|
|
* Transform a relative path to absolute URL
|
|
*
|
|
* @return string
|
|
*/
|
|
public function toAbsolute()
|
|
{
|
|
if (empty($this->path))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Check if it's already absolute URL
|
|
if ($this->isAbsolute())
|
|
{
|
|
return $this->path;
|
|
}
|
|
|
|
$basePath = \parse_url(Uri::root());
|
|
|
|
$parse_path = $this->getInstance();
|
|
$parse_path->setScheme($basePath['scheme']);
|
|
$parse_path->setHost($basePath['host']);
|
|
$parse_path->setPath($basePath['path'] . $parse_path->getPath());
|
|
|
|
return $parse_path->toString();
|
|
}
|
|
|
|
/**
|
|
* CDNify a resource
|
|
*
|
|
* @param string $host The hostname of the CDN to be used
|
|
* @param string $scheme
|
|
*
|
|
* @return string
|
|
*/
|
|
public function cdnify($host, $scheme = 'https')
|
|
{
|
|
// Allow only internal URLs
|
|
if (!$this->isInternal())
|
|
{
|
|
return $this->path;
|
|
}
|
|
|
|
// Allow only resource files
|
|
$path = $this->getInstance()->getPath();
|
|
|
|
if (strpos($path, '.') === false)
|
|
{
|
|
return $this->path;
|
|
}
|
|
|
|
return $this->setHost($host, $scheme);
|
|
}
|
|
|
|
public function setHost($domain, $scheme = 'https')
|
|
{
|
|
if (empty($this->path))
|
|
{
|
|
return;
|
|
}
|
|
|
|
$url_new = $this->getInstance();
|
|
$url_new->setScheme($scheme);
|
|
$url_new->setHost($domain);
|
|
|
|
// Path should always start with a slash
|
|
if ($url_new->getPath())
|
|
{
|
|
$url_new->setPath('/' . ltrim($url_new->getPath(), '/'));
|
|
}
|
|
|
|
$result = $url_new->toString();
|
|
|
|
if ($scheme == '//')
|
|
{
|
|
$result = str_replace('://', '', $result);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
} |