WordPress Version: 6.1
/**
* Displays a human readable HTML representation of the difference between two strings.
*
* 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.
*
* @since 2.6.0
*
* @see wp_parse_args() Used to change defaults to user defined settings.
* @uses Text_Diff
* @uses WP_Text_Diff_Renderer_Table
*
* @param string $left_string "old" (left) version of string.
* @param string $right_string "new" (right) version of string.
* @param string|array $args {
* Associative array of options to pass to WP_Text_Diff_Renderer_Table().
*
* @type string $title Titles the diff in a manner compatible
* with the output. Default empty.
* @type string $title_left Change the HTML to the left of the title.
* Default empty.
* @type string $title_right Change the HTML to the right of the title.
* Default empty.
* @type bool $show_split_view True for split view (two columns), false for
* un-split view (single column). Default true.
* }
* @return string Empty string if strings are equivalent or HTML with differences.
*/
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;
}