File Coverage

blib/lib/MediaWiki/DumpFile/Compat.pm
Criterion Covered Total %
statement 34 64 53.1
branch 0 4 0.0
condition n/a
subroutine 12 22 54.5
pod n/a
total 46 90 51.1


line stmt bran cond sub pod time code
1             #!/usr/bin/env perl
2              
3             #Parse::MediaWikiDump compatibility
4              
5             package MediaWiki::DumpFile::Compat;
6              
7             our $VERSION = '0.2.0';
8              
9             package #go away indexer!
10             Parse::MediaWikiDump;
11              
12 6     6   93873 use strict;
  6         13  
  6         172  
13 6     6   27 use warnings;
  6         9  
  6         856  
14              
15             sub new {
16 0     0     my ($class) = @_;
17 0           return bless({}, $class);
18             }
19              
20             sub pages {
21 0     0     shift(@_);
22 0           return Parse::MediaWikiDump::Pages->new(@_);
23             }
24              
25             sub revisions {
26 0     0     shift(@_);
27 0           return Parse::MediaWikiDump::Revisions->new(@_);
28             }
29              
30             sub links {
31 0     0     shift(@_);
32 0           return Parse::MediaWikiDump::Links->new(@_);
33             }
34              
35             package #go away indexer!
36             Parse::MediaWikiDump::Links;
37              
38 6     6   25 use strict;
  6         10  
  6         161  
39 6     6   30 use warnings;
  6         14  
  6         149  
40              
41 6     6   3353 use MediaWiki::DumpFile::SQL;
  6         20  
  6         1025  
42              
43             sub new {
44 0     0     my ($class, $source) = @_;
45 0           my $self = {};
46 0           my $sql;
47            
48 0           $Carp::CarpLevel++;
49 0           $sql = MediaWiki::DumpFile::SQL->new($source);
50 0           $Carp::CarpLevel--;
51            
52 0 0         if (! defined($sql)) {
53 0           die "could not create SQL parser";
54             }
55            
56 0           $self->{sql} = $sql;
57            
58 0           return bless($self, $class);
59             }
60              
61             sub next {
62 0     0     my ($self) = @_;
63 0           my $next = $self->{sql}->next;
64            
65 0 0         unless(defined($next)) {
66 0           return undef;
67             }
68            
69 0           return Parse::MediaWikiDump::link->new($next);
70             }
71              
72             package #go away indexer!
73             Parse::MediaWikiDump::link;
74              
75 6     6   60 use strict;
  6         8  
  6         209  
76 6     6   29 use warnings;
  6         10  
  6         199  
77              
78 6     6   29 use Data::Dumper;
  6         8  
  6         893  
79              
80             sub new {
81 0     0     my ($class, $self) = @_;
82            
83 0           bless($self, $class);
84             }
85              
86             sub from {
87 0     0     return $_[0]->{pl_from};
88             }
89              
90             sub namespace {
91 0     0     return $_[0]->{pl_namespace};
92             }
93              
94             sub to {
95 0     0     return $_[0]->{pl_title};
96             }
97              
98             package #go away indexer!
99             Parse::MediaWikiDump::Revisions;
100              
101 6     6   35 use strict;
  6         9  
  6         157  
102 6     6   28 use warnings;
  6         11  
  6         119  
103 6     6   24 use Data::Dumper;
  6         7  
  6         230  
104              
105 6     6   4499 use MediaWiki::DumpFile::Pages;
  0            
  0            
106              
107             sub new {
108             my ($class, @args) = @_;
109             my $self = { queue => [] };
110             my $mediawiki;
111            
112             $Carp::CarpLevel++;
113             $mediawiki = MediaWiki::DumpFile::Pages->new(@args);
114             $Carp::CarpLevel--;
115            
116             $self->{mediawiki} = $mediawiki;
117            
118             return bless($self, $class);
119             }
120              
121             sub version {
122             return $_[0]->{mediawiki}->version;
123             }
124              
125             sub sitename {
126             return $_[0]->{mediawiki}->sitename;
127             }
128              
129             sub base {
130             return $_[0]->{mediawiki}->base;
131             }
132              
133             sub generator {
134             return $_[0]->{mediawiki}->generator;
135             }
136              
137             sub case {
138             return $_[0]->{mediawiki}->case;
139             }
140              
141             sub namespaces {
142             my $cache = $_[0]->{cache}->{namespaces};
143            
144             if(defined($cache)) {
145             return $cache;
146             }
147            
148             my %namespaces = $_[0]->{mediawiki}->namespaces;
149             my @temp;
150            
151             while(my ($key, $val) = each(%namespaces)) {
152             push(@temp, [$key, $val]);
153             }
154            
155             @temp = sort({$a->[0] <=> $b->[0]} @temp);
156            
157             $_[0]->{cache}->{namespaces} = \@temp;
158            
159             return \@temp;
160             }
161              
162             sub namespaces_names {
163             my ($self) = @_;
164             my @result;
165            
166             return $self->{cache}->{namespaces_names} if defined $self->{cache}->{namespaces_names};
167            
168             foreach (@{ $_[0]->namespaces }) {
169             push(@result, $_->[1]);
170             }
171            
172             $self->{cache}->{namespaces_names} = \@result;
173            
174             return \@result;
175             }
176              
177             sub current_byte {
178             return $_[0]->{mediawiki}->current_byte;
179             }
180              
181             sub size {
182             return $_[0]->{mediawiki}->size;
183             }
184              
185             sub get_category_anchor {
186             my ($self) = @_;
187             my $namespaces = $self->namespaces;
188             my $cache = $self->{cache};
189             my $ret = undef;
190            
191             if (defined($cache->{category_anchor})) {
192             return $cache->{category_anchor};
193             }
194              
195             foreach (@$namespaces) {
196             my ($id, $name) = @$_;
197             if ($id == 14) {
198             $ret = $name;
199             }
200             }
201            
202             $self->{cache}->{category_anchor} = $ret;
203            
204             return $ret;
205             }
206              
207             sub next {
208             my $self = $_[0];
209             my $queue = $_[0]->{queue};
210             my $next = shift(@$queue);
211             my @results;
212              
213             return $next if defined $next;
214            
215             $next = $self->{mediawiki}->next;
216            
217             return undef unless defined $next;
218              
219             foreach ($next->revision) {
220             push(@$queue, Parse::MediaWikiDump::page->new($next, $self->namespaces, $self->get_category_anchor, $_));
221             }
222            
223             return shift(@$queue);
224             }
225              
226             package #go away indexer!
227             Parse::MediaWikiDump::Pages;
228              
229             use strict;
230             use warnings;
231              
232             our @ISA = qw(Parse::MediaWikiDump::Revisions);
233              
234             sub next {
235             my $self = $_[0];
236             my $next = $self->{mediawiki}->next;
237             my $revision_count;
238            
239             return undef unless defined $next;
240            
241             $revision_count = scalar(@{[$next->revision]});
242             #^^^^^ because scalar($next->revision) doesn't work
243            
244             if ($revision_count > 1) {
245             die "only one revision per page is allowed\n";
246             }
247              
248             return Parse::MediaWikiDump::page->new($next, $self->namespaces, $self->get_category_anchor);
249             }
250              
251              
252             package #go away indexer!
253             Parse::MediaWikiDump::page;
254              
255             use strict;
256             use warnings;
257              
258             our %REGEX_CACHE_CATEGORIES;
259              
260             sub new {
261             my ($class, $page, $namespaces, $category_anchor, $revision) = @_;
262             my $self = {page => $page, namespaces => $namespaces, category_anchor => $category_anchor};
263            
264             $self->{revision} = $revision;
265            
266             return bless($self, $class);
267             }
268              
269             sub _revision {
270             if (defined($_[0]->{revision})) { return $_[0]->{revision}};
271            
272             return $_[0]->{page}->revision;
273             }
274              
275             sub text {
276             my $text = $_[0]->_revision->text;
277             return \$text;
278             }
279              
280             sub title {
281             return $_[0]->{page}->title;
282             }
283              
284             sub id {
285             return $_[0]->{page}->id;
286             }
287              
288             sub revision_id {
289             return $_[0]->_revision->id;
290             }
291              
292             sub username {
293             return $_[0]->_revision->contributor->username;
294             }
295              
296             sub userid {
297             return $_[0]->_revision->contributor->id;
298             }
299              
300             sub userip {
301             return $_[0]->_revision->contributor->ip;
302             }
303              
304             sub timestamp {
305             return $_[0]->_revision->timestamp;
306             }
307              
308             sub minor {
309             return $_[0]->_revision->minor;
310             }
311              
312             sub namespace {
313             my ($self) = @_;
314             my $title = $self->title;
315             my $namespace = '';
316            
317             if (defined($self->{cache}->{namespace})) {
318             return $self->{cache}->{namespace};
319             }
320            
321             if ($title =~ m/^([^:]+):(.*)/o) {
322             foreach (@{ $self->{namespaces} } ) {
323             my ($num, $name) = @$_;
324             if ($1 eq $name) {
325             $namespace = $1;
326             last;
327             }
328             }
329             }
330              
331             $self->{cache}->{namespace} = $namespace;
332              
333             return $namespace;
334             }
335              
336             sub redirect {
337             my ($self) = @_;
338             my $text = $self->text;
339             my $ret;
340            
341             return $self->{cache}->{redirect} if defined $self->{cache}->{redirect};
342              
343             if ($$text =~ m/^#redirect\s*:?\s*\[\[([^\]]*)\]\]/io) {
344             $ret = $1;
345             } else {
346             $ret = undef;
347             }
348            
349             $self->{cache}->{redirect} = $ret;
350            
351             return $ret;
352             }
353              
354             sub categories {
355             my ($self) = @_;
356             my $anchor = $$self{category_anchor};
357             my $text = $self->text;
358             my @cats;
359             my $ret;
360            
361             return $self->{cache}->{categories} if defined $self->{cache}->{categories};
362            
363             if (! defined($REGEX_CACHE_CATEGORIES{$anchor})) {
364             $REGEX_CACHE_CATEGORIES{$anchor} = qr/\[\[$anchor:\s*([^\]]+)\]\]/i;
365             }
366            
367             while($$text =~ /$REGEX_CACHE_CATEGORIES{$anchor}/g) {
368             my $buf = $1;
369            
370             #deal with the pipe trick
371             $buf =~ s/\|.*$//;
372             push(@cats, $buf);
373             }
374              
375             if (scalar(@cats) == 0) {
376             $ret = undef;
377             } else {
378             $ret = \@cats;
379             }
380              
381             return $ret;
382             }
383              
384              
385             1;
386              
387             __END__