예제 #1
0
 function run()
 {
     try {
         $nPageId = (int) AnwEnv::_GET("page");
         if ($nPageId <= 0) {
             throw new AnwBadCallException();
         }
         //find TO revision
         $nRevToChangeId = (int) AnwEnv::_GET("revto");
         if ($nRevToChangeId <= 0) {
             throw new AnwBadCallException();
         } else {
             $oPageRevTo = AnwPage::getPageByChangeId($nPageId, $nRevToChangeId);
         }
         //find FROM revision
         $nRevFromChangeId = (int) AnwEnv::_GET("revfrom");
         if ($nRevFromChangeId <= 0) {
             try {
                 $oPageRevFrom = $oPageRevTo->getPreviousArchive();
             } catch (AnwArchiveNotFoundException $e) {
                 //if TO revision is already the last...
                 $oPageRevFrom = $oPageRevTo;
             }
         } else {
             $oPageRevFrom = AnwPage::getPageByChangeId($nPageId, $nRevFromChangeId);
         }
         if (!$oPageRevTo) {
             throw new AnwBadCallException("page revision TO not found :" . $nRevToChangeId);
         }
         if (!$oPageRevTo->getContent() instanceof AnwContentPage) {
             throw new AnwUnexpectedException("error getcontent for page revision TO :" . $nRevToChangeId);
         }
         if (!$oPageRevFrom) {
             throw new AnwBadCallException("page revision FROM not found :" . $nRevFromChangeId);
         }
         if (!$oPageRevFrom->getContent() instanceof AnwContentPage) {
             throw new AnwUnexpectedException("error getcontent for page revision FROM :" . $nRevFromChangeId);
         }
         // check permissions
         $oPageRevFrom->checkGlobalAndViewActionAllowed($this->getName());
         $oPageRevTo->checkGlobalAndViewActionAllowed($this->getName());
         $oContentXmlFrom = $oPageRevFrom->getContent()->toXml();
         $oContentXmlTo = $oPageRevTo->getContent()->toXml();
     } catch (AnwBadPageNameException $e) {
         $this->error($this->g_("err_badcall"));
     } catch (AnwBadCallException $e) {
         $this->error($this->g_("err_badcall"));
     } catch (AnwPageNotFoundException $e) {
         $this->error($this->g_("err_badcall"));
     } catch (AnwArchiveNotFoundException $e) {
         $this->error($this->g_("err_badcall"));
     }
     $this->setTitle($this->t_("title", array("pagename" => $oPageRevTo->getName())));
     $oDiffs = new AnwDiffs($oContentXmlFrom, $oContentXmlTo);
     if (!AnwCurrentSession::getUser()->isPhpEditionAllowed()) {
         $oDiffs->hidePhpCode();
     } else {
         $oDiffs->showPhpCode();
     }
     $this->out .= $this->tpl()->beforeDiffs($this->linkMe(), $oPageRevFrom, $oPageRevTo, $oPageRevTo->getActivePage());
     if ($oPageRevFrom->getChangeId() == $oPageRevTo->getChangeId()) {
         $this->out .= $this->tpl()->drawNotice($this->t_("notice_same"));
     }
     if ($oPageRevFrom->getChangeId() > $oPageRevTo->getChangeId()) {
         $this->out .= $this->tpl()->drawNotice($this->t_("notice_reverse"));
     }
     $this->renderDiffs($oDiffs);
 }
예제 #2
0
 private static function findDiffsNodes($aoDiffs)
 {
     //AnwDebug::logdetail(" ------ findDiffsNodes ------ ");
     $aoNewDiffs = array();
     //find edited nodes (= near deletion + addition with the same tag)
     $nCountDiffs = count($aoDiffs);
     for ($i = 0; $i < $nCountDiffs; $i++) {
         //$bKeepDiffUnchanged = true;
         if (isset($aoDiffs[$i])) {
             $oDiff = $aoDiffs[$i];
             if ($oDiff->getDiffType() == AnwDiff::TYPE_ADDED || $oDiff->getDiffType() == AnwDiff::TYPE_DELETED) {
                 $j = self::findEditedNodes_findNext($aoDiffs, $i);
                 if ($j) {
                     if ($oDiff->getDiffType() == AnwDiff::TYPE_ADDED) {
                         $iDiffAdded = $i;
                         $iDiffDeleted = $j;
                     } else {
                         $iDiffAdded = $j;
                         $iDiffDeleted = $i;
                     }
                     $oDiffAdded = $aoDiffs[$iDiffAdded];
                     $oDiffDeleted = $aoDiffs[$iDiffDeleted];
                     //AnwDebug::logdetail("?!? ".htmlentities(AnwUtils::xmlDumpNode($oDiffAdded->getNode()))." (".$oDiffAdded->getNode()->nodeName.")");
                     if (AnwXml::xmlIsTextNode($oDiffAdded->getNode()) || AnwXml::xmlIsUnmodifiableBlockNode($oDiffAdded->getNode())) {
                         //---------------------------------------------------------
                         //   EDITED NODE
                         //---------------------------------------------------------
                     } else {
                         //---------------------------------------------------------
                         //   DIFFS NODE
                         //---------------------------------------------------------
                         $oDiffReplacingAdded = new AnwDiffs($oDiffDeleted->getNode(), $oDiffAdded->getNode(), $oDiffAdded->getNode());
                         //AnwDebug::logdetail("findEditedNodes : AnwDiffs found".htmlentities(AnwUtils::xmlDumpNode($oDiffDeleted->getNode()))." --> ".htmlentities(AnwUtils::xmlDumpNode($oDiffAdded->getNode())));
                         //pre-calculate diffs - recursive call to xmlDiff()
                         $oDiffReplacingAdded->getAllDiffs();
                         //replace AnwDiffAdded with AnwDiffEdited, remove AnwDiffDeleted
                         //$bKeepDiffUnchanged = false;
                         //$aoNewDiffs[] = $oDiffReplacingAdded; //replace AnwDiffAdded
                         $oDiff = $oDiffReplacingAdded;
                         //replace AnwDiffAdded
                         unset($aoDiffs[$iDiffDeleted]);
                         //remove AnwDiffDeleted
                     }
                 }
             }
             //if ($bKeepDiffUnchanged)
             //{
             $aoNewDiffs[] = $oDiff;
             //}
         }
     }
     return $aoNewDiffs;
 }