File Coverage

blib/lib/Text/Markup.pm
Criterion Covered Total %
statement 46 47 97.8
branch 15 20 75.0
condition 6 12 50.0
subroutine 15 15 100.0
pod 8 8 100.0
total 90 102 88.2


line stmt bran cond sub pod time code
1             package Text::Markup;
2              
3 2     2   80082 use 5.8.1;
  2         7  
4 2     2   9 use strict;
  2         4  
  2         62  
5 2     2   11 use warnings;
  2         4  
  2         50  
6 2     2   850 use Text::Markup::None;
  2         16  
  2         68  
7 2     2   14 use Carp;
  2         4  
  2         1659  
8              
9             our $VERSION = '0.30';
10              
11             my %_PARSER_FOR;
12             my %REGEX_FOR = (
13             html => qr{x?html?},
14             markdown => qr{m(?:d(?:own)?|kdn?|arkdown)},
15             multimarkdown => qr{mm(?:d(?:own)?|kdn?|arkdown)},
16             pod => qr{p(?:od|m|l)},
17             textile => qr{textile},
18             trac => qr{tra?c},
19             mediawiki => qr{(?:m(?:edia)?)?wiki},
20             rest => qr{re?st},
21             asciidoc => qr{a(?:sc(?:iidoc)?|doc)?},
22             bbcode => qr{bb(?:code)?},
23             creole => qr{creole},
24             );
25              
26             sub register {
27 3     3 1 3692 my ($class, $name, $regex) = @_;
28 3         6 my $pkg = caller;
29 3         13 $REGEX_FOR{$name} = $regex;
30 3 50       79 $_PARSER_FOR{$name} = $pkg->can('parser')
31             or croak "No parser() function defind in $pkg";
32             }
33              
34             sub _parser_for {
35 28     28   55 my ($self, $format) = @_;
36 28 100       92 return Text::Markup::None->can('parser') unless $format;
37 26 100       143 return $_PARSER_FOR{$format} if $_PARSER_FOR{$format};
38 10 100       70 my $pkg = __PACKAGE__ . '::' . ($format eq 'html' ? 'HTML' : ucfirst $format);
39 10 50       657 eval "require $pkg; 1" or die $@;
40 10   33     137 return $_PARSER_FOR{$format} = $pkg->can('parser')
41             || croak "No parser() function defind in $pkg";
42             }
43              
44             sub formats {
45 13     13 1 5558 sort keys %REGEX_FOR;
46             }
47              
48 1     1 1 21 sub format_matchers { %REGEX_FOR }
49              
50             sub new {
51 11     11 1 564 my $class = shift;
52 11         67 bless { default_encoding => 'UTF-8', @_ } => $class;
53             }
54              
55             sub parse {
56 24     24 1 14822 my $self = shift;
57 24         101 my %p = @_;
58 24 50       87 my $file = $p{file} or croak "No file parameter passed to parse()";
59 24 50 33     608 croak "$file does not exist" unless -e $file && !-d _;
60              
61 24         118 my $parser = $self->_get_parser(\%p);
62             return $parser->(
63             $file,
64             $p{encoding} || $self->default_encoding,
65             $p{options}
66 24   33     118 );
67             }
68              
69             sub default_format {
70 8     8 1 1482 my $self = shift;
71 8 100       38 return $self->{default_format} unless @_;
72 3         15 $self->{default_format} = shift;
73             }
74              
75             sub default_encoding {
76 24     24 1 48 my $self = shift;
77 24 50       180 return $self->{default_encoding} unless @_;
78 0         0 $self->{default_encoding} = shift;
79             }
80              
81             sub _get_parser {
82 28     28   63 my ($self, $p) = @_;
83             my $format = $p->{format}
84             || $self->guess_format($p->{file})
85 28   100     126 || $self->default_format;
86              
87 28         74 return $self->_parser_for($format);
88             }
89              
90             sub guess_format {
91 36     36 1 14845 my ($self, $file) = @_;
92 36         160 for my $format (keys %REGEX_FOR) {
93 254 100       5729 return $format if $file =~ qr{[.]$REGEX_FOR{$format}$};
94             }
95 5         46 return;
96             }
97              
98             1;
99             __END__