File Coverage

lib/WRT/HTML.pm
Criterion Covered Total %
statement 37 37 100.0
branch 4 4 100.0
condition n/a
subroutine 10 10 100.0
pod 0 3 0.0
total 51 54 94.4


line stmt bran cond sub pod time code
1             package WRT::HTML;
2              
3 4     4   61280 use strict;
  4         15  
  4         106  
4 4     4   22 use warnings;
  4         6  
  4         109  
5 4     4   18 no warnings 'uninitialized';
  4         29  
  4         142  
6              
7              
8 4     4   18 use Exporter;
  4         7  
  4         523  
9             our @ISA = qw(Exporter);
10              
11             our %EXPORT_TAGS = ( 'all' => [ qw(a div p em small strong table
12             table_row table_cell entry_markup
13             heading article nav section
14             unordered_list ordered_list list_item) ],
15              
16             'highlevel' => [ qw(a p em small strong table
17             table_row table_cell
18             entry_markup heading) ] );
19              
20             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
21             our @EXPORT = qw( );
22              
23 4     4   289 use HTML::Entities qw(encode_entities);
  4         4301  
  4         635  
24              
25             # Generate subs for these:
26             my %tags = (
27             p => \&tag,
28             em => \&tag,
29             small => \&tag,
30             strong => \&tag,
31             table => \&tag,
32             tr => \&tag,
33             td => \&tag,
34             a => \&tag,
35             div => \&tag,
36             article => \&tag,
37             nav => \&tag,
38             section => \&tag,
39             ul => \&tag,
40             ol => \&tag,
41             li => \&tag,
42             );
43              
44             # ...but map these tags to different sub names:
45             my %tagmap = (
46             tr => 'table_row',
47             td => 'table_cell',
48             ul => 'unordered_list',
49             ol => 'ordered_list',
50             li => 'list_item',
51             );
52              
53             # Install appropriate subs in symbol table:
54 4     4   29 { no strict 'refs';
  4         8  
  4         1607  
55              
56             for my $key (keys %tags) {
57             my $subname = $tagmap{$key};
58             $subname = $key unless ($subname);
59              
60 233     233   1210 *{ $subname } = sub { $tags{$key}->($key, @_); };
61             }
62              
63             }
64              
65             # handle most HTML tags:
66             sub tag {
67 243     243 0 325 my ($tag) = shift;
68 243         337 my (@params) = @_;
69              
70 243         212 my ($attr_string, $text);
71              
72 243         268 for my $param (@params) {
73              
74 440 100       584 if (ref($param)) {
75             # We sort these because, if using each, order is random(ish), and
76             # this can lead to different HTML for the same input:
77 193         188 foreach my $name (sort keys %{ $param }) {
  193         467  
78 311         266 my $value = encode_entities( ${ $param }{$name} );
  311         503  
79 311         3656 $attr_string .= qq{ $name="$value"};
80             }
81             }
82             else {
83 247 100       384 $text .= "\n" if length($text) > 0;
84 247         282 $text .= $param;
85             }
86              
87             }
88              
89             # voila, an X(HT)ML tag:
90 243         949 return "<${tag}${attr_string}>$text</$tag>";
91             }
92              
93             # Special cases and higher-level markup
94              
95             sub entry_markup {
96 16     16 0 36 my ($text) = @_;
97 16         99 return "\n\n" . article(div($text, { class => 'entry' })) . "\n\n";
98             }
99              
100             sub heading {
101 10     10 0 19 my ($text, $level) = @_;
102 10         19 my $h = "h$level";
103 10         25 return tag($h, $text);
104             }
105              
106             1;