X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FText%2FTradition%2FParser%2FSelf.pm;h=5e92b9a7a7599dc40968aa485085f66d47cf9359;hb=10e4b1acc8fc6607456481c568da930983efac33;hp=432d8a37dd92b31278106a004868420924b41702;hpb=aff524fcaed9a44206cd32d84ec7e2126fe11968;p=scpubgit%2Fstemmatology.git diff --git a/lib/Text/Tradition/Parser/Self.pm b/lib/Text/Tradition/Parser/Self.pm index 432d8a3..5e92b9a 100644 --- a/lib/Text/Tradition/Parser/Self.pm +++ b/lib/Text/Tradition/Parser/Self.pm @@ -167,7 +167,10 @@ sub parse { } } - # Add the nodes to the graph. + # Add the nodes to the graph. + # Note any reading IDs that were changed in order to comply with XML + # name restrictions; we have to hardcode start & end. + my %namechange = ( '#START#' => '__START__', '#END#' => '__END__' ); # print STDERR "Adding collation readings\n"; foreach my $n ( @{$graph_data->{'nodes'}} ) { @@ -179,13 +182,20 @@ sub parse { next; } my $gnode = $collation->add_reading( $n ); + if( $gnode->id ne $n->{'id'} ) { + $namechange{$n->{'id'}} = $gnode->id; + } } # Now add the edges. # print STDERR "Adding collation path edges\n"; foreach my $e ( @{$graph_data->{'edges'}} ) { - my $from = $collation->reading( $e->{'source'}->{'id'} ); - my $to = $collation->reading( $e->{'target'}->{'id'} ); + my $sourceid = exists $namechange{$e->{'source'}->{'id'}} + ? $namechange{$e->{'source'}->{'id'}} : $e->{'source'}->{'id'}; + my $targetid = exists $namechange{$e->{'target'}->{'id'}} + ? $namechange{$e->{'target'}->{'id'}} : $e->{'target'}->{'id'}; + my $from = $collation->reading( $sourceid ); + my $to = $collation->reading( $targetid ); warn "No witness label on path edge!" unless $e->{'witness'}; my $label = $e->{'witness'} . ( $e->{'extra'} ? $collation->ac_label : '' ); @@ -206,8 +216,12 @@ sub parse { # TODO check that scoping does trt $rel_data->{'edges'} ||= []; # so that the next line doesn't break on no rels foreach my $e ( sort { _layersort_rel( $a, $b ) } @{$rel_data->{'edges'}} ) { - my $from = $collation->reading( $e->{'source'}->{'id'} ); - my $to = $collation->reading( $e->{'target'}->{'id'} ); + my $sourceid = exists $namechange{$e->{'source'}->{'id'}} + ? $namechange{$e->{'source'}->{'id'}} : $e->{'source'}->{'id'}; + my $targetid = exists $namechange{$e->{'target'}->{'id'}} + ? $namechange{$e->{'target'}->{'id'}} : $e->{'target'}->{'id'}; + my $from = $collation->reading( $sourceid ); + my $to = $collation->reading( $targetid ); delete $e->{'source'}; delete $e->{'target'}; # The remaining keys are relationship attributes.