XML-NewsML_G2

 view release on metacpan or  search on metacpan

lib/XML/NewsML_G2/Writer.pm  view on Meta::CPAN

    if ( $self->_root_item->doc_version > 1 ) {
        $im->appendChild( my $s = $self->create_element('signal') );
        $self->scheme_manager->add_qcode( $s, 'sig', 'correction' );
    }

    foreach ( @{ $self->_root_item->indicators } ) {
        $im->appendChild( my $s = $self->create_element('signal') );
        $self->scheme_manager->add_qcode( $s, 'ind', lc );
    }

    foreach
        my $attr (qw(see_alsos derived_froms processed_froms evolved_froms)) {
        if ( $self->_root_item->$attr ) {
            my $arrayref = $self->_root_item->$attr;
            for my $v (@$arrayref) {
                ( my $rel = $attr ) =~ s/_(\w)/uc $1/ge;
                $rel =~ s/s$//;
                my $linkelem = $self->create_element(
                    'link',
                    rel     => "irel:$rel",
                    version => $v->version
                );
                for my $attribute (qw/residref href/) {
                    next unless $v->$attribute;
                    $linkelem->setAttribute( $attribute => $v->$attribute );
                }

                $im->appendChild($linkelem);
            }
        }
    }

    $root->appendChild($im);
    return;
}

sub _import_iptc_catalog {
    my $self = shift;

    while ( my ( $attr, $alias ) = each %{ $self->g2_catalog_schemes } ) {
        $alias ||= $attr;
        my $getter_setter = $self->scheme_manager->can($attr)
            or die "Unknown scheme '$attr'\n";
        next
            if ( $getter_setter->( $self->scheme_manager ) )
            ;    # attribute ist already set by user
        my $scheme = XML::NewsML_G2::Scheme->new(
            alias   => $alias,
            catalog => $self->g2_catalog_url
        );
        $getter_setter->( $self->scheme_manager, $scheme );
    }
    return;
}

# public methods

sub create_element {
    my ( $self, $name, %attrs ) = @_;
    my $text      = delete $attrs{_text};
    my $cdata     = delete $attrs{_cdata};
    my $name_text = delete $attrs{_name_text};
    my $ns        = delete $attrs{_ns} || $self->g2_ns;
    my $elem      = $self->doc->createElementNS( $ns, $name );
    for my $attr_name ( sort keys %attrs ) {
        $elem->setAttribute( $attr_name, $attrs{$attr_name} );
    }
    if ($text) {
        $elem->appendChild( $self->doc->createTextNode($text) );
    }
    elsif ($cdata) {
        $elem->appendChild( $self->doc->createCDATASection($cdata) );
    }
    elsif ($name_text) {
        $name_text = $name_text->name
            if ( ref $name_text and $name_text->can('name') );
        $elem->appendChild(
            $self->create_element( 'name', _text => $name_text ) );
    }
    return $elem;
}

sub create_dom {
    my $self = shift;

    $self->_import_iptc_catalog();
    my $root = $self->_create_root_element();
    $self->_create_catalogs($root);
    $self->_create_rights_info($root);
    $self->_create_item_meta($root);
    $self->_create_content_meta($root);
    $self->_create_content($root);
    return $self->doc;

}

__PACKAGE__->meta->make_immutable;

1;
__END__

=head1 NAME

XML::NewsML_G2::Writer - base class for XML DOM tree creation
conforming to NewsML-G2 News Items, Package Items and News Messages

=for test_synopsis
    my ($ni, $sm);

=head1 SYNOPSIS

    my $w = XML::NewsML_G2::Writer::News_Item->new
        (news_item => $ni, scheme_manager => $sm, g2_version => 2.18);

    my $p = $w->create_element('p', class => 'main', _text => 'blah');

    my $dom = $w->create_dom();

=head1 DESCRIPTION

This module acts as a NewsML-G2 version-independent base class for all
writer classes. Depending on whether you want to create output for a
News Item, Package Item or News Message, use one of the subclasses
L<XML::NewsML_G2::Writer::News_Item>,
L<XML::NewsML_G2::Writer::Package_Item> or
L<XML::NewsML_G2::Writer::News_Message> instead.

=head1 ATTRIBUTES

=over 4

=item news_item



( run in 0.521 second using v1.01-cache-2.11-cpan-39bf76dae61 )