From: Tara L Andrews Date: Mon, 1 Oct 2012 04:56:23 +0000 (+0200) Subject: query dynamically for relationship types in rel mapper X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=scpubgit%2Fstemmaweb.git;a=commitdiff_plain;h=8843c8b9a186dda97aaf7864ac2e2eec41db177c query dynamically for relationship types in rel mapper --- diff --git a/lib/stemmaweb/Controller/Relation.pm b/lib/stemmaweb/Controller/Relation.pm index 8187847..be51983 100644 --- a/lib/stemmaweb/Controller/Relation.pm +++ b/lib/stemmaweb/Controller/Relation.pm @@ -30,22 +30,6 @@ sub index :Path :Args(0) { $c->stash->{'template'} = 'relate.tt'; } -=head2 definitions - - GET relation/definitions - -Returns a data structure giving the valid types and scopes for a relationship. - -=cut - -sub definitions :Local :Args(0) { - my( $self, $c ) = @_; - my $valid_relationships = [ qw/ spelling orthographic grammatical lexical transposition / ]; - my $valid_scopes = [ qw/ local global / ]; - $c->stash->{'result'} = { 'types' => $valid_relationships, 'scopes' => $valid_scopes }; - $c->forward('View::JSON'); -} - =head2 text GET relation/$textid/ @@ -75,11 +59,20 @@ sub text :Chained('/') :PathPart('relation') :CaptureArgs(1) { my $ok = _check_permission( $c, $tradition ); return unless $ok; + $c->stash->{'textid'} = $textid; + $c->stash->{'tradition'} = $tradition; +} + +sub main :Chained('text') :PathPart('') :Args(0) { + my( $self, $c ) = @_; + my $tradition = delete $c->stash->{'tradition'}; + my $collation = $tradition->collation; + # See how big the tradition is. Edges are more important than nodes # when it comes to rendering difficulty. - my $numnodes = scalar $tradition->collation->readings; - my $numedges = scalar $tradition->collation->paths; - my $length = $tradition->collation->end->rank; + my $numnodes = scalar $collation->readings; + my $numedges = scalar $collation->paths; + my $length = $collation->end->rank; # We should display no more than roughly 500 nodes, or roughly 700 # edges, at a time. my $segments = $numnodes / 500; @@ -97,37 +90,28 @@ sub text :Chained('/') :PathPart('relation') :CaptureArgs(1) { $r += $segsize; } $c->stash->{'textsegments'} = []; - $c->stash->{'segsize'} = $segsize; - $c->stash->{'margin'} = $margin; foreach my $i ( 0..$#divs ) { my $seg = { 'start' => $divs[$i] }; $seg->{'display'} = "Segment " . ($i+1); push( @{$c->stash->{'textsegments'}}, $seg ); } } - $c->stash->{'textid'} = $textid; - $c->stash->{'tradition'} = $tradition; -} - -sub main :Chained('text') :PathPart('') :Args(0) { - my( $self, $c ) = @_; my $startseg = $c->req->param('start'); - my $tradition = delete $c->stash->{'tradition'}; - my $collation = $tradition->collation; my $svgopts; if( $startseg ) { # Only render the subgraph from startseg to endseg or to END, # whichever is less. - my $endseg = $startseg + $c->stash->{'segsize'} + $c->stash->{'margin'}; + my $endseg = $startseg + $segsize + $margin; $svgopts = { 'from' => $startseg }; $svgopts->{'to'} = $endseg if $endseg < $collation->end->rank; } elsif( exists $c->stash->{'textsegments'} ) { # This is the unqualified load of a long tradition. We implicitly start - # at zero, but go only as far as 550. - my $endseg = $c->stash->{'segsize'} + $c->stash->{'margin'}; + # at zero, but go only as far as our segment size. + my $endseg = $segsize + $margin; $startseg = 0; $svgopts = { 'to' => $endseg }; } + # Spit out the SVG my $svg_str = $collation->as_svg( $svgopts ); $svg_str =~ s/\n//gs; $c->stash->{'startseg'} = $startseg if defined $startseg; @@ -142,6 +126,28 @@ sub main :Chained('text') :PathPart('') :Args(0) { $c->stash->{'template'} = 'relate.tt'; } +=head2 definitions + + GET relation/$textid/definitions + +Returns a data structure giving the valid types and scopes for a relationship in +this tradition. + +=cut + +sub definitions :Chained('text') :PathPart :Args(0) { + my( $self, $c ) = @_; + my $tradition = delete $c->stash->{'tradition'}; + my @valid_relationships = map { $_->name } grep { !$_->is_weak } + $tradition->collation->relations->types; + my $valid_scopes = [ qw/ local global / ]; + $c->stash->{'result'} = { + 'types' => \@valid_relationships, + 'scopes' => $valid_scopes + }; + $c->forward('View::JSON'); +} + =head2 help GET relation/help/$language diff --git a/root/js/relationship-full.js b/root/js/relationship-full.js index fb81069..123b1d6 100644 --- a/root/js/relationship-full.js +++ b/root/js/relationship-full.js @@ -202,7 +202,8 @@ function svgEnlargementLoaded() { function add_relations( callback_fn ) { var textrelpath = getTextURL( 'relationships' ); - $.getJSON( basepath + 'definitions', function(data) { + var typedefpath = getTextURL( 'definitions' ); + $.getJSON( typedefpath, function(data) { var rel_types = data.types.sort(); // Add the relationship types to our document data so that we don't have // to call again @@ -660,8 +661,9 @@ $(document).ready(function () { }, create: function(event, ui) { $(this).data( 'relation_drawn', false ); - //TODO? Err handling? - var jqjson = $.getJSON( basepath + 'definitions', function(data) { + //TODO Check whether we have already retrieved the definitions + var typedefpath = getTextURL( 'definitions' ); + var jqjson = $.getJSON( typedefpath, function(data) { var types = data.types.sort(); $.each( types, function(index, value) { $('#rel_type').append( $('