split stemma lib into util and object; make phylip_input microservice
[scpubgit/stemmatology.git] / TreeOfTexts / lib / TreeOfTexts / Controller / Stemmagraph.pm
index f2fcccc..d192178 100644 (file)
@@ -1,8 +1,10 @@
 package TreeOfTexts::Controller::Stemmagraph;
 use Moose;
 use namespace::autoclean;
+use File::Temp;
+use JSON;
 use Text::Tradition::Collation;
-use Text::Tradition::Stemma;
+use Text::Tradition::StemmaUtil qw/ phylip_pars_input /;
 
 BEGIN { extends 'Catalyst::Controller' }
 
@@ -14,7 +16,7 @@ __PACKAGE__->config(namespace => '');
 
 =head1 NAME
 
-TreeOfTexts::Controller::Root - Root Controller for TreeOfTexts
+TreeOfTexts::Controller::Stemmagraph - Simple controller for stemma display
 
 =head1 DESCRIPTION
 
@@ -22,45 +24,51 @@ TreeOfTexts::Controller::Root - Root Controller for TreeOfTexts
 
 =head1 METHODS
 
-=head2 index
-
-The root page (/)
-
 =cut
 
-sub index :Path :Args(0) {
-    my ( $self, $c ) = @_;
-    $c->stash->{template} = 'dotinput.tt2';  
-}
-
 sub get_graph :Local {
        my( $self, $c ) = @_;
        # If called interactively, we have params 'display', 'output', 'witnesses'
        # If called non-interactively, we look at headers and content.
        # The body is actually a File::Temp object; this is undocumented but 
        # so it seems to be.
-       my $dot_fh = $c->request->body;
+       my $dotfile;
+       my $must_unlink = 0;
+       if( $c->request->params->{'dot'} ) {
+           # Make a File::Temp object.
+           my $tmpfile = File::Temp->new( UNLINK => 0 );
+           print $tmpfile $c->request->params->{'dot'};
+           $dotfile = $tmpfile->filename;
+           $must_unlink = 1;
+       } else {
+           $dotfile = $c->request->body;
+       }
        my $format = 'svg';
 
     # Render the dot in the given format.
     my $collation = Text::Tradition::Collation->new();
-    my $stemma = Text::Tradition::Stemma->new( 'collation' => $collation, 'dot' => $dot_fh );
+    my $stemma = Text::Tradition::Stemma->new( 'collation' => $collation, 'dot' => $dotfile );
+    unlink( $dotfile ) if $must_unlink;
     $c->stash->{result} = $stemma->as_svg;
     $c->forward( "View::SVG" );
 }
 
-=head2 default
+=head2 character_matrix
 
-Standard 404 error page
+Given an alignment table in JSON form, in the parameter 'alignment', returns a
+character matrix suitable for input to Phylip PARS. 
 
 =cut
 
-sub default :Path {
-    my ( $self, $c ) = @_;
-    $c->response->body( 'Page not found' );
-    $c->response->status(404);
+sub character_matrix :Local {
+       my( $self, $c ) = @_;
+       my $json = $c->request->params->{'alignment'};
+       $c->log->debug( $json );
+       my $table = from_json( $json );
+       my $matrix = phylip_pars_input( $table );
+       $c->stash->{'result'} = { 'matrix' => $matrix };
+       $c->forward( 'View::JSON' );
 }
-
 =head2 end
 
 Attempt to render a view, if needed.