Completed
Push — master ( 1316f3...b7872d )
by Aydin
26s queued 12s
created

StringUtil::length()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 1
c 0
b 0
f 0
nc 1
nop 2
dl 0
loc 3
rs 10
1
<?php
2
3
namespace PhpSchool\CliMenu\Util;
4
5
/**
6
 * @author Michael Woodward <[email protected]>
7
 */
8
class StringUtil
9
{
10
    /**
11
     * Minimal multi-byte wordwrap implementation
12
     * which also takes break length into consideration
13
     */
14
    public static function wordwrap(string $string, int $width, string $break = "\n") : string
15
    {
16
        return implode(
17
            $break,
18
            array_map(function (string $line) use ($width, $break) {
19
                $line = rtrim($line);
20
                if (mb_strlen($line) <= $width) {
21
                    return $line;
22
                }
23
                
24
                $words  = explode(' ', $line);
25
                $line   = '';
26
                $actual = '';
27
                foreach ($words as $word) {
28
                    if (mb_strlen($actual . $word) <= $width) {
29
                        $actual .= $word . ' ';
30
                    } else {
31
                        if ($actual !== '') {
32
                            $line .= rtrim($actual) . $break;
33
                        }
34
                        $actual = $word . ' ';
35
                    }
36
                }
37
                return $line . trim($actual);
38
            }, explode("\n", $string))
39
        );
40
    }
41
42
    public static function stripAnsiEscapeSequence(string $str) : string
43
    {
44
        return (string) preg_replace('/\x1b[^m]*m/', '', $str);
45
    }
46
47
    public static function length(string $str, bool $ignoreAnsiEscapeSequence = true) : int
48
    {
49
        return mb_strlen($ignoreAnsiEscapeSequence ? self::stripAnsiEscapeSequence($str) : $str);
50
    }
51
}
52