line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Text::Format::Interview; |
2
|
1
|
|
|
1
|
|
27204
|
use Moose; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
=head1 NAME |
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
Text::Format::Interview - Take a text interview transcript and format to html. |
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
=head1 VERSION |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
Version 0.03 |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
=cut |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
our $VERSION = '0.03'; |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
=head1 SYNOPSIS |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
use Text::Format::Interview; |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
my $txt = Text::Format::Interview->new(); |
21
|
|
|
|
|
|
|
my $html = $txt->process($string); |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
Converts text of the form: |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
# Interview between Fred Flintstone and Barney Rubble, 3rd April, 2000 BC |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
Fred: [00:00:00] |
29
|
|
|
|
|
|
|
So, Barney, when did you decide to become a Flintstone? |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
Barney: [00:00:10] |
32
|
|
|
|
|
|
|
Well Fred, I'm not actually a Flintstone, my surname is Rubble and I live in Bedrock. |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
Into HTML, something like: |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
# Interview between Fred Flintstone and Barney Rubble, 3rd April, 2000 BC |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
<h2>Fred: [00:00:00]</h2> |
39
|
|
|
|
|
|
|
<p>So, Barney, when did you decide to become a Flintstone?</p> |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
This is intended as a pre-processor, so the header is using markdown here, but could equally be html. |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
Alternatively if you specify a comma separated list of "interviewers" and |
44
|
|
|
|
|
|
|
"interviewees" at the top of the file to be processed, you'll get some css |
45
|
|
|
|
|
|
|
classes as well: |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
# Interview between Fred Flintstone and Barney Rubble, 3rd April, 2000 BC |
48
|
|
|
|
|
|
|
interviewer: fred,wilma |
49
|
|
|
|
|
|
|
interviewee: barney,betty |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
Fred: [00:00:00] |
52
|
|
|
|
|
|
|
So what's it like to be a flintstone? |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
Barney: [00:00:05] |
55
|
|
|
|
|
|
|
I'm not a Flintstone, I'm a Rubble. What do you think Betty? |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
Betty: [00:00:10] |
58
|
|
|
|
|
|
|
Yes Fred, you're confused. |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
Wilma: [00:00:15] |
61
|
|
|
|
|
|
|
I'm so terribly embarrassed by my husband. |
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
Which ought to render to: |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
# Interview between Fred Flintstone and Barney Rubble, 3rd April, 2000 BC |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
<p>interviewer: fred, wilma <br> |
68
|
|
|
|
|
|
|
interviewee: barney, betty <br></p> |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
<h2 class="interviewer">Fred: [00:00:00]</h2> |
71
|
|
|
|
|
|
|
<p>So what's it like to be a flintstone?</p> |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
<h2 class="interviewee">Barney: [00:00:05]</p> |
74
|
|
|
|
|
|
|
<p>I'm not a Flintstone, I'm a Rubble. What do you think Betty?</p> |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
This gives us the ability to put pretty colours in the interview transcript |
77
|
|
|
|
|
|
|
with CSS, something like this: |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
h2.interviewer > p { color: red } |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
(or something far more tortorous if you need to Internet Explorer 6 support ...) |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=head1 FUNCTIONS |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
=head2 process |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
Takes the text, and spits out the html. |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
=cut |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
sub process { |
92
|
|
|
|
|
|
|
my ($self, $content) = @_; |
93
|
|
|
|
|
|
|
my $rendered = ''; |
94
|
|
|
|
|
|
|
# first let's make sure our newlines are consistent for the current platform. |
95
|
|
|
|
|
|
|
# regex ripped out of the cpan module File::LocalizeNewlines |
96
|
|
|
|
|
|
|
$content =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; |
97
|
|
|
|
|
|
|
my @content = split /\n\n/, $content; |
98
|
|
|
|
|
|
|
shift @content if $content[0] =~ /^$/; |
99
|
|
|
|
|
|
|
my ($interviewer) = $content[0] =~ /interviewer:\s?(.*)$/mi; |
100
|
|
|
|
|
|
|
$interviewer ||=''; |
101
|
|
|
|
|
|
|
my (@interviewers, @interviewees); |
102
|
|
|
|
|
|
|
eval { |
103
|
|
|
|
|
|
|
@interviewers = split /,\s?/,$interviewer; |
104
|
|
|
|
|
|
|
}; |
105
|
|
|
|
|
|
|
warn "No interviewers specified" if @_; |
106
|
|
|
|
|
|
|
my ($interviewee) = $content[0] =~ /interviewee:\s?(.*)$/mi; |
107
|
|
|
|
|
|
|
$interviewee ||= ''; |
108
|
|
|
|
|
|
|
eval { |
109
|
|
|
|
|
|
|
@interviewees = split /,\s?/,$interviewee; |
110
|
|
|
|
|
|
|
}; |
111
|
|
|
|
|
|
|
warn "No interviewees specified" if @_; |
112
|
|
|
|
|
|
|
my %speaker; |
113
|
|
|
|
|
|
|
$speaker{lc($_)} = 'class = "interviewee"' for @interviewees; |
114
|
|
|
|
|
|
|
$speaker{lc($_)} = 'class = "interviewer"' for @interviewers; |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
my @first_para = split /\n/, $content[0]; |
117
|
|
|
|
|
|
|
$rendered .= $first_para[0] . "\n\n"; # interview title |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
#remainder is metadata/ text description |
120
|
|
|
|
|
|
|
$rendered .= "<p>"; |
121
|
|
|
|
|
|
|
$rendered .= $_ . "<br>\n" for @first_para[1 .. $#first_para]; |
122
|
|
|
|
|
|
|
$rendered .= "</p>\n\n"; |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
foreach my $c (@content[1 .. $#content]) { |
125
|
|
|
|
|
|
|
my ($who,$time,$txt) = $c =~ /^(.*?:)\s+?(\[.*?\])\s?(.*)/ms; |
126
|
|
|
|
|
|
|
my ($name) = $who =~ /(\w+):/; |
127
|
|
|
|
|
|
|
$speaker{lc($name)} = '' unless exists $speaker{lc($name)}; |
128
|
|
|
|
|
|
|
$rendered .= "<h2 " .$speaker{lc($name)} . ">$who</h2>\n\n<p><span class='timestamp'>$time</span>$txt</p>\n\n"; |
129
|
|
|
|
|
|
|
} |
130
|
|
|
|
|
|
|
return $rendered; |
131
|
|
|
|
|
|
|
} |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
=head1 AUTHOR |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
Kieren Diment, C<< <zarquon at cpan.org> >> |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
=head1 BUGS |
138
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
Please report any bugs or feature requests to C<bug-text-format-interview at rt.cpan.org>, or through |
140
|
|
|
|
|
|
|
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Text-Format-Interview>. I will be notified, and then you'll |
141
|
|
|
|
|
|
|
automatically be notified of progress on your bug as I make changes. |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
=head1 SUPPORT |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
You can find documentation for this module with the perldoc command. |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
perldoc Text::Format::Interview |
151
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
You can also look for information at: |
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
=over 4 |
156
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
=item * RT: CPAN's request tracker |
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Text-Format-Interview> |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
=item * AnnoCPAN: Annotated CPAN documentation |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
L<http://annocpan.org/dist/Text-Format-Interview> |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
=item * CPAN Ratings |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
L<http://cpanratings.perl.org/d/Text-Format-Interview> |
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
=item * Search CPAN |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
L<http://search.cpan.org/dist/Text-Format-Interview/> |
172
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
=item * Version Control Repository (Github) |
174
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
L<http://github.com/singingfish/Test-Format-Interview/tree/master> |
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
=back |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
=head1 ACKNOWLEDGEMENTS |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
=head1 COPYRIGHT & LICENSE |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
Copyright 2009 Kieren Diment, all rights reserved. |
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it |
187
|
|
|
|
|
|
|
under the same terms as Perl itself. |
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
=cut |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
1; # End of Text::Format::Interview |