openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 516fdb8c467a7712ad8c4f52e01db9a4eb122f9e
parent 7b6d6566e4a2fdf3407d45af607957d7fe87123e
Author: dankert <devnull@localhost>
Date:   Thu, 14 Oct 2004 23:08:32 +0200

Vergleichen von Versionen

Diffstat:
actionClasses/PageelementAction.class.php | 242+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
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 = '&nbsp;'; + 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