blob: 323c776bdc4160f9516fbf95febcddfdf6f34e4f [file] [log] [blame]
Akron151676d2016-03-14 20:12:14 +01001package KorAP::XML::Annotation::Malt::Dependency;
2use KorAP::XML::Annotation::Base;
Akronf3f0c942016-06-27 13:27:14 +02003use strict;
4use warnings;
Akron194be542016-01-21 12:52:43 +01005
6sub parse {
7 my $self = shift;
8
Akron14ca9f02016-01-29 19:38:18 +01009 # TODO: Create XIP tree here - for indirect dependency
10 # >>:xip/d:SUBJ<i>566<i>789
11
Akron194be542016-01-21 12:52:43 +010012 # Relation data
13 $$self->add_tokendata(
14 foundry => 'malt',
15 layer => 'dependency',
16 cb => sub {
Akron14ca9f02016-01-29 19:38:18 +010017 my ($stream, $source, $tokens) = @_;
Akron194be542016-01-21 12:52:43 +010018
Akron14ca9f02016-01-29 19:38:18 +010019 # Get MultiTermToken from stream for source
Akronfa82f042020-08-04 12:56:29 +020020 my $mtt = $stream->pos($source->get_pos);
Akron194be542016-01-21 12:52:43 +010021
22 # Serialized information from token
Akronfa82f042020-08-04 12:56:29 +020023 my $content = $source->get_hash;
Akron14ca9f02016-01-29 19:38:18 +010024
25 # Get relation information
26 my $rel = $content->{rel};
27 $rel = [$rel] unless ref $rel eq 'ARRAY';
28
Akron39df7ce2020-08-04 15:55:26 +020029 my $mt;
30
Akron14ca9f02016-01-29 19:38:18 +010031 # Iterate over relations
32 foreach (@$rel) {
Akronfa82f042020-08-04 12:56:29 +020033 my $label = $_->{-label};
Akron14ca9f02016-01-29 19:38:18 +010034
Akronfa82f042020-08-04 12:56:29 +020035 #my $target = $stream->tui($source->pos);
36 my $from = $_->{span}->{-from};
37 my $to = $_->{span}->{-to};
Akron14ca9f02016-01-29 19:38:18 +010038
Akronfa82f042020-08-04 12:56:29 +020039 # Target
40 my $target = $tokens->token($from, $to);
Akronf3f0c942016-06-27 13:27:14 +020041
Akronfa82f042020-08-04 12:56:29 +020042 # Relation is term-to-term with a found target!
43 if ($target) {
Akron14ca9f02016-01-29 19:38:18 +010044
Akronfa82f042020-08-04 12:56:29 +020045 # Unary means, it refers to itself!
Akron39df7ce2020-08-04 15:55:26 +020046 $mt = $mtt->add_by_term('>:malt/d:' . $label);
47 $mt->set_pti(32); # term-to-term relation
48 $mt->set_payload(
49 '<i>' . $target->get_pos # . # right part token position
Akronfa82f042020-08-04 12:56:29 +020050 # '<s>0' . # $source_term->tui . # left part tui
51 # '<s>0' # . $target_term->tui # right part tui
Akron39df7ce2020-08-04 15:55:26 +020052 );
Akron14ca9f02016-01-29 19:38:18 +010053
Akronfa82f042020-08-04 12:56:29 +020054 my $target_mtt = $stream->pos($target->get_pos);
Akron14ca9f02016-01-29 19:38:18 +010055
Akron39df7ce2020-08-04 15:55:26 +020056 $mt = $target_mtt->add_by_term('<:malt/d:' . $label);
57 $mt->set_pti(32); # term-to-term relation
58 $mt->set_payload(
59 '<i>' . $source->get_pos # . # left part token position
Akronfa82f042020-08-04 12:56:29 +020060 # '<s>0' . # $source_term->tui . # left part tui
61 # '<s>0' # . $target_term->tui # right part tui
Akron39df7ce2020-08-04 15:55:26 +020062 );
Akronfa82f042020-08-04 12:56:29 +020063 }
Akron14ca9f02016-01-29 19:38:18 +010064
Akronfa82f042020-08-04 12:56:29 +020065 # Relation is possibly term-to-element with a found target!
66 elsif ($target = $tokens->span($from, $to)) {
Akron39df7ce2020-08-04 15:55:26 +020067 $mt = $mtt->add_by_term('>:malt/d:' . $label);
68 $mt->set_pti(33); # term-to-element relation
69 $mt->set_payload(
70 '<i>' . $target->get_o_start . # end position
Akronfa82f042020-08-04 12:56:29 +020071 '<i>' . $target->get_o_end . # end position
72 '<i>' . $target->get_p_start . # right part start position
73 '<i>' . $target->get_p_end # . # right part end position
74 # '<s>0' . # $source_term->tui . # left part tui
75 # '<s>0' # . $target_span->tui # right part tui
76 );
Akron14ca9f02016-01-29 19:38:18 +010077
Akronfa82f042020-08-04 12:56:29 +020078 my $target_mtt = $stream->pos($target->get_p_start);
Akron39df7ce2020-08-04 15:55:26 +020079 $mt = $target_mtt->add_by_term('<:malt/d:' . $label);
80 $mt->set_pti(34); # element-to-term relation
81 $mt->set_payload(
82 '<i>' . $target->get_o_start . # end position
Akronfa82f042020-08-04 12:56:29 +020083 '<i>' . $target->get_o_end . # end position
84 '<i>' . $target->get_p_end . # right part end position
85 '<i>' . $source->get_pos # . # left part token position
86 # '<s>0' . # $source_term->tui . # left part tui
87 # '<s>0' # . $target_span->tui # right part tui
88 );
89 }
90 else {
91 use Data::Dumper;
92 $$self->log->warn('Relation currently not supported: ' . Dumper($content));
93 };
Akron14ca9f02016-01-29 19:38:18 +010094 };
Akron194be542016-01-21 12:52:43 +010095 }) or return;
96
97 return 1;
98};
99
100sub layer_info {
Akronf3f0c942016-06-27 13:27:14 +0200101 ['malt/d=rels']
Akron194be542016-01-21 12:52:43 +0100102};
103
104
1051;