Wikidiff2
Wikidiff2 is a native extension for PHP that provides a faster diff engine to MediaWiki. It is partly based on the original wikidiff, and partly on MediaWiki's DifferenceEngine class. It produces diffs from input text (line-based or word-level) and can format these as HTML or JSON.
![]() Release status: stable |
|
---|---|
Implementation | PHP |
Description | Faster diff plugin for MediaWiki under PHP and HHVM |
Author(s) | Tim Starling |
Latest version | 1.10.0 (2019-11-20) |
MediaWiki | 1.27+ |
License | GNU General Public License 2.0 or later |
Download | releases.wikimedia.org - wikidiff2 browse repository (GitHub) |
Translate the Wikidiff2 extension if it is available at translatewiki.net | |
Issues | Open tasks · Report a bug |
Wikidiff2 includes support for character-level diffs for text composed of characters from the Japanese and Thai alphabets and the unified Han, and includes support for Thai segmentation for word-level diffs in that language. Japanese, Chinese and Thai do not use spaces to separate words. The input is assumed to be UTF-8 encoded. Invalid UTF-8 may cause undesirable operation, such as truncation of the output, so the input should be validated by the application. The input text should have unix-style line endings.
InstallingEdit
Debian or UbuntuEdit
apt-get install php-wikidiff2
On older versions of the package you may need to run a command to actually enable the extension:
sudo phpenmod wikidiff2
(The command will be php5enmod
on versions that provide PHP 5.)
If you are running a MediaWiki version older than 1.27 (newer versions automatically detect wikidiff2), add the following line to your LocalSettings.php file:
$wgExternalDiffEngine = 'wikidiff2';
ManuallyEdit
First, get and compile libthai (it should be on your OS or distro's packages).
You can download wikidiff2 through git (git clone https://gerrit.wikimedia.org/r/mediawiki/php/wikidiff2.git
) or by downloading a tarball from https://releases.wikimedia.org/wikidiff2/.
Then compile wikidiff2. You need phpize (shipped with PHP).
cd wikidiff2
phpize
./configure
make
sudo make install
Make sure that your php option
extension = wikidiff2.so
is set. This is usually set in your "php.ini" file.
If you are running a MediaWiki version older than 1.27 (newer versions automatically detect wikidiff2), add the following line to your LocalSettings.php file:
$wgExternalDiffEngine = 'wikidiff2';
FormatsEdit
HTMLEdit
The HTML diff—a number of HTML table rows with the rest of the document structure omitted—is available as a side-by-side or inline comparison.
The characters "<", ">" and "&" will be HTML-escaped in the output.
In the Wikidiff2 C++ library, you can access the side-by-side diff using the TableDiff
class or the inline diff using the InlineDiff
class.
Both classes include an execute method that returns the diff of the text passed in as parameters.
You can also access these execute methods using the PHP wrapper functions wikidiff2_do_diff
(for the side-by-side diff) and wikidiff2_inline_diff
(for the inline diff).
JSONEdit
The JSON diff provides structured data to compose a visual, line-by-line comparison between two sets of text.
In the Wikidiff2 C++ library, you can access the JSON diff using the InlineDiffJSON
class, which includes an execute method that returns the diff of the text passed in as parameters.
You can also access this execute method using the PHP wrapper function wikidiff2_inline_json_diff
.
JSON diff schema
The JSON diff includes properties to identify changes between the two sets of text. For an example of a JSON diff, see the MediaWiki REST API compare revisions endpoint.
property | description
|
---|---|
diff
required | array of objects |
Each object in the diff array represents a line in a visual, line-by-line comparison between the two revisions.
|
diff.type
required | integer |
The type of change represented by the diff object, either:
|
diff.lineNumber
optional | integer |
The line number of the change based on the to revision.
|
diff.text
required | string |
The text of the line, including content from both revisions. For a line containing text that differs between the two revisions, you can use highlightRanges to visually indicate added and removed text. For a line containing a new line, the API returns the text as "" (empty string).
|
diff.highlightRanges
optional | array of objects |
An array of objects that indicate where and in what style text should be highlighted to visually represent changes.
Each object includes:
|
diff.moveInfo
optional | object |
Visual indicators to use when a paragraph's location differs between the two revisions. moveInfo objects occur in pairs within the diff.
|
diff.offset
required | object |
The location of the line in bytes from the beginning of the page, including:
|