File Coverage

blib/lib/HTML/ForumCode.pm
Criterion Covered Total %
statement 69 71 97.1
branch 6 8 75.0
condition 1 3 33.3
subroutine 18 18 100.0
pod 3 3 100.0
total 97 103 94.1


line stmt bran cond sub pod time code
1             package HTML::ForumCode;
2             # vim: ts=8 sts=4 et sw=4 sr sta
3 3     3   38811 use strict;
  3         7  
  3         114  
4 3     3   17 use warnings;
  3         4  
  3         98  
5              
6 3     3   906 use version; our $VERSION = qv('0.0.5')->numify;
  3         2717  
  3         19  
7              
8 3     3   1277 use Template::Plugin::HTML;
  3         23662  
  3         5725  
9              
10             sub new {
11 1     1 1 14 my ($class, @args) = @_;
12              
13 1   33     9 my $new_obj = bless {}, (ref($class)||$class);
14 1         6 $new_obj->init;
15              
16 1         3 return $new_obj;
17             }
18              
19             sub init {
20 2     2 1 6 my $self = shift;
21              
22             # simple [x][/x] --> tags
23 2         24 $self->{simple_tags} = [qw{
24             b
25             u
26             i
27             }];
28             # replacements; e.g. __x__ --> x
29 2         16 $self->{replacements} = [
30             { from => '__', to => 'u' },
31             { from => '\*\*', to => 'b' },
32             ];
33              
34 2         6 return;
35             }
36              
37             sub forumcode {
38 86     86 1 87248 my ($self, $text) = @_;
39              
40             # if we don't have any text, we don't have to do any work
41 86 50       230 if (not defined $text) {
42 0         0 return q{};
43             }
44              
45             # first of all ESCAPE EVERYTHING!
46 86         318 $text = Template::Plugin::HTML->escape($text);
47              
48             # turn newlines into
tags
49 86         1039 $self->_preserve_newlines(\$text );
50              
51 86         180 $self->_simple_tags ( \$text );
52 86         249 $self->_replacements ( \$text );
53 86         279 $self->_colouring ( \$text );
54 86         201 $self->_lists ( \$text );
55 86         181 $self->_url_links ( \$text );
56 86         204 $self->_images ( \$text );
57 86         206 $self->_styled_block ( \$text );
58 86         162 $self->_quoted_block ( \$text );
59            
60 86         361 return $text;
61             }
62              
63             sub _preserve_newlines {
64 86     86   126 my ($self, $textref) = @_;
65              
66 86         198 $$textref =~ s{\n}{
}xmsg;
67             }
68              
69             sub _simple_tags {
70 86     86   109 my ($self, $textref) = @_;
71              
72             # deal with acceptable [x]...[/x] markup
73 86         117 foreach my $tag (@{ $self->{simple_tags} }) {
  86         199  
74             # we should be able to combine these two into one
75             #$$textref =~ s{\[$tag\]}{<$tag>}g;
76             #$$textref =~ s{\[/$tag\]}{}g;
77 258         5236 $$textref =~ s{
78             \[($tag)\]
79             (.+?)
80             \[/$tag\]
81             }
82             {<$1>$2}xmsg;
83             }
84             }
85              
86             sub _replacements {
87 86     86   108 my ($self, $textref) = @_;
88              
89             # now deal with replacements
90 86         99 foreach my $tag (@{ $self->{replacements} }) {
  86         178  
91 172         2491 $$textref =~ s{
92             $tag->{from}
93             (.+?)
94             $tag->{from}
95             }
96             {<$tag->{to}>$1{to}>}gx;
97             }
98             }
99              
100             sub _url_links {
101 86     86   106 my ($self, $textref) = @_;
102              
103             # deal with links with no text-label
104 86         139 $$textref =~ s{\[url\](.+?)\[/url\]}
105             {$1}xmsg;
106             # deal with links with a text-label
107 86         190 $$textref =~ s{
108             \[url # start of url tag
109             \s+ # need some whitespace
110             name=" # name="
111             (.+?) # the name
112             " # closing "
113             \s* # optional whitespace
114             \] # close the opening tag
115             (.+?) # the url
116             \[/url\] # close the URL tag
117             }
118             {$1}xmsg;
119             # bbcode / explosm style urls
120 86         209 $$textref =~ s{
121             \[URL=" # opening url tag
122             (.+?) # the url
123             "\] # close-opening tag
124             (.+?) # link name/text/label
125             \[/URL] # closing tag
126             }
127             {$2}ximsg;
128             }
129              
130             sub _images {
131 86     86   107 my ($self, $textref) = @_;
132              
133             # deal with image tags
134 86         220 $$textref =~ s{
135             \[img # opening img tag
136             (.*?) # optional parameters
137             \] # close-opening tag
138             (.+?) # image URL
139             \[/img\] # closing img tag
140             }
141             #{}ximsg;
142 20         48 {&_image_tag_with_attr($2,$1)}ximsge;
143             }
144              
145             sub _image_tag_with_attr {
146 20     20   59 my ($uri, $attr_match) = @_;
147              
148             # no annoying image attributes to worry about
149 20 100       165 if (q{} eq $attr_match) {
150 10         58 return qq{};
151             }
152             # deal with annoying image attributes
153             else {
154 10         67 $attr_match =~ s{
155             (\w+)
156             =
157             "
158             (\w+?)
159             "
160             }
161             {$1="$2"}xmsg;
162 10         49 return qq{};
163             }
164             }
165              
166             sub _colouring {
167 86     86   122 my ($self, $textref) = @_;
168              
169             # deal with colouring
170 86         414 $$textref =~ s{
171             \[(colou?r)
172             =
173             (
174             red | orange | yellow | green | blue
175             | black | white
176             | \#[0-9a-fA-F]{3}
177             | \#[0-9a-fA-F]{6}
178             )
179             \]
180             (.+?)
181             \[/\1\]
182             }
183             {$3}ixmsg;
184             }
185              
186             sub _lists {
187 86     86   106 my ($self, $textref) = @_;
188              
189 86         212 $$textref =~ s{
190             \[list\]
191             (?:
192             \s*
193             (?:
194            
195             )?
196             \s*
197             )
198             (.+?)
199             \[/list\]
200             [\s]*
201             (?:
202            
203             )?
204             }
205 4         11 {_list_elements($1)}xmsge;
206             }
207              
208             sub _list_elements {
209 4     4   10 my ($text) = @_;
210              
211             # ordered lists
212 4 100       43 if (
213             $text =~ s{
214             \[\*\]
215             \s*
216             (.+?)
217            
218             \s*
219             }
220             {
  • $1
  • }xmsg
    221             ) {
    222 2         9 return qq{
      $text
    };
    223             }
    224              
    225             # ordered lists
    226 2 50       36 if (
    227             $text =~ s{
    228             \[1\]
    229             \s*
    230             (.+?)
    231            
    232             \s*
    233             }
    234             {
  • $1
  • }xmsg
    235             ) {
    236 2         11 return qq{
      $text
    };
    237             }
    238              
    239              
    240             # otherwise, just return what we were given
    241 0         0 return $text;
    242             }
    243              
    244             sub _styled_block {
    245 86     86   97 my ($self, $textref) = @_;
    246              
    247 86         174 $$textref =~ s{
    248             \[(code|pre|quote)\]
    249             (.+?)
    250             \[/\1\]
    251             }
    252             {
    $2
    }xmsg;
    253             }
    254              
    255             # this deals with the extended case of [quote] where we have the quoting=
    256             # attribute
    257             sub _quoted_block {
    258 86     86   132 my ($self, $textref) = @_;
    259              
    260 86         153 $$textref =~ s{
    261             \[
    262             (quote)
    263             \s+
    264             quoting=
    265             "
    266             (.+?)
    267             "
    268             \]
    269             (.+?)
    270             \[/\1\]
    271             }
    272             {
    Quoting $2:
    $3
    }xmsg;
    273             }
    274              
    275             1;
    276             __END__