File Coverage

blib/lib/Pod/Cats/Parser/MGC.pm
Criterion Covered Total %
statement 44 44 100.0
branch 9 10 90.0
condition 1 2 50.0
subroutine 7 7 100.0
pod 1 2 50.0
total 62 65 95.3


line stmt bran cond sub pod time code
1             package Pod::Cats::Parser::MGC;
2 5     5   27 use strict;
  5         10  
  5         148  
3 5     5   25 use warnings;
  5         8  
  5         112  
4 5     5   80 use 5.010;
  5         14  
  5         224  
5              
6 5     5   1099 use parent qw(Parser::MGC);
  5         324  
  5         48  
7              
8             sub new {
9 4     4 1 48 my $self = shift->SUPER::new(@_);
10 4         344 my %o = @_;
11 4 50       25 $self->{obj} = $o{object} or die "Expected argument 'object'";
12 4   50     24 $self->{delimiters} = $o{delimiters} || "<";
13              
14 4         25 return $self;
15             }
16              
17             sub parse {
18 29     29 0 340 my $self = shift;
19 29         43 my $pod_cats = $self->{obj};
20              
21             # Can't grab the whole lot with one re (yet) so I will grab one and expect
22             # more.
23              
24             my $ret = $self->sequence_of(sub {
25 45     45   2242 my $odre;
26 45 100       128 if ($self->scope_level) {
27 12         107 $odre = qr/\Q$self->{delimiters}/;
28             }
29             else {
30 33         305 $odre = qr/[\Q$self->{delimiters}\E]/;
31             }
32              
33             $self->any_of(
34             sub {
35             # After we're in 1 level we've committed to an exact delimiter.
36 45         868 my $tag = $self->expect( qr/[A-Z](?=$odre)/ );
37              
38 13         373 $self->commit;
39              
40 13         70 my $odel;
41            
42 13 100       31 if ($self->scope_level) {
43 3         15 $odel = $self->expect( $self->{delimiters} );
44             }
45             else {
46 10         49 $odel = $self->expect( $odre );
47 10         415 $odel .= $self->expect( qr/\Q$odel\E*/ );
48             }
49              
50 13         463 (my $cdel = $odel) =~ tr/<({[/>)}]/;
51              
52             # The opening delimiter is the same char repeated, never
53             # different ones.
54 13         29 local $self->{delimiters} = $odel;
55              
56 13 100       102 if ($tag eq 'Z') {
57 3         9 $self->expect( $cdel );
58 3         123 $self->{level}--;
59 3         11 return;
60             }
61              
62 10         45 my $retval = $pod_cats->handle_entity(
63             $tag => @{
64 10         20 $self->scope_of( undef, \&parse, $cdel )
65             }
66             );
67 10         4809 return $retval;
68             },
69              
70             sub {
71 32 100       2526 if ($self->scope_level) {
72 9         115 return $self->substring_before( qr/[A-Z]\Q$self->{delimiters}/ );
73             }
74             else {
75 23         269 return $self->substring_before( qr/[A-Z]$odre/ );
76             }
77             },
78             )
79 29         211 });
  45         387  
80             }
81              
82             1;