File Coverage

lib/MIME/Type.pm
Criterion Covered Total %
statement 41 43 95.3
branch 16 20 80.0
condition 4 5 80.0
subroutine 21 23 91.3
pod 16 19 84.2
total 98 110 89.0


line stmt bran cond sub pod time code
1             # Copyrights 1999-2021 by [Mark Overmeer ].
2             # For other contributors see ChangeLog.
3             # See the manual pages for details on the licensing terms.
4             # Pod stripped from pm file by OODoc 2.02.
5             # This code is part of distribution MIME::Types. Meta-POD processed with
6             # OODoc into POD and HTML manual-pages. See README.md
7             # Copyright Mark Overmeer. Licensed under the same terms as Perl itself.
8              
9             package MIME::Type;
10 6     6   157047 use vars '$VERSION';
  6         17  
  6         315  
11             $VERSION = '2.22';
12              
13              
14 6     6   33 use strict;
  6         9  
  6         120  
15              
16 6     6   26 use Carp 'croak';
  6         7  
  6         280  
17              
18              
19             #-------------------------------------------
20              
21              
22             use overload
23 6         35 '""' => 'type'
24 6     6   7765 , cmp => 'cmp';
  6         5975  
25              
26             #-------------------------------------------
27              
28              
29 2048     2048 1 8369 sub new(@) { (bless {}, shift)->init( {@_} ) }
30              
31             sub init($)
32 2048     2048 0 3198 { my ($self, $args) = @_;
33              
34             my $type = $self->{MT_type} = $args->{type}
35 2048 50       5690 or croak "ERROR: Type parameter is obligatory.";
36              
37             $self->{MT_simplified} = $args->{simplified}
38 2048   66     4794 || $self->simplified($type);
39              
40 2048   100     5221 $self->{MT_extensions} = $args->{extensions} || [];
41              
42             $self->{MT_encoding}
43             = $args->{encoding} ? $args->{encoding}
44 2048 100       4279 : $self->mediaType eq 'text' ? 'quoted-printable'
    100          
45             : 'base64';
46              
47             $self->{MT_system} = $args->{system}
48 2048 50       4313 if defined $args->{system};
49              
50 2048         9496 $self;
51             }
52              
53             #-------------------------------------------
54              
55 16226     16226 1 41429 sub type() {shift->{MT_type}}
56              
57              
58             sub simplified(;$)
59 2135     2135 1 3038 { my $thing = shift;
60 2135 100       3549 return $thing->{MT_simplified} unless @_;
61              
62 2080         2443 my $mime = shift;
63              
64 2080 50       17449 $mime =~ m!^\s*(?:x\-)?([\w.+-]+)/(?:x\-)?([\w.+-]+)\s*$!i ? lc "$1/$2"
    100          
65             : $mime eq 'text' ? 'text/plain' # some silly mailers...
66             : undef;
67             }
68              
69              
70 4044     4044 1 4596 sub extensions() { @{shift->{MT_extensions}} }
  4044         8746  
71 4041     4041 1 13712 sub encoding() {shift->{MT_encoding}}
72 0     0 1 0 sub system() {shift->{MT_system}}
73              
74             #-------------------------------------------
75              
76              
77 1950 100   1950 1 8505 sub mediaType() {shift->{MT_simplified} =~ m!^([\w.-]+)/! ? $1 : undef}
78 2     2 0 6 sub mainType() {shift->mediaType} # Backwards compatibility
79              
80              
81 2 50   2 1 24 sub subType() {shift->{MT_simplified} =~ m!/([\w+.-]+)$! ? $1 : undef}
82              
83              
84 8     8 1 68 sub isRegistered() { lc shift->{MT_type} !~ m{^x\-|/x\-} }
85              
86              
87             # http://tools.ietf.org/html/rfc4288#section-3
88 4     4 1 27 sub isVendor() {shift->{MT_simplified} =~ m!/vnd\.!}
89 4     4 1 23 sub isPersonal() {shift->{MT_simplified} =~ m!/prs\.!}
90 4     4 1 23 sub isExperimental() {shift->{MT_simplified} =~ m!/x\.! }
91              
92              
93 4     4 1 443 sub isBinary() { shift->{MT_encoding} eq 'base64' }
94 4     4 1 25 sub isText() { shift->{MT_encoding} ne 'base64' }
95             *isAscii = \&isText;
96              
97              
98             # simplified names only!
99             my %sigs = map +($_ => 1),
100             qw(application/pgp-keys application/pgp application/pgp-signature
101             application/pkcs10 application/pkcs7-mime application/pkcs7-signature
102             text/vCard);
103              
104 0     0 1 0 sub isSignature() { $sigs{shift->{MT_simplified}} }
105              
106              
107             sub cmp($)
108 37     37 0 1677 { my ($self, $other) = @_;
109              
110 37 100       118 my $type = ref $other
111             ? $other->simplified
112             : (ref $self)->simplified($other);
113              
114 37         71 $self->simplified cmp $type;
115             }
116 19     19 1 1728 sub equals($) { $_[0]->cmp($_[1])==0 }
117              
118             1;