X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FText%2FTradition%2FCollation%2FRelationship.pm;h=227bb7befa6b437d06cb792e9fd99f02a59af3de;hb=7b7abf10979385f65a15e873de8a6f41c610b50a;hp=85f872d944428b1aef0a6ae2915736abe81c259d;hpb=d047cd5205779949e2d2c2d6f0e99077c5dc9c94;p=scpubgit%2Fstemmatology.git diff --git a/lib/Text/Tradition/Collation/Relationship.pm b/lib/Text/Tradition/Collation/Relationship.pm index 85f872d..227bb7b 100644 --- a/lib/Text/Tradition/Collation/Relationship.pm +++ b/lib/Text/Tradition/Collation/Relationship.pm @@ -3,25 +3,174 @@ package Text::Tradition::Collation::Relationship; use Moose; use Moose::Util::TypeConstraints; -enum 'RelationshipType' => qw( spelling orthographic grammatical ); - -has 'sort' => ( - is => 'rw', - isa => 'RelationshipType', - required => 1, -); - -has 'reading' => ( - is => 'rw', - isa => 'Text::Tradition::Collation::Reading', - required => 1, -); - -has 'global' => ( - is => 'rw', - isa => 'Bool', - default => 1, -); - - no Moose; - __PACKAGE__->meta->make_immutable; +enum 'RelationshipType' => qw( spelling orthographic grammatical lexical + collated repetition transposition punctuation ); + +enum 'RelationshipScope' => qw( local document global ); + +no Moose::Util::TypeConstraints; + +=head1 NAME + +Text::Tradition::Collation::Relationship - represents a syntactic or semantic +relationship between two readings + +=head1 DESCRIPTION + +Text::Tradition is a library for representation and analysis of collated +texts, particularly medieval ones. A relationship connects two readings +within a collation, usually when they appear in the same place in different +texts. + +=head1 CONSTRUCTOR + +=head2 new + +Creates a new relationship. Usually called via $collation->add_relationship. +Options include: + +=over 4 + +=item * type - Can be one of spelling, orthographic, grammatical, lexical, +collated, repetition, transposition. All but the last two are only valid +relationships between readings that occur at the same point in the text. +The 'collated' relationship should only be used by parsers to align readings +in the graph when the input information would otherwise be lost, e.g. from +an alignment table. + +=item * displayform - (Optional) The reading that should be displayed if the +related nodes are treated as one. + +=item * scope - (Optional) A meta-attribute. Can be one of 'local', +'document', or 'global'. Denotes whether the relationship between the two +readings holds always, independent of context, either within this tradition +or across all traditions. + +=item * annotation - (Optional) A freeform note to attach to the relationship. + +=item * alters_meaning - Indicate whether, in context, the related words cause +the text to have different meanings. Possible values are 0 (no), 1 (slightly), +and >1 (yes). + +=item * non_correctable - (Optional) True if the reading would not have been +corrected independently. + +=item * non_independent - (Optional) True if the variant is unlikely to have +occurred independently in unrelated witnesses. + +=back + +=head1 ACCESSORS + +=head2 type + +=head2 displayform + +=head2 scope + +=head2 annotation + +=head2 non_correctable + +=head2 non_independent + +See the option descriptions above. + +=cut + +has 'type' => ( + is => 'ro', + isa => 'RelationshipType', + required => 1, + ); + +has 'reading_a' => ( + is => 'ro', + isa => 'Str', + required => 1, + ); + +has 'reading_b' => ( + is => 'ro', + isa => 'Str', + required => 1, + ); + +has 'displayform' => ( + is => 'ro', + isa => 'Str', + predicate => 'has_displayform', + ); + +has 'scope' => ( + is => 'ro', + isa => 'RelationshipScope', + default => 'local', + ); + +has 'annotation' => ( + is => 'ro', + isa => 'Str', + predicate => 'has_annotation', + ); + +has 'alters_meaning' => ( + is => 'rw', + isa => 'Int', + default => 0, + ); + +has 'non_correctable' => ( + is => 'ro', + isa => 'Bool', + ); + +has 'non_independent' => ( + is => 'ro', + isa => 'Bool', + ); + +around 'alters_meaning' => sub { + my $orig = shift; + my $self = shift; + if( @_ ) { + if( $_[0] eq 'no' ) { + return $self->$orig( 0 ); + } elsif( $_[0] eq 'slightly' ) { + return $self->$orig( 1 ); + } elsif( $_[0] eq 'yes' ) { + return $self->$orig( 2 ); + } + } + return $self->$orig( @_ ); +}; + +# A read-only meta-Boolean attribute. + +=head2 colocated + +Returns true if the relationship type is one that requires that its readings +occupy the same place in the collation. + +=cut + +sub colocated { + my $self = shift; + return $self->type !~ /^(repetition|transposition)$/; +} + +=head2 nonlocal + +Returns true if the relationship scope is anything other than 'local'. + +=cut + +sub nonlocal { + my $self = shift; + return $self->scope ne 'local'; +} + +no Moose; +__PACKAGE__->meta->make_immutable; + +1;