File Coverage

blib/lib/Filename/Type/Ebook.pm
Criterion Covered Total %
statement 13 13 100.0
branch 2 2 100.0
condition n/a
subroutine 5 5 100.0
pod 1 1 100.0
total 21 21 100.0


line stmt bran cond sub pod time code
1             package Filename::Type::Ebook;
2              
3 2     2   381883 use 5.010001;
  2         8  
4 2     2   11 use strict;
  2         3  
  2         55  
5 2     2   17 use warnings;
  2         3  
  2         269  
6              
7             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
8             our $DATE = '2024-12-20'; # DATE
9             our $DIST = 'Filename-Type-Ebook'; # DIST
10             our $VERSION = '0.002'; # VERSION
11              
12 2     2   13 use Exporter qw(import);
  2         3  
  2         759  
13             our @EXPORT_OK = qw(check_ebook_filename);
14              
15             our %SPEC;
16              
17             our %SUFFIXES = (
18             '.azw' => {format=>'kindle'},
19             '.azw3' => {format=>'kindle'},
20             '.kf8' => {format=>'kindle'},
21             '.kfx' => {format=>'kindle'},
22              
23             '.cbr' => {format=>'cbr'},
24             '.cbz' => {format=>'cbr'},
25             '.cb7' => {format=>'cbr'},
26             '.cbt' => {format=>'cbr'},
27             '.cba' => {format=>'cbr'},
28              
29             '.chm' => {format=>'chm'},
30              
31             '.djvu' => {format=>'djvu'},
32              
33             '.doc' => {format=>'doc'},
34             '.docx' => {format=>'docx'},
35              
36             '.epub' => {format=>'epub'},
37              
38             '.htm' => {format=>'html'},
39             '.html' => {format=>'html'},
40              
41             '.mobi' => {format=>'mobi'},
42             '.prc' => {format=>'mobi'},
43              
44             '.pdf' => {format=>'pdf'},
45              
46             '.ps' => {format=>'postscript'},
47              
48             '.rtf' => {format=>'rtf'},
49              
50             '.text' => {format=>'txt'},
51             '.txt' => {format=>'txt'},
52              
53             # old/unpopular
54             # .pdb (palm)
55             # .fb2 (fictionbook)
56             # .xeb, .ceb (apabi)
57             # .ibooks (apple ibook)
58             # .inf (ibm)
59             # .lit (microsoft lit)
60             # .pkg (newton)
61             # .opf (open ebook, superseded by epub)
62             # .pdg (ssreader)
63             # .tr2, .tr3 (tomeraider)
64             # .oxps, .xps (open xml paper)
65              
66             # ambiguous
67             # .xml
68             );
69              
70             our %FORMATS = (
71             );
72              
73             our $STR_RE = join "|", map {quotemeta} sort keys %SUFFIXES;
74              
75             our $RE = qr((?:$STR_RE)\z)i;
76              
77             $SPEC{check_ebook_filename} = {
78             v => 1.1,
79             summary => 'Check whether filename indicates being an e-book',
80             description => <<'MARKDOWN',
81              
82              
83             MARKDOWN
84             args => {
85             filename => {
86             schema => 'str*',
87             req => 1,
88             pos => 0,
89             },
90             ci => {
91             summary => 'Whether to match case-insensitively',
92             schema => 'bool',
93             default => 1,
94             },
95             },
96             result_naked => 1,
97             };
98             sub check_ebook_filename {
99 5     5 1 455119 my %args = @_;
100              
101 5 100       100 $args{filename} =~ $RE ? {} : 0;
102             }
103              
104             1;
105             # ABSTRACT: Check whether filename indicates being an e-book
106              
107             __END__