Changeset 2826

Show
Ignore:
Timestamp:
07/21/08 21:49:11 (4 months ago)
Author:
arvind
Message:

Added diffing routines

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/feature-revision-histories/lib/MT/Revisable.pm

    r2815 r2826  
    245245    my $datasource = $obj->datasource;     
    246246    my $rev_class = MT->model($datasource . ':revision'); 
    247      
    248     $args ||= {}; 
    249     # Only specified a revision_id 
     247 
     248    # Only specified a rev_number 
    250249    if(defined $terms && ref $terms ne 'HASH') {  
    251         $terms = { id => $_[0] };          
     250        $terms = { rev_number => $_[0] };          
    252251    }     
    253252    $terms->{$datasource . '_id'} ||= $obj->id;     
     
    283282} 
    284283 
     284sub 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 
     310sub _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 
    2853391;