| Akron | 151676d | 2016-03-14 20:12:14 +0100 | [diff] [blame] | 1 | package KorAP::XML::Annotation::Malt::Dependency; |
| 2 | use KorAP::XML::Annotation::Base; |
| Akron | f3f0c94 | 2016-06-27 13:27:14 +0200 | [diff] [blame] | 3 | use strict; |
| 4 | use warnings; |
| Akron | 194be54 | 2016-01-21 12:52:43 +0100 | [diff] [blame] | 5 | |
| 6 | sub parse { |
| 7 | my $self = shift; |
| 8 | |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 9 | # TODO: Create XIP tree here - for indirect dependency |
| 10 | # >>:xip/d:SUBJ<i>566<i>789 |
| 11 | |
| Akron | 194be54 | 2016-01-21 12:52:43 +0100 | [diff] [blame] | 12 | # Relation data |
| 13 | $$self->add_tokendata( |
| 14 | foundry => 'malt', |
| 15 | layer => 'dependency', |
| 16 | cb => sub { |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 17 | my ($stream, $source, $tokens) = @_; |
| Akron | 194be54 | 2016-01-21 12:52:43 +0100 | [diff] [blame] | 18 | |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 19 | # Get MultiTermToken from stream for source |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 20 | my $mtt = $stream->pos($source->get_pos); |
| Akron | 194be54 | 2016-01-21 12:52:43 +0100 | [diff] [blame] | 21 | |
| 22 | # Serialized information from token |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 23 | my $content = $source->get_hash; |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 24 | |
| 25 | # Get relation information |
| 26 | my $rel = $content->{rel}; |
| 27 | $rel = [$rel] unless ref $rel eq 'ARRAY'; |
| 28 | |
| Akron | 39df7ce | 2020-08-04 15:55:26 +0200 | [diff] [blame] | 29 | my $mt; |
| 30 | |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 31 | # Iterate over relations |
| 32 | foreach (@$rel) { |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 33 | my $label = $_->{-label}; |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 34 | |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 35 | #my $target = $stream->tui($source->pos); |
| 36 | my $from = $_->{span}->{-from}; |
| 37 | my $to = $_->{span}->{-to}; |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 38 | |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 39 | # Target |
| 40 | my $target = $tokens->token($from, $to); |
| Akron | f3f0c94 | 2016-06-27 13:27:14 +0200 | [diff] [blame] | 41 | |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 42 | # Relation is term-to-term with a found target! |
| 43 | if ($target) { |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 44 | |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 45 | # Unary means, it refers to itself! |
| Akron | 39df7ce | 2020-08-04 15:55:26 +0200 | [diff] [blame] | 46 | $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 |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 50 | # '<s>0' . # $source_term->tui . # left part tui |
| 51 | # '<s>0' # . $target_term->tui # right part tui |
| Akron | 39df7ce | 2020-08-04 15:55:26 +0200 | [diff] [blame] | 52 | ); |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 53 | |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 54 | my $target_mtt = $stream->pos($target->get_pos); |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 55 | |
| Akron | 39df7ce | 2020-08-04 15:55:26 +0200 | [diff] [blame] | 56 | $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 |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 60 | # '<s>0' . # $source_term->tui . # left part tui |
| 61 | # '<s>0' # . $target_term->tui # right part tui |
| Akron | 39df7ce | 2020-08-04 15:55:26 +0200 | [diff] [blame] | 62 | ); |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 63 | } |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 64 | |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 65 | # Relation is possibly term-to-element with a found target! |
| 66 | elsif ($target = $tokens->span($from, $to)) { |
| Akron | 39df7ce | 2020-08-04 15:55:26 +0200 | [diff] [blame] | 67 | $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 |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 71 | '<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 | ); |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 77 | |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 78 | my $target_mtt = $stream->pos($target->get_p_start); |
| Akron | 39df7ce | 2020-08-04 15:55:26 +0200 | [diff] [blame] | 79 | $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 |
| Akron | fa82f04 | 2020-08-04 12:56:29 +0200 | [diff] [blame] | 83 | '<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 | }; |
| Akron | 14ca9f0 | 2016-01-29 19:38:18 +0100 | [diff] [blame] | 94 | }; |
| Akron | 194be54 | 2016-01-21 12:52:43 +0100 | [diff] [blame] | 95 | }) or return; |
| 96 | |
| 97 | return 1; |
| 98 | }; |
| 99 | |
| 100 | sub layer_info { |
| Akron | f3f0c94 | 2016-06-27 13:27:14 +0200 | [diff] [blame] | 101 | ['malt/d=rels'] |
| Akron | 194be54 | 2016-01-21 12:52:43 +0100 | [diff] [blame] | 102 | }; |
| 103 | |
| 104 | |
| 105 | 1; |