annotate core/lib/Drupal/Component/Diff/WordLevelDiff.php @ 14:1fec387a4317

Update Drupal core to 8.5.2 via Composer
author Chris Cannam
date Mon, 23 Apr 2018 09:46:53 +0100
parents 4c8ae668cc8c
children 129ea1e6d783
rev   line source
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 }