You are here

class WordLevelDiff in Drupal 8

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Component/Diff/WordLevelDiff.php \Drupal\Component\Diff\WordLevelDiff

@todo document @private @subpackage DifferenceEngine

Hierarchy

Expanded class hierarchy of WordLevelDiff

1 file declares its use of WordLevelDiff
DiffFormatter.php in core/lib/Drupal/Core/Diff/DiffFormatter.php

File

core/lib/Drupal/Component/Diff/WordLevelDiff.php, line 12

Namespace

Drupal\Component\Diff
View source
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 (mb_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;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
Diff::$edits protected property The list of differences as an array of diff operations.
Diff::check public function Check a Diff for validity.
Diff::getEdits public function Gets the list of differences as an array of diff operations.
Diff::isEmpty public function Check for empty diff.
Diff::lcs public function Compute the length of the Longest Common Subsequence (LCS).
Diff::reverse public function Compute reversed Diff.
WordLevelDiff::closing public function Gets the closing set of lines. Overrides Diff::closing
WordLevelDiff::MAX_LINE_LENGTH constant
WordLevelDiff::orig public function Gets the original set of lines. Overrides Diff::orig
WordLevelDiff::_split protected function
WordLevelDiff::__construct public function Constructor. Overrides MappedDiff::__construct