Exemplo n.º 1
0
 private static function xmlDiffBasic($node1, $node2)
 {
     $childsOld = $node1->childNodes;
     $childsNew = $node2->childNodes;
     $aoDiffs = array();
     $iStartNewChild = 0;
     // next childNew offset
     foreach ($childsOld as $oChildOld) {
         $bMatch = false;
         //AnwDebug::logdetail(" * Now, searching : ".htmlentities(AnwUtils::xmlDumpNode($oChildOld)));
         // search a childNew similar to $oChildOld, starting at offset $iStartNewChild
         //$nblinesdiff=0;
         for ($iNewChild = $iStartNewChild; $iNewChild < $childsNew->length; $iNewChild++) {
             $oChildNew = $childsNew->item($iNewChild);
             //AnwDebug::logdetail("   -> Comparing with ".htmlentities(AnwUtils::xmlDumpNode($oChildNew)));
             /*
             				if ( $iNewChild==($childsNew->length) || /*$nblinesdiff > 0 &&*/
             /* AnwXml::xmlAreSimilarNodes($oChildOld, $oChildNew) )
             			{
             				//---------------------------------------------------------
             				//   ADDED NODES
             				//---------------------------------------------------------
             				for($i = $iStartNewChild; $i < $iNewChild; $i++)
             				{
             					AnwDebug::log(" -> added : ".htmlentities(AnwUtils::xmlDumpNode($childsNew->item($i))));
             					$oDiff = new AnwDiffAdded($childsNew->item($i));
             					$aoDiffs[] = $oDiff;
             				}
             			}*/
             $bTestSimilar = AnwXml::xmlAreSimilarNodes($oChildOld, $oChildNew);
             if ($bTestSimilar) {
                 //---------------------------------------------------------
                 //   ADDED NODES
                 //---------------------------------------------------------
                 for ($i = $iStartNewChild; $i < $iNewChild; $i++) {
                     $oChildNewAdded = $childsNew->item($i);
                     //AnwDebug::logdetail("[]added (before kept) : ".htmlentities(AnwUtils::xmlDumpNode($oChildNewAdded)));
                     $aoDiffs[] = new AnwDiffAdded($oChildNewAdded);
                     $iStartNewChild++;
                 }
                 //---------------------------------------------------------
                 //   KEPT NODE
                 //---------------------------------------------------------
                 if ($iStartNewChild != $iNewChild) {
                     throw new AnwUnexpectedException("{$iStartNewChild} should equal to {$iNewChild}");
                 }
                 //AnwDebug::logdetail("[]kept : ".htmlentities(AnwUtils::xmlDumpNode($oChildOld)));
                 $aoDiffs[] = new AnwDiffKept($oChildOld);
                 $iStartNewChild++;
                 //$iStartNewChild = $iNewChild+1;
                 $bMatch = true;
                 break;
             } else {
                 //no match at this line, try next one
                 //$nblinesdiff++;
             }
         }
         //---------------------------------------------------------
         //   ADDED NODES
         //---------------------------------------------------------
         for ($i = $iStartNewChild; $i < $iNewChild; $i++) {
             $oChildNewAdded = $childsNew->item($i);
             //AnwDebug::logdetail("[]added : ".htmlentities(AnwUtils::xmlDumpNode($oChildNewAdded)));
             $aoDiffs[] = new AnwDiffAdded($oChildNewAdded);
             $iStartNewChild++;
         }
         if ($bMatch == false) {
             //---------------------------------------------------------
             //   DELETED NODE
             //---------------------------------------------------------
             //no match found -> the line has been deleted
             //AnwDebug::logdetail("[]deleted : ".htmlentities(AnwUtils::xmlDumpNode($oChildOld)));
             $oDiff = new AnwDiffDeleted($oChildOld);
             $aoDiffs[] = $oDiff;
         }
     }
     //check that nothing was added at bottom of the file
     for ($i = $iStartNewChild; $i < $childsNew->length; $i++) {
         //---------------------------------------------------------
         //   ADDED NODES
         //---------------------------------------------------------
         $oChildNewAdded = $childsNew->item($i);
         //AnwDebug::logdetail("[]added (at end) : ".htmlentities(AnwUtils::xmlDumpNode($oChildNewAdded)));
         $oDiff = new AnwDiffAdded($oChildNewAdded);
         $aoDiffs[] = $oDiff;
     }
     /*print "************BEFOREDIFFS**************".'<ul style="font-size:12px; font-family:verdana">';
     		foreach ($aoDiffs as $oDiff){
     			print $oDiff->debugHtml();
     		}
     		print '</ul>';*/
     ////$aoDiffs = self::findMovedNodes($aoDiffs); //find moved nodes - first pass
     $aoDiffs = self::findDiffsNodes($aoDiffs);
     //find diffs only
     return $aoDiffs;
 }