Better regexp to quote-wrap words in stemma dot. Fixes #19, again.
[scpubgit/stemmaweb.git] / lib / stemmaweb / Controller / Root.pm
index aa6329c..51d7dff 100644 (file)
@@ -51,6 +51,17 @@ sub about :Local :Args(0) {
        $c->stash->{template} = 'about.tt';
 }
 
+=head2 help/*
+
+A dispatcher for documentation of various aspects of the application.
+
+=cut
+
+sub help :Local :Args(1) {
+       my( $self, $c, $topic ) = @_;
+       $c->stash->{template} = "$topic.tt";
+}
+
 =head1 Elements of index page
 
 =head2 directory
@@ -340,6 +351,11 @@ sub stemma :Local :Args(2) {
        if( $c->req->method eq 'POST' ) {
                if( $ok eq 'full' ) {
                        my $dot = $c->request->body_params->{'dot'};
+                       # Graph::Reader::Dot does not handle bare unicode. We get around this
+                       # by wrapping all words in double quotes, as long as they aren't already
+                       # wrapped, and as long as they aren't the initial 'digraph stemma'.
+                       # Horrible HACK.
+                       $dot =~ s/(?<!")\b(?!(?:digraph|stemma)\b)(\w+)\b(?!")/"$1"/g;
                        try {
                                if( $stemmaid eq 'n' ) {
                                        # We are adding a new stemma.
@@ -422,6 +438,30 @@ sub stemmadot :Local :Args(2) {
        $c->forward('View::JSON');
 }
 
+=head2 download
+
+ GET /download/$textid
+Returns the full XML definition of the tradition and its stemmata, if any.
+=cut
+
+sub download :Local :Args(1) {
+       my( $self, $c, $textid ) = @_;
+       my $tradition = $c->model('Directory')->tradition( $textid );
+       unless( $tradition ) {
+               return _json_error( $c, 404, "No tradition with ID $textid" );
+       }
+       my $ok = _check_permission( $c, $tradition );
+       return unless $ok;
+       try {
+               $c->stash->{'result'} = $tradition->collation->as_graphml();
+       } catch( Text::Tradition::Error $e ) {
+               return _json_error( $c, 500, $e->message );
+       }
+       $c->forward('View::GraphML');
+}
+
 ####################
 ### Helper functions
 ####################