requires( 'XML::Easy::Syntax' );
requires( 'XML::LibXML' );
requires( 'XML::LibXML::XPathContext' );
+requires( 'YAML::XS' );
# For the morphology stuff
requires( 'Lingua::TagSet::Multext' );
requires( 'Lingua::TagSet::TreeTagger' );
next unless $save_types{$attr->type_constraint->name};
$reading_attributes{$attr->name} = $save_types{$attr->type_constraint->name};
}
+ # Extra custom key for the reading morphology
+ $reading_attributes{'lexemes'} = 'string';
+
my %node_data_keys;
my $ndi = 0;
foreach my $datum ( sort keys %reading_attributes ) {
$node_el->setAttribute( 'id', $node_xmlid );
foreach my $d ( keys %reading_attributes ) {
my $nval = $n->$d;
+ # Custom serialization
+ if( $d eq 'lexemes' ) {
+ # If nval is a true value, we have lexemes so we need to
+ # serialize them. Otherwise set nval to undef so that the
+ # key is excluded from this reading.
+ $nval = $nval ? $n->_serialize_lexemes : undef;
+ }
if( $rankoffset && $d eq 'rank' && $n ne $self->start ) {
# Adjust the ranks within the subgraph.
$nval = $n eq $self->end ? $end->rank - $rankoffset + 1
use Moose;
use Module::Load;
+use YAML::XS;
use overload '""' => \&_stringify, 'fallback' => 1;
=head1 NAME
predicate => 'has_normal_form',
);
-# Holds the word form. If is_disambiguated is true, the form at index zero
-# is the correct one.
+# Holds the lexemes for the reading.
has 'reading_lexemes' => (
traits => ['Array'],
isa => 'ArrayRef[Text::Tradition::Collation::Reading::Lexeme]',
=head1 MORPHOLOGY
-A few methods to try to tack on morphological information.
+Methods for the morphological information (if any) attached to readings.
+A reading may be made up of multiple lexemes; the concatenated lexeme
+strings ought to match the reading's normalized form.
+
+See L<Text::Tradition::Collation::Reading::Lexeme> for more information
+on Lexeme objects and their attributes.
+
+=head2 has_lexemes
+
+Returns a true value if the reading has any attached lexemes.
=head2 lexemes
-=head2 has_lexemes
+Returns the Lexeme objects (if any) attached to the reading.
=head2 clear_lexemes
-=head2 add_lexeme
+Wipes any associated Lexeme objects out of the reading.
+
+=head2 add_lexeme( $lexobj )
-=head2 lemmatize
+Adds the Lexeme in $lexobj to the list of lexemes.
+
+=head2 lemmatize
+
+If the language of the reading is set, this method will use the appropriate
+Language model to determine the lexemes that belong to this reading. See
+L<Text::Tradition::lemmatize> if you wish to lemmatize an entire tradition.
=cut
}
+# For graph serialization. Return a string representation of the associated
+# reading lexemes.
+sub _serialize_lexemes {
+ my $self = shift;
+ return Dump( [ $self->lexemes ] );
+}
+
+
## Utility methods
sub TO_JSON {