commit 516fdb8c467a7712ad8c4f52e01db9a4eb122f9e
parent 7b6d6566e4a2fdf3407d45af607957d7fe87123e
Author: dankert <devnull@localhost>
Date: Thu, 14 Oct 2004 23:08:32 +0200
Vergleichen von Versionen
Diffstat:
1 file changed, 237 insertions(+), 5 deletions(-)
diff --git a/actionClasses/PageelementAction.class.php b/actionClasses/PageelementAction.class.php
@@ -20,7 +20,10 @@
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// ---------------------------------------------------------------------------
// $Log$
-// Revision 1.8 2004-10-13 21:19:50 dankert
+// Revision 1.9 2004-10-14 21:08:32 dankert
+// Vergleichen von Versionen
+//
+// Revision 1.8 2004/10/13 21:19:50 dankert
// Lesen der Selectitem-Liste ueber Element-Objekt
//
// Revision 1.7 2004/07/07 20:43:48 dankert
@@ -290,17 +293,23 @@ class PageelementAction extends Action
$this->value->element = new Element( $this->getSessionVar('elementid') );
$this->value->element->load();
- $list = array();
+ $list = array();
+ $version_list = array();
+ $lfd_nr = 0;
foreach( $this->value->getVersionList() as $valueid )
{
+ $lfd_nr++;
$this->value->valueid = $valueid;
$this->value->loadWithId();
$this->value->generate();
if ( $this->value->lastchangeTimeStamp != 0 )
$date = date( lang('DATE_FORMAT'),$this->value->lastchangeTimeStamp);
- else $date = ' ';
+ else $date = lang('UNKNOWN');
+
+ if ( in_array( $this->value->element->type,array('text','longtext') ) )
+ $version_list[ $valueid ] = '('.$lfd_nr.') '.$date;
if ( ! $this->value->active )
$useUrl = Html::url(array('action' =>'pageelement',
@@ -324,6 +333,7 @@ class PageelementAction extends Action
$list[] = array( 'value' => Text::maxLaenge( 50,$this->value->value),
'date' => $date,
+ 'lfd_nr' => $lfd_nr,
'user' => User::getUserName($this->value->lastchangeUserId),
'useUrl' => $useUrl,
'public' => $public,
@@ -331,10 +341,232 @@ class PageelementAction extends Action
'releaseUrl'=> $releaseUrl );
}
- $this->setTemplateVar('name',$this->value->element->name);
- $this->setTemplateVar('el',$list);
+ $this->setTemplateVar('name' ,$this->value->element->name);
+ $this->setTemplateVar('el' ,$list);
+ $this->setTemplateVar('version_list',$version_list);
$this->forward('pageelement_archive');
}
+
+
+ /**
+ * Vergleicht 2 Versionen eines Inhaltes
+ */
+ function diff()
+ {
+ $value1id = $this->getRequestVar('value1id');
+ $value2id = $this->getRequestVar('value2id');
+
+ // Wenn Value1-Id groesser als Value2-Id, dann Variablen tauschen
+ if ( $value1id > $value2id )
+ list($value1id,$value2id) = array( $value2id,$value1id );
+
+
+ $value1 = new Value( $value1id );
+ $value2 = new Value( $value2id );
+ $value1->valueid = $value1id;
+ $value2->valueid = $value2id;
+
+ $value1->loadWithId();
+ $value2->loadWithId();
+
+ Logger::debug( 'comparing value '.$value1id.' with '.$value2id );
+
+ $date1 = date( lang('DATE_FORMAT'),$value1->lastchangeTimeStamp);
+ $this->setTemplateVar('title1',$date1);
+
+ $date2 = date( lang('DATE_FORMAT'),$value2->lastchangeTimeStamp);
+ $this->setTemplateVar('title2',$date2);
+
+ $text1 = explode("\n",$value1->text);
+ $text2 = explode("\n",$value2->text);
+
+ $res_diff = $this->textdiff($text1,$text2);
+ #echo "<pre>";
+ #print_r($res_diff);
+ #echo "</pre>";
+ list( $text1,$text2 ) = $res_diff;
+
+ $this->setTemplateVar('text1',$text1 );
+ $this->setTemplateVar('text2',$text2 );
+
+ $this->forward('pageelement_diff');
+ }
+
+
+ /**
+ * Vergleicht 2 Text-Arrays und ermittelt eine Darstellung der Unterschiede
+ *
+ */
+ function textdiff( $from_text,$to_text )
+ {
+ // Zaehler pro Textarray
+ $pos_from = -1;
+ $pos_to = -1;
+
+ // Ergebnis-Arrays
+ $from_out = array();
+ $to_out = array();
+
+ while( true )
+ {
+ $pos_from++;
+ $pos_to ++;
+
+ if ( !isset($from_text[$pos_from]) &&
+ !isset($to_text [$pos_to ]) )
+ {
+ // Text in ist 'neu' und 'alt' zuende. Ende der Schleife.
+ break;
+ }
+ elseif
+ ( isset($from_text[$pos_from]) &&
+ !isset($to_text [$pos_to]) )
+ {
+ // Text in 'neu' ist zuende, die Restzeilen von 'alt' werden ausgegeben
+ while( isset($from_text[$pos_from]) )
+ {
+ $from_out[] = array('text'=>$from_text[$pos_from],'line'=>$pos_from+1,'type'=>'old');
+ $to_out [] = array();
+ $pos_from++;
+ }
+ break;
+ }
+ elseif
+ ( !isset($from_text[$pos_from]) &&
+ isset($to_text [$pos_to]) )
+ {
+ // Umgekehrter Fall: Text in 'alt' ist zuende, Restzeilen aus 'neu' werden ausgegeben
+ while( isset($to_text[$pos_to]) )
+ {
+ $from_out[] = array();
+ $to_out [] = array('text'=>$to_text[$pos_to],'line'=>$pos_to+1,'type'=>'new');
+ $pos_to++;
+ }
+ break;
+ }
+ elseif
+ ( rtrim($from_text[$pos_from]) != rtrim($to_text[$pos_to]) )
+ {
+ // Zeilen sind vorhanden, aber ungleich
+ // Wir suchen jetzt die naechsten beiden Zeilen, die gleich sind.
+ $max_entf = min(count($from_text)-$pos_from-1,count($to_text)-$pos_to-1);
+
+ #echo "suche start, max_entf=$max_entf, pos_from=$pos_from, pos_to=$pos_to<br/>";
+
+ for ( $a=0; $a<=$max_entf; $a++ )
+ {
+ #echo "a ist $a<br/>";
+ for ( $b=0; $b<=$max_entf; $b++ )
+ {
+ #echo "b ist $b<br/>";
+ if ( trim($from_text[$pos_from+$b]) != '' &&
+ $from_text[$pos_from+$b] == $to_text[$pos_to+$a] )
+ {
+ $pos_gef_from = $pos_from+$b;
+ $pos_gef_to = $pos_to +$a;
+ break;
+ }
+
+ if ( trim($from_text[$pos_from+$a]) != '' &&
+ $from_text[$pos_from+$a] == $to_text[$pos_to+$b] )
+ {
+ $pos_gef_from = $pos_from+$a;
+ $pos_gef_to = $pos_to +$b;
+ break;
+ }
+ }
+
+ if ( $b <=$max_entf)
+ {
+ break;
+ }
+ }
+
+ if ( $a<=$max_entf )
+ {
+ // Gleiche Zeile gefunden
+ #echo "gefunden, pos_gef_from=$pos_gef_from, pos_gef_to=$pos_gef_to<br/>";
+
+ if ( $pos_gef_from - $pos_from == 0 )
+ $type = 'new';
+ elseif
+ ( $pos_gef_to - $pos_to == 0 )
+ $type = 'old';
+ else
+ $type = 'notequal';
+
+ while( $pos_gef_from - $pos_from > 0 &&
+ $pos_gef_to - $pos_to > 0 )
+ {
+ $from_out[] = array('text'=>$from_text[$pos_from],'line'=>$pos_from+1,'type'=>$type);
+ $to_out [] = array('text'=>$to_text [$pos_to ],'line'=>$pos_to+1 ,'type'=>$type);
+
+ $pos_from++;
+ $pos_to++;
+ }
+
+ while( $pos_gef_from - $pos_from > 0 )
+ {
+ $from_out[] = array('text'=>$from_text[$pos_from],'line'=>$pos_from+1,'type'=>$type);
+ $to_out [] = array();
+ $pos_from++;
+ }
+
+ while( $pos_gef_to - $pos_to > 0 )
+ {
+ $from_out[] = array();
+ $to_out [] = array('text'=>$to_text [$pos_to ],'line'=>$pos_to+1 ,'type'=>$type);
+ $pos_to++;
+ }
+ $pos_from--;
+ $pos_to--;
+ }
+ else
+ {
+ // Keine gleichen Zeilen gefunden
+ #echo "nicht gefunden, i=$i, j=$j, pos_from war $pos_from, pos_to war $pos_to<br/>";
+
+ while( true )
+ {
+ if ( !isset($from_text[$pos_from]) &&
+ !isset($to_text [$pos_to ]) )
+ {
+ break;
+ }
+ elseif
+ ( isset($from_text[$pos_from]) &&
+ !isset($to_text [$pos_to ]) )
+ {
+ $from_out[] = array('text'=>$from_text[$pos_from],'line'=>$pos_from+1,'type'=>'notequal');
+ $to_out [] = array();
+ }
+ elseif
+ ( !isset($from_text[$pos_from]) &&
+ isset($to_text [$pos_to ]) )
+ {
+ $from_out[] = array();
+ $to_out [] = array('text'=>$to_text [$pos_to ],'line'=>$pos_to+1 ,'type'=>'notequal');
+ }
+ else
+ {
+ $from_out[] = array('text'=>$from_text[$pos_from],'line'=>$pos_from+1,'type'=>'notequal');
+ $to_out [] = array('text'=>$to_text [$pos_to ],'line'=>$pos_to+1 ,'type'=>'notequal');
+ }
+ $pos_from++;
+ $pos_to++;
+ }
+ }
+ }
+ else
+ {
+ // Zeilen sind gleich
+ $from_out[] = array('text'=>$from_text[$pos_from],'line'=>$pos_from+1,'type'=>'equal');
+ $to_out [] = array('text'=>$to_text [$pos_to ],'line'=>$pos_to+1 ,'type'=>'equal');
+ }
+ }
+
+ return( array($from_out,$to_out) );
+ }
}
?>
\ No newline at end of file