Beagle

 view release on metacpan or  search on metacpan

lib/Beagle/Cmd/Command/spread.pm  view on Meta::CPAN

                die "template file $name doesn't exist" unless defined $file;
            }

            $template = read_file($file);
        }
        elsif ( defined $self->template ) {
            $template = $self->template;
        }

        my $to = $self->to;
        my $from = $self->from || current_user();
        my $subject = $self->subject || $entry->summary(80);

        if ( defined $template ) {
            require Text::Xslate;
            my $tx = Text::Xslate->new(
                function => {
                    shorten => sub {
                        my $url = shift;
                        return $url unless defined $url;
                        return `shorten $url`;
                    },
                }
            );

            $msg = $tx->render_string(
                $template,
                {
                    handle  => $bh,
                    entry   => $entry,
                    id      => $id,
                    url     => $bh->info->url . '/entry/' . $id,
                    to      => $to,
                    from    => $from,
                    subject => $subject,
                }
            );
            $msg = encode_utf8( $msg );
        }
        else {
            require MIME::Entity;
            my %head = (
                'X-Beagle-URL'       => $bh->info->url . '/entry/' . $entry->id,
                'X-Beagle-Copyright' => $bh->info->copyright,
                'X-Beagle-Class'     => ref $entry,
            );

            my $mime = MIME::Entity->build(
                From    => encode( 'MIME-HEADER', $from ),
                Subject => encode( 'MIME-HEADER', $subject ),
                Data    => $entry->serialize( id => 1 ),
                Charset => 'utf-8',
                To => encode( 'MIME-HEADER', $to ),
                %head,
            );

            if ( $entry->format ne 'plain' ) {
                $mime->make_multipart;
                $mime->attach(
                    Data           => $entry->body_html,
                    'Content-Type' => 'text/html; charset=utf-8',
                );
            }

            my $atts = $bh->attachments_map->{$id};
            if ($atts) {
                $mime->make_multipart;
                for my $name ( keys %$atts ) {
                    $mime->attach(
                        Filename              => $name,
                        Data                  => $atts->{$name}->content,
                        Type                  => $atts->{$name}->mime_type,
                        'Content-Disposition' => "attachment; filename=$name",
                    );
                }
            }
            $msg = $mime->stringify;
        }

        $msg =~ s!\s+$!newline()!e;

        if ($cmd) {
            puts "going to call `$cmd` with input:", newline(),
              decode_utf8($msg)
              unless $self->quiet && !$self->dry_run;

            if ( !$self->dry_run ) {
                my $doit = 1;
                if ( !$self->quiet ) {
                    print "spread? (Y/n): ";
                    my $val = <STDIN>;
                    undef $doit if $val =~ /n/i;
                }

                if ($doit) {
                    my @cmd = Text::ParseWords::shellwords($cmd);
                    require IPC::Run3;
                    my ( $out, $err );
                    IPC::Run3::run3( [@cmd], \$msg, \$out, \$err, );
                    if ($?) {
                        die "failed to run $cmd: exit code is "
                          . ( $? >> 8 )
                          . ", out is $out, err is $err\n";
                    }
                    else {
                        print $out;
                    }
                }
            }
        }
        else {
            # yes, print utf8 encoded string all the time
            print $msg;
        }
    }
}


1;

__END__



( run in 1.403 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )