iBash: Fix broke quote format
[quotesite.git] / quotesite / iBashGrabber.pm
1 # (c) 2007 by Ralf Ertzinger <ralf@camperquake.de>
2 # licensed under GNU GPL v2
3 #
4 # Grabber for german-bash.org
5
6 package iBashGrabber;
7
8 use GrabberBase;
9 @ISA = qw(GrabberBase);
10
11 use LWP::Simple qw(!get);
12 use HTML::TokeParser;
13 use Data::Dumper;
14 use Encode;
15
16 use strict;
17
18 sub new {
19     my $class = shift;
20     my $self = $class->SUPER::new();
21
22     $self->{'NAME'} = 'ibash.de';
23     $self->{'PATTERNS'} = ['(http://(?:[-a-zA-Z0-9_.]+\.)*ibash.de/zitat_(\d+)\.html)'];
24
25     bless($self, $class);
26     $self->_prepare_parameters();
27
28     return $self;
29 }
30
31 sub __buildquote_line {
32     my $self = shift;
33     my $p = shift;
34     my $t;
35     my $data = '';
36
37     while ($t = $p->get_tag('td', '/tr')) {
38         if ($t->[0] eq '/tr') {
39             return $data;
40         }
41         if (exists($t->[1]->{'colspan'})) {
42             return '';
43         }
44         $data .= $p->get_text('/td')
45     }
46 }
47
48
49 sub __buildquote_block {
50     my $self = shift;
51     my $p = shift;
52     my $t;
53     my $data;
54
55     while ($t = $p->get_tag('tr','/table')) {
56         if ($t->[0] eq '/table') {
57             return $data;
58         }
59         $data .= $self->__buildquote_line($p) . "\n";
60     }
61 }
62
63 sub _parse {
64     my $self = shift;
65     my $url = shift;
66     my $pattern = shift;
67     my $content;
68     my $metadata = {};
69     my $p;
70     my $t;
71
72     $url =~ m|$pattern|;
73     $url = $1;
74
75     $metadata->{'URL'} = $url;
76     $metadata->{'ID'} = $2;
77     $metadata->{'TYPE'} = 'quote';
78     $metadata->{'SOURCE'} = $self->{'NAME'};
79     $metadata->{'CONTENT'} = undef;
80
81     # Get the HTML file containing the quote
82     unless(defined($content = LWP::Simple::get(sprintf('http://www.ibash.de/zitat_%s.html', $2)))) {
83         $self->error('Could not download quote');
84         return undef;
85     }
86
87     $p = HTML::TokeParser->new(\$content);
88
89     while ($t = $p->get_tag('td')) {
90         if (exists($t->[1]->{'class'}) && ($t->[1]->{'class'} eq 'quote')) {
91             $metadata->{'CONTENT'} = $self->__buildquote_block($p);
92             Encode::from_to($metadata->{'CONTENT'}, 'iso-8859-1', 'utf8');
93         }
94     }
95
96     unless(defined($metadata->{'CONTENT'})) {
97         $self->error('Could not extract quote content');
98         return undef;
99     }
100
101     return $metadata;
102 }
103
104 1;