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