Completed
Push — master ( da65dc...5751ed )
by Tomáš
20:43 queued 16:49
created

Text   A

Complexity

Total Complexity 28

Size/Duplication

Total Lines 232
Duplicated Lines 43.97 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 28
c 0
b 0
f 0
lcom 1
cbo 2
dl 102
loc 232
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A processSniff() 7 13 4
A printTitle() 0 12 1
B printTextBlock() 19 37 6
F printCodeComparisonBlock() 76 125 17

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
/**
3
 * A doc generator that outputs text-based documentation.
4
 *
5
 * Output is designed to be displayed in a terminal and is wrapped to 100 characters.
6
 *
7
 * @author    Greg Sherwood <[email protected]>
8
 * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
9
 * @license   https://github.com/squizlabs/Symplify\PHP7_CodeSniffer/blob/master/licence.txt BSD Licence
10
 */
11
12
namespace Symplify\PHP7_CodeSniffer\Generators;
13
14
class Text extends Generator
15
{
16
17
18
    /**
19
     * Process the documentation for a single sniff.
20
     *
21
     * @param \DOMNode $doc The DOMNode object for the sniff.
22
     *                     It represents the "documentation" tag in the XML
23
     *                     standard file.
24
     *
25
     * @return void
26
     */
27
    public function processSniff(\DOMNode $doc)
28
    {
29
        $this->printTitle($doc);
30
31 View Code Duplication
        foreach ($doc->childNodes as $node) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
32
            if ($node->nodeName === 'standard') {
33
                $this->printTextBlock($node);
34
            } else if ($node->nodeName === 'code_comparison') {
35
                $this->printCodeComparisonBlock($node);
36
            }
37
        }
38
39
    }//end processSniff()
40
41
42
    /**
43
     * Prints the title area for a single sniff.
44
     *
45
     * @param \DOMNode $doc The DOMNode object for the sniff.
46
     *                     It represents the "documentation" tag in the XML
47
     *                     standard file.
48
     *
49
     * @return void
50
     */
51
    protected function printTitle(\DOMNode $doc)
52
    {
53
        $title    = $this->getTitle($doc);
54
        $standard = $this->ruleset->name;
55
56
        echo PHP_EOL;
57
        echo str_repeat('-', (strlen("$standard CODING STANDARD: $title") + 4));
58
        echo strtoupper(PHP_EOL."| $standard CODING STANDARD: $title |".PHP_EOL);
59
        echo str_repeat('-', (strlen("$standard CODING STANDARD: $title") + 4));
60
        echo PHP_EOL.PHP_EOL;
61
62
    }//end printTitle()
63
64
65
    /**
66
     * Print a text block found in a standard.
67
     *
68
     * @param \DOMNode $node The DOMNode object for the text block.
69
     *
70
     * @return void
71
     */
72
    protected function printTextBlock(\DOMNode $node)
73
    {
74
        $text = trim($node->nodeValue);
75
        $text = str_replace('<em>', '*', $text);
76
        $text = str_replace('</em>', '*', $text);
77
78
        $lines    = array();
79
        $tempLine = '';
80
        $words    = explode(' ', $text);
81
82 View Code Duplication
        foreach ($words as $word) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
83
            if (strlen($tempLine.$word) >= 99) {
84
                if (strlen($tempLine.$word) === 99) {
85
                    // Adding the extra space will push us to the edge
86
                    // so we are done.
87
                    $lines[]  = $tempLine.$word;
88
                    $tempLine = '';
89
                } else if (strlen($tempLine.$word) === 100) {
90
                    // We are already at the edge, so we are done.
91
                    $lines[]  = $tempLine.$word;
92
                    $tempLine = '';
93
                } else {
94
                    $lines[]  = rtrim($tempLine);
95
                    $tempLine = $word.' ';
96
                }
97
            } else {
98
                $tempLine .= $word.' ';
99
            }
100
        }//end foreach
101
102
        if ($tempLine !== '') {
103
            $lines[] = rtrim($tempLine);
104
        }
105
106
        echo implode(PHP_EOL, $lines).PHP_EOL.PHP_EOL;
107
108
    }//end printTextBlock()
109
110
111
    /**
112
     * Print a code comparison block found in a standard.
113
     *
114
     * @param \DOMNode $node The DOMNode object for the code comparison block.
115
     *
116
     * @return void
117
     */
118
    protected function printCodeComparisonBlock(\DOMNode $node)
