Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 12 |
CRAP | |
0.00% |
0 / 107 |
DiffFormatter | |
0.00% |
0 / 1 |
|
0.00% |
0 / 12 |
1260 | |
0.00% |
0 / 107 |
format | |
0.00% |
0 / 1 |
182 | |
0.00% |
0 / 54 |
|||
_block | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 20 |
|||
_start_diff | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
_end_diff | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
_block_header | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 8 |
|||
_start_block | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 4 |
|||
_end_block | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
_lines | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 4 |
|||
_context | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
_added | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
_deleted | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
_changed | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Component\Diff\DiffFormatter. | |
*/ | |
namespace Drupal\Component\Diff; | |
use Drupal\Component\Diff\Engine\DiffOpCopy; | |
/** | |
* A class to format Diffs | |
* | |
* This class formats the diff in classic diff format. | |
* It is intended that this class be customized via inheritance, | |
* to obtain fancier outputs. | |
* @todo document | |
* @private | |
* @subpackage DifferenceEngine | |
*/ | |
class DiffFormatter { | |
/** | |
* Should a block header be shown? | |
*/ | |
var $show_header = TRUE; | |
/** | |
* Number of leading context "lines" to preserve. | |
* | |
* This should be left at zero for this class, but subclasses | |
* may want to set this to other values. | |
*/ | |
var $leading_context_lines = 0; | |
/** | |
* Number of trailing context "lines" to preserve. | |
* | |
* This should be left at zero for this class, but subclasses | |
* may want to set this to other values. | |
*/ | |
var $trailing_context_lines = 0; | |
/** | |
* Format a diff. | |
* | |
* @param \Drupal\Component\Diff\Diff $diff | |
* A Diff object. | |
* | |
* @return string | |
* The formatted output. | |
*/ | |
public function format(Diff $diff) { | |
$xi = $yi = 1; | |
$block = FALSE; | |
$context = array(); | |
$nlead = $this->leading_context_lines; | |
$ntrail = $this->trailing_context_lines; | |
$this->_start_diff(); | |
foreach ($diff->getEdits() as $edit) { | |
if ($edit->type == 'copy') { | |
if (is_array($block)) { | |
if (sizeof($edit->orig) <= $nlead + $ntrail) { | |
$block[] = $edit; | |
} | |
else { | |
if ($ntrail) { | |
$context = array_slice($edit->orig, 0, $ntrail); | |
$block[] = new DiffOpCopy($context); | |
} | |
$this->_block($x0, $ntrail + $xi - $x0, $y0, $ntrail + $yi - $y0, $block); | |
$block = FALSE; | |
} | |
} | |
$context = $edit->orig; | |
} | |
else { | |
if (! is_array($block)) { | |
$context = array_slice($context, sizeof($context) - $nlead); | |
$x0 = $xi - sizeof($context); | |
$y0 = $yi - sizeof($context); | |
$block = array(); | |
if ($context) { | |
$block[] = new DiffOpCopy($context); | |
} | |
} | |
$block[] = $edit; | |
} | |
if ($edit->orig) { | |
$xi += sizeof($edit->orig); | |
} | |
if ($edit->closing) { | |
$yi += sizeof($edit->closing); | |
} | |
} | |
if (is_array($block)) { | |
$this->_block($x0, $xi - $x0, $y0, $yi - $y0, $block); | |
} | |
$end = $this->_end_diff(); | |
if (!empty($xi)) { | |
$this->line_stats['counter']['x'] += $xi; | |
} | |
if (!empty($yi)) { | |
$this->line_stats['counter']['y'] += $yi; | |
} | |
return $end; | |
} | |
protected function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) { | |
$this->_start_block($this->_block_header($xbeg, $xlen, $ybeg, $ylen)); | |
foreach ($edits as $edit) { | |
if ($edit->type == 'copy') { | |
$this->_context($edit->orig); | |
} | |
elseif ($edit->type == 'add') { | |
$this->_added($edit->closing); | |
} | |
elseif ($edit->type == 'delete') { | |
$this->_deleted($edit->orig); | |
} | |
elseif ($edit->type == 'change') { | |
$this->_changed($edit->orig, $edit->closing); | |
} | |
else { | |
trigger_error('Unknown edit type', E_USER_ERROR); | |
} | |
} | |
$this->_end_block(); | |
} | |
protected function _start_diff() { | |
ob_start(); | |
} | |
protected function _end_diff() { | |
$val = ob_get_contents(); | |
ob_end_clean(); | |
return $val; | |
} | |
protected function _block_header($xbeg, $xlen, $ybeg, $ylen) { | |
if ($xlen > 1) { | |
$xbeg .= "," . ($xbeg + $xlen - 1); | |
} | |
if ($ylen > 1) { | |
$ybeg .= "," . ($ybeg + $ylen - 1); | |
} | |
return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg; | |
} | |
protected function _start_block($header) { | |
if ($this->show_header) { | |
echo $header . "\n"; | |
} | |
} | |
protected function _end_block() { | |
} | |
protected function _lines($lines, $prefix = ' ') { | |
foreach ($lines as $line) { | |
echo "$prefix $line\n"; | |
} | |
} | |
protected function _context($lines) { | |
$this->_lines($lines); | |
} | |
protected function _added($lines) { | |
$this->_lines($lines, '>'); | |
} | |
protected function _deleted($lines) { | |
$this->_lines($lines, '<'); | |
} | |
protected function _changed($orig, $closing) { | |
$this->_deleted($orig); | |
echo "---\n"; | |
$this->_added($closing); | |
} | |
} |