clean up svg output; allow non-linear GraphML graphs
Tara L Andrews [Fri, 27 May 2011 23:01:45 +0000 (01:01 +0200)]
lib/Text/Tradition/Collation.pm
lib/Text/Tradition/Parser/GraphML.pm

index 90e7f31..03aed2a 100644 (file)
@@ -407,6 +407,8 @@ sub collapse_graph_paths {
 
     # Don't list out every witness if we have more than half to list.
     my $majority = int( scalar( @{$self->tradition->witnesses} ) / 2 ) + 1;
+    # But don't compress if there are only a few witnesses.
+    $majority = 4 if $majority < 4;
     foreach my $node( $self->readings ) {
        my $newlabels = {};
        # We will visit each node, so we only look ahead.
@@ -420,7 +422,7 @@ sub collapse_graph_paths {
            my $label;
            my @compressed_wits = ();
            if( @{$newlabels->{$newdest}} < $majority ) {
-               $label = join( ', ', @{$newlabels->{$newdest}} );
+               $label = join( ', ', sort( @{$newlabels->{$newdest}} ) );
            } else {
                ## TODO FIX THIS HACK
                my @aclabels;
@@ -431,7 +433,7 @@ sub collapse_graph_paths {
                        push( @compressed_wits, $wit );
                    }
                }
-               $label = join( ', ', 'majority', @aclabels );
+               $label = join( ', ', 'majority', sort( @aclabels ) );
            }
            
            my $newpath = 
index dbeff7e..9842bdb 100644 (file)
@@ -121,9 +121,13 @@ sub parse {
     foreach my $tn ( @$transposition_nodes ) {
        my $id_xpath = sprintf( './g:data[@key="%s"]/text()', 
                                $nodedata{'identical'} );
-       $collation->reading( $node_id{ $tn->getAttribute( 'id' ) } )->
-           set_identical( $collation->reading( 
-                              $node_name{ $xpc->findvalue( $id_xpath, $tn ) } ) );
+       my $tn_reading = $collation->reading( $node_id{ $tn->getAttribute( 'id' ) } );
+       my $main_reading = $collation->reading( $node_name{ $xpc->findvalue( $id_xpath, $tn ) } );
+       if( $collation->linear ) {
+           $tn_reading->set_identical( $main_reading );
+       } else {
+           $collation->merge_readings( $main_reading, $tn_reading );
+       }
     }
 
     # Find the beginning and end nodes of the graph.  The beginning node