Displays a human readable HTML representation of the difference between two strings.
Description
The Diff is available for getting the changes between versions. The output is HTML, so the primary use is for displaying the changes. If the two strings are equivalent, then an empty string will be returned.
See also
- wp_parse_args(): Used to change defaults to user defined settings.
Parameters
$left_string
stringrequired- "old" (left) version of string.
$right_string
stringrequired- "new" (right) version of string.
$args
string|arrayoptional- Associative array of options to pass to WP_Text_Diff_Renderer_Table().
title
stringTitles the diff in a manner compatible with the output. Default empty.title_left
stringChange the HTML to the left of the title.
Default empty.title_right
stringChange the HTML to the right of the title.
Default empty.show_split_view
boolTrue for split view (two columns), false for un-split view (single column). Default true.
Default:
null
Source
function wp_text_diff( $left_string, $right_string, $args = null ) {
$defaults = array(
'title' => '',
'title_left' => '',
'title_right' => '',
'show_split_view' => true,
);
$args = wp_parse_args( $args, $defaults );
if ( ! class_exists( 'WP_Text_Diff_Renderer_Table', false ) ) {
require ABSPATH . WPINC . '/wp-diff.php';
}
$left_string = normalize_whitespace( $left_string );
$right_string = normalize_whitespace( $right_string );
$left_lines = explode( "\n", $left_string );
$right_lines = explode( "\n", $right_string );
$text_diff = new Text_Diff( $left_lines, $right_lines );
$renderer = new WP_Text_Diff_Renderer_Table( $args );
$diff = $renderer->render( $text_diff );
if ( ! $diff ) {
return '';
}
$is_split_view = ! empty( $args['show_split_view'] );
$is_split_view_class = $is_split_view ? ' is-split-view' : '';
$r = "<table class='diff$is_split_view_class'>\n";
if ( $args['title'] ) {
$r .= "<caption class='diff-title'>$args[title]</caption>\n";
}
if ( $args['title_left'] || $args['title_right'] ) {
$r .= '<thead>';
}
if ( $args['title_left'] || $args['title_right'] ) {
$th_or_td_left = empty( $args['title_left'] ) ? 'td' : 'th';
$th_or_td_right = empty( $args['title_right'] ) ? 'td' : 'th';
$r .= "<tr class='diff-sub-title'>\n";
$r .= "\t<$th_or_td_left>$args[title_left]</$th_or_td_left>\n";
if ( $is_split_view ) {
$r .= "\t<$th_or_td_right>$args[title_right]</$th_or_td_right>\n";
}
$r .= "</tr>\n";
}
if ( $args['title_left'] || $args['title_right'] ) {
$r .= "</thead>\n";
}
$r .= "<tbody>\n$diff\n</tbody>\n";
$r .= '</table>';
return $r;
}
Changelog
Version | Description |
---|---|
2.6.0 | Introduced. |
Example
This will output the following html:
[html]
<table class="diff">
<colgroup>
<col class="ltype">
<col class="content">
<col class="ltype">
<col class="content">
</colgroup>
<thead>
<tr class="diff-title">
<th colspan="4">Differences</th>
</tr>
<tr class="diff-sub-title">
<td></td>
<th>Old Version</th>
<td></td>
<th>New version</th>
</tr>
</thead>
<tbody>
<tr>
<td>-</td>
<td class="diff-deletedline">
This is the <del>original</del> string
</td>
<td>+</td>
<td class="diff-addedline">
This is the <ins>revised</ins> string
</td>
</tr>
</tbody>
</table>
[/html]