Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Component\Diff;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Diff\Engine\HWLDFWordAccumulator;
|
Chris@0
|
6 use Drupal\Component\Utility\Unicode;
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * @todo document
|
Chris@0
|
10 * @private
|
Chris@0
|
11 * @subpackage DifferenceEngine
|
Chris@0
|
12 */
|
Chris@0
|
13 class WordLevelDiff extends MappedDiff {
|
Chris@0
|
14
|
Chris@0
|
15 const MAX_LINE_LENGTH = 10000;
|
Chris@0
|
16
|
Chris@0
|
17 public function __construct($orig_lines, $closing_lines) {
|
Chris@0
|
18 list($orig_words, $orig_stripped) = $this->_split($orig_lines);
|
Chris@0
|
19 list($closing_words, $closing_stripped) = $this->_split($closing_lines);
|
Chris@0
|
20
|
Chris@0
|
21 parent::__construct($orig_words, $closing_words, $orig_stripped, $closing_stripped);
|
Chris@0
|
22 }
|
Chris@0
|
23
|
Chris@0
|
24 protected function _split($lines) {
|
Chris@0
|
25 $words = [];
|
Chris@0
|
26 $stripped = [];
|
Chris@0
|
27 $first = TRUE;
|
Chris@0
|
28 foreach ($lines as $line) {
|
Chris@0
|
29 // If the line is too long, just pretend the entire line is one big word
|
Chris@0
|
30 // This prevents resource exhaustion problems
|
Chris@0
|
31 if ( $first ) {
|
Chris@0
|
32 $first = FALSE;
|
Chris@0
|
33 }
|
Chris@0
|
34 else {
|
Chris@0
|
35 $words[] = "\n";
|
Chris@0
|
36 $stripped[] = "\n";
|
Chris@0
|
37 }
|
Chris@0
|
38 if (Unicode::strlen($line) > $this::MAX_LINE_LENGTH) {
|
Chris@0
|
39 $words[] = $line;
|
Chris@0
|
40 $stripped[] = $line;
|
Chris@0
|
41 }
|
Chris@0
|
42 else {
|
Chris@0
|
43 if (preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs', $line, $m)) {
|
Chris@0
|
44 $words = array_merge($words, $m[0]);
|
Chris@0
|
45 $stripped = array_merge($stripped, $m[1]);
|
Chris@0
|
46 }
|
Chris@0
|
47 }
|
Chris@0
|
48 }
|
Chris@0
|
49 return [$words, $stripped];
|
Chris@0
|
50 }
|
Chris@0
|
51
|
Chris@0
|
52 public function orig() {
|
Chris@0
|
53 $orig = new HWLDFWordAccumulator();
|
Chris@0
|
54
|
Chris@0
|
55 foreach ($this->edits as $edit) {
|
Chris@0
|
56 if ($edit->type == 'copy') {
|
Chris@0
|
57 $orig->addWords($edit->orig);
|
Chris@0
|
58 }
|
Chris@0
|
59 elseif ($edit->orig) {
|
Chris@0
|
60 $orig->addWords($edit->orig, 'mark');
|
Chris@0
|
61 }
|
Chris@0
|
62 }
|
Chris@0
|
63 $lines = $orig->getLines();
|
Chris@0
|
64 return $lines;
|
Chris@0
|
65 }
|
Chris@0
|
66
|
Chris@0
|
67 public function closing() {
|
Chris@0
|
68 $closing = new HWLDFWordAccumulator();
|
Chris@0
|
69
|
Chris@0
|
70 foreach ($this->edits as $edit) {
|
Chris@0
|
71 if ($edit->type == 'copy') {
|
Chris@0
|
72 $closing->addWords($edit->closing);
|
Chris@0
|
73 }
|
Chris@0
|
74 elseif ($edit->closing) {
|
Chris@0
|
75 $closing->addWords($edit->closing, 'mark');
|
Chris@0
|
76 }
|
Chris@0
|
77 }
|
Chris@0
|
78 $lines = $closing->getLines();
|
Chris@0
|
79 return $lines;
|
Chris@0
|
80 }
|
Chris@0
|
81
|
Chris@0
|
82 }
|