File Coverage

blib/lib/Text/Markup.pm
Criterion Covered Total %
statement 49 50 98.0
branch 15 20 75.0
condition 8 14 57.1
subroutine 16 16 100.0
pod 8 8 100.0
total 96 108 88.8


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