| | 284 | sub diff_revision { |
|---|
| | 285 | my $obj = shift; |
|---|
| | 286 | my ($terms, $diff_args) = @_; |
|---|
| | 287 | # Only specified a rev_number so diff with current |
|---|
| | 288 | if(defined $terms && ref $terms ne 'HASH') { |
|---|
| | 289 | $terms = { rev_number => [$_[0], $obj->current_revision] }; |
|---|
| | 290 | } |
|---|
| | 291 | my $args = { |
|---|
| | 292 | limit => 2, |
|---|
| | 293 | sort_by => 'created_on', |
|---|
| | 294 | direction => 'ascend' |
|---|
| | 295 | }; |
|---|
| | 296 | |
|---|
| | 297 | my @revisions = $obj->load_revision($terms, $args); |
|---|
| | 298 | my $obj_a = $revisions[0]->[0]; |
|---|
| | 299 | my $obj_b = $revisions[1]->[0]; |
|---|
| | 300 | my %diff; |
|---|
| | 301 | |
|---|
| | 302 | my $cols = $obj->revisioned_columns(); |
|---|
| | 303 | foreach my $col (@$cols) { |
|---|
| | 304 | $diff{$col} = _diff_string($obj_a->$col, $obj_b->$col, $diff_args); |
|---|
| | 305 | } |
|---|
| | 306 | |
|---|
| | 307 | return \%diff; |
|---|
| | 308 | } |
|---|
| | 309 | |
|---|
| | 310 | sub _diff_string { |
|---|
| | 311 | my ($str_a, $str_b, $diff_args) = @_; |
|---|
| | 312 | $diff_args ||= {}; |
|---|
| | 313 | my $diff_method = $diff_args->{method} || 'html_word_diff'; |
|---|
| | 314 | my $limit_unchanged = $diff_args->{limit_unchanged}; |
|---|
| | 315 | |
|---|
| | 316 | require HTML::Diff; |
|---|
| | 317 | my $diff_result = eval "HTML::Diff::$diff_method(\$str_a, \$str_b)"; |
|---|
| | 318 | my @result; |
|---|
| | 319 | foreach my $diff (@$diff_result) { |
|---|
| | 320 | unless($diff->[0] eq 'c') { # changed has adds and removes |
|---|
| | 321 | push @result, { |
|---|
| | 322 | flag => $diff->[0], |
|---|
| | 323 | value => ($diff->[0] eq '+') ? $diff->[2] : $diff->[1] |
|---|
| | 324 | }; |
|---|
| | 325 | } else { |
|---|
| | 326 | push @result, { |
|---|
| | 327 | flag => '-', |
|---|
| | 328 | value => $diff->[1] |
|---|
| | 329 | }; |
|---|
| | 330 | push @result, { |
|---|
| | 331 | flag => '+', |
|---|
| | 332 | value => $diff->[2] |
|---|
| | 333 | }; |
|---|
| | 334 | } |
|---|
| | 335 | } |
|---|
| | 336 | return \@result; |
|---|
| | 337 | } |
|---|
| | 338 | |
|---|