$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
sub textinfo :Local :Args(1) {
my( $self, $c, $textid ) = @_;
my $tradition = $c->model('Directory')->tradition( $textid );
+ ## Have to keep users in the same scope as tradition
+ my $newuser;
+ my $olduser;
unless( $tradition ) {
return _json_error( $c, 404, "No tradition with ID $textid" );
}
}
# Handle language param, making Default => null
my $langval = delete $params->{language} || 'Default';
- unless( $tradition->language eq $langval ) {
+
+ unless( $tradition->language eq $langval || !$tradition->can('language') ) {
try {
$tradition->language( $langval );
$changed = 1;
}
# Handle ownership change
- my $newuser;
if( exists $params->{'owner'} ) {
# Only admins can update user / owner
my $newownerid = delete $params->{'owner'};
unless( !$newownerid ||
- ( $tradition->has_user && $tradition->user->id eq $newownerid ) ) {
+ ( $tradition->has_user && $tradition->user->email eq $newownerid ) ) {
unless( $c->user->get_object->is_admin ) {
return _json_error( $c, 403,
"Only admin users can change tradition ownership" );
}
- $newuser = $m->find_user({ username => $newownerid });
+ $newuser = $m->find_user({ email => $newownerid });
unless( $newuser ) {
return _json_error( $c, 500, "No such user " . $newownerid );
}
+ if( $tradition->has_user ) {
+ $olduser = $tradition->user;
+ $olduser->remove_tradition( $tradition );
+ }
$newuser->add_tradition( $tradition );
$changed = 1;
}
my $textinfo = {
textid => $textid,
name => $tradition->name,
- language => $tradition->language,
- public => $tradition->public,
- owner => $tradition->user ? $tradition->user->id : undef,
+ #language => $tradition->language,
+ public => $tradition->public || 0,
+ owner => $tradition->user ? $tradition->user->email : undef,
witnesses => [ map { $_->sigil } $tradition->witnesses ],
};
+ if( $tradition->can('language') ) {
+ $textinfo->{'language'} = $tradition->language;
+ }
my @stemmasvg = map { $_->as_svg() } $tradition->stemmata;
map { $_ =~ s/\n/ /mg } @stemmasvg;
$textinfo->{stemmata} = \@stemmasvg;
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.
$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
####################