1 package Text::Tradition::Witness;
3 use Moose::Util::TypeConstraints;
7 Text::Tradition::Witness - a manuscript witness to a text tradition
11 use Text::Tradition::Witness;
12 my $w = Text::Tradition::Witness->new(
14 'identifier' => 'Oxford MS Ex.1932',
19 Text::Tradition::Witness is an object representation of a manuscript
20 witness to a text tradition. A manuscript has a sigil (a short code that
21 represents it in the wider tradition), an identifier (e.g. the library ID),
28 Create a new witness. Options include:
32 =item * sigil - A short code to represent the manuscript. Required.
34 =item * text - An array of strings (words) that contains the text of the
37 =item * source - A reference to the text, such as a filename, if it is not
38 given in the 'text' option.
40 =item * identifier - The recognized name of the manuscript, e.g. a library
43 =item * other_info - A freeform string for any other description of the
50 Accessor method for the witness sigil.
54 Accessor method to get and set the text array.
58 Accessor method to get and set the text source.
62 Accessor method for the witness identifier.
66 Accessor method for the general witness description.
70 An array of Text::Tradition::Collation::Reading objects which, taken in
71 sequence, represent the text.
73 =head2 uncorrected_path
75 An array of Text::Tradition::Collation::Reading objects which, taken in
76 sequence, represent the text before any scribal corrections were made.
80 use_ok( 'Text::Tradition::Witness', "can use module" );
82 my @text = qw( This is a line of text );
83 my $wit = Text::Tradition::Witness->new(
87 is( ref( $wit ), 'Text::Tradition::Witness', 'Created a witness' );
89 is( $wit->sigil, 'A', "Witness has correct sigil" );
90 is( join( ' ', @{$wit->text} ), join( ' ', @text ), "Witness has correct text" );
97 # Sigil. Required identifier for a witness.
104 # Text. This is an array of strings (i.e. word tokens).
105 # TODO Think about how to handle this for the case of pre-prepared
106 # collations, where the tokens are in the graph already.
109 isa => 'ArrayRef[Str]',
110 predicate => 'has_text',
113 # Source. This is where we read in the witness, if not from a
114 # pre-prepared collation. It is probably a filename.
118 predicate => 'has_source',
121 # Path. This is an array of Reading nodes that should mirror the
125 isa => 'ArrayRef[Text::Tradition::Collation::Reading]',
126 predicate => 'has_path',
129 has 'uncorrected_path' => (
131 isa => 'ArrayRef[Text::Tradition::Collation::Reading]',
132 predicate => 'has_ante_corr',
135 # Manuscript name or similar
136 has 'identifier' => (
141 # Any other info we have
142 has 'other_info' => (
150 if( $self->has_source ) {
151 # Read the file and initialize the text.
153 eval { no warnings; $rc = open( WITNESS, $self->source ); };
154 # If we didn't open a file, assume it is a string.
159 push( @words, split( /\s+/, $_ ) );
162 $self->text( \@words );
163 } # else the text is in the source string, probably
164 # XML, and we are doing nothing with it.
172 my $simple = 't/data/simple.txt';
173 my $s = Text::Tradition->new(
175 'input' => 'Tabular',
178 my $wit_c = $s->witness( 'C' );
179 is( ref( $wit_c ), 'Text::Tradition::Witness' ),;
181 ok( !$wit_c->has_text, "Text property not yet set" );
182 my $c_arr = $wit_c->text;
183 is( $c_arr->[0], 'Je', "Text constructed from path" );
184 ok( $wit_c->has_text, "Text property now set" );
191 # If the text is not present, and the path is, and this is a 'get'
192 # request, generate text from path.
197 if( $self->has_path && !$self->has_text && !@_ ) {
198 my @words = map { $_->label } grep { !$_->is_meta } @{$self->path};
199 $self->$orig( \@words );
206 __PACKAGE__->meta->make_immutable;
212 =item * Get rid of either text or path, as they are redundant.
214 =item * Re-think the mechanism for pre-correction readings etc.
220 This package is free software and is provided "as is" without express
221 or implied warranty. You can redistribute it and/or modify it under
222 the same terms as Perl itself.
226 Tara L Andrews E<lt>aurum@cpan.orgE<gt>