Commit 5f2a612c by Alexander Makarov

Moved file and path related methods from StringHelper to FileHelper, renamed…

Moved file and path related methods from StringHelper to FileHelper, renamed StringHelper byte methods not to be misused as string methods
parent ef51c7b2
...@@ -9,12 +9,10 @@ namespace yii\elasticsearch; ...@@ -9,12 +9,10 @@ namespace yii\elasticsearch;
use yii\base\InvalidCallException; use yii\base\InvalidCallException;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\base\NotSupportedException;
use yii\db\ActiveRecordInterface;
use yii\db\BaseActiveRecord; use yii\db\BaseActiveRecord;
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\Json; use yii\helpers\Json;
use yii\helpers\StringHelper;
/** /**
* ActiveRecord is the base class for classes representing relational data in terms of objects. * ActiveRecord is the base class for classes representing relational data in terms of objects.
...@@ -228,7 +226,7 @@ class ActiveRecord extends BaseActiveRecord ...@@ -228,7 +226,7 @@ class ActiveRecord extends BaseActiveRecord
*/ */
public static function index() public static function index()
{ {
return Inflector::pluralize(Inflector::camel2id(StringHelper::basename(get_called_class()), '-')); return Inflector::pluralize(Inflector::camel2id(FileHelper::basename(get_called_class()), '-'));
} }
/** /**
...@@ -236,7 +234,7 @@ class ActiveRecord extends BaseActiveRecord ...@@ -236,7 +234,7 @@ class ActiveRecord extends BaseActiveRecord
*/ */
public static function type() public static function type()
{ {
return Inflector::camel2id(StringHelper::basename(get_called_class()), '-'); return Inflector::camel2id(FileHelper::basename(get_called_class()), '-');
} }
/** /**
......
<?php <?php
use yii\db\ActiveRecordInterface; use yii\db\ActiveRecordInterface;
use yii\helpers\StringHelper; use yii\helpers\FileHelper;
/** /**
* This is the template for generating a CRUD controller class file. * This is the template for generating a CRUD controller class file.
...@@ -10,9 +10,9 @@ use yii\helpers\StringHelper; ...@@ -10,9 +10,9 @@ use yii\helpers\StringHelper;
* @var yii\gii\generators\crud\Generator $generator * @var yii\gii\generators\crud\Generator $generator
*/ */
$controllerClass = StringHelper::basename($generator->controllerClass); $controllerClass = FileHelper::basename($generator->controllerClass);
$modelClass = StringHelper::basename($generator->modelClass); $modelClass = FileHelper::basename($generator->modelClass);
$searchModelClass = StringHelper::basename($generator->searchModelClass); $searchModelClass = FileHelper::basename($generator->searchModelClass);
if ($modelClass === $searchModelClass) { if ($modelClass === $searchModelClass) {
$searchModelAlias = $searchModelClass.'Search'; $searchModelAlias = $searchModelClass.'Search';
} }
...@@ -27,7 +27,7 @@ $actionParamComments = $generator->generateActionParamComments(); ...@@ -27,7 +27,7 @@ $actionParamComments = $generator->generateActionParamComments();
echo "<?php\n"; echo "<?php\n";
?> ?>
namespace <?= StringHelper::dirname(ltrim($generator->controllerClass, '\\')) ?>; namespace <?= FileHelper::dirname(ltrim($generator->controllerClass, '\\')) ?>;
use <?= ltrim($generator->modelClass, '\\') ?>; use <?= ltrim($generator->modelClass, '\\') ?>;
use <?= ltrim($generator->searchModelClass, '\\') ?><?php if (isset($searchModelAlias)):?> as <?= $searchModelAlias ?><?php endif ?>; use <?= ltrim($generator->searchModelClass, '\\') ?><?php if (isset($searchModelAlias)):?> as <?= $searchModelAlias ?><?php endif ?>;
...@@ -38,7 +38,7 @@ use yii\web\VerbFilter; ...@@ -38,7 +38,7 @@ use yii\web\VerbFilter;
/** /**
* <?= $controllerClass ?> implements the CRUD actions for <?= $modelClass ?> model. * <?= $controllerClass ?> implements the CRUD actions for <?= $modelClass ?> model.
*/ */
class <?= $controllerClass ?> extends <?= StringHelper::basename($generator->baseControllerClass) . "\n" ?> class <?= $controllerClass ?> extends <?= FileHelper::basename($generator->baseControllerClass) . "\n" ?>
{ {
public function behaviors() public function behaviors()
{ {
......
<?php <?php
use yii\helpers\StringHelper; use yii\helpers\FileHelper;
/** /**
* This is the template for generating a CRUD controller class file. * This is the template for generating a CRUD controller class file.
...@@ -9,8 +9,8 @@ use yii\helpers\StringHelper; ...@@ -9,8 +9,8 @@ use yii\helpers\StringHelper;
* @var yii\gii\generators\crud\Generator $generator * @var yii\gii\generators\crud\Generator $generator
*/ */
$modelClass = StringHelper::basename($generator->modelClass); $modelClass = FileHelper::basename($generator->modelClass);
$searchModelClass = StringHelper::basename($generator->searchModelClass); $searchModelClass = FileHelper::basename($generator->searchModelClass);
$rules = $generator->generateSearchRules(); $rules = $generator->generateSearchRules();
$labels = $generator->generateSearchLabels(); $labels = $generator->generateSearchLabels();
$searchAttributes = $generator->getSearchAttributes(); $searchAttributes = $generator->getSearchAttributes();
...@@ -19,7 +19,7 @@ $searchConditions = $generator->generateSearchConditions(); ...@@ -19,7 +19,7 @@ $searchConditions = $generator->generateSearchConditions();
echo "<?php\n"; echo "<?php\n";
?> ?>
namespace <?= StringHelper::dirname(ltrim($generator->searchModelClass, '\\')) ?>; namespace <?= FileHelper::dirname(ltrim($generator->searchModelClass, '\\')) ?>;
use yii\base\Model; use yii\base\Model;
use yii\data\ActiveDataProvider; use yii\data\ActiveDataProvider;
......
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
...@@ -28,7 +28,7 @@ use yii\widgets\ActiveForm; ...@@ -28,7 +28,7 @@ use yii\widgets\ActiveForm;
*/ */
?> ?>
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-form"> <div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-form">
<?= "<?php " ?>$form = ActiveForm::begin(); ?> <?= "<?php " ?>$form = ActiveForm::begin(); ?>
......
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
...@@ -21,7 +21,7 @@ use yii\widgets\ActiveForm; ...@@ -21,7 +21,7 @@ use yii\widgets\ActiveForm;
*/ */
?> ?>
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-search"> <div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-search">
<?= "<?php " ?>$form = ActiveForm::begin([ <?= "<?php " ?>$form = ActiveForm::begin([
'action' => ['index'], 'action' => ['index'],
......
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
...@@ -18,11 +18,11 @@ use yii\helpers\Html; ...@@ -18,11 +18,11 @@ use yii\helpers\Html;
* @var <?= ltrim($generator->modelClass, '\\') ?> $model * @var <?= ltrim($generator->modelClass, '\\') ?> $model
*/ */
$this->title = 'Create <?= Inflector::camel2words(StringHelper::basename($generator->modelClass)) ?>'; $this->title = 'Create <?= Inflector::camel2words(FileHelper::basename($generator->modelClass)) ?>';
$this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>', 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(BaseFileHelper::basename($generator->modelClass))) ?>', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;
?> ?>
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-create"> <div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-create">
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1> <h1><?= "<?= " ?>Html::encode($this->title) ?></h1>
......
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
...@@ -23,17 +23,17 @@ use <?= $generator->indexWidgetType === 'grid' ? "yii\\grid\\GridView" : "yii\\w ...@@ -23,17 +23,17 @@ use <?= $generator->indexWidgetType === 'grid' ? "yii\\grid\\GridView" : "yii\\w
* @var <?= ltrim($generator->searchModelClass, '\\') ?> $searchModel * @var <?= ltrim($generator->searchModelClass, '\\') ?> $searchModel
*/ */
$this->title = '<?= Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>'; $this->title = '<?= Inflector::pluralize(Inflector::camel2words(FileHelper::basename($generator->modelClass))) ?>';
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;
?> ?>
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-index"> <div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-index">
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1> <h1><?= "<?= " ?>Html::encode($this->title) ?></h1>
<?= "<?php " . ($generator->indexWidgetType === 'grid' ? "// " : "") ?>echo $this->render('_search', ['model' => $searchModel]); ?> <?= "<?php " . ($generator->indexWidgetType === 'grid' ? "// " : "") ?>echo $this->render('_search', ['model' => $searchModel]); ?>
<p> <p>
<?= "<?= " ?>Html::a('Create <?= StringHelper::basename($generator->modelClass) ?>', ['create'], ['class' => 'btn btn-success']) ?> <?= "<?= " ?>Html::a('Create <?= FileHelper::basename($generator->modelClass) ?>', ['create'], ['class' => 'btn btn-success']) ?>
</p> </p>
<?php if ($generator->indexWidgetType === 'grid'): ?> <?php if ($generator->indexWidgetType === 'grid'): ?>
......
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
...@@ -20,12 +20,12 @@ use yii\helpers\Html; ...@@ -20,12 +20,12 @@ use yii\helpers\Html;
* @var <?= ltrim($generator->modelClass, '\\') ?> $model * @var <?= ltrim($generator->modelClass, '\\') ?> $model
*/ */
$this->title = 'Update <?= Inflector::camel2words(StringHelper::basename($generator->modelClass)) ?>: ' . $model-><?= $generator->getNameAttribute() ?>; $this->title = 'Update <?= Inflector::camel2words(FileHelper::basename($generator->modelClass)) ?>: ' . $model-><?= $generator->getNameAttribute() ?>;
$this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>', 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(BaseFileHelper::basename($generator->modelClass))) ?>', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $model-><?= $generator->getNameAttribute() ?>, 'url' => ['view', <?= $urlParams ?>]]; $this->params['breadcrumbs'][] = ['label' => $model-><?= $generator->getNameAttribute() ?>, 'url' => ['view', <?= $urlParams ?>]];
$this->params['breadcrumbs'][] = 'Update'; $this->params['breadcrumbs'][] = 'Update';
?> ?>
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-update"> <div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-update">
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1> <h1><?= "<?= " ?>Html::encode($this->title) ?></h1>
......
<?php <?php
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
/** /**
* @var yii\web\View $this * @var yii\web\View $this
...@@ -22,10 +22,10 @@ use yii\widgets\DetailView; ...@@ -22,10 +22,10 @@ use yii\widgets\DetailView;
*/ */
$this->title = $model-><?= $generator->getNameAttribute() ?>; $this->title = $model-><?= $generator->getNameAttribute() ?>;
$this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>', 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => '<?= Inflector::pluralize(Inflector::camel2words(FileHelper::basename($generator->modelClass))) ?>', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;
?> ?>
<div class="<?= Inflector::camel2id(StringHelper::basename($generator->modelClass)) ?>-view"> <div class="<?= Inflector::camel2id(FileHelper::basename($generator->modelClass)) ?>-view">
<h1><?= "<?= " ?>Html::encode($this->title) ?></h1> <h1><?= "<?= " ?>Html::encode($this->title) ?></h1>
......
...@@ -10,7 +10,7 @@ namespace yii\gii\generators\module; ...@@ -10,7 +10,7 @@ namespace yii\gii\generators\module;
use Yii; use Yii;
use yii\gii\CodeFile; use yii\gii\CodeFile;
use yii\helpers\Html; use yii\helpers\Html;
use yii\helpers\StringHelper; use yii\helpers\FileHelper;
/** /**
* This generator will generate the skeleton code needed by a module. * This generator will generate the skeleton code needed by a module.
...@@ -119,7 +119,7 @@ EOD; ...@@ -119,7 +119,7 @@ EOD;
$files = []; $files = [];
$modulePath = $this->getModulePath(); $modulePath = $this->getModulePath();
$files[] = new CodeFile( $files[] = new CodeFile(
$modulePath . '/' . StringHelper::basename($this->moduleClass) . '.php', $modulePath . '/' . FileHelper::basename($this->moduleClass) . '.php',
$this->render("module.php") $this->render("module.php")
); );
$files[] = new CodeFile( $files[] = new CodeFile(
......
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
namespace yii\redis; namespace yii\redis;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\base\NotSupportedException;
use yii\db\BaseActiveRecord; use yii\db\BaseActiveRecord;
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper; use yii\helpers\StringHelper;
...@@ -97,7 +97,7 @@ class ActiveRecord extends BaseActiveRecord ...@@ -97,7 +97,7 @@ class ActiveRecord extends BaseActiveRecord
*/ */
public static function keyPrefix() public static function keyPrefix()
{ {
return Inflector::camel2id(StringHelper::basename(get_called_class()), '_'); return Inflector::camel2id(FileHelper::basename(get_called_class()), '_');
} }
/** /**
...@@ -288,7 +288,7 @@ class ActiveRecord extends BaseActiveRecord ...@@ -288,7 +288,7 @@ class ActiveRecord extends BaseActiveRecord
if (is_numeric($key)) { if (is_numeric($key)) {
return $key; return $key;
} elseif (is_string($key)) { } elseif (is_string($key)) {
return ctype_alnum($key) && StringHelper::strlen($key) <= 32 ? $key : md5($key); return ctype_alnum($key) && StringHelper::byteLen($key) <= 32 ? $key : md5($key);
} elseif (is_array($key)) { } elseif (is_array($key)) {
if (count($key) == 1) { if (count($key) == 1) {
return self::buildKey(reset($key)); return self::buildKey(reset($key));
......
...@@ -12,8 +12,8 @@ use yii\db\BaseActiveRecord; ...@@ -12,8 +12,8 @@ use yii\db\BaseActiveRecord;
use yii\base\NotSupportedException; use yii\base\NotSupportedException;
use yii\db\ActiveRelationInterface; use yii\db\ActiveRelationInterface;
use yii\db\StaleObjectException; use yii\db\StaleObjectException;
use yii\helpers\FileHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
use yii\helpers\StringHelper;
use Yii; use Yii;
/** /**
...@@ -166,7 +166,7 @@ abstract class ActiveRecord extends BaseActiveRecord ...@@ -166,7 +166,7 @@ abstract class ActiveRecord extends BaseActiveRecord
*/ */
public static function indexName() public static function indexName()
{ {
return Inflector::camel2id(StringHelper::basename(get_called_class()), '_'); return Inflector::camel2id(FileHelper::basename(get_called_class()), '_');
} }
/** /**
......
...@@ -100,7 +100,7 @@ abstract class Cache extends Component implements \ArrayAccess ...@@ -100,7 +100,7 @@ abstract class Cache extends Component implements \ArrayAccess
protected function buildKey($key) protected function buildKey($key)
{ {
if (is_string($key)) { if (is_string($key)) {
$key = ctype_alnum($key) && StringHelper::strlen($key) <= 32 ? $key : md5($key); $key = ctype_alnum($key) && StringHelper::byteLen($key) <= 32 ? $key : md5($key);
} else { } else {
$key = md5(json_encode($key)); $key = md5(json_encode($key));
} }
......
...@@ -9,12 +9,7 @@ ...@@ -9,12 +9,7 @@
namespace yii\db; namespace yii\db;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\base\Model; use yii\helpers\FileHelper;
use yii\base\InvalidParamException;
use yii\base\ModelEvent;
use yii\base\UnknownMethodException;
use yii\base\InvalidCallException;
use yii\helpers\StringHelper;
use yii\helpers\Inflector; use yii\helpers\Inflector;
/** /**
...@@ -174,7 +169,7 @@ class ActiveRecord extends BaseActiveRecord ...@@ -174,7 +169,7 @@ class ActiveRecord extends BaseActiveRecord
*/ */
public static function tableName() public static function tableName()
{ {
return 'tbl_' . Inflector::camel2id(StringHelper::basename(get_called_class()), '_'); return 'tbl_' . Inflector::camel2id(FileHelper::basename(get_called_class()), '_');
} }
/** /**
......
...@@ -292,11 +292,11 @@ class BaseFileHelper ...@@ -292,11 +292,11 @@ class BaseFileHelper
if ($isDir = is_dir($path)) { if ($isDir = is_dir($path)) {
$path .= '/'; $path .= '/';
} }
$n = StringHelper::strlen($path); $n = StringHelper::byteLen($path);
if (!empty($options['except'])) { if (!empty($options['except'])) {
foreach ($options['except'] as $name) { foreach ($options['except'] as $name) {
if (StringHelper::substr($path, -StringHelper::strlen($name), $n) === $name) { if (StringHelper::byteSubstr($path, -StringHelper::byteLen($name), $n) === $name) {
return false; return false;
} }
} }
...@@ -304,7 +304,7 @@ class BaseFileHelper ...@@ -304,7 +304,7 @@ class BaseFileHelper
if (!$isDir && !empty($options['only'])) { if (!$isDir && !empty($options['only'])) {
foreach ($options['only'] as $name) { foreach ($options['only'] as $name) {
if (StringHelper::substr($path, -StringHelper::strlen($name), $n) === $name) { if (StringHelper::byteSubstr($path, -StringHelper::byteLen($name), $n) === $name) {
return true; return true;
} }
} }
...@@ -338,4 +338,48 @@ class BaseFileHelper ...@@ -338,4 +338,48 @@ class BaseFileHelper
chmod($path, $mode); chmod($path, $mode);
return $result; return $result;
} }
/**
* Returns the trailing name component of a path.
* This method is similar to the php function `basename()` except that it will
* treat both \ and / as directory separators, independent of the operating system.
* This method was mainly created to work on php namespaces. When working with real
* file paths, php's `basename()` should work fine for you.
* Note: this method is not aware of the actual filesystem, or path components such as "..".
*
* @param string $path A path string.
* @param string $suffix If the name component ends in suffix this will also be cut off.
* @return string the trailing name component of the given path.
* @see http://www.php.net/manual/en/function.basename.php
*/
public static function basename($path, $suffix = '')
{
if (($len = mb_strlen($suffix)) > 0 && mb_substr($path, -$len) == $suffix) {
$path = mb_substr($path, 0, -$len);
}
$path = rtrim(str_replace('\\', '/', $path), '/\\');
if (($pos = mb_strrpos($path, '/')) !== false) {
return mb_substr($path, $pos + 1);
}
return $path;
}
/**
* Returns parent directory's path.
* This method is similar to `dirname()` except that it will treat
* both \ and / as directory separators, independent of the operating system.
*
* @param string $path A path string.
* @return string the parent directory's path.
* @see http://www.php.net/manual/en/function.basename.php
*/
public static function dirname($path)
{
$pos = mb_strrpos(str_replace('\\', '/', $path), '/');
if ($pos !== false) {
return mb_substr($path, 0, $pos);
} else {
return $path;
}
}
} }
...@@ -80,10 +80,10 @@ class BaseSecurity ...@@ -80,10 +80,10 @@ class BaseSecurity
} }
$module = static::openCryptModule(); $module = static::openCryptModule();
$ivSize = mcrypt_enc_get_iv_size($module); $ivSize = mcrypt_enc_get_iv_size($module);
$iv = StringHelper::substr($data, 0, $ivSize); $iv = StringHelper::byteSubstr($data, 0, $ivSize);
$key = static::deriveKey($password, $iv); $key = static::deriveKey($password, $iv);
mcrypt_generic_init($module, $key, $iv); mcrypt_generic_init($module, $key, $iv);
$decrypted = mdecrypt_generic($module, StringHelper::substr($data, $ivSize, StringHelper::strlen($data))); $decrypted = mdecrypt_generic($module, StringHelper::byteSubstr($data, $ivSize, StringHelper::byteLen($data)));
mcrypt_generic_deinit($module); mcrypt_generic_deinit($module);
mcrypt_module_close($module); mcrypt_module_close($module);
return static::stripPadding($decrypted); return static::stripPadding($decrypted);
...@@ -96,7 +96,7 @@ class BaseSecurity ...@@ -96,7 +96,7 @@ class BaseSecurity
*/ */
protected static function addPadding($data) protected static function addPadding($data)
{ {
$pad = self::CRYPT_BLOCK_SIZE - (StringHelper::strlen($data) % self::CRYPT_BLOCK_SIZE); $pad = self::CRYPT_BLOCK_SIZE - (StringHelper::byteLen($data) % self::CRYPT_BLOCK_SIZE);
return $data . str_repeat(chr($pad), $pad); return $data . str_repeat(chr($pad), $pad);
} }
...@@ -107,11 +107,11 @@ class BaseSecurity ...@@ -107,11 +107,11 @@ class BaseSecurity
*/ */
protected static function stripPadding($data) protected static function stripPadding($data)
{ {
$end = StringHelper::substr($data, -1, NULL); $end = StringHelper::byteSubstr($data, -1, NULL);
$last = ord($end); $last = ord($end);
$n = StringHelper::strlen($data) - $last; $n = StringHelper::byteLen($data) - $last;
if (StringHelper::substr($data, $n, NULL) == str_repeat($end, $last)) { if (StringHelper::byteSubstr($data, $n, NULL) == str_repeat($end, $last)) {
return StringHelper::substr($data, 0, $n); return StringHelper::byteSubstr($data, 0, $n);
} }
return false; return false;
} }
...@@ -164,11 +164,11 @@ class BaseSecurity ...@@ -164,11 +164,11 @@ class BaseSecurity
*/ */
public static function validateData($data, $key, $algorithm = 'sha256') public static function validateData($data, $key, $algorithm = 'sha256')
{ {
$hashSize = StringHelper::strlen(hash_hmac($algorithm, 'test', $key)); $hashSize = StringHelper::byteLen(hash_hmac($algorithm, 'test', $key));
$n = StringHelper::strlen($data); $n = StringHelper::byteLen($data);
if ($n >= $hashSize) { if ($n >= $hashSize) {
$hash = StringHelper::substr($data, 0, $hashSize); $hash = StringHelper::byteSubstr($data, 0, $hashSize);
$data2 = StringHelper::substr($data, $hashSize, $n - $hashSize); $data2 = StringHelper::byteSubstr($data, $hashSize, $n - $hashSize);
return $hash === hash_hmac($algorithm, $data2, $key) ? $data2 : false; return $hash === hash_hmac($algorithm, $data2, $key) ? $data2 : false;
} else { } else {
return false; return false;
......
...@@ -26,7 +26,7 @@ class BaseStringHelper ...@@ -26,7 +26,7 @@ class BaseStringHelper
* @param string $string the string being measured for length * @param string $string the string being measured for length
* @return integer the number of bytes in the given string. * @return integer the number of bytes in the given string.
*/ */
public static function strlen($string) public static function byteLen($string)
{ {
return mb_strlen($string, '8bit'); return mb_strlen($string, '8bit');
} }
...@@ -40,52 +40,11 @@ class BaseStringHelper ...@@ -40,52 +40,11 @@ class BaseStringHelper
* @return string the extracted part of string, or FALSE on failure or an empty string. * @return string the extracted part of string, or FALSE on failure or an empty string.
* @see http://www.php.net/manual/en/function.substr.php * @see http://www.php.net/manual/en/function.substr.php
*/ */
public static function substr($string, $start, $length) public static function byteSubstr($string, $start, $length)
{ {
return mb_substr($string, $start, $length, '8bit'); return mb_substr($string, $start, $length, '8bit');
} }
/**
* Returns the trailing name component of a path.
* This method is similar to the php function `basename()` except that it will
* treat both \ and / as directory separators, independent of the operating system.
* This method was mainly created to work on php namespaces. When working with real
* file paths, php's `basename()` should work fine for you.
* Note: this method is not aware of the actual filesystem, or path components such as "..".
* @param string $path A path string.
* @param string $suffix If the name component ends in suffix this will also be cut off.
* @return string the trailing name component of the given path.
* @see http://www.php.net/manual/en/function.basename.php
*/
public static function basename($path, $suffix = '')
{
if (($len = mb_strlen($suffix)) > 0 && mb_substr($path, -$len) == $suffix) {
$path = mb_substr($path, 0, -$len);
}
$path = rtrim(str_replace('\\', '/', $path), '/\\');
if (($pos = mb_strrpos($path, '/')) !== false) {
return mb_substr($path, $pos + 1);
}
return $path;
}
/**
* Returns parent directory's path.
* This method is similar to `dirname()` except that it will treat
* both \ and / as directory separators, independent of the operating system.
* @param string $path A path string.
* @return string the parent directory's path.
* @see http://www.php.net/manual/en/function.basename.php
*/
public static function dirname($path)
{
$pos = mb_strrpos(str_replace('\\', '/', $path), '/');
if ($pos !== false) {
return mb_substr($path, 0, $pos);
} else {
return $path;
}
}
/** /**
* Compares two strings or string arrays, and return their differences. * Compares two strings or string arrays, and return their differences.
......
...@@ -382,7 +382,7 @@ class Response extends \yii\base\Response ...@@ -382,7 +382,7 @@ class Response extends \yii\base\Response
public function sendContentAsFile($content, $attachmentName, $mimeType = 'application/octet-stream') public function sendContentAsFile($content, $attachmentName, $mimeType = 'application/octet-stream')
{ {
$headers = $this->getHeaders(); $headers = $this->getHeaders();
$contentLength = StringHelper::strlen($content); $contentLength = StringHelper::byteLen($content);
$range = $this->getHttpRange($contentLength); $range = $this->getHttpRange($contentLength);
if ($range === false) { if ($range === false) {
$headers->set('Content-Range', "bytes */$contentLength"); $headers->set('Content-Range', "bytes */$contentLength");
...@@ -395,14 +395,14 @@ class Response extends \yii\base\Response ...@@ -395,14 +395,14 @@ class Response extends \yii\base\Response
->setDefault('Content-Type', $mimeType) ->setDefault('Content-Type', $mimeType)
->setDefault('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') ->setDefault('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->setDefault('Content-Transfer-Encoding', 'binary') ->setDefault('Content-Transfer-Encoding', 'binary')
->setDefault('Content-Length', StringHelper::strlen($content)) ->setDefault('Content-Length', StringHelper::byteLen($content))
->setDefault('Content-Disposition', "attachment; filename=\"$attachmentName\""); ->setDefault('Content-Disposition', "attachment; filename=\"$attachmentName\"");
list($begin, $end) = $range; list($begin, $end) = $range;
if ($begin !=0 || $end != $contentLength - 1) { if ($begin !=0 || $end != $contentLength - 1) {
$this->setStatusCode(206); $this->setStatusCode(206);
$headers->set('Content-Range', "bytes $begin-$end/$contentLength"); $headers->set('Content-Range', "bytes $begin-$end/$contentLength");
$this->content = StringHelper::substr($content, $begin, $end - $begin + 1); $this->content = StringHelper::byteSubstr($content, $begin, $end - $begin + 1);
} else { } else {
$this->setStatusCode(200); $this->setStatusCode(200);
$this->content = $content; $this->content = $content;
......
...@@ -12,7 +12,7 @@ use DOMElement; ...@@ -12,7 +12,7 @@ use DOMElement;
use DOMText; use DOMText;
use yii\base\Arrayable; use yii\base\Arrayable;
use yii\base\Component; use yii\base\Component;
use yii\helpers\StringHelper; use yii\helpers\FileHelper;
/** /**
* XmlResponseFormatter formats the given data into an XML response content. * XmlResponseFormatter formats the given data into an XML response content.
...@@ -66,7 +66,7 @@ class XmlResponseFormatter extends Component implements ResponseFormatterInterfa ...@@ -66,7 +66,7 @@ class XmlResponseFormatter extends Component implements ResponseFormatterInterfa
protected function buildXml($element, $data) protected function buildXml($element, $data)
{ {
if (is_object($data)) { if (is_object($data)) {
$child = new DOMElement(StringHelper::basename(get_class($data))); $child = new DOMElement(FileHelper::basename(get_class($data)));
$element->appendChild($child); $element->appendChild($child);
if ($data instanceof Arrayable) { if ($data instanceof Arrayable) {
$this->buildXml($child, $data->toArray()); $this->buildXml($child, $data->toArray());
......
<?php <?php
namespace yiiunit\framework\helpers; namespace yiiunit\framework\helpers;
use yii\helpers\FileHelper;
use yii\helpers\StringHelper; use yii\helpers\StringHelper;
use yiiunit\TestCase; use yiiunit\TestCase;
...@@ -12,57 +13,57 @@ class StringHelperTest extends TestCase ...@@ -12,57 +13,57 @@ class StringHelperTest extends TestCase
{ {
public function testStrlen() public function testStrlen()
{ {
$this->assertEquals(4, StringHelper::strlen('this')); $this->assertEquals(4, StringHelper::byteLen('this'));
$this->assertEquals(6, StringHelper::strlen('это')); $this->assertEquals(6, StringHelper::byteLen('это'));
} }
public function testSubstr() public function testSubstr()
{ {
$this->assertEquals('th', StringHelper::substr('this', 0, 2)); $this->assertEquals('th', StringHelper::byteSubstr('this', 0, 2));
$this->assertEquals('э', StringHelper::substr('это', 0, 2)); $this->assertEquals('э', StringHelper::byteSubstr('это', 0, 2));
} }
public function testBasename() public function testBasename()
{ {
$this->assertEquals('', StringHelper::basename('')); $this->assertEquals('', FileHelper::basename(''));
$this->assertEquals('file', StringHelper::basename('file')); $this->assertEquals('file', FileHelper::basename('file'));
$this->assertEquals('file.test', StringHelper::basename('file.test', '.test2')); $this->assertEquals('file.test', FileHelper::basename('file.test', '.test2'));
$this->assertEquals('file', StringHelper::basename('file.test', '.test')); $this->assertEquals('file', FileHelper::basename('file.test', '.test'));
$this->assertEquals('file', StringHelper::basename('/file')); $this->assertEquals('file', FileHelper::basename('/file'));
$this->assertEquals('file.test', StringHelper::basename('/file.test', '.test2')); $this->assertEquals('file.test', FileHelper::basename('/file.test', '.test2'));
$this->assertEquals('file', StringHelper::basename('/file.test', '.test')); $this->assertEquals('file', FileHelper::basename('/file.test', '.test'));
$this->assertEquals('file', StringHelper::basename('/path/to/file')); $this->assertEquals('file', FileHelper::basename('/path/to/file'));
$this->assertEquals('file.test', StringHelper::basename('/path/to/file.test', '.test2')); $this->assertEquals('file.test', FileHelper::basename('/path/to/file.test', '.test2'));
$this->assertEquals('file', StringHelper::basename('/path/to/file.test', '.test')); $this->assertEquals('file', FileHelper::basename('/path/to/file.test', '.test'));
$this->assertEquals('file', StringHelper::basename('\file')); $this->assertEquals('file', FileHelper::basename('\file'));
$this->assertEquals('file.test', StringHelper::basename('\file.test', '.test2')); $this->assertEquals('file.test', FileHelper::basename('\file.test', '.test2'));
$this->assertEquals('file', StringHelper::basename('\file.test', '.test')); $this->assertEquals('file', FileHelper::basename('\file.test', '.test'));
$this->assertEquals('file', StringHelper::basename('C:\file')); $this->assertEquals('file', FileHelper::basename('C:\file'));
$this->assertEquals('file.test', StringHelper::basename('C:\file.test', '.test2')); $this->assertEquals('file.test', FileHelper::basename('C:\file.test', '.test2'));
$this->assertEquals('file', StringHelper::basename('C:\file.test', '.test')); $this->assertEquals('file', FileHelper::basename('C:\file.test', '.test'));
$this->assertEquals('file', StringHelper::basename('C:\path\to\file')); $this->assertEquals('file', FileHelper::basename('C:\path\to\file'));
$this->assertEquals('file.test', StringHelper::basename('C:\path\to\file.test', '.test2')); $this->assertEquals('file.test', FileHelper::basename('C:\path\to\file.test', '.test2'));
$this->assertEquals('file', StringHelper::basename('C:\path\to\file.test', '.test')); $this->assertEquals('file', FileHelper::basename('C:\path\to\file.test', '.test'));
// mixed paths // mixed paths
$this->assertEquals('file.test', StringHelper::basename('/path\to/file.test')); $this->assertEquals('file.test', FileHelper::basename('/path\to/file.test'));
$this->assertEquals('file.test', StringHelper::basename('/path/to\file.test')); $this->assertEquals('file.test', FileHelper::basename('/path/to\file.test'));
$this->assertEquals('file.test', StringHelper::basename('\path/to\file.test')); $this->assertEquals('file.test', FileHelper::basename('\path/to\file.test'));
// \ and / in suffix // \ and / in suffix
$this->assertEquals('file', StringHelper::basename('/path/to/filete/st', 'te/st')); $this->assertEquals('file', FileHelper::basename('/path/to/filete/st', 'te/st'));
$this->assertEquals('st', StringHelper::basename('/path/to/filete/st', 'te\st')); $this->assertEquals('st', FileHelper::basename('/path/to/filete/st', 'te\st'));
$this->assertEquals('file', StringHelper::basename('/path/to/filete\st', 'te\st')); $this->assertEquals('file', FileHelper::basename('/path/to/filete\st', 'te\st'));
$this->assertEquals('st', StringHelper::basename('/path/to/filete\st', 'te/st')); $this->assertEquals('st', FileHelper::basename('/path/to/filete\st', 'te/st'));
// http://www.php.net/manual/en/function.basename.php#72254 // http://www.php.net/manual/en/function.basename.php#72254
$this->assertEquals('foo', StringHelper::basename('/bar/foo/')); $this->assertEquals('foo', FileHelper::basename('/bar/foo/'));
$this->assertEquals('foo', StringHelper::basename('\\bar\\foo\\')); $this->assertEquals('foo', FileHelper::basename('\\bar\\foo\\'));
} }
} }
...@@ -57,7 +57,7 @@ class ResponseTest extends \yiiunit\TestCase ...@@ -57,7 +57,7 @@ class ResponseTest extends \yiiunit\TestCase
$this->assertEquals(206, $this->response->statusCode); $this->assertEquals(206, $this->response->statusCode);
$headers = $this->response->headers; $headers = $this->response->headers;
$this->assertEquals("bytes", $headers->get('Accept-Ranges')); $this->assertEquals("bytes", $headers->get('Accept-Ranges'));
$this->assertEquals("bytes " . $expectedHeader . '/' . StringHelper::strlen($fullContent), $headers->get('Content-Range')); $this->assertEquals("bytes " . $expectedHeader . '/' . StringHelper::byteLen($fullContent), $headers->get('Content-Range'));
$this->assertEquals('text/plain', $headers->get('Content-Type')); $this->assertEquals('text/plain', $headers->get('Content-Type'));
$this->assertEquals("$length", $headers->get('Content-Length')); $this->assertEquals("$length", $headers->get('Content-Length'));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment