Text_Diff_Engine_string::parseContextDiff()publicWP 1.0

Parses an array containing the context diff.

Метод класса: Text_Diff_Engine_string{}

Хуков нет.

Возвращает

Массив. List of all diff operations.

Использование

$Text_Diff_Engine_string = new Text_Diff_Engine_string();
$Text_Diff_Engine_string->parseContextDiff( $diff );
$diff(массив) (обязательный) (передается по ссылке — &)
Array of lines.

Код Text_Diff_Engine_string::parseContextDiff() WP 6.4.3

function parseContextDiff(&$diff)
{
    $edits = array();
    $i = $max_i = $j = $max_j = 0;
    $end = count($diff) - 1;
    while ($i < $end && $j < $end) {
        while ($i >= $max_i && $j >= $max_j) {
            // Find the boundaries of the diff output of the two files
            for ($i = $j;
                 $i < $end && substr($diff[$i], 0, 3) == '***';
                 $i++);
            for ($max_i = $i;
                 $max_i < $end && substr($diff[$max_i], 0, 3) != '---';
                 $max_i++);
            for ($j = $max_i;
                 $j < $end && substr($diff[$j], 0, 3) == '---';
                 $j++);
            for ($max_j = $j;
                 $max_j < $end && substr($diff[$max_j], 0, 3) != '***';
                 $max_j++);
        }

        // find what hasn't been changed
        $array = array();
        while ($i < $max_i &&
               $j < $max_j &&
               strcmp($diff[$i], $diff[$j]) == 0) {
            $array[] = substr($diff[$i], 2);
            $i++;
            $j++;
        }

        while ($i < $max_i && ($max_j-$j) <= 1) {
            if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') {
                break;
            }
            $array[] = substr($diff[$i++], 2);
        }

        while ($j < $max_j && ($max_i-$i) <= 1) {
            if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') {
                break;
            }
            $array[] = substr($diff[$j++], 2);
        }
        if (count($array) > 0) {
            $edits[] = new Text_Diff_Op_copy($array);
        }

        if ($i < $max_i) {
            $diff1 = array();
            switch (substr($diff[$i], 0, 1)) {
            case '!':
                $diff2 = array();
                do {
                    $diff1[] = substr($diff[$i], 2);
                    if ($j < $max_j && substr($diff[$j], 0, 1) == '!') {
                        $diff2[] = substr($diff[$j++], 2);
                    }
                } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!');
                $edits[] = new Text_Diff_Op_change($diff1, $diff2);
                break;

            case '+':
                do {
                    $diff1[] = substr($diff[$i], 2);
                } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+');
                $edits[] = new Text_Diff_Op_add($diff1);
                break;

            case '-':
                do {
                    $diff1[] = substr($diff[$i], 2);
                } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-');
                $edits[] = new Text_Diff_Op_delete($diff1);
                break;
            }
        }

        if ($j < $max_j) {
            $diff2 = array();
            switch (substr($diff[$j], 0, 1)) {
            case '+':
                do {
                    $diff2[] = substr($diff[$j++], 2);
                } while ($j < $max_j && substr($diff[$j], 0, 1) == '+');
                $edits[] = new Text_Diff_Op_add($diff2);
                break;

            case '-':
                do {
                    $diff2[] = substr($diff[$j++], 2);
                } while ($j < $max_j && substr($diff[$j], 0, 1) == '-');
                $edits[] = new Text_Diff_Op_delete($diff2);
                break;
            }
        }
    }

    return $edits;
}