File: generic_tagval_parser.pm

package info (click to toggle)
libgo-perl 0.09-1
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 7,392 kB
  • ctags: 888
  • sloc: perl: 13,268; sh: 21; makefile: 6
file content (115 lines) | stat: -rw-r--r-- 2,678 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# $Id: generic_tagval_parser.pm,v 1.3 2007/02/02 05:54:11 cmungall Exp $
#
#
# see also - http://www.geneontology.org
#          - http://www.godatabase.org/dev
#
# You may distribute this module under the same terms as perl itself

package GO::Parsers::generic_tagval_parser;

=head1 NAME

  GO::Parsers::generic_tagval_parser     - syntax parsing of GO .def flat files

=head1 SYNOPSIS

  do not use this class directly; use GO::Parser

=cut

=head1 DESCRIPTION

This generates Stag event streams from one of the various GO flat file
formats (ontology, defs, xref, associations). See GO::Parser for details

Examples of these files can be found at http://www.geneontology.org

A description of the event streams generated follows; Stag or an XML
handler can be used to catch these events


=head1 GO DEFINITION FILES

These have a suffix .defs or .definitions

 

=head1 AUTHOR

=cut

use Exporter;
use base qw(GO::Parsers::base_parser);
use GO::Parsers::ParserEventNames;  # declare XML constants

use Carp;
use FileHandle;
use strict qw(subs vars refs);

sub dtd {
    'generic_tagval-parser-events.dtd';
}

sub _class { 'generic' }
sub _id_column {}
sub _map_property_type { shift;@_ }

sub parse_fh {
    my ($self, $fh) = @_;
    my $file = $self->file;

    $self->start_event(OBO);
    my $lnum = 0;
    my $in_record=0;
    my $class = $self->_class;
    my $id_column = $self->_id_column;
    while (my $line = <$fh>) {
        chomp $line;
	++$lnum;
        next if $line =~ /^\!/;
        $line =~ s/^\s+$//;
        if (!$line) {
	    $self->pop_stack_to_depth(1);
            $in_record = 0;
            next;
        }

	if ($line =~ /^(\S+):\s+(.*)/) {
            my ($t,$v) = ($1,$2);
            if (!$in_record) {
                $self->start_event(INSTANCE);
                $self->event(instance_of=>$class);
                if (!$id_column) {
                    $t = 'id';
                }
                $in_record = 1;
            }
            if ($id_column && $t eq $id_column) {
                $t = 'id';
            }
            if ($t eq 'id') {
                $self->event(ID, $v);
            }
            else {
                my $dt = 'xsd:string';
                if ($v =~ /^http:/) {
                    $dt = 'xsd:anyURI';
                }
                $self->event(PROPERTY_VALUE,
                             [[TYPE,$self->_map_property_type($t)],
                              [VALUE,$v],
                              [DATATYPE,$dt]]);
            }
	}
	elsif ($line =~ /^(\S+):\s*$/) {
        }
	else {
#	    $self->parse_err("cannot parse:\"$line\"");
	}
    }
    $self->pop_stack_to_depth(0);  # end event obo
}


1;