* * @package Wiki */ define( "DIFF_EQUAL", "=" ); define( "DIFF_ADDED", "+" ); define( "DIFF_DELETED", "-" ); define( "DIFF_MOVED", "M" ); /** * Get difference between two strings * @param string old first string * @param string new second string * @param boolean show_equals set to true to see line that are equal between * the two strings (default true) * @param string format_line_function callback function to format line * (default 'format_line') * @return string formated diff output */ function diff( $old, $new, $show_equals = false, $format_line_function = 'format_line' ) { $oldArr = str_split_on_new_line( $old ); $newArr = str_split_on_new_line( $new ); $oldCount = count ( $oldArr ); $newCount = count ( $newArr ); $max = max( $oldCount, $newCount ); //get added and deleted lines $deleted = array_diff_assoc( $oldArr, $newArr ); $added = array_diff_assoc( $newArr, $oldArr ); $moved = array(); foreach ( $added as $key => $candidate ) { foreach ( $deleted as $index => $content ) { if ( $candidate == $content ) { $moved[$key] = $candidate; unset( $added[$key] ); unset( $deleted[$index] ); break; } } } $output = ''; for ( $i = 0; $i < $max; $i++ ) { // line changed if ( isset ( $deleted[$i] ) && isset( $added[$i] ) ) { $output .= $format_line_function( $i, DIFF_DELETED, $deleted[$i] ); $output .= $format_line_function( $i, DIFF_ADDED, $added[$i] ); } // line deleted elseif ( isset ( $deleted[$i] ) && ! isset ( $added[$i] ) ) { $output .= $format_line_function( $i, DIFF_DELETED, $deleted[$i] ); } // line added elseif ( isset ( $added[$i] ) && ! isset ( $deleted[$i] ) ) { $output .= $format_line_function( $i, DIFF_ADDED, $added[$i] ); } // line moved elseif ( isset ( $moved[$i] ) ) { $output .= $format_line_function( $i, DIFF_MOVED, $newArr[$i] ); } // line unchanged elseif ( $show_equals == true ) { $output .= $format_line_function( $i, DIFF_EQUAL, $newArr[$i] ); } else { // skip } } return $output; } /** * Split strings on new line */ function str_split_on_new_line( $str ) { $content = array(); if ( strpos( $str, "\r\n" ) != false ) { $content = explode("\r\n", $str ); } elseif ( strpos( $str, "\n" ) != false ) { $content = explode( "\n", $str ); } elseif ( strpos( $str, "\r" ) != false ) { $content = explode( "\r", $str ); } else { $content[] = $str; } return $content; } /** * Default and prototype format line function * @param int line line number * @param mixed type line type, must be one of the following : * DIFF_EQUAL, DIFF_MOVED, DIFF_ADDED, DIFF_DELETED * @param string value line content * @param boolean skip_empty skip empty lines (default false) * @return string formated diff line */ function format_line( $line, $type, $value, $skip_empty = false ) { if ( trim( $value ) == "" && $skip_empty ) { return ""; } elseif ( trim( $value ) == "" ) { $value = ' '; } switch ( $type ) { case DIFF_EQUAL: { // return $line. ' : ' . ' = ' . $value . '
' . "\n" ; return '' . $value . '
' . "\n" ; //juan carlos muestra solo color break; } case DIFF_MOVED: { //return $line. ' : ' . ' M ' . $value . '
' . "\n" ; //juan carlos raña la sustitye la inverior return '' . $value . '
' . "\n" ; //juan carlos muestra solo color break; } case DIFF_ADDED: { //return $line . ' : ' . ' + ' . $value . '
' . "\n" ; return '' . $value . '
' . "\n" ; //juan carlos muestra solo color break; } case DIFF_DELETED: { //return $line . ' : ' . ' - ' . $value . '
' . "\n" ; //juan carlos raña la sustitye la inverior return '' . $value . '
' . "\n" ; //juan carlos muestra solo color break; } } } /** * Table format line function * @see format_line */ function format_table_line( $line, $type, $value, $skip_empty = false ) { if ( trim( $value ) == "" && $skip_empty ) { return ""; } elseif ( trim( $value ) == "" ) { $value = ' '; } switch ( $type ) { case DIFF_EQUAL: { //return '' . $line. ' : ' . ' =' . $value . '' . "\n"; //juan carlos comentado return ''. $value . '' . "\n" ; //juan carlos muestra solo color (no también la línea). Además EN IEXPLORER VA BIEN PERO EN FIREFOX 3 la etiqueta span no muestra el color de fondo que está definido en la hoja de estilos como background-color, aceptando sólo la propiedad color pero esta solo da color al texto con lo cual los cambios quedan poco resaltados, además los cambios de otros objetos que no sean texto no se indican por ej. añadir una imagen, por esta razón doy el color de fondo al td directamente. break; } case DIFF_MOVED: { // return '' . $line. ' : ' . ' M' . $value . '' . "\n" //juan carlos comenta ; return ''. $value . '' . "\n" ; //juan carlos muestra solo color (no también la línea). Además EN IEXPLORER VA BIEN PERO EN FIREFOX 3 la etiqueta span no muestra el color de fondo que está definido en la hoja de estilos como background-color, aceptando sólo la propiedad color pero esta solo da color al texto con lo cual los cambios quedan poco resaltados, además los cambios de otros objetos que no sean texto no se indican por ej. añadir una imagen, por esta razón doy el color de fondo al td directamente. break; } case DIFF_ADDED: { // return '' . $line. ' : ' . ' +' . $value . '' . "\n" ; //juan carlos comentado return ''. $value . '' . "\n" ; //juan carlos muestra solo color (no también la línea). Además EN IEXPLORER VA BIEN PERO EN FIREFOX 3 la etiqueta span no muestra el color de fondo que está definido en la hoja de estilos como background-color, aceptando sólo la propiedad color pero esta solo da color al texto con lo cual los cambios quedan poco resaltados, además los cambios de otros objetos que no sean texto no se indican por ej. añadir una imagen, por esta razón doy el color de fondo al td directamente. break; } case DIFF_DELETED: { // return '' . $line. ' : ' . ' -' . $value . '' . "\n" ; //juan carlos comentado return ''. $value . '' . "\n" ; //juan carlos muestra solo color (no también la línea). Además EN IEXPLORER VA BIEN PERO EN FIREFOX 3 la etiqueta span no muestra el color de fondo que está definido en la hoja de estilos como background-color, aceptando sólo la propiedad color pero esta solo da color al texto con lo cual los cambios quedan poco resaltados, además los cambios de otros objetos que no sean texto no se indican por ej. añadir una imagen, por esta razón doy el color de fondo al td directamente. } } } if (! function_exists('array_diff_assoc') ) { /** * Replace array_diff_assoc() * * @link http://php.net/function.array_diff_assoc * @author Aidan Lister * @since PHP 4.3.0 * @require PHP 4.0.0 (user_error) */ function array_diff_assoc() { // Check we have enough arguments $args = func_get_args(); $count = count($args ); if (count($args ) < 2 ) { trigger_error('Wrong parameter count for array_diff_assoc()', E_USER_WARNING ); return; } // Check arrays for ($i = 0; $i < $count; $i++ ) { if (! is_array($args[$i] ) ) { trigger_error('array_diff_assoc() Argument #' . ($i + 1) . ' is not an array', E_USER_WARNING ); return; } } // Get the comparison array $array_comp = array_shift($args ); --$count; // Traverse values of the first array foreach ($array_comp as $key => $value ) { // Loop through the other arrays for ($i = 0; $i < $count; $i++ ) { // Loop through this arrays key/value pairs and compare foreach ($args[$i] as $comp_key => $comp_value ) { if ((string) $key === (string)$comp_key && (string) $value === (string) $comp_value ) { unset($array_comp[$key] ); } } } } return $array_comp; } } ?>