File Coverage

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


line stmt bran cond sub pod time code
1             package Pod::Cats::Parser::MGC;
2 5     5   23 use strict;
  5         8  
  5         113  
3 5     5   25 use warnings;
  5         7  
  5         108  
4 5     5   75 use 5.010;
  5         13  
5              
6 5     5   1428 use parent qw(Parser::MGC);
  5         585  
  5         32  
7              
8             sub new {
9 3     3 1 32 my $self = shift->SUPER::new(@_);
10 3         247 my %o = @_;
11 3 50       26 $self->{obj} = $o{object} or die "Expected argument 'object'";
12 3   50     13 $self->{delimiters} = $o{delimiters} || "<";
13              
14 3         15 return $self;
15             }
16              
17             sub parse {
18 25     25 0 307 my $self = shift;
19 25         38 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 41     41   1970 my $odre;
26 41 100       122 if ($self->scope_level) {
27 12         100 $odre = qr/\Q$self->{delimiters}/;
28             }
29             else {
30 29         242 $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 41         717 my $tag = $self->expect( qr/[A-Z](?=$odre)/ );
37              
38 13         419 $self->commit;
39              
40 13         79 my $odel;
41            
42 13 100       34 if ($self->scope_level) {
43 3         18 $odel = $self->expect( $self->{delimiters} );
44             }
45             else {
46 10         60 $odel = $self->expect( $odre );
47 10         428 $odel .= $self->expect( qr/\Q$odel\E*/ );
48             }
49              
50 13         527 (my $cdel = $odel) =~ tr/<({[/>)}]/;
51              
52             # The opening delimiter is the same char repeated, never
53             # different ones.
54 13         30 local $self->{delimiters} = $odel;
55              
56 13 100       40 if ($tag eq 'Z') {
57 3         15 $self->expect( $cdel );
58 3         117 $self->{level}--;
59 3         11 return;
60             }
61              
62             my $retval = $pod_cats->handle_entity(
63             $tag => @{
64 10         13 $self->scope_of( undef, \&parse, $cdel )
  10         40  
65             }
66             );
67 10         3975 return $retval;
68             },
69              
70             sub {
71 28 100       2113 if ($self->scope_level) {
72 9         102 return $self->substring_before( qr/[A-Z]\Q$self->{delimiters}/ );
73             }
74             else {
75 19         204 return $self->substring_before( qr/[A-Z]$odre/ );
76             }
77             },
78             )
79 25         142 });
  41         310  
80             }
81              
82             1;