X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FText%2FTradition%2FParser%2FSelf.pm;h=ce49448a9892ce4623f35ef32a84236605650663;hb=0106ea2e3bf1f5ef92bc9112a46cdd512f2c42d0;hp=addff132551be9fab6ce6847b3c38d0b3e2d90db;hpb=94c00c71ffabc3dc155d237364e76af4385dcb96;p=scpubgit%2Fstemmatology.git diff --git a/lib/Text/Tradition/Parser/Self.pm b/lib/Text/Tradition/Parser/Self.pm index addff13..ce49448 100644 --- a/lib/Text/Tradition/Parser/Self.pm +++ b/lib/Text/Tradition/Parser/Self.pm @@ -41,7 +41,16 @@ sub parse { my $collation = $tradition->collation; my %witnesses; - + + # Set up the graph-global attributes. They will appear in the + # hash under their accessor names. + # TODO Consider simplifying this for nodes & edges as well. + print STDERR "Setting graph globals\n"; + foreach my $gkey ( keys %{$graph_data->{'attr'}} ) { + my $val = $graph_data->{'attr'}->{$gkey}; + $collation->$gkey( $val ); + } + # Add the nodes to the graph. # TODO Are we adding extra start/end nodes? @@ -58,11 +67,14 @@ sub parse { my $rank = delete $node_data{$RANK_KEY}; # Create the node. Current valid classes are common and meta. - # Everything else is a normal reading. + # Everything else is a normal reading. + ## TODO RATIONALIZE THESE CLASSES my $gnode = $collation->add_reading( $nodeid ); $gnode->text( $reading ); $gnode->make_common if $class eq 'common'; $gnode->is_meta( 1 ) if $class eq 'meta'; + # This is a horrible hack. + $gnode->is_lacuna( $reading =~ /^\#LACUNA/ ); $gnode->rank( $rank ) if defined $rank; # Now save the data that we need for post-processing, @@ -74,7 +86,6 @@ sub parse { # Now add the edges. print STDERR "Adding graph edges\n"; - $DB::single = 1; foreach my $e ( @{$graph_data->{'edges'}} ) { my $from = $e->{$SOURCE_KEY}; my $to = $e->{$TARGET_KEY}; @@ -93,34 +104,49 @@ sub parse { $tradition->add_witness( sigil => $wit ); $witnesses{$wit} = 1; } + $witnesses{$wit} = 2 if $extra; } elsif( $class eq 'relationship' ) { - # We need the relationship type. - my $rel = $e->{$RELATIONSHIP_KEY}; - warn "No relationship type for relationship edge!" unless $rel; - $collation->add_relationship( $rel, $from->{$IDKEY}, $to->{$IDKEY} ); + # We need the metadata about the relationship. + my $opts = { 'type' => $e->{$RELATIONSHIP_KEY} }; + $opts->{'equal_rank'} = $e->{'equal_rank'} + if exists $e->{'equal_rank'}; + $opts->{'non_correctable'} = $e->{'non_correctable'} + if exists $e->{'non_correctable'}; + $opts->{'non_independent'} = $e->{'non_independent'} + if exists $e->{'non_independent'}; + warn "No relationship type for relationship edge!" unless $opts->{'type'}; + $collation->add_relationship( $from->{$IDKEY}, $to->{$IDKEY}, $opts ); } } ## Deal with node information (transposition, relationships, etc.) that ## needs to be processed after all the nodes are created. print STDERR "Adding second-pass node data\n"; - my $linear = undef; foreach my $nkey ( keys %$extra_data ) { foreach my $edkey ( keys %{$extra_data->{$nkey}} ) { my $this_reading = $collation->reading( $nkey ); if( $edkey eq $TRANSPOS_KEY ) { - $DB::single = 1; my $other_reading = $collation->reading( $extra_data->{$nkey}->{$edkey} ); - # We evidently have a linear graph. - $linear = 1; $this_reading->set_identical( $other_reading ); } else { warn "Unfamiliar reading node data $edkey for $nkey"; } } } - $collation->linear( $linear ); - # TODO We probably need to set the $witness->path arrays for each wit. + + # Set the $witness->path arrays for each wit. + print STDERR "Walking paths for witnesses\n"; + foreach my $wit ( $tradition->witnesses ) { + my @path = $collation->reading_sequence( $collation->start, $collation->end, + $wit->sigil ); + $wit->path( \@path ); + if( $witnesses{$wit->sigil} == 2 ) { + # Get the uncorrected path too + my @uc = $collation->reading_sequence( $collation->start, $collation->end, + $wit->sigil . $collation->ac_label, $wit->sigil ); + $wit->uncorrected_path( \@uc ); + } + } } =back