| Akron | 4a46e6e | 2017-08-16 17:49:16 +0200 | [diff] [blame] | 1 | package Krawfish::Koral::Document::Annotation; |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 2 | use Krawfish::Util::String qw/squote/; |
| 3 | use warnings; |
| 4 | use strict; |
| Akron | 290f59f | 2017-08-17 21:55:07 +0200 | [diff] [blame] | 5 | use Krawfish::Koral::Query::Term; |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 6 | |
| Akron | 14ff0c4 | 2017-08-09 20:49:52 +0200 | [diff] [blame] | 7 | # Accepts a Krawfish::Koral::Query::Term object |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 8 | sub new { |
| 9 | my $class = shift; |
| 10 | bless { |
| 11 | term => shift, |
| 12 | data => [@_] |
| 13 | }, $class; |
| 14 | }; |
| 15 | |
| 16 | |
| 17 | sub term { |
| 18 | $_[0]->{term}; |
| 19 | }; |
| 20 | |
| 21 | |
| 22 | sub data { |
| 23 | $_[0]->{data} |
| 24 | }; |
| 25 | |
| 26 | |
| Akron | 14ff0c4 | 2017-08-09 20:49:52 +0200 | [diff] [blame] | 27 | sub foundry_id { |
| 28 | $_[0]->{foundry_id} // 0; |
| 29 | }; |
| 30 | |
| 31 | |
| 32 | sub layer_id { |
| 33 | $_[0]->{layer_id} // 0; |
| 34 | }; |
| 35 | |
| 36 | |
| Akron | 31e15b8 | 2017-08-10 21:02:58 +0200 | [diff] [blame] | 37 | sub type { |
| 38 | $_[0]->{term}->term_type; |
| 39 | }; |
| 40 | |
| Akron | 14ff0c4 | 2017-08-09 20:49:52 +0200 | [diff] [blame] | 41 | sub term_id { |
| 42 | $_[0]->{term_id}; |
| 43 | }; |
| 44 | |
| 45 | |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 46 | sub identify { |
| 47 | my ($self, $dict) = @_; |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 48 | |
| Akron | 14ff0c4 | 2017-08-09 20:49:52 +0200 | [diff] [blame] | 49 | my $term_id; |
| 50 | my $term = $self->{term}; |
| 51 | my $term_str = $term->to_term; |
| 52 | |
| 53 | $term_id = $dict->term_id_by_term($term_str); |
| 54 | |
| 55 | # Term id is already known! |
| 56 | if ($term_id) { |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 57 | $self->{term_id} = $term_id; |
| Akron | d15e2bb | 2017-08-11 18:23:14 +0200 | [diff] [blame] | 58 | $self->{foundry_id} = $dict->term_id_by_term('^' . $term->foundry) if $term->foundry; |
| 59 | $self->{layer_id} = $dict->term_id_by_term('°' . $term->layer) if $term->layer; |
| Akron | 14ff0c4 | 2017-08-09 20:49:52 +0200 | [diff] [blame] | 60 | return $self; |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 61 | } |
| Akron | 14ff0c4 | 2017-08-09 20:49:52 +0200 | [diff] [blame] | 62 | |
| 63 | # Term id is not yet given |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 64 | else { |
| Akron | 14ff0c4 | 2017-08-09 20:49:52 +0200 | [diff] [blame] | 65 | $self->{term_id} = $dict->add_term($term_str); |
| 66 | }; |
| 67 | |
| 68 | # Get term_id for foundry |
| 69 | if ($term->foundry) { |
| 70 | $term_id = $dict->term_id_by_term('^' . $term->foundry); |
| 71 | $self->{foundry_id} = $term_id ? $term_id : |
| 72 | $dict->add_term('^' . $term->foundry); |
| 73 | }; |
| 74 | |
| 75 | # Get term_id for layer |
| 76 | if ($term->layer) { |
| 77 | $term_id = $dict->term_id_by_term('°' . $term->layer); |
| 78 | $self->{layer_id} = $term_id ? $term_id : |
| 79 | $dict->add_term('°' . $term->layer); |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 80 | }; |
| 81 | |
| 82 | return $self; |
| 83 | }; |
| 84 | |
| 85 | |
| 86 | sub to_string { |
| 87 | my $self = shift; |
| 88 | my $str = ''; |
| 89 | |
| 90 | if ($self->{term_id}) { |
| 91 | $str .= $self->{term_id}; |
| 92 | } |
| 93 | |
| 94 | else { |
| Akron | 14ff0c4 | 2017-08-09 20:49:52 +0200 | [diff] [blame] | 95 | $str .= squote($self->{term}->to_term); |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 96 | }; |
| Akron | 14ff0c4 | 2017-08-09 20:49:52 +0200 | [diff] [blame] | 97 | return $str . '$' . join(',', @{$self->{data}}); |
| Akron | dd10fb9 | 2017-08-08 20:19:46 +0200 | [diff] [blame] | 98 | }; |
| 99 | |
| 100 | 1; |