File Coverage

blib/lib/HTML/Blitz/ParseError.pm
Criterion Covered Total %
statement 55 55 100.0
branch 24 42 57.1
condition 5 9 55.5
subroutine 8 8 100.0
pod 0 4 0.0
total 92 118 77.9


line stmt bran cond sub pod time code
1             # This code can be redistributed and modified under the terms of the GNU
2             # General Public License as published by the Free Software Foundation, either
3             # version 3 of the License, or (at your option) any later version.
4             # See the "COPYING" file for details.
5             package HTML::Blitz::ParseError;
6 11     11   85 use HTML::Blitz::pragma;
  11         23  
  11         71  
7 11 50   11   5746 use overload fallback => 1, '""' => method (@) { $self->to_string };
  11     56   24  
  11         127  
  56         14152  
  56         95  
  56         90  
  56         131  
8              
9             our $VERSION = '0.09';
10              
11             method new($class:
12             :$src_name,
13             :$src_ref,
14             :$pos,
15             :$msg,
16             :$width = 1,
17             :$alt_pos = undef,
18             :$alt_msg = undef,
19             :$alt_width = 1,
20 28 50 33 28 0 80 ) {
  28 50       112  
  28 50       48  
  28 50       127  
  28 50       84  
  28 50       74  
  28 50       79  
  28 50       77  
  28 50       76  
  28         53  
  28         40  
  28         86  
  28         69  
  28         37  
21 28         518 bless {@_}, $class
22             }
23              
24 35 50   35   77 fun _context($src_ref, $pos) {
  35 50       71  
  35         72  
  35         54  
25 35         134 my $n_line = substr($$src_ref, 0, $pos) =~ tr/\n// + 1;
26 35         100 my $line_start = rindex($$src_ref, "\n", $pos - 1) + 1;
27 35         101 my $line_end = index($$src_ref, "\n", $pos);
28 35 100       88 $line_end = length $$src_ref if $line_end == -1;
29 35         78 my $s_line = substr $$src_ref, $line_start, $line_end - $line_start;
30 35         55 my $lpos = $pos - $line_start;
31             +{
32 35         242 line_num => $n_line,
33             col_num => $lpos + 1,
34             line => $s_line,
35             m_prefix => substr($s_line, 0, $lpos) =~ tr/ \t/ /cr,
36             }
37             }
38              
39 56 50   56 0 138 method location() {
  56 50       104  
  56         82  
  56         64  
40             $self->{_location} //= _context $self->{src_ref}, $self->{pos}
41 56   66     199 }
42              
43 56 50   56 0 128 method alt_location() {
  56 50       104  
  56         78  
  56         69  
44 56         92 my $alt_pos = $self->{alt_pos};
45 56 100       149 return undef if !defined $alt_pos;
46 14   66     63 $self->{_alt_location} //= _context $self->{src_ref}, $alt_pos
47             }
48              
49 56 50   56 0 121 method to_string() {
  56 50       118  
  56         86  
  56         69  
50 56         117 my $loc = $self->location;
51 56         124 my $alt_loc = $self->alt_location;
52             "$self->{src_name}:$loc->{line_num}:$loc->{col_num}: error: $self->{msg}\n"
53             . " |\n"
54             . " | $loc->{line}\n"
55             . " | $loc->{m_prefix}" . '^' x $self->{width} . "\n"
56             . (!defined $alt_loc ? "" :
57             "$self->{src_name}:$alt_loc->{line_num}:$alt_loc->{col_num}: ... $self->{alt_msg}\n"
58             . " |\n"
59             . " | $alt_loc->{line}\n"
60 56 100       748 . " | $alt_loc->{m_prefix}" . '^' x $self->{alt_width} . "\n"
61             )
62             }
63              
64             1