use File::Temp;
use JSON;
use Text::Tradition::Collation;
-use Text::Tradition::StemmaUtil qw/ character_input /;
+use Text::Tradition::StemmaUtil qw/ character_input phylip_pars newick_to_svg /;
BEGIN { extends 'Catalyst::Controller' }
$c->stash->{'result'} = { 'matrix' => $matrix };
$c->forward( 'View::JSON' );
}
-=head2 end
-Attempt to render a view, if needed.
+=head2 run_pars
+
+Takes either an alignment table in JSON format (passed as the parameter 'alignment')
+or a character matrix Phylip accepts (passed as the parameter 'matrix'). Returns
+either the Newick-format answer or an SVG representation of the graph.
=cut
-sub end : ActionClass('RenderView') {}
+sub run_pars :Local {
+ my( $self, $c ) = @_;
+ my $error;
+ my $view = 'View::JSON';
+ my $matrix;
+ if( $c->request->param('matrix') ) {
+ $matrix = $c->request->param('matrix');
+ } elsif( $c->request->param('alignment') ) {
+ # Make the matrix from the alignment
+ my $table = from_json( $c->request->param('alignment') );
+ $matrix = character_input( $table );
+ } else {
+ $error = "Must pass either an alignment or a matrix";
+ }
+
+ # Got the matrix, so try to run pars.
+ my( $result, $output );
+ unless( $error ) {
+ ( $result, $output ) = phylip_pars( $matrix );
+ $error = $output unless( $result );
+ }
+
+ # Did we want newick or a graph?
+ unless( $error ) {
+ my $format = 'newick';
+ $format = $c->request->param('format') if $c->request->param('format');
+ if( $format eq 'svg' ) {
+ # Do something
+ $c->stash->{'result'} = newick_to_svg( $output );
+ $view = 'View::SVG';
+ } elsif( $format ne 'newick' ) {
+ $error = "Requested output format $format unknown";
+ } else {
+ $c->stash->{'result'} = { 'tree' => $output };
+ }
+ }
+
+ if( $error ) {
+ $c->stash->{'error'} = $error;
+ } # else the stash is populated.
+ $c->forward( $view );
+}
=head1 AUTHOR