Mercurial > hg > isophonics-drupal-site
diff core/lib/Drupal/Component/Diff/WordLevelDiff.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 129ea1e6d783 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Component/Diff/WordLevelDiff.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,82 @@ +<?php + +namespace Drupal\Component\Diff; + +use Drupal\Component\Diff\Engine\HWLDFWordAccumulator; +use Drupal\Component\Utility\Unicode; + +/** + * @todo document + * @private + * @subpackage DifferenceEngine + */ +class WordLevelDiff extends MappedDiff { + + const MAX_LINE_LENGTH = 10000; + + public function __construct($orig_lines, $closing_lines) { + list($orig_words, $orig_stripped) = $this->_split($orig_lines); + list($closing_words, $closing_stripped) = $this->_split($closing_lines); + + parent::__construct($orig_words, $closing_words, $orig_stripped, $closing_stripped); + } + + protected function _split($lines) { + $words = []; + $stripped = []; + $first = TRUE; + foreach ($lines as $line) { + // If the line is too long, just pretend the entire line is one big word + // This prevents resource exhaustion problems + if ( $first ) { + $first = FALSE; + } + else { + $words[] = "\n"; + $stripped[] = "\n"; + } + if (Unicode::strlen($line) > $this::MAX_LINE_LENGTH) { + $words[] = $line; + $stripped[] = $line; + } + else { + if (preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs', $line, $m)) { + $words = array_merge($words, $m[0]); + $stripped = array_merge($stripped, $m[1]); + } + } + } + return [$words, $stripped]; + } + + public function orig() { + $orig = new HWLDFWordAccumulator(); + + foreach ($this->edits as $edit) { + if ($edit->type == 'copy') { + $orig->addWords($edit->orig); + } + elseif ($edit->orig) { + $orig->addWords($edit->orig, 'mark'); + } + } + $lines = $orig->getLines(); + return $lines; + } + + public function closing() { + $closing = new HWLDFWordAccumulator(); + + foreach ($this->edits as $edit) { + if ($edit->type == 'copy') { + $closing->addWords($edit->closing); + } + elseif ($edit->closing) { + $closing->addWords($edit->closing, 'mark'); + } + } + $lines = $closing->getLines(); + return $lines; + } + +}