Chris@14
|
1 <?php declare(strict_types=1);
|
Chris@14
|
2 /*
|
Chris@14
|
3 * This file is part of sebastian/diff.
|
Chris@14
|
4 *
|
Chris@14
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@14
|
6 *
|
Chris@14
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@14
|
8 * file that was distributed with this source code.
|
Chris@14
|
9 */
|
Chris@14
|
10 namespace SebastianBergmann\Diff\Output;
|
Chris@14
|
11
|
Chris@14
|
12 /**
|
Chris@14
|
13 * Builds a diff string representation in a loose unified diff format
|
Chris@14
|
14 * listing only changes lines. Does not include line numbers.
|
Chris@14
|
15 */
|
Chris@14
|
16 final class DiffOnlyOutputBuilder implements DiffOutputBuilderInterface
|
Chris@14
|
17 {
|
Chris@14
|
18 /**
|
Chris@14
|
19 * @var string
|
Chris@14
|
20 */
|
Chris@14
|
21 private $header;
|
Chris@14
|
22
|
Chris@14
|
23 public function __construct(string $header = "--- Original\n+++ New\n")
|
Chris@14
|
24 {
|
Chris@14
|
25 $this->header = $header;
|
Chris@14
|
26 }
|
Chris@14
|
27
|
Chris@14
|
28 public function getDiff(array $diff): string
|
Chris@14
|
29 {
|
Chris@14
|
30 $buffer = \fopen('php://memory', 'r+b');
|
Chris@14
|
31
|
Chris@14
|
32 if ('' !== $this->header) {
|
Chris@14
|
33 \fwrite($buffer, $this->header);
|
Chris@14
|
34 if ("\n" !== \substr($this->header, -1, 1)) {
|
Chris@14
|
35 \fwrite($buffer, "\n");
|
Chris@14
|
36 }
|
Chris@14
|
37 }
|
Chris@14
|
38
|
Chris@14
|
39 foreach ($diff as $diffEntry) {
|
Chris@14
|
40 if ($diffEntry[1] === 1 /* ADDED */) {
|
Chris@14
|
41 \fwrite($buffer, '+' . $diffEntry[0]);
|
Chris@14
|
42 } elseif ($diffEntry[1] === 2 /* REMOVED */) {
|
Chris@14
|
43 \fwrite($buffer, '-' . $diffEntry[0]);
|
Chris@14
|
44 } elseif ($diffEntry[1] === 3 /* WARNING */) {
|
Chris@14
|
45 \fwrite($buffer, ' ' . $diffEntry[0]);
|
Chris@14
|
46
|
Chris@14
|
47 continue; // Warnings should not be tested for line break, it will always be there
|
Chris@14
|
48 } else { /* Not changed (old) 0 */
|
Chris@14
|
49 continue; // we didn't write the non changs line, so do not add a line break either
|
Chris@14
|
50 }
|
Chris@14
|
51
|
Chris@14
|
52 $lc = \substr($diffEntry[0], -1);
|
Chris@14
|
53 if ($lc !== "\n" && $lc !== "\r") {
|
Chris@14
|
54 \fwrite($buffer, "\n"); // \No newline at end of file
|
Chris@14
|
55 }
|
Chris@14
|
56 }
|
Chris@14
|
57
|
Chris@14
|
58 $diff = \stream_get_contents($buffer, -1, 0);
|
Chris@14
|
59 \fclose($buffer);
|
Chris@14
|
60
|
Chris@14
|
61 return $diff;
|
Chris@14
|
62 }
|
Chris@14
|
63 }
|