EBook-Ishmael

 view release on metacpan or  search on metacpan

lib/EBook/Ishmael/EBook.pm  view on Meta::CPAN

package EBook::Ishmael::EBook;
use 5.016;
our $VERSION = '2.04';
use strict;
use warnings;

use Exporter 'import';
our @EXPORT = qw(&ebook_id %EBOOK_FORMATS);

use EBook::Ishmael::EBook::CB7;
use EBook::Ishmael::EBook::CBR;
use EBook::Ishmael::EBook::CBZ;
use EBook::Ishmael::EBook::CHM;
use EBook::Ishmael::EBook::Epub;
use EBook::Ishmael::EBook::FictionBook2;
use EBook::Ishmael::EBook::HTML;
use EBook::Ishmael::EBook::KF8;
use EBook::Ishmael::EBook::Mobi;
use EBook::Ishmael::EBook::PalmDoc;
use EBook::Ishmael::EBook::PDF;
use EBook::Ishmael::EBook::Text;
use EBook::Ishmael::EBook::XHTML;
use EBook::Ishmael::EBook::Zip;
use EBook::Ishmael::EBook::zTXT;

our %EBOOK_FORMATS = map { lc $_ => "EBook::Ishmael::EBook::$_" } qw(
    CB7 CBR CBZ CHM Epub FictionBook2 HTML KF8 Mobi PalmDoc PDF Text XHTML Zip
    zTXT
);

sub ebook_id {

    my $file = shift;

    open my $fh, '<', $file
        or die "Failed to open $file for reading: $!\n";
    binmode $fh;

    for my $f (
        # Make sure text is last
        sort {
            return  1 if $a eq 'text';
            return -1 if $b eq 'text';
            return $a cmp $b;
        } keys %EBOOK_FORMATS
    ) {

        seek $fh, 0, 0;

        if ($EBOOK_FORMATS{ $f }->heuristic($file, $fh)) {
            close $fh;
            return $f;
        }

    }

    close $fh;
    return undef;

}

sub new {

    my $class = shift;
    my $file  = shift;
    my $type  = shift // ebook_id($file);
    my $enc   = shift;
    my $net   = shift;

    if (not defined $type) {
        die "Could not identify $file format\n";
    }

    my $obj = $EBOOK_FORMATS{ $type }->new($file, $enc, $net);

    return $obj;

}

1;

=head1 NAME

EBook::Ishmael::EBook - Interface for processing ebook documents

=head1 SYNOPSIS



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