blob: 5e3ffb940258d1766c4b9d5474217f7e28ad4fee [file] [log] [blame]
package KorAP::XML::Meta::Sgbr;
use KorAP::XML::Meta::Base;
use Try::Tiny;
# Parse meta data
sub parse {
my $self = shift;
my $dom = shift;
my $type = shift;
my $stmt;
if ($type eq 'text') {
# Publisher
try {
$self->{A_publisher} = $dom->at('publisher')->all_text;
};
# Date of publication
try {
my $date = $dom->at('date')->all_text;
$self->{D_sgbr_date} = $date;
if ($date =~ s!^\s*(\d{4})-(\d{2})-(\d{2}).*$!$1$2$3!) {
$self->{D_pub_date} = $date;
}
else {
$self->log->warn('"' . $date . '" is not a compatible pubDate');
};
};
# Publication place
try {
my $pp = $dom->at('pubPlace');
if ($pp) {
$self->{S_pub_place} = $pp->all_text if $pp->all_text;
};
if ($pp->attr('ref')) {
$self->{A_reference} = $pp->attr('ref');
};
};
if ($stmt = $dom->at('titleStmt')) {
# Title
try {
$stmt->find('title')->each(
sub {
my $type = $_->attr('type') || 'main';
$self->{T_title} = $_->all_text if $type eq 'main';
# Only support the first subtitle
$self->{T_sub_title} = $_->all_text
if $type eq 'sub' && !$self->sub_title;
}
);
};
# Author
try {
my $author = $stmt->at('author')->attr('ref');
$author = $self->{_ref_author}->{$author};
if ($author) {
my $array = ($self->{K_keywords} //= []);
$self->{T_author} = $author->{name} // $author->{id};
if ($author->{age}) {
$self->{'S_sgbr_author_age_class'} = $author->{age};
push @$array, 'sgbrAuthorAgeClass:' . $author->{age};
};
if ($author->{sex}) {
$self->{'S_sgbr_author_sex'} = $author->{sex};
push @$array, 'sgbrAuthorSex:' . $author->{sex};
};
};
};
};
try {
my $kodex = $dom->at('item[rend]')->attr('rend');
if ($kodex) {
my $array = ($self->{K_keywords} //= []);
$self->{'S_sgbr_kodex'} = $kodex;
push @$array, 'sgbrKodex:' . $kodex;
};
};
}
elsif ($type eq 'doc') {
try {
$dom->find('particDesc person')->each(
sub {
my $hash = $self->{_ref_author}->{'#' . $_->attr('xml:id')} = {
age => $_->attr('age'),
sex => $_->attr('sex'),
id => $_->attr('xml:id')
};
# Get name
if ($_->at('persName')) {
$hash->{name} = $_->at('persName')->all_text;
};
});
};
try {
my $lang = $dom->at('language[ident]')->attr('ident');
$self->{S_language} = $lang;
};
try {
$self->{'A_funder'} = $dom->at('funder > orgName')->all_text;
};
try {
$stmt = $dom->find('fileDesc > titleStmt > title')->each(
sub {
my $type = $_->attr('type') || 'main';
$self->{T_doc_title} = $_->all_text if $type eq 'main';
if ($type eq 'sub') {
my $sub_title = $self->{T_doc_sub_title};
$self->{T_doc_sub_title} =
($sub_title ? $sub_title . ', ' : '') . $_->all_text;
};
}
);
};
};
return;
};
1;