65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Class used internally by Diff to actually compute the diffs.
 | 
						|
 *
 | 
						|
 * This class uses the xdiff PECL package (http://pecl.php.net/package/xdiff)
 | 
						|
 * to compute the differences between the two input arrays.
 | 
						|
 *
 | 
						|
 * Copyright 2004-2010 The Horde Project (http://www.horde.org/)
 | 
						|
 *
 | 
						|
 * See the enclosed file COPYING for license information (LGPL). If you did
 | 
						|
 * not receive this file, see https://opensource.org/license/lgpl-2-1/.
 | 
						|
 *
 | 
						|
 * @author  Jon Parise <jon@horde.org>
 | 
						|
 * @package Text_Diff
 | 
						|
 */
 | 
						|
class Text_Diff_Engine_xdiff {
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    function diff($from_lines, $to_lines)
 | 
						|
    {
 | 
						|
        array_walk($from_lines, array('Text_Diff', 'trimNewlines'));
 | 
						|
        array_walk($to_lines, array('Text_Diff', 'trimNewlines'));
 | 
						|
 | 
						|
        /* Convert the two input arrays into strings for xdiff processing. */
 | 
						|
        $from_string = implode("\n", $from_lines);
 | 
						|
        $to_string = implode("\n", $to_lines);
 | 
						|
 | 
						|
        /* Diff the two strings and convert the result to an array. */
 | 
						|
        $diff = xdiff_string_diff($from_string, $to_string, count($to_lines));
 | 
						|
        $diff = explode("\n", $diff);
 | 
						|
 | 
						|
        /* Walk through the diff one line at a time.  We build the $edits
 | 
						|
         * array of diff operations by reading the first character of the
 | 
						|
         * xdiff output (which is in the "unified diff" format).
 | 
						|
         *
 | 
						|
         * Note that we don't have enough information to detect "changed"
 | 
						|
         * lines using this approach, so we can't add Text_Diff_Op_changed
 | 
						|
         * instances to the $edits array.  The result is still perfectly
 | 
						|
         * valid, albeit a little less descriptive and efficient. */
 | 
						|
        $edits = array();
 | 
						|
        foreach ($diff as $line) {
 | 
						|
            if (!strlen($line)) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            switch ($line[0]) {
 | 
						|
            case ' ':
 | 
						|
                $edits[] = new Text_Diff_Op_copy(array(substr($line, 1)));
 | 
						|
                break;
 | 
						|
 | 
						|
            case '+':
 | 
						|
                $edits[] = new Text_Diff_Op_add(array(substr($line, 1)));
 | 
						|
                break;
 | 
						|
 | 
						|
            case '-':
 | 
						|
                $edits[] = new Text_Diff_Op_delete(array(substr($line, 1)));
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $edits;
 | 
						|
    }
 | 
						|
 | 
						|
}
 |