1
0
mirror of https://github.com/danog/MadelineProto.git synced 2025-01-12 09:58:17 +01:00
MadelineProto/src/StrTools.php

150 lines
4.4 KiB
PHP
Raw Normal View History

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;
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-06-16 17:52:55 +02:00
/**
* Some tools.
*/
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
{
return \mb_convert_encoding(
\substr(
\mb_convert_encoding($text, 'UTF-16'),
$offset<<1,
2022-12-30 19:21:36 +01:00
$length === null ? null : ($length<<1),
),
'UTF-8',
2022-12-30 19:21:36 +01:00
'UTF-16',
);
2022-05-17 22:17:41 +02:00
}
/**
* Telegram UTF-8 multibyte split.
*
* @param string $text Text
* @param integer $length Length
* @return array<string>
2022-05-17 22:17:41 +02:00
*/
public static function mbStrSplit(string $text, int $length): array
{
$result = [];
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
}