File Coverage

lib/Jinja2/TT2.pm
Criterion Covered Total %
statement 25 38 65.7
branch 2 6 33.3
condition 1 2 50.0
subroutine 8 9 88.8
pod 3 3 100.0
total 39 58 67.2


line stmt bran cond sub pod time code
1             package Jinja2::TT2;
2              
3 1     1   122372 use strict;
  1         2  
  1         80  
4 1     1   11 use warnings;
  1         2  
  1         56  
5 1     1   14 use v5.20;
  1         3  
6              
7 1     1   582 use Jinja2::TT2::Tokenizer;
  1         3  
  1         56  
8 1     1   649 use Jinja2::TT2::Parser;
  1         4  
  1         48  
9 1     1   673 use Jinja2::TT2::Emitter;
  1         3  
  1         552  
10              
11             our $VERSION = '0.01';
12              
13             sub new {
14 1     1 1 220761 my ($class, %opts) = @_;
15             return bless {
16             tokenizer => Jinja2::TT2::Tokenizer->new(),
17             parser => Jinja2::TT2::Parser->new(),
18             emitter => Jinja2::TT2::Emitter->new(%opts),
19 1   50     11 debug => $opts{debug} // 0,
20             }, $class;
21             }
22              
23             sub transpile {
24 43     43 1 119807 my ($self, $template) = @_;
25              
26             # Step 1: Tokenize
27 43         226 my @tokens = $self->{tokenizer}->tokenize($template);
28              
29 43 50       156 if ($self->{debug}) {
30 0         0 say STDERR "=== TOKENS ===";
31 0         0 for my $tok (@tokens) {
32 0         0 say STDERR " [$tok->{type}] '$tok->{value}'";
33             }
34             }
35              
36             # Step 2: Parse into AST
37 43         209 my $ast = $self->{parser}->parse(\@tokens);
38              
39 43 50       158 if ($self->{debug}) {
40 0         0 require Data::Dumper;
41 0         0 say STDERR "=== AST ===";
42 0         0 say STDERR Data::Dumper::Dumper($ast);
43             }
44              
45             # Step 3: Emit TT2
46 43         211 return $self->{emitter}->emit($ast);
47             }
48              
49             sub transpile_file {
50 0     0 1   my ($self, $filename) = @_;
51              
52 0 0         open my $fh, '<:encoding(UTF-8)', $filename
53             or die "Cannot open '$filename': $!";
54 0           my $template = do { local $/; <$fh> };
  0            
  0            
55 0           close $fh;
56              
57 0           return $self->transpile($template);
58             }
59              
60             1;
61              
62             __END__