aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/diff
diff options
context:
space:
mode:
authorNils Adermann <naderman@naderman.de>2010-03-02 01:05:34 +0100
committerNils Adermann <naderman@naderman.de>2010-03-02 01:05:34 +0100
commit517f25353246f06eec7d1fdef90a04119a45bbbf (patch)
tree7837b0e54fcd05f2f49a22a078b0f12cad864b30 /phpBB/includes/diff
parent89b37954f994a7cd517553d2d16686f91dcaae72 (diff)
parent7068d8b462e388ea87883c5203a28fa6a8e4b6dc (diff)
downloadforums-517f25353246f06eec7d1fdef90a04119a45bbbf.tar
forums-517f25353246f06eec7d1fdef90a04119a45bbbf.tar.gz
forums-517f25353246f06eec7d1fdef90a04119a45bbbf.tar.bz2
forums-517f25353246f06eec7d1fdef90a04119a45bbbf.tar.xz
forums-517f25353246f06eec7d1fdef90a04119a45bbbf.zip
Merge commit 'release-3.0-B5'
Diffstat (limited to 'phpBB/includes/diff')
-rw-r--r--phpBB/includes/diff/diff.php24
-rw-r--r--phpBB/includes/diff/engine.php29
-rw-r--r--phpBB/includes/diff/renderer.php39
3 files changed, 63 insertions, 29 deletions
diff --git a/phpBB/includes/diff/diff.php b/phpBB/includes/diff/diff.php
index ca8d16fd3e..b18970dab4 100644
--- a/phpBB/includes/diff/diff.php
+++ b/phpBB/includes/diff/diff.php
@@ -15,10 +15,6 @@ if (!defined('IN_PHPBB'))
exit;
}
-// Include renderer and engine
-include_once($phpbb_root_path . 'includes/diff/engine.' . $phpEx);
-include_once($phpbb_root_path . 'includes/diff/renderer.' . $phpEx);
-
/**
* Code from pear.php.net, Text_Diff-0.2.1 (beta) package
* http://pear.php.net/package/Text_Diff/
@@ -46,10 +42,10 @@ class diff
* @param array $from_lines An array of strings. Typically these are lines from a file.
* @param array $to_lines An array of strings.
*/
- function diff($from_lines, $to_lines)
+ function diff(&$from_content, &$to_content, $preserve_cr = true)
{
$diff_engine = &new diff_engine();
- $this->_edits = call_user_func_array(array($diff_engine, 'diff'), array($from_lines, $to_lines));
+ $this->_edits = $diff_engine->diff($from_content, $to_content, $preserve_cr);
}
/**
@@ -248,7 +244,7 @@ class mapped_diff extends diff
* compared when computing the diff.
* @param array $mapped_to_lines This array should have the same number of elements as $to_lines.
*/
- function mapped_diff($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines)
+ function mapped_diff(&$from_lines, &$to_lines, &$mapped_from_lines, &$mapped_to_lines)
{
if (sizeof($from_lines) != sizeof($mapped_from_lines) || sizeof($to_lines) != sizeof($mapped_to_lines))
{
@@ -414,10 +410,16 @@ class diff3 extends diff
* @param array $final1 The first version to compare to.
* @param array $final2 The second version to compare to.
*/
- function diff3($orig, $final1, $final2)
+ function diff3(&$orig, &$final1, &$final2)
{
- $engine = new diff_engine();
- $this->_edits = $this->_diff3($engine->diff($orig, $final1), $engine->diff($orig, $final2));
+ $diff_engine = &new diff_engine();
+
+ $diff_1 = $diff_engine->diff($orig, $final1);
+ $diff_2 = $diff_engine->diff($orig, $final2);
+
+ unset($engine);
+
+ $this->_edits = $this->_diff3($diff_1, $diff_2);
}
/**
@@ -542,7 +544,7 @@ class diff3 extends diff
/**
* @access private
*/
- function _diff3($edits1, $edits2)
+ function _diff3(&$edits1, &$edits2)
{
$edits = array();
$bb = &new diff3_block_builder();
diff --git a/phpBB/includes/diff/engine.php b/phpBB/includes/diff/engine.php
index 5fcb317dd5..a74fa9d263 100644
--- a/phpBB/includes/diff/engine.php
+++ b/phpBB/includes/diff/engine.php
@@ -47,10 +47,32 @@ if (!defined('IN_PHPBB'))
*/
class diff_engine
{
- function diff($from_lines, $to_lines)
+ function diff(&$from_lines, &$to_lines, $preserve_cr = true)
{
- array_walk($from_lines, array('diff', 'trim_newlines'));
- array_walk($to_lines, array('diff', 'trim_newlines'));
+ // Remove empty lines...
+ // If preserve_cr is true, we basically only change \r\n and bare \r to \n to get the same carriage returns for both files
+ // If it is false, we try to only use \n once per line and ommit all empty lines to be able to get a proper data diff
+
+ if (is_array($from_lines))
+ {
+ $from_lines = implode("\n", $from_lines);
+ }
+
+ if (is_array($to_lines))
+ {
+ $to_lines = implode("\n", $to_lines);
+ }
+
+ if ($preserve_cr)
+ {
+ $from_lines = explode("\n", str_replace("\r", "\n", str_replace("\r\n", "\n", $from_lines)));
+ $to_lines = explode("\n", str_replace("\r", "\n", str_replace("\r\n", "\n", $to_lines)));
+ }
+ else
+ {
+ $from_lines = explode("\n", preg_replace('#[\n\r]+#', "\n", $from_lines));
+ $to_lines = explode("\n", preg_replace('#[\n\r]+#', "\n", $to_lines));
+ }
$n_from = sizeof($from_lines);
$n_to = sizeof($to_lines);
@@ -249,6 +271,7 @@ class diff_engine
}
}
+ // no reset() here
while (list($junk, $y) = each($matches))
{
if ($y > $this->seq[$k - 1])
diff --git a/phpBB/includes/diff/renderer.php b/phpBB/includes/diff/renderer.php
index 984fd65708..e920e9688f 100644
--- a/phpBB/includes/diff/renderer.php
+++ b/phpBB/includes/diff/renderer.php
@@ -98,8 +98,13 @@ class diff_renderer
if (is_a($diff, 'diff3'))
{
$diff3 = &$diff;
- $diff = &new diff($diff3->get_original(), $diff3->merged_output());
+
+ $diff_1 = $diff3->get_original();
+ $diff_2 = $diff3->merged_output();
+
unset($diff3);
+
+ $diff = &new diff($diff_1, $diff_2);
}
$nlead = $this->_leading_context_lines;
@@ -293,17 +298,17 @@ class diff_renderer_unified extends diff_renderer
function _context($lines)
{
- return '<pre class="diff context">' . htmlspecialchars($this->_lines($lines, ' ')) . '</pre>';
+ return '<pre class="diff context">' . htmlspecialchars($this->_lines($lines, ' ')) . '<br /></pre>';
}
function _added($lines)
{
- return '<pre class="diff added">' . htmlspecialchars($this->_lines($lines, '+')) . '</pre>';
+ return '<pre class="diff added">' . htmlspecialchars($this->_lines($lines, '+')) . '<br /></pre>';
}
function _deleted($lines)
{
- return '<pre class="diff removed">' . htmlspecialchars($this->_lines($lines, '-')) . '</pre>';
+ return '<pre class="diff removed">' . htmlspecialchars($this->_lines($lines, '-')) . '<br /></pre>';
}
function _changed($orig, $final)
@@ -360,7 +365,7 @@ class diff_renderer_inline extends diff_renderer
*/
function get_diff_content($diff)
{
- return '<pre>' . nl2br($this->render($diff)) . '</pre>';
+ return '<pre>' . nl2br($this->render($diff)) . '<br /></pre>';
}
function _start_diff()
@@ -440,7 +445,11 @@ class diff_renderer_inline extends diff_renderer
// We want to split on word boundaries, but we need to preserve whitespace as well.
// Therefore we split on words, but include all blocks of whitespace in the wordlist.
- $diff = &new diff($this->_split_on_words($text1, $nl), $this->_split_on_words($text2, $nl));
+ $splitted_text_1 = $this->_split_on_words($text1, $nl);
+ $splitted_text_2 = $this->_split_on_words($text2, $nl);
+
+ $diff = &new diff($splitted_text_1, $splitted_text_2);
+ unset($splitted_text_1, $splitted_text_2);
// Get the diff in inline format.
$renderer = &new diff_renderer_inline(array_merge($this->get_params(), array('split_level' => 'words')));
@@ -506,7 +515,7 @@ class diff_renderer_raw extends diff_renderer
*/
function get_diff_content($diff)
{
- return '<textarea style="height: 400px;" class="full">' . htmlspecialchars($this->render($diff)) . '</textarea>';
+ return '<textarea style="height: 290px;" class="full">' . htmlspecialchars($this->render($diff)) . '</textarea>';
}
function _block_header($xbeg, $xlen, $ybeg, $ylen)
@@ -605,8 +614,8 @@ class diff_renderer_side_by_side extends diff_renderer
$line = $current_context;
$current_context = '';
- $output .= '<tr class="unmodified"><td><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '</pre></td>
- <td><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '</pre></td></tr>';
+ $output .= '<tr class="unmodified"><td><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '<br /></pre></td>
+ <td><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '<br /></pre></td></tr>';
}
switch ($change['type'])
@@ -619,7 +628,7 @@ class diff_renderer_side_by_side extends diff_renderer
$line .= htmlspecialchars($_line) . '<br />';
}
- $output .= '<tr><td class="added_empty">&nbsp;</td><td class="added"><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '</pre></td></tr>';
+ $output .= '<tr><td class="added_empty">&nbsp;</td><td class="added"><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '<br /></pre></td></tr>';
break;
case 'remove':
@@ -630,7 +639,7 @@ class diff_renderer_side_by_side extends diff_renderer
$line .= htmlspecialchars($_line) . '<br />';
}
- $output .= '<tr><td class="removed"><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '</pre></td><td class="removed_empty">&nbsp;</td></tr>';
+ $output .= '<tr><td class="removed"><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '<br /></pre></td><td class="removed_empty">&nbsp;</td></tr>';
break;
case 'empty':
@@ -655,7 +664,7 @@ class diff_renderer_side_by_side extends diff_renderer
if (!empty($left))
{
- $output .= '<td class="modified"><pre>' . $left . '</pre></td>';
+ $output .= '<td class="modified"><pre>' . $left . '<br /></pre></td>';
}
else if ($row < $oldsize)
{
@@ -668,7 +677,7 @@ class diff_renderer_side_by_side extends diff_renderer
if (!empty($right))
{
- $output .= '<td class="modified"><pre>' . $right . '</pre></td>';
+ $output .= '<td class="modified"><pre>' . $right . '<br /></pre></td>';
}
else if ($row < $newsize)
{
@@ -689,8 +698,8 @@ class diff_renderer_side_by_side extends diff_renderer
$line = $current_context;
$current_context = '';
- $output .= '<tr class="unmodified"><td><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '</pre></td>';
- $output .= '<td><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '</pre></td></tr>';
+ $output .= '<tr class="unmodified"><td><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '<br /></pre></td>';
+ $output .= '<td><pre>' . ((strlen($line)) ? $line : '&nbsp;') . '<br /></pre></td></tr>';
}
}
}