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); }
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; }