X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=stemmaweb%2Flib%2Fstemmaweb%2FController%2FRelation.pm;h=8785d6fc108c133f4d77ae969fabada6d75f5641;hb=a7f4020a1a1fd72aba6e25dc0a8f8aa9a1891202;hp=4809dec34a6874a1869b98b5463d361c776a21a8;hpb=a8928d1d98b99bdb121debeddec0db89774ce4a6;p=scpubgit%2Fstemmatology.git diff --git a/stemmaweb/lib/stemmaweb/Controller/Relation.pm b/stemmaweb/lib/stemmaweb/Controller/Relation.pm index 4809dec..8785d6f 100644 --- a/stemmaweb/lib/stemmaweb/Controller/Relation.pm +++ b/stemmaweb/lib/stemmaweb/Controller/Relation.pm @@ -1,5 +1,6 @@ package stemmaweb::Controller::Relation; use Moose; +use Module::Load; use namespace::autoclean; use TryCatch; @@ -29,19 +30,6 @@ sub index :Path :Args(0) { $c->stash->{'template'} = 'relate.tt'; } -=head2 help - - GET relation/help - -Returns the help window HTML. - -=cut - -sub help :Local :Args(0) { - my( $self, $c ) = @_; - $c->stash->{'template'} = 'relatehelp.tt'; -} - =head2 definitions GET relation/definitions @@ -134,9 +122,37 @@ sub main :Chained('text') :PathPart('') :Args(0) { $c->stash->{'startseg'} = $startseg if defined $startseg; $c->stash->{'svg_string'} = $svg_str; $c->stash->{'text_title'} = $tradition->name; + $c->stash->{'text_lang'} = $tradition->language; $c->stash->{'template'} = 'relate.tt'; } +=head2 help + + GET relation/help/$language + +Returns the help window HTML. + +=cut + +sub help :Local :Args(1) { + my( $self, $c, $lang ) = @_; + # Display the morphological help for the language if it is defined. + if( $lang && $lang ne 'Default' ) { + my $mod = 'Text::Tradition::Language::' . $lang; + try { + load( $mod ); + } catch { + $c->log->debug("Warning: could not load $mod"); + } + my $has_mod = $mod->can('morphology_tags'); + if( $has_mod ) { + my $tagset = &$has_mod; + $c->stash->{'tagset'} = $tagset; + } + } + $c->stash->{'template'} = 'relatehelp.tt'; +} + =head2 relationships GET relation/$textid/relationships @@ -214,23 +230,33 @@ Returns the list of readings defined for this text along with their metadata. =cut +my %read_write_keys = ( + 'id' => 0, + 'text' => 0, + 'is_meta' => 0, + 'grammar_invalid' => 1, + 'is_nonsense' => 1, + 'normal_form' => 1, +); + sub _reading_struct { my( $reading ) = @_; # Return a JSONable struct of the useful keys. Keys meant to be writable # have a true value; read-only keys have a false value. - my %read_write_keys = ( - 'id' => 0, - 'text' => 0, - 'is_meta' => 0, - 'grammar_invalid' => 1, - 'is_nonsense' => 1, - 'normal_form' => 1, - 'lexemes' => 1, # special case? - ); my $struct = {}; map { $struct->{$_} = $reading->$_ } keys( %read_write_keys ); # Special case $struct->{'lexemes'} = [ $reading->lexemes ]; + # Look up any words related via spelling or orthography + my $sameword = sub { + my $t = $_[0]->type; + return $t eq 'spelling' || $t eq 'orthographic'; + }; + my @variants; + foreach my $sr ( $reading->related_readings( $sameword ) ) { + push( @variants, $sr->text ); + } + $struct->{'variants'} = \@variants; return $struct; } @@ -266,18 +292,68 @@ sub reading :Chained('text') :PathPart :Args(1) { my( $self, $c, $reading_id ) = @_; my $tradition = delete $c->stash->{'tradition'}; my $collation = $tradition->collation; + my $rdg = $collation->reading( $reading_id ); my $m = $c->model('Directory'); if( $c->request->method eq 'GET' ) { - my $rdg = $collation->reading( $reading_id ); $c->stash->{'result'} = $rdg ? _reading_struct( $rdg ) : { 'error' => "No reading with ID $reading_id" }; } elsif ( $c->request->method eq 'POST' ) { - # TODO Update the reading if we can. + my $errmsg; + # Are we re-lemmatizing? + if( $c->request->param('relemmatize') ) { + my $nf = $c->request->param('normal_form'); + # TODO throw error unless $nf + $rdg->normal_form( $nf ); + # TODO throw error if lemmatization fails + # TODO skip this if normal form hasn't changed + $rdg->lemmatize(); + } else { + # Set all the values that we have for the reading. + # TODO error handling + foreach my $p ( keys %{$c->request->params} ) { + if( $p =~ /^morphology_(\d+)$/ ) { + # Set the form on the correct lexeme + my $midx = $1; + $c->log->debug( "Fetching lexeme $midx" ); + my $lx = $rdg->lexeme( $midx ); + my $strrep = $rdg->language . ' // ' + . $c->request->param( $p ); + my $idx = $lx->has_form( $strrep ); + unless( defined $idx ) { + # Make the word form and add it to the lexeme. + $c->log->debug("Adding new form for $strrep"); + try { + $idx = $lx->add_matching_form( $strrep ) - 1; + } catch( Text::Tradition::Error $e ) { + $c->response->status( '403' ); + $errmsg = $e->message; + } + } + $lx->disambiguate( $idx ) if defined $idx; + } elsif( $read_write_keys{$p} ) { + my $val = _clean_booleans( $rdg, $p, $c->request->param( $p ) ); + $rdg->$p( $val ); + } + } + } + $m->save( $tradition ); + $c->stash->{'result'} = $errmsg ? { 'error' => $errmsg } + : _reading_struct( $rdg ); + } $c->forward('View::JSON'); } +sub _clean_booleans { + my( $rdg, $param, $val ) = @_; + if( $rdg->meta->get_attribute( $param )->type_constraint->name eq 'Bool' ) { + $val = 1 if $val eq 'true'; + $val = undef if $val eq 'false'; + } + return $val; +} + =head2 end Attempt to render a view, if needed.