This commit is contained in:
2024-05-20 15:37:46 +03:00
commit 00b7dbd0b7
10404 changed files with 3285853 additions and 0 deletions

View File

@ -0,0 +1,74 @@
<?php
namespace Nextend\Framework\ResourceTranslator;
class ResourceIdentifier {
/**
* @var string
*/
protected $rawKeyword = '';
/**
* @var string
*/
protected $keyword = '';
/**
* @var string
*/
protected $path = '';
/**
* @var string
*/
protected $url = '';
public function __construct($keyword, $path, $url) {
/**
* Keyword must start and end with `$` sign
*/
if (strlen($keyword) == 0) {
$keyword = '$';
} else {
if ($keyword[0] != '$') {
$keyword = '$' . $keyword;
}
if ($keyword[strlen($keyword) - 1] != '$') {
$keyword .= '$';
}
}
$this->rawKeyword = $keyword;
$this->keyword = $keyword . '/';
$this->path = rtrim($path, '/\\') . DIRECTORY_SEPARATOR;
$this->url = rtrim($url, '/') . '/';
}
public function getRawKeyword() {
return $this->rawKeyword;
}
/**
* @return string
*/
public function getKeyword() {
return $this->keyword;
}
/**
* @return string
*/
public function getPath() {
return $this->path;
}
/**
* @return string
*/
public function getUrl() {
return $this->url;
}
}

View File

@ -0,0 +1,171 @@
<?php
namespace Nextend\Framework\ResourceTranslator;
use Nextend\Framework\Filesystem\Filesystem;
use Nextend\Framework\Image\Image;
use Nextend\Framework\Pattern\SingletonTrait;
use Nextend\Framework\Settings;
use Nextend\Framework\Url\Url;
class ResourceTranslator {
use SingletonTrait;
/**
* @var ResourceIdentifier[]
*/
private static $resources = array();
private static $isProtocolRelative = true;
private static $resourceIdentifierKeywords = array();
protected function init() {
self::$isProtocolRelative = !!Settings::get('protocol-relative', 1);
self::createResource('$', Filesystem::getBasePath(), Url::getBaseUri());
Image::getInstance();
}
/**
* @param string $keyword
* @param string $path
* @param string $url
*/
public static function createResource($keyword, $path, $url) {
$resourceIdentifier = new ResourceIdentifier($keyword, $path, self::convertUrl($url));
array_unshift(self::$resources, $resourceIdentifier);
self::$resourceIdentifierKeywords[] = $resourceIdentifier->getKeyword();
}
public static function isResource($resourcePath) {
return preg_match(self::getResourceIdentifierRegexp(), $resourcePath);
}
public static function toUrl($resourcePath) {
foreach (self::$resources as $resourceIdentifier) {
$keyword = $resourceIdentifier->getKeyword();
if (strpos($resourcePath, $keyword) === 0) {
return str_replace(DIRECTORY_SEPARATOR, '/', $resourceIdentifier->getUrl() . substr($resourcePath, strlen($keyword)));
}
}
return $resourcePath;
}
public static function toPath($resourcePath) {
foreach (self::$resources as $resourceIdentifier) {
$keyword = $resourceIdentifier->getKeyword();
if (strpos($resourcePath, $keyword) === 0) {
return str_replace('/', DIRECTORY_SEPARATOR, $resourceIdentifier->getPath() . substr($resourcePath, strlen($keyword)));
}
}
return $resourcePath;
}
public static function urlToResource($originalUrl) {
$url = self::convertUrl($originalUrl);
foreach (self::$resources as $resourceIdentifier) {
if (strpos($url, $resourceIdentifier->getUrl()) === 0) {
return $resourceIdentifier->getKeyword() . substr($url, strlen($resourceIdentifier->getUrl()));
}
}
return $originalUrl;
}
public static function pathToResource($path) {
foreach (self::$resources as $resourceIdentifier) {
if (strpos($path, $resourceIdentifier->getPath()) === 0) {
return $resourceIdentifier->getKeyword() . substr($path, strlen($resourceIdentifier->getPath()));
}
}
return $path;
}
/**
* @return bool
*/
public static function isProtocolRelative() {
return self::$isProtocolRelative;
}
/**
* @return string[]
*/
public static function getResourceIdentifierKeywords() {
$keywords = array();
foreach (self::$resources as $resourceIdentifier) {
$keywords[] = $resourceIdentifier->getKeyword();
}
return $keywords;
}
public static function getResourceIdentifierUrls() {
$urls = array();
foreach (self::$resources as $resourceIdentifier) {
$urls[] = $resourceIdentifier->getUrl();
}
return $urls;
}
public static function exportData() {
$data = array();
foreach (self::$resources as $resourceIdentifier) {
$data[$resourceIdentifier->getKeyword()] = $resourceIdentifier->getUrl();
}
return $data;
}
private static function convertUrl($url) {
if (self::$isProtocolRelative) {
return preg_replace('/^http(s)?:\/\//', '//', $url);
}
return $url;
}
private static function getResourceIdentifierRegexp() {
return '/^' . join('|', array_map(function ($keyword) {
return preg_quote($keyword, '/');
}, self::$resourceIdentifierKeywords)) . '/';
}
}
ResourceTranslator::getInstance();