119
    {
120
        $codeBlocks = $node->getElementsByTagName('code');
121
        $first      = trim($codeBlocks->item(0)->nodeValue);
122
        $firstTitle = $codeBlocks->item(0)->getAttribute('title');
123
124
        $firstTitleLines = array();
125
        $tempTitle       = '';
126
        $words           = explode(' ', $firstTitle);
127
128 View Code Duplication
        foreach ($words as $word) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
129
            if (strlen($tempTitle.$word) >= 45) {
130
                if (strlen($tempTitle.$word) === 45) {
131
                    // Adding the extra space will push us to the edge
132
                    // so we are done.
133
                    $firstTitleLines[] = $tempTitle.$word;
134
                    $tempTitle         = '';
135
                } else if (strlen($tempTitle.$word) === 46) {
136
                    // We are already at the edge, so we are done.
137
                    $firstTitleLines[] = $tempTitle.$word;
138
                    $tempTitle         = '';
139
                } else {
140
                    $firstTitleLines[] = $tempTitle;
141
                    $tempTitle         = $word;
142
                }
143
            } else {
144
                $tempTitle .= $word.' ';
145
            }
146
        }//end foreach
147
148
        if ($tempTitle !== '') {
149
            $firstTitleLines[] = $tempTitle;
150
        }
151
152
        $first      = str_replace('<em>', '', $first);
153
        $first      = str_replace('</em>', '', $first);
154
        $firstLines = explode("\n", $first);
155
156
        $second      = trim($codeBlocks->item(1)->nodeValue);
157
        $secondTitle = $codeBlocks->item(1)->getAttribute('title');
158
159
        $secondTitleLines = array();
160
        $tempTitle        = '';
161
        $words            = explode(' ', $secondTitle);
162
163 View Code Duplication
        foreach ($words as $word) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
164
            if (strlen($tempTitle.$word) >= 45) {
165
                if (strlen($tempTitle.$word) === 45) {
166
                    // Adding the extra space will push us to the edge
167
                    // so we are done.
168
                    $secondTitleLines[] = $tempTitle.$word;
169
                    $tempTitle          = '';
170
                } else if (strlen($tempTitle.$word) === 46) {
171
                    // We are already at the edge, so we are done.
172
                    $secondTitleLines[] = $tempTitle.$word;
173
                    $tempTitle          = '';
174
                } else {
175
                    $secondTitleLines[] = $tempTitle;
176
                    $tempTitle          = $word;
177
                }
178
            } else {
179
                $tempTitle .= $word.' ';
180
            }
181
        }//end foreach
182
183
        if ($tempTitle !== '') {
184
            $secondTitleLines[] = $tempTitle;
185
        }
186
187
        $second      = str_replace('<em>', '', $second);
188
        $second      = str_replace('</em>', '', $second);
189
        $secondLines = explode("\n", $second);
190
191
        $maxCodeLines  = max(count($firstLines), count($secondLines));
192
        $maxTitleLines = max(count($firstTitleLines), count($secondTitleLines));
193
194
        echo str_repeat('-', 41);
195
        echo ' CODE COMPARISON ';
196
        echo str_repeat('-', 42).PHP_EOL;
197
198 View Code Duplication
        for ($i = 0; $i < $maxTitleLines; $i++) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
199
            if (isset($firstTitleLines[$i]) === true) {
200
                $firstLineText = $firstTitleLines[$i];
201
            } else {
202
                $firstLineText = '';
203
            }
204
205
            if (isset($secondTitleLines[$i]) === true) {
206
                $secondLineText = $secondTitleLines[$i];
207
            } else {
208
                $secondLineText = '';
209
            }
210
211
            echo '| ';
212
            echo $firstLineText.str_repeat(' ', (46 - strlen($firstLineText)));
213
            echo ' | ';
214
            echo $secondLineText.str_repeat(' ', (47 - strlen($secondLineText)));
215
            echo ' |'.PHP_EOL;
216
        }//end for
217
218
        echo str_repeat('-', 100).PHP_EOL;
219
220 View Code Duplication
        for ($i = 0; $i < $maxCodeLines; $i++) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
221
            if (isset($firstLines[$i]) === true) {
222
                $firstLineText = $firstLines[$i];
223
            } else {
224
                $firstLineText = '';
225
            }
226
227
            if (isset($secondLines[$i]) === true) {
228
                $secondLineText = $secondLines[$i];
229
            } else {
230
                $secondLineText = '';
231
            }
232
233
            echo '| ';
234
            echo $firstLineText.str_repeat(' ', (47 - strlen($firstLineText)));
235
            echo '| ';
236
            echo $secondLineText.str_repeat(' ', (48 - strlen($secondLineText)));
237
            echo '|'.PHP_EOL;
238
        }//end for
239
240
        echo str_repeat('-', 100).PHP_EOL.PHP_EOL;
241
242
    }//end printCodeComparisonBlock()
243
244
245
}//end class
246