File Coverage

blib/lib/Text/Markup.pm
Criterion Covered Total %
statement 46 47 97.8
branch 15 20 75.0
condition 8 14 57.1
subroutine 15 15 100.0
pod 8 8 100.0
total 92 104 88.4


line stmt bran cond sub pod time code
1             package Text::Markup;
2              
3 2     2   80097 use 5.8.1;
  2         8  
4 2     2   10 use strict;
  2         14  
  2         62  
5 2     2   11 use warnings;
  2         4  
  2         55  
6 2     2   852 use Text::Markup::None;
  2         17  
  2         71  
7 2     2   16 use Carp;
  2         4  
  2         1572  
8              
9             our $VERSION = '0.31';
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 3660 my ($class, $name, $regex) = @_;
28 3         8 my $pkg = caller;
29 3         13 $REGEX_FOR{$name} = $regex;
30 3 50       49 $_PARSER_FOR{$name} = $pkg->can('parser')
31             or croak "No parser() function defind in $pkg";
32             }
33              
34             sub _parser_for {
35 28     28   60 my ($self, $format) = @_;
36 28 100       81 return Text::Markup::None->can('parser') unless $format;
37 26 100       105 return $_PARSER_FOR{$format} if $_PARSER_FOR{$format};
38 10 100       59 my $pkg = __PACKAGE__ . '::' . ($format eq 'html' ? 'HTML' : ucfirst $format);
39 10 50       613 eval "require $pkg; 1" or die $@;
40 10   33     131 return $_PARSER_FOR{$format} = $pkg->can('parser')
41             || croak "No parser() function defind in $pkg";
42             }
43              
44             sub formats {
45 13     13 1 5331 sort keys %REGEX_FOR;
46             }
47              
48 1     1 1 15 sub format_matchers { %REGEX_FOR }
49              
50             sub new {
51 11     11 1 468 my $class = shift;
52 11         61 bless { default_encoding => 'UTF-8', @_ } => $class;
53             }
54              
55             sub parse {
56 24     24 1 14076 my $self = shift;
57 24         94 my %p = @_;
58 24 50       77 my $file = $p{file} or croak "No file parameter passed to parse()";
59 24 50 33     552 croak "$file does not exist" unless -e $file && !-d _;
60              
61 24         113 my $parser = $self->_get_parser(\%p);
62             return $parser->(
63             $file,
64             $p{encoding} || $self->default_encoding,
65 24   33     99 $p{options} || [],
      100        
66             );
67             }
68              
69             sub default_format {
70 8     8 1 1505 my $self = shift;
71 8 100       40 return $self->{default_format} unless @_;
72 3         7 $self->{default_format} = shift;
73             }
74              
75             sub default_encoding {
76 24     24 1 49 my $self = shift;
77 24 50       189 return $self->{default_encoding} unless @_;
78 0         0 $self->{default_encoding} = shift;
79             }
80              
81             sub _get_parser {
82 28     28   66 my ($self, $p) = @_;
83             my $format = $p->{format}
84             || $self->guess_format($p->{file})
85 28   100     101 || $self->default_format;
86              
87 28         76 return $self->_parser_for($format);
88             }
89              
90             sub guess_format {
91 36     36 1 14055 my ($self, $file) = @_;
92 36         153 for my $format (keys %REGEX_FOR) {
93 231 100       5345 return $format if $file =~ qr{[.]$REGEX_FOR{$format}$};
94             }
95 5         39 return;
96             }
97              
98             1;
99             __END__