1 package Text::Tradition::Parser::KUL;
5 use Storable qw /dclone/;
10 Text::Tradition::Parser::CSV
14 Parser module for Text::Tradition, given a list of variants as a CSV
15 file and a reference text as a plaintext file with appropriate line
24 my @apparatus = read( $csv_file );
26 Takes a CSV file; returns a data structure of apparatus entries to be
27 merged with a base text.
33 my $parser = Text::CSV::Simple->new();
34 my @fields = qw/ reference text variant type context non_corr non_indep
35 length total origin /;
36 my @lines = $parser->read_file( $ARGV[0] );
37 my @labels = @{shift( @lines )};
38 push( @fields, @labels[10..$#labels] );
44 foreach my $line ( @lines ) {
46 if( $line->[0] =~ /^\d/ ) {
47 $new_lemma = $started = 1;
51 # Get the lines into their fields.
53 @linehash{@fields} = @$line;
55 # Readings can take up multiple lines in the CSV, so append the
56 # apparatus to the list, and clear it out, if we have started a
59 # Was it a doubled-up apparatus entry e.g 'non (1/2)'?
60 if( keys %$apparatus &&
61 $apparatus->{'rdg_0'} =~ /(.*?)\s+\(?([\d\/]+)\)?\s*$/ ) {
62 my( $reading, $istr ) = ( $1, $2 );
63 my @instances = split( /\//, $istr );
64 foreach my $i ( @instances ) {
65 my $app = dclone( $apparatus );
66 $app->{'rdg_0'} = $reading . "_$i";
67 $app->{'_id'} .= chr(97+$i);
68 push( @app_list, $app );
70 } elsif( keys %$apparatus ) {
71 push( @app_list, $apparatus );
73 $apparatus = { _id => $linehash{reference} };
76 # The apparatus has multiple readings, and multiple witnesses per
77 # reading. So it's a hashref whose values are listrefs.
78 $apparatus->{'rdg_0'} = $linehash{'text'} if $linehash{'text'};
79 $apparatus->{'rdg_' . ++$rdg_ctr} = $linehash{'variant'};
80 foreach my $attr ( @fields[3..8] ) {
81 $apparatus->{"_rdg_${rdg_ctr}_$attr"} = $linehash{$attr} if defined $linehash{$attr};
84 foreach my $k ( @fields[10..$#fields] ) {
85 my $variant_rdg = $linehash{$k};
86 $k =~ s/\s+\(a\.c\.\)//;
87 if( $variant_rdg =~ /^0/ ) {
88 $apparatus->{$k} = 'rdg_0'
89 unless exists $apparatus->{$k};
90 } elsif ( $variant_rdg =~ /^1/ ) {
91 warn sprintf( "Already found variant reading %s for %s at %s!",
92 $apparatus->{$k}, $k, $apparatus->{_id} )
93 if exists $apparatus->{$k} && $apparatus->{$k} ne 'rdg_0';
94 $apparatus->{$k} = 'rdg_' . $rdg_ctr;
95 } else { # else for $, we don't list the MS
96 warn "Unparsed variant indicator $variant_rdg for $k in " .
98 unless ( !$variant_rdg or $variant_rdg =~ /^\$$/ );
101 # See if we have at least one reading for each variant.
102 my @seen_rdgs = values %$apparatus;
103 foreach my $rdg ( grep { $_ =~ /^rdg/ } keys %$apparatus ) {
104 unless( grep { $_ =~ /^$rdg$/ } @seen_rdgs ) {
105 print STDERR 'No manuscript found with reading "'
106 . $apparatus->{$rdg} .
107 '" at location ' . $apparatus->{_id} . "\n";
108 # delete $apparatus->{$rdg}; # for now
112 # Done with loop, so push the last apparatus.
113 push( @app_list, $apparatus );
121 This package is free software and is provided "as is" without express
122 or implied warranty. You can redistribute it and/or modify it under
123 the same terms as Perl itself.
127 Tara L Andrews, aurum@cpan.org