Merge branch 'master' of github.com:tla/stemmatology
[scpubgit/stemmatology.git] / lib / Text / Tradition / Witness.pm
CommitLineData
dd3b58b0 1package Text::Tradition::Witness;
2use Moose;
7854e12e 3use Moose::Util::TypeConstraints;
dd3b58b0 4
784877d9 5# Sigil. Required identifier for a witness.
dd3b58b0 6has 'sigil' => (
d047cd52 7 is => 'ro',
8 isa => 'Str',
9 required => 1,
10 );
dd3b58b0 11
d047cd52 12# Text. This is an array of strings (i.e. word tokens).
13# TODO Think about how to handle this for the case of pre-prepared
14# collations, where the tokens are in the graph already.
dd3b58b0 15has 'text' => (
d047cd52 16 is => 'rw',
17 isa => 'ArrayRef[Str]',
de51424a 18 predicate => 'has_text',
d047cd52 19 );
dd3b58b0 20
d047cd52 21# Source. This is where we read in the witness, if not from a
22# pre-prepared collation. It is probably a filename.
23has 'source' => (
24 is => 'ro',
25 isa => 'Str',
8e1394aa 26 predicate => 'has_source',
d047cd52 27 );
784877d9 28
1ed3973e 29# Path. This is an array of Reading nodes that should mirror the
30# text above.
4a8828f0 31has 'path' => (
32 is => 'rw',
33 isa => 'ArrayRef[Text::Tradition::Collation::Reading]',
de51424a 34 predicate => 'has_path',
4a8828f0 35 );
36
b15511bf 37has 'uncorrected_path' => (
6a222840 38 is => 'rw',
b15511bf 39 isa => 'ArrayRef[Text::Tradition::Collation::Reading]',
40 predicate => 'has_ante_corr',
7854e12e 41 );
f6066bac 42
43# Manuscript name or similar
44has 'identifier' => (
45 is => 'ro',
46 isa => 'Str',
47 );
48
49# Any other info we have
50has 'other_info' => (
51 is => 'ro',
52 isa => 'Str',
53 );
e2902068 54
55
784877d9 56sub BUILD {
57 my $self = shift;
d047cd52 58 if( $self->has_source ) {
784877d9 59 # Read the file and initialize the text.
f2b9605f 60 my $rc;
61 eval { no warnings; $rc = open( WITNESS, $self->source ); };
62 # If we didn't open a file, assume it is a string.
63 if( $rc ) {
64 my @words;
65 while(<WITNESS>) {
66 chomp;
67 push( @words, split( /\s+/, $_ ) );
68 }
69 close WITNESS;
70 $self->text( \@words );
71 } # else the text is in the source string, probably
72 # XML, and we are doing nothing with it.
784877d9 73 }
74}
75
de51424a 76# If the text is not present, and the path is, and this is a 'get'
77# request, generate text from path.
78around text => sub {
79 my $orig = shift;
80 my $self = shift;
81
82 if( $self->has_path && !$self->has_text && !@_ ) {
83 my @words = map { $_->label } @{$self->path};
84 $self->$orig( \@words );
85 }
86
87 $self->$orig( @_ );
88};
89
dd3b58b0 90no Moose;
91__PACKAGE__->meta->make_immutable;