first
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
@ -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();
|
Reference in New Issue
Block a user