Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F4117910
DiffFormatter.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
DiffFormatter.php
View Options
<?php
/**
* Base for diff rendering classes. Portions taken from phpwiki-1.3.3.
*
* Copyright © 2000, 2001 Geoffrey T. Dairiki <dairiki@dairiki.org>
* You may copy this code freely under the conditions of the GPL.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup DifferenceEngine
*/
namespace
Wikimedia\Diff
;
use
UnexpectedValueException
;
/**
* Base class for diff formatters
*
* This class formats the diff in classic diff format.
* It is intended that this class be customized via inheritance,
* to obtain fancier outputs.
* @todo document
* @ingroup DifferenceEngine
*/
abstract
class
DiffFormatter
{
/** @var int 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.
*/
protected
$leadingContextLines
=
0
;
/** @var int 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.
*/
protected
$trailingContextLines
=
0
;
/** @var string The output buffer; holds the output while it is built. */
private
$result
=
''
;
/**
* Format a diff.
*
* @param Diff $diff
*
* @return string The formatted output.
*/
public
function
format
(
$diff
)
{
$xi
=
$yi
=
1
;
$block
=
false
;
$context
=
[];
$nlead
=
$this
->
leadingContextLines
;
$ntrail
=
$this
->
trailingContextLines
;
$this
->
startDiff
();
// Initialize $x0 and $y0 to prevent IDEs from getting confused.
$x0
=
$y0
=
0
;
foreach
(
$diff
->
edits
as
$edit
)
{
if
(
$edit
->
type
==
'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
DiffOpCopy
(
$context
);
}
$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
=
[];
if
(
$context
)
{
$block
[]
=
new
DiffOpCopy
(
$context
);
}
}
$block
[]
=
$edit
;
}
if
(
$edit
->
orig
)
{
$xi
+=
count
(
$edit
->
orig
);
}
if
(
$edit
->
closing
)
{
$yi
+=
count
(
$edit
->
closing
);
}
}
if
(
is_array
(
$block
)
)
{
$this
->
block
(
$x0
,
$xi
-
$x0
,
$y0
,
$yi
-
$y0
,
$block
);
}
$end
=
$this
->
endDiff
();
return
$end
;
}
/**
* @param int $xbeg
* @param int $xlen
* @param int $ybeg
* @param int $ylen
* @param array &$edits
*/
protected
function
block
(
$xbeg
,
$xlen
,
$ybeg
,
$ylen
,
&
$edits
)
{
$this
->
startBlock
(
$this
->
blockHeader
(
$xbeg
,
$xlen
,
$ybeg
,
$ylen
)
);
foreach
(
$edits
as
$edit
)
{
if
(
$edit
->
type
==
'copy'
)
{
$this
->
context
(
$edit
->
orig
);
}
elseif
(
$edit
->
type
==
'add'
)
{
$this
->
added
(
$edit
->
closing
);
}
elseif
(
$edit
->
type
==
'delete'
)
{
$this
->
deleted
(
$edit
->
orig
);
}
elseif
(
$edit
->
type
==
'change'
)
{
$this
->
changed
(
$edit
->
orig
,
$edit
->
closing
);
}
else
{
throw
new
UnexpectedValueException
(
"Unknown edit type: {$edit->type}"
);
}
}
$this
->
endBlock
();
}
protected
function
startDiff
()
{
$this
->
result
=
''
;
}
/**
* Writes a string to the output buffer.
*
* @param string $text
*/
protected
function
writeOutput
(
$text
)
{
$this
->
result
.=
$text
;
}
/**
* @return string
*/
protected
function
endDiff
()
{
$val
=
$this
->
result
;
$this
->
result
=
''
;
return
$val
;
}
/**
* @param int $xbeg
* @param int $xlen
* @param int $ybeg
* @param int $ylen
*
* @return string
*/
protected
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
;
}
/**
* Called at the start of a block of connected edits.
* This default implementation writes the header and a newline to the output buffer.
*
* @param string $header
*/
protected
function
startBlock
(
$header
)
{
$this
->
writeOutput
(
$header
.
"
\n
"
);
}
/**
* Called at the end of a block of connected edits.
* This default implementation does nothing.
*/
protected
function
endBlock
()
{
}
/**
* Writes all (optionally prefixed) lines to the output buffer, separated by newlines.
*
* @param string[] $lines
* @param string $prefix
*/
protected
function
lines
(
$lines
,
$prefix
=
' '
)
{
foreach
(
$lines
as
$line
)
{
$this
->
writeOutput
(
"$prefix $line
\n
"
);
}
}
/**
* @param string[] $lines
*/
protected
function
context
(
$lines
)
{
$this
->
lines
(
$lines
);
}
/**
* @param string[] $lines
*/
protected
function
added
(
$lines
)
{
$this
->
lines
(
$lines
,
'>'
);
}
/**
* @param string[] $lines
*/
protected
function
deleted
(
$lines
)
{
$this
->
lines
(
$lines
,
'<'
);
}
/**
* Writes the two sets of lines to the output buffer, separated by "---" and a newline.
*
* @param string[] $orig
* @param string[] $closing
*/
protected
function
changed
(
$orig
,
$closing
)
{
$this
->
deleted
(
$orig
);
$this
->
writeOutput
(
"---
\n
"
);
$this
->
added
(
$closing
);
}
}
/** @deprecated class alias since 1.41 */
class_alias
(
DiffFormatter
::
class
,
'DiffFormatter'
);
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Wed, Aug 19, 02:25 (2 w, 2 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
f4/9f/11893e17806a1cb883971deda8fb
Default Alt Text
DiffFormatter.php (6 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment