wp/wp-includes/Text/Diff/Engine/xdiff.php
author ymh <ymh.work@gmail.com>
Tue, 09 Jun 2015 03:35:32 +0200
changeset 5 5e2f62d02dcd
parent 0 d970ebf37754
child 21 48c4eec2b7e6
permissions -rw-r--r--
upgrade wordpress + plugins
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * Class used internally by Diff to actually compute the diffs.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * This class uses the xdiff PECL package (http://pecl.php.net/package/xdiff)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * to compute the differences between the two input arrays.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * Copyright 2004-2010 The Horde Project (http://www.horde.org/)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 * See the enclosed file COPYING for license information (LGPL). If you did
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
 * not receive this file, see http://opensource.org/licenses/lgpl-license.php.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
 * @author  Jon Parise <jon@horde.org>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 * @package Text_Diff
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
class Text_Diff_Engine_xdiff {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    /**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
     */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    function diff($from_lines, $to_lines)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
        array_walk($from_lines, array('Text_Diff', 'trimNewlines'));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
        array_walk($to_lines, array('Text_Diff', 'trimNewlines'));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
        /* Convert the two input arrays into strings for xdiff processing. */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
        $from_string = implode("\n", $from_lines);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
        $to_string = implode("\n", $to_lines);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
        /* Diff the two strings and convert the result to an array. */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        $diff = xdiff_string_diff($from_string, $to_string, count($to_lines));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        $diff = explode("\n", $diff);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
        /* Walk through the diff one line at a time.  We build the $edits
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
         * array of diff operations by reading the first character of the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
         * xdiff output (which is in the "unified diff" format).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
         *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
         * Note that we don't have enough information to detect "changed"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
         * lines using this approach, so we can't add Text_Diff_Op_changed
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
         * instances to the $edits array.  The result is still perfectly
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
         * valid, albeit a little less descriptive and efficient. */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        $edits = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        foreach ($diff as $line) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
            if (!strlen($line)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
                continue;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
            switch ($line[0]) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
            case ' ':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
                $edits[] = new Text_Diff_Op_copy(array(substr($line, 1)));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
                break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
            case '+':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
                $edits[] = new Text_Diff_Op_add(array(substr($line, 1)));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
                break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
            case '-':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
                $edits[] = new Text_Diff_Op_delete(array(substr($line, 1)));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
                break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        return $edits;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
}