2022-12-30 21:54:44 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
2020-06-16 17:52:55 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Tools module.
|
|
|
|
*
|
|
|
|
* This file is part of MadelineProto.
|
|
|
|
* MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
|
|
* MadelineProto is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
* See the GNU Affero General Public License for more details.
|
|
|
|
* You should have received a copy of the GNU General Public License along with MadelineProto.
|
|
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
* @author Daniil Gentili <daniil@daniil.it>
|
2023-01-04 12:43:01 +01:00
|
|
|
* @copyright 2016-2023 Daniil Gentili <daniil@daniil.it>
|
2020-06-16 17:52:55 +02:00
|
|
|
* @license https://opensource.org/licenses/AGPL-3.0 AGPLv3
|
|
|
|
* @link https://docs.madelineproto.xyz MadelineProto documentation
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace danog\MadelineProto;
|
|
|
|
|
2022-12-29 20:40:06 +01:00
|
|
|
use danog\MadelineProto\TL\Conversion\DOMEntities;
|
2020-10-04 16:27:22 +02:00
|
|
|
use danog\MadelineProto\TL\Conversion\Extension;
|
2022-05-01 20:17:16 +02:00
|
|
|
use Parsedown;
|
2023-01-11 18:47:27 +01:00
|
|
|
use Webmozart\Assert\Assert;
|
2020-10-04 16:27:22 +02:00
|
|
|
|
2020-06-16 17:52:55 +02:00
|
|
|
/**
|
|
|
|
* Some tools.
|
|
|
|
*/
|
2020-10-04 16:27:22 +02:00
|
|
|
abstract class StrTools extends Extension
|
2020-06-16 17:52:55 +02:00
|
|
|
{
|
2022-05-17 22:17:41 +02:00
|
|
|
/**
|
|
|
|
* Get Telegram UTF-8 length of string.
|
|
|
|
*
|
|
|
|
* @param string $text Text
|
|
|
|
*/
|
2023-01-11 18:47:27 +01:00
|
|
|
public static function mbStrlen(string $text): int
|
2022-05-17 22:17:41 +02:00
|
|
|
{
|
|
|
|
$length = 0;
|
|
|
|
$textlength = \strlen($text);
|
|
|
|
for ($x = 0; $x < $textlength; $x++) {
|
|
|
|
$char = \ord($text[$x]);
|
|
|
|
if (($char & 0xc0) != 0x80) {
|
2023-01-14 19:51:23 +01:00
|
|
|
$length += 1 + ($char >= 0xf0 ? 1 : 0);
|
2022-05-17 22:17:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return $length;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Telegram UTF-8 multibyte substring.
|
|
|
|
*
|
|
|
|
* @param string $text Text to substring
|
|
|
|
* @param integer $offset Offset
|
2023-01-20 15:30:13 +01:00
|
|
|
* @param null|int $length Length
|
2022-05-17 22:17:41 +02:00
|
|
|
*/
|
2022-12-30 19:21:36 +01:00
|
|
|
public static function mbSubstr(string $text, int $offset, ?int $length = null): string
|
2022-05-17 22:17:41 +02:00
|
|
|
{
|
2022-07-26 18:41:15 +02:00
|
|
|
return \mb_convert_encoding(
|
|
|
|
\substr(
|
|
|
|
\mb_convert_encoding($text, 'UTF-16'),
|
2022-07-26 18:16:54 +02:00
|
|
|
$offset<<1,
|
2022-12-30 19:21:36 +01:00
|
|
|
$length === null ? null : ($length<<1),
|
2022-07-26 18:16:54 +02:00
|
|
|
),
|
|
|
|
'UTF-8',
|
2022-12-30 19:21:36 +01:00
|
|
|
'UTF-16',
|
2022-07-26 18:16:54 +02:00
|
|
|
);
|
2022-05-17 22:17:41 +02:00
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Telegram UTF-8 multibyte split.
|
|
|
|
*
|
|
|
|
* @param string $text Text
|
|
|
|
* @param integer $length Length
|
2022-07-26 18:16:54 +02:00
|
|
|
* @return array<string>
|
2022-05-17 22:17:41 +02:00
|
|
|
*/
|
|
|
|
public static function mbStrSplit(string $text, int $length): array
|
|
|
|
{
|
|
|
|
$result = [];
|
2022-07-26 18:41:15 +02:00
|
|
|
foreach (\str_split(\mb_convert_encoding($text, 'UTF-16'), $length<<1) as $chunk) {
|
2023-01-14 19:18:23 +01:00
|
|
|
$chunk = \mb_convert_encoding($chunk, 'UTF-8', 'UTF-16');
|
|
|
|
Assert::string($chunk);
|
|
|
|
$result []= $chunk;
|
2022-05-17 22:17:41 +02:00
|
|
|
}
|
|
|
|
return $result;
|
|
|
|
}
|
2020-06-16 17:52:55 +02:00
|
|
|
/**
|
|
|
|
* Convert to camelCase.
|
|
|
|
*
|
|
|
|
* @param string $input String
|
|
|
|
*/
|
|
|
|
public static function toCamelCase(string $input): string
|
|
|
|
{
|
|
|
|
return \lcfirst(\str_replace('_', '', \ucwords($input, '_')));
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Convert to snake_case.
|
|
|
|
*
|
|
|
|
* @param string $input String
|
|
|
|
*/
|
|
|
|
public static function toSnakeCase(string $input): string
|
|
|
|
{
|
|
|
|
\preg_match_all('!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!', $input, $matches);
|
|
|
|
$ret = $matches[0];
|
|
|
|
foreach ($ret as &$match) {
|
|
|
|
$match = $match == \strtoupper($match) ? \strtolower($match) : \lcfirst($match);
|
|
|
|
}
|
|
|
|
return \implode('_', $ret);
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Escape string for markdown.
|
|
|
|
*
|
|
|
|
* @param string $hwat String to escape
|
|
|
|
*/
|
|
|
|
public static function markdownEscape(string $hwat): string
|
|
|
|
{
|
|
|
|
return \str_replace('_', '\\_', $hwat);
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Escape type name.
|
|
|
|
*
|
|
|
|
* @param string $type String to escape
|
|
|
|
*/
|
|
|
|
public static function typeEscape(string $type): string
|
|
|
|
{
|
|
|
|
$type = \str_replace(['<', '>'], ['_of_', ''], $type);
|
|
|
|
return \preg_replace('/.*_of_/', '', $type);
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Escape method name.
|
|
|
|
*
|
|
|
|
* @param string $method Method name
|
|
|
|
*/
|
|
|
|
public static function methodEscape(string $method): string
|
|
|
|
{
|
|
|
|
return \str_replace('.', '->', $method);
|
|
|
|
}
|
2022-05-01 20:17:16 +02:00
|
|
|
/**
|
|
|
|
* Strip markdown tags.
|
|
|
|
*
|
|
|
|
* @internal
|
|
|
|
*/
|
|
|
|
public static function toString(string $markdown): string
|
|
|
|
{
|
|
|
|
if ($markdown === '') {
|
|
|
|
return $markdown;
|
|
|
|
}
|
2022-12-29 20:40:06 +01:00
|
|
|
return (new DOMEntities(Parsedown::instance()->text($markdown)))->message;
|
2022-05-01 20:17:16 +02:00
|
|
|
}
|
2020-06-16 17:52:55 +02:00
|
|
|
}
|