Revert 30130, completely breaks editing with fatal PHP error.
[lhc/web/wiklou.git] / includes / DifferenceEngine.php
index 4f2abf5..349c88e 100644 (file)
@@ -707,7 +707,7 @@ CONTROL;
                        $this->mOldPagetitle = htmlspecialchars( wfMsg( 'revisionasof', $t ) );
                        
                        $this->mOldtitle = "<a href='$oldLink'>{$this->mOldPagetitle}</a>"
-                               . "(<a href='$oldEdit'>" . htmlspecialchars( wfMsg( 'editold' ) ) . "</a>)";
+                               . " (<a href='$oldEdit'>" . htmlspecialchars( wfMsg( 'editold' ) ) . "</a>)";
                        // Add an "undo" link
                        $newUndo = $this->mNewPage->escapeLocalUrl( 'action=edit&undoafter=' . $this->mOldid . '&undo=' . $this->mNewid);
                        if ( $this->mNewRev->userCan(Revision::DELETED_TEXT) )
@@ -1648,7 +1648,7 @@ class DiffFormatter
        }
 
        function _start_block($header) {
-               echo $header;
+               echo $header . "\n";
        }
 
        function _end_block() {
@@ -1677,6 +1677,84 @@ class DiffFormatter
        }
 }
 
+/**
+ * A formatter that outputs unified diffs
+ * @addtogroup DifferenceEngine
+ */
+
+class UnifiedDiffFormatter extends DiffFormatter
+{
+       var $leading_context_lines = 2;
+       var $trailing_context_lines = 2;
+       
+       function _added($lines) {
+               $this->_lines($lines, '+');
+       }
+       function _deleted($lines) {
+               $this->_lines($lines, '-');
+       }
+       function _changed($orig, $closing) {
+               $this->_deleted($orig);
+               $this->_added($closing);
+       }
+       function _block_header($xbeg, $xlen, $ybeg, $ylen) {
+               return "@@ -$xbeg,$xlen +$ybeg,$ylen @@";
+       }
+}
+
+/**
+ * A pseudo-formatter that just passes along the Diff::$edits array
+ * @addtogroup DifferenceEngine
+ */
+class ArrayDiffFormatter extends DiffFormatter
+{
+       function format($diff)
+       {
+               $oldline = 1;
+               $newline = 1;
+               $retval = array();
+               foreach($diff->edits as $edit)
+                       switch($edit->type)
+                       {
+                               case 'add':
+                                       foreach($edit->closing as $l)
+                                       {
+                                               $retval[] = array(
+                                                       'action' => 'add',
+                                                       'new'=> $l,
+                                                       'newline' => $newline++
+                                               );
+                                       }
+                                       break;
+                               case 'delete':
+                                       foreach($edit->orig as $l)
+                                       {
+                                               $retval[] = array(
+                                                       'action' => 'delete',
+                                                       'old' => $l,
+                                                       'oldline' => $oldline++,
+                                               );
+                                       }
+                                       break;
+                               case 'change':
+                                       foreach($edit->orig as $i => $l)
+                                       {
+                                               $retval[] = array(
+                                                       'action' => 'change',
+                                                       'old' => $l,
+                                                       'new' => @$edit->closing[$i],
+                                                       'oldline' => $oldline++,
+                                                       'newline' => $newline++,
+                                               );
+                                       }
+                                       break;
+                               case 'copy':
+                                       $oldline += count($edit->orig);
+                                       $newline += count($edit->orig);
+                       }
+               return $retval;
+       }                       
+}
 
 /**
  *     Additions by Axel Boldt follow, partly taken from diff.php, phpwiki-1.3.3
@@ -1892,13 +1970,15 @@ class TableDiffFormatter extends DiffFormatter
        function _added( $lines ) {
                foreach ($lines as $line) {
                        echo '<tr>' . $this->emptyLine() .
-                               $this->addedLine( htmlspecialchars ( $line ) ) . "</tr>\n";
+                               $this->addedLine( '<ins class="diffchange">' .
+                                       htmlspecialchars ( $line ) . '</ins>' ) . "</tr>\n";
                }
        }
 
        function _deleted($lines) {
                foreach ($lines as $line) {
-                       echo '<tr>' . $this->deletedLine( htmlspecialchars ( $line ) ) .
+                       echo '<tr>' . $this->deletedLine( '<del class="diffchange">' .
+                               htmlspecialchars ( $line ) . '</del>' ) .
                          $this->emptyLine() . "</tr>\n";
                }
        }