User:AnomieBOT/source/tasks/SourceUploader/WikiPod.pm
Appearance
package tasks::SourceUploader::WikiPod;
use utf8;
use strict;
use Pod::Simple::Wiki;
use Pod::Simple::Wiki::Mediawiki;
use URI;
use Data::Dumper;
use vars qw(@ISA);
@ISA=qw/Pod::Simple::Wiki::Mediawiki/;
sub new {
my $class = shift;
my $self = Pod::Simple::Wiki->new('mediawiki', @_);
# Set encoding
$self->encoding( 'utf8' ) if $self->can('encoding');
# New "A<>" code handling
$self->{_A_base} = shift;
$self->accept_codes('A');
# Override stupid choice of tags
$self->{_tags} = {
%{$self->{_tags}},
'<tt>' => '<code>',
'</tt>' => '</code>',
'<pre>' => "<pre>\n",
'</pre>' => "\n</pre>\n",
};
bless $self, $class;
return $self;
}
# New "A<>" code handling
sub _start_A {
my $self=shift;
$self->_append('');
$self->_output; # Flush text buffer
}
sub _end_A {
my $self=shift;
my $link="$self->{_A_base}/$self->{_wiki_text}";
if($link=~/::/){
$link=~s!::!/!g;
$link.='.pm';
}
$self->{_wiki_text} = "[[$link|$self->{_wiki_text}]]";
}
# Fix indentation and multiple =items with no intervening paragraph.
sub _indent_item {
my $self=shift;
my $item_type = $_[0];
my $item_param = $_[1];
my $indent_level = $self->{_item_indent};
$self->_append(':' x ($indent_level-1));
if ($item_type eq 'bullet') {
$self->_append('* ');
} elsif ($item_type eq 'number') {
$self->_append('# ');
} elsif ($item_type eq 'text') {
$self->_append('; ');
}
}
sub _end_item_text {$_[0]->_output("\n")}
sub _start_Para {
my $self = shift;
my $indent_level = $self->{_item_indent};
if ($self->{_in_over_block}) {
$self->{_indent_text} = (':' x $indent_level);
}
if ($self->{_in_over_text}) {
# This line is the only difference from Pod::Simple::Wiki::Mediawiki
$self->{_indent_text} = (':' x $indent_level);
}
}
# Fix link formatting
sub _format_link {
my ($self, $text, $attr) = @_;
if ($attr->{type} eq 'url') {
my $link = $attr->{to};
if($link=~m(^(?:https?|ftp|irc|mailto|svn|git)://)){
return $link if $attr->{'content-implicit'};
return "[$link $text]";
} else {
$link=~s/_/ /g;
($text=$link)=~s/^[^:]*:// if $attr->{'content-implicit'};
return "[[:$link|$text]]";
}
}
if ($attr->{type} eq 'man') {
if($attr->{to}=~/^(.+)\(([^)]+)\)$/){
my ($page,$section)=($1,$2);
my $src='';
$src='perldoc' if $page=~/^perl/i || $section eq '3perl';
return "{{man|$section|$page|$src||inline}}" if(!defined($attr->{section}) && $attr->{'content-implicit'});
$src='default' if $src eq '';
my $link="{{man/$src|$section|$page|url}}";
$link.="#".$attr->{section} if defined $attr->{section};
return "{{man/format|$section|$page|$link}}" if $attr->{'content-implicit'};
return "[$link $text]";
}
}
die "Unknown link type $attr->{type}" unless $attr->{type} eq 'pod';
# Handle a link within this page:
return "[[#$attr->{section}|$text]]" unless defined $attr->{to};
# Handle a link to a specific section in another page:
return "[[$attr->{to}#$attr->{section}|$text]]" if defined $attr->{section};
return "[[$attr->{to}]]" if $attr->{'content-implicit'};
return "[[$attr->{to}|$text]]";
}
1;