Completed
Push — master ( 737704...b39c01 )
by Jitendra
12s queued 11s
created

Pretty::reset()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 6
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the CLI-SYNTAX package.
7
 *
8
 * (c) Jitendra Adhikari <[email protected]>
9
 *     <https://github.com/adhocore>
10
 *
11
 * Licensed under MIT license.
12
 */
13
14
namespace Ahc\CliSyntax;
15
16
abstract class Pretty
17
{
18
    /** @var string The PHP code. */
19
    protected $code;
20
21
    /** @var int The current line number. */
22
    protected $lineNo = 0;
23
24
    /** @var int The total lines count. */
25
    protected $lineCount = 0;
26
27
    /** @var bool Show line numbers. */
28
    protected $withLineNo = false;
29
30
    /** @var array Lengths of each line */
31
    protected $lengths = [];
32
33
    /** @var bool Indicates if it has been already configured. */
34
    protected static $configured;
35
36
    public function __construct(string $code = null)
37
    {
38
        $this->code = $code ?? '';
39
    }
40
41
    public static function for(string $file): self
42
    {
43
        if (!\is_file($file)) {
44
            throw new \InvalidArgumentException('The given file doesnot exist or is unreadable.');
45
        }
46
47
        return new static(\file_get_contents($file));
48
    }
49
50
    public static function configure()
51
    {
52
        if (static::$configured) {
53
            return;
54
        }
55
56
        foreach (['comment', 'default', 'html', 'keyword', 'string'] as $type) {
57
            \ini_set("highlight.$type", \ini_get("highlight.$type") . \sprintf('" data-type="%s', $type));
58
        }
59
60
        static::$configured = true;
61
    }
62
63
    protected function setOptions(array $options)
64
    {
65
        if ($options['lineNo'] ?? false) {
66
            $this->withLineNo = true;
67
        }
68
    }
69
70
    protected function parse(string $code = null)
71
    {
72
        $this->reset();
73
74
        $dom = new \DOMDocument;
75
        $dom->loadHTML($this->codeToHtml($code ?? $this->code));
76
77
        $adjust = -1;
78
        foreach ((new \DOMXPath($dom))->query('/html/body/code/span/*') as $el) {
79
            $this->lineNo = $el->getLineNo() + $adjust;
80
            $this->visit($el);
81
        }
82
    }
83
84
    protected function codeToHtml(string $code): string
85
    {
86
        static::configure();
87
88
        $this->lineCount = \substr_count($code, "\n") ?: 1;
89
90
        $html = \highlight_string($code, true);
91
92
        return \str_replace(['<br />'], ["\n"], $html);
93
    }
94
95
    protected function formatLineNo(): string
96
    {
97
        if ($this->withLineNo && $this->lineNo <= $this->lineCount && !isset($this->lengths[$this->lineNo])) {
98
            return \str_pad("$this->lineNo", \strlen("$this->lineCount"), ' ', \STR_PAD_LEFT) . '. ';
99
        }
100
101
        return '';
102
    }
103
104
    protected function reset()
105
    {
106
        $this->doReset();
107
108
        $this->lengths = [];
109
        $this->lineNo  = $this->lineCount = 0;
110
    }
111
112
    abstract protected function doReset();
113
114
    abstract protected function visit(\DOMNode $el);
115
}
116