Catmandu-Importer-MWTemplates

 view release on metacpan or  search on metacpan

lib/Catmandu/Importer/MWTemplates.pm  view on Meta::CPAN

use Catmandu::Sane;
use Furl;
use Moo;

our $VERSION = '0.01';

with 'Catmandu::Importer';

has site => (
    is => 'ro',
    coerce => sub {
        my ($site) = @_;
        if ($site =~ /^[a-z]+([_-][a-z])*$/) {
            $site =~ s/-/_/g;
            $site = "http://$site.wikipedia.org/";
        }
        return $site;
    }
);

has page => (
    is => 'ro'
);

has template => (
    is => 'ro'
);

has wikilinks => (
    is => 'ro',
    default => sub { 1 }
);

has tempname => (
    is => 'ro',
    default => sub { 'TEMPLATE' }
);


sub generator {
    my ($self) = @_;
    
    sub {
        state $templates = $self->_extract;
        return unless $templates and @$templates;
        return shift @$templates;
    }
}

sub _extract {
    my ($self) = @_;
    my $text = "";

    if ($self->site) {
        my $client = Furl->new;
        if (defined $self->page) {
            my $page = $self->page;
            my $url = $self->site . "wiki/$page?action=raw";
            my $res = $client->get($url);
            if ($res->is_success) {
                $text = $res->decoded_content;
            } else {
                die "failed to get $url";
            }
        } else {
            # TODO: read pages from input unless page is set
        }
    } else {
        my $fh = $self->fh;
        $text = do { local $/; <$fh> };
    }

    # TODO: add PAGE if page input mode set

    $self->_extract_template($text);
}

# Parse arguments of one template call
sub _template () {
    my ($self, $result, $name, $parameters) = @_;

    # {{foo bar}} calls Template:Foo_bar with upper case F.
    # Might not work for non-ASCII characters.
    $name = ucfirst($name);
    $name =~ s/ /_/g;

    my $template = { };

    if  (defined ($parameters)) {
        my ($field, $value);
        my $argc = 0;
        $parameters =~ s/^\|\s*(.*?)\s*$/$1/;
        foreach my $arg (split(/\s*\|\s*/, $parameters)) {
            $argc++;
            if ($arg =~ /^([^=]*?)\s*=\s*(.*)$/) {
                $field = $1;
                $value = $2;
            } else {
                $field = $argc;
                $value = $arg;
            }

            if (!$self->wikilinks) {
                $value =~ s/\[\[([^\]]*?)(\$!([^\]]*))?\]\]/$2 ? $3 : $1/eg;
            } elsif ($self->wikilinks == 2) {
                $value =~ s/\[\[([^\]]*?)(\$!([^\]]*))?\]\]/$1/eg;
            } else {
                $value =~ s/\[\[([^\]]*?)(\$!([^\]]*))?\]\]/$2 ? "[[$1|$3]]" : "[[$1]]"/eg;
            }

            $template->{$field} = $value; 
        }
    }

    if (!defined $self->template) {
        $template->{$self->tempname} = $name;
        push @$result, $template;
    } elsif ($self->template eq $name) {
        push @$result, $template;
    }



( run in 2.389 seconds using v1.01-cache-2.11-cpan-7f9471e7e0a )