⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diff.inc.php

📁 简介:IceBB是一个强大
💻 PHP
📖 第 1 页 / 共 3 页
字号:
 * @author  Geoffrey T. Dairiki <dairiki@dairiki.org> * @access  private */class Text_Diff_Op_change extends Text_Diff_Op {    function Text_Diff_Op_change($orig, $final)    {        $this->orig = $orig;        $this->final = $final;    }    function &reverse()    {        return $reverse = &new Text_Diff_Op_change($this->final, $this->orig);    }}// from Diff/Renderer.php/** * A class to render Diffs in different formats. * * This class renders the diff in classic diff format. It is intended that * this class be customized via inheritance, to obtain fancier outputs. * * $Horde: framework/Text_Diff/Diff/Renderer.php,v 1.8 2005/05/02 19:44:53 chuck Exp $ * * @package Text_Diff */class Text_Diff_Renderer {    /**     * Number of leading context "lines" to preserve.     *     * This should be left at zero for this class, but subclasses may want to     * set this to other values.     */    var $_leading_context_lines = 0;    /**     * Number of trailing context "lines" to preserve.     *     * This should be left at zero for this class, but subclasses may want to     * set this to other values.     */    var $_trailing_context_lines = 0;    /**     * Constructor.     */    function Text_Diff_Renderer($params = array())    {        foreach ($params as $param => $value) {            $v = '_' . $param;            if (isset($this->$v)) {                $this->$v = $value;            }        }    }    /**     * Get any renderer parameters.     *     * @return array  All parameters of this renderer object.     */    function getParams()    {        return get_object_vars($this);    }    /**     * Renders a diff.     *     * @param Text_Diff $diff  A Text_Diff object.     *     * @return string  The formatted output.     */    function render($diff)    {        $xi = $yi = 1;        $block = false;        $context = array();        $nlead = $this->_leading_context_lines;        $ntrail = $this->_trailing_context_lines;        $output = $this->_startDiff();        foreach ($diff->getDiff() as $edit) {            if (is_a($edit, 'Text_Diff_Op_copy')) {                if (is_array($block)) {                    if (count($edit->orig) <= $nlead + $ntrail) {                        $block[] = $edit;                    } else {                        if ($ntrail) {                            $context = array_slice($edit->orig, 0, $ntrail);                            $block[] = &new Text_Diff_Op_copy($context);                        }                        $output .= $this->_block($x0, $ntrail + $xi - $x0,                                                 $y0, $ntrail + $yi - $y0,                                                 $block);                        $block = false;                    }                }                $context = $edit->orig;            } else {                if (!is_array($block)) {                    $context = array_slice($context, count($context) - $nlead);                    $x0 = $xi - count($context);                    $y0 = $yi - count($context);                    $block = array();                    if ($context) {                        $block[] = &new Text_Diff_Op_copy($context);                    }                }                $block[] = $edit;            }            if ($edit->orig) {                $xi += count($edit->orig);            }            if ($edit->final) {                $yi += count($edit->final);            }        }        if (is_array($block)) {            $output .= $this->_block($x0, $xi - $x0,                                     $y0, $yi - $y0,                                     $block);        }        return $output . $this->_endDiff();    }    function _block($xbeg, $xlen, $ybeg, $ylen, &$edits)    {        $output = $this->_startBlock($this->_blockHeader($xbeg, $xlen, $ybeg, $ylen));        foreach ($edits as $edit) {            switch (strtolower(get_class($edit))) {            case 'text_diff_op_copy':                $output .= $this->_context($edit->orig);                break;            case 'text_diff_op_add':                $output .= $this->_added($edit->final);                break;            case 'text_diff_op_delete':                $output .= $this->_deleted($edit->orig);                break;            case 'text_diff_op_change':                $output .= $this->_changed($edit->orig, $edit->final);                break;            }        }        return $output . $this->_endBlock();    }    function _startDiff()    {        return '';    }    function _endDiff()    {        return '';    }    function _blockHeader($xbeg, $xlen, $ybeg, $ylen)    {        if ($xlen > 1) {            $xbeg .= ',' . ($xbeg + $xlen - 1);        }        if ($ylen > 1) {            $ybeg .= ',' . ($ybeg + $ylen - 1);        }        return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg;    }    function _startBlock($header)    {        return $header . "\n";    }    function _endBlock()    {        return '';    }    function _lines($lines, $prefix = ' ')    {        return $prefix . implode("\n$prefix", $lines) . "\n";    }    function _context($lines)    {        return $this->_lines($lines);    }    function _added($lines)    {        return $this->_lines($lines, '>');    }    function _deleted($lines)    {        return $this->_lines($lines, '<');    }    function _changed($orig, $final)    {        return $this->_deleted($orig) . "---\n" . $this->_added($final);    }}/** * "Inline" diff renderer. * * This class renders diffs in the Wiki-style "inline" format. * * $Horde: framework/Text_Diff/Diff/Renderer/inline.php,v 1.11 2005/05/02 19:49:39 chuck Exp $ * * @author  Ciprian Popovici * @package Text_Diff */class Text_Diff_Renderer_inline extends Text_Diff_Renderer {    /**     * Number of leading context "lines" to preserve.     */    var $_leading_context_lines = 10000;    /**     * Number of trailing context "lines" to preserve.     */    var $_trailing_context_lines = 10000;    /**     * Prefix for inserted text.     */    var $_ins_prefix = '<ins>';    /**     * Suffix for inserted text.     */    var $_ins_suffix = '</ins>';    /**     * Prefix for deleted text.     */    var $_del_prefix = '<del>';    /**     * Suffix for deleted text.     */    var $_del_suffix = '</del>';    /**     * Header for each change block.     */    var $_block_header = '';    /**     * What are we currently splitting on? Used to recurse to show word-level     * changes.     */    var $_split_level = 'lines';    function _lines($lines, $prefix = ' ')    {        if ($this->_split_level == 'words') {            return implode('', $lines);        } else {            return implode("\n", $lines) . "\n";        }    }    function _blockHeader($xbeg, $xlen, $ybeg, $ylen)    {        return $this->_block_header;    }    function _startBlock($header)    {        return $header;    }    function _added($lines)    {        $lines[0] = $this->_ins_prefix . $lines[0];        $lines[count($lines) - 1] .= $this->_ins_suffix;        return $this->_lines($lines);    }    function _deleted($lines, $words = false)    {        $lines[0] = $this->_del_prefix . $lines[0];        $lines[count($lines) - 1] .= $this->_del_suffix;        return $this->_lines($lines);    }    function _changed($orig, $final)    {        /* If we've already split on words, don't try to do so again - just         * display. */        if ($this->_split_level == 'words') {            $prefix = '';            while (substr($orig[0], 0, 1) == substr($final[0], 0, 1)) {                $prefix .= substr($orig[0], 0, 1);                $orig[0] = substr($orig[0], 1);                $final[0] = substr($final[0], 1);            }            return $prefix . $this->_deleted($orig) . $this->_added($final);        }        $text1 = implode("\n", $orig);        $text2 = implode("\n", $final);        /* Non-printing newline marker. */        $nl = "\0";        /* We want to split on word boundaries, but we need to         * preserve whitespace as well. Therefore we split on words,         * but include all blocks of whitespace in the wordlist. */        $diff = &new Text_Diff($this->_splitOnWords($text1, $nl),                               $this->_splitOnWords($text2, $nl));        /* Get the diff in inline format. */        $renderer = &new Text_Diff_Renderer_inline(array_merge($this->getParams(),                                                               array('split_level' => 'words')));        /* Run the diff and get the output. */        return str_replace($nl, "\n", $renderer->render($diff)) . "\n";    }    function _splitOnWords($string, $newlineEscape = "\n")    {        $words = array();        $length = strlen($string);        $pos = 0;        while ($pos < $length) {            // Eat a word with any preceding whitespace.            $spaces = strspn($string, " \n", $pos);            $nextpos = strcspn($string, " \n", $pos + $spaces);            $words[] = str_replace("\n", $newlineEscape, substr($string, $pos, $spaces + $nextpos));            $pos += $spaces + $nextpos;        }        return $words;    }}/** * "Unified" diff renderer. * * This class renders the diff in classic "unified diff" format. * * $Horde: framework/Text_Diff/Diff/Renderer/unified.php,v 1.4 2005/03/07 14:58:30 jan Exp $ * * @package Text_Diff */class Text_Diff_Renderer_unified extends Text_Diff_Renderer {    /**     * Number of leading context "lines" to preserve.     */    var $_leading_context_lines = 4;    /**     * Number of trailing context "lines" to preserve.     */    var $_trailing_context_lines = 4;    function _blockHeader($xbeg, $xlen, $ybeg, $ylen)    {        if ($xlen != 1) {            $xbeg .= ',' . $xlen;        }        if ($ylen != 1) {            $ybeg .= ',' . $ylen;        }        return "@@ -$xbeg +$ybeg @@";    }    function _added($lines)    {        return $this->_lines($lines, '+');    }    function _deleted($lines)    {        return $this->_lines($lines, '-');    }    function _changed($orig, $final)    {        return $this->_deleted($orig) . $this->_added($final);    }}?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -