File Coverage

blib/lib/String/TT.pm
Criterion Covered Total %
statement 58 58 100.0
branch 14 16 87.5
condition 4 6 66.6
subroutine 10 10 100.0
pod 2 2 100.0
total 88 92 95.6


line stmt bran cond sub pod time code
1             package String::TT;
2 3     3   74028 use strict;
  3         6  
  3         125  
3 3     3   16 use warnings;
  3         7  
  3         90  
4 3     3   2701 use PadWalker qw(peek_my);
  3         6154  
  3         352  
5 3     3   26 use Carp qw(confess croak);
  3         7  
  3         287  
6 3     3   154965 use Template;
  3         114425  
  3         119  
7 3     3   34 use List::Util qw(min);
  3         6  
  3         557  
8 3         33 use Sub::Exporter -setup => {
9             exports => [qw/tt strip/],
10 3     3   6100 };
  3         57861  
11              
12             our $VERSION = '0.03';
13             our $AUTHORITY = 'CPAN:JROCKWAY';
14              
15             my %SIGIL_MAP = (
16             '$' => 's',
17             '@' => 'a',
18             '%' => 'h',
19             '&' => 'c', # probably do not need
20             '*' => 'g', # probably do not need
21             );
22              
23             {
24             my $engine;
25             sub _build_tt_engine {
26 10   66 10   50 return $engine ||= Template->new;
27             }
28             }
29              
30             sub tt($) {
31 10     10 1 68 my $template = shift;
32 10 50       30 confess 'Whoa there, I need a template' if !defined $template;
33              
34 10 50       15 my %vars = %{peek_my(1)||{}};
  10         110  
35 10         23 my %transformed_vars;
36 10         35 for my $v (keys %vars){
37 15         75 my ($sigil, $varname) = ($v =~ /^(.)(.+)$/);
38 15         47 my $suffix = $SIGIL_MAP{$sigil};
39 15         33 my $name = join '_', $varname, $suffix;
40 15         34 $transformed_vars{$name} = $vars{$v};
41 15 100       38 if($sigil eq '$'){
42 12         15 $transformed_vars{$name} = ${$transformed_vars{$name}};
  12         45  
43             }
44             }
45              
46             # add the plain scalar variables (without overwriting anything)
47 10         25 for my $v (grep { /_s$/ } keys %transformed_vars) {
  15         61  
48 12         49 my ($varname) = ($v =~ /^(.+)_s$/);
49 12 100       61 if(!exists $transformed_vars{$varname}){
50 11         36 $transformed_vars{$varname} = $transformed_vars{$v};
51             }
52             }
53              
54 10         29 my $t = _build_tt_engine;
55 10         30827 my $output;
56 10 100       46 $t->process(\$template, \%transformed_vars, \$output)
57             || croak $t->error;
58 9         71394 return $output;
59             }
60              
61             sub strip($){
62 11     11 1 9721 my $lines = shift;
63              
64 11         39 my $trailing_newline = ($lines =~ /\n$/s);# perl silently throws away data
65 11         51 my @lines = split "\n", $lines;
66 11 100       43 shift @lines if $lines[0] eq ''; # strip empty leading line
67              
68             # determine indentation level
69 11 100 66     23 my @spaces = map { /^(\040+)/ and length $1 or 0 } grep { !/^\s*$/ } @lines;
  17         149  
  22         344  
70            
71 11         53 my $indentation_level = min(@spaces);
72            
73             # strip off $indentation_level spaces
74 22         29 my $stripped = join "\n", map {
75 11         19 my $copy = $_;
76 22         32 substr($copy,0,$indentation_level) = "";
77 22         74 $copy;
78             } @lines;
79            
80 11 100       35 $stripped .= "\n" if $trailing_newline;
81 11         84 return $stripped;
82             }
83              
84             1;
85             __END__