diff options
| author | Nils Adermann <naderman@naderman.de> | 2010-03-02 01:05:34 +0100 |
|---|---|---|
| committer | Nils Adermann <naderman@naderman.de> | 2010-03-02 01:05:34 +0100 |
| commit | 517f25353246f06eec7d1fdef90a04119a45bbbf (patch) | |
| tree | 7837b0e54fcd05f2f49a22a078b0f12cad864b30 /phpBB/includes/diff | |
| parent | 89b37954f994a7cd517553d2d16686f91dcaae72 (diff) | |
| parent | 7068d8b462e388ea87883c5203a28fa6a8e4b6dc (diff) | |
| download | forums-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.php | 24 | ||||
| -rw-r--r-- | phpBB/includes/diff/engine.php | 29 | ||||
| -rw-r--r-- | phpBB/includes/diff/renderer.php | 39 |
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 : ' ') . '</pre></td> - <td><pre>' . ((strlen($line)) ? $line : ' ') . '</pre></td></tr>'; + $output .= '<tr class="unmodified"><td><pre>' . ((strlen($line)) ? $line : ' ') . '<br /></pre></td> + <td><pre>' . ((strlen($line)) ? $line : ' ') . '<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"> </td><td class="added"><pre>' . ((strlen($line)) ? $line : ' ') . '</pre></td></tr>'; + $output .= '<tr><td class="added_empty"> </td><td class="added"><pre>' . ((strlen($line)) ? $line : ' ') . '<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 : ' ') . '</pre></td><td class="removed_empty"> </td></tr>'; + $output .= '<tr><td class="removed"><pre>' . ((strlen($line)) ? $line : ' ') . '<br /></pre></td><td class="removed_empty"> </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 : ' ') . '</pre></td>'; - $output .= '<td><pre>' . ((strlen($line)) ? $line : ' ') . '</pre></td></tr>'; + $output .= '<tr class="unmodified"><td><pre>' . ((strlen($line)) ? $line : ' ') . '<br /></pre></td>'; + $output .= '<td><pre>' . ((strlen($line)) ? $line : ' ') . '<br /></pre></td></tr>'; } } } |
