File Coverage

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