package Pod::Simple::Wiki::Mediawiki; ############################################################################### # # Pod::Simple::Wiki::Mediawiki - A class for creating Pod to Mediawiki filters. # # # Copyright 2003-2008, John McNamara, jmcnamara@cpan.org # # Documentation after __END__ # use Pod::Simple::Wiki; use strict; use vars qw(@ISA $VERSION); @ISA = qw(Pod::Simple::Wiki); $VERSION = '0.08'; ############################################################################### # # The tag to wiki mappings. # my $tags = { '' => "'''", '' => "'''", '' => "''", '' => "''", '' => '', '' => '', '
'  => "\n",
            '
' => "\n\n", '

' => '==', '

' => "==\n", '

' => '===', '

' => "===\n", '

' => '====', '

' => "====\n", '

' => '=====', '

' => "=====\n", }; ############################################################################### # # new() # # Simple constructor inheriting from Pod::Simple::Wiki. # sub new { my $class = shift; my $self = Pod::Simple::Wiki->new('wiki', @_); $self->{_tags} = $tags; bless $self, $class; $self->accept_targets('mediawiki'); $self->nbsp_for_S(1); return $self; } ############################################################################### # # _append() # # Appends some text to the buffered Wiki text. # sub _append { my $self = shift; if ($self->{_indent_text}) { $self->{_wiki_text} .= $self->{_indent_text}; $self->{_indent_text} = ''; } $self->{_wiki_text} .= $_[0]; } ############################################################################### # # _indent_item() # # Indents an "over-item" to the correct level. # sub _indent_item { my $self = shift; my $item_type = $_[0]; my $item_param = $_[1]; my $indent_level = $self->{_item_indent}; if ($item_type eq 'bullet') { $self->_append('*' x $indent_level . ' '); } elsif ($item_type eq 'number') { $self->_append('#' x $indent_level . ' '); } elsif ($item_type eq 'text') { $self->_append(':' x ($indent_level-1) . '; '); } } ############################################################################### # # Functions to deal with links. sub _start_L { my ($self, $attr) = @_; unless ($self->_skip_headings) { $self->_append(''); # In case we have _indent_text pending $self->_output; # Flush the text buffer, so it will contain only the link text $self->{_link_attr} = $attr; # Save for later } # end unless skipping formatting because in heading } # end _start_L sub _end_L { my $self = $_[0]; my $attr = delete $self->{_link_attr}; if ($attr and my $method = $self->can('_format_link')) { $self->{_wiki_text} = $method->($self, $self->{_wiki_text}, $attr); } # end if link to be processed } # end _end_L ############################################################################### # # _format_link sub _format_link { my ($self, $text, $attr) = @_; if ($attr->{type} eq 'url') { my $link = $attr->{to}; return $link if $attr->{'content-implicit'}; return "[$link $text]"; } # end if hyperlink to URL # Manpage: if ($attr->{type} eq 'man') { # FIXME link to http://www.linuxmanpages.com? return "$text" if $attr->{'content-implicit'}; return "$text ($attr->{to})"; } # end if manpage 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]]"; } # end _format_link ############################################################################### # # _handle_text() # # Perform any necessary transforms on the text. This is mainly used to escape # inadvertent CamelCase words. # sub _handle_text { my $self = shift; my $text = $_[0]; unless ($self->{_in_Data}) { # Escape colons in definition lists: if ($self->{_in_item_text}) { $text =~ s/:/:/g; # A colon would end the item } # Escape empty lines in verbatim sections: if ($self->{_in_Verbatim}) { $text =~ s/^$/ /mg; # An empty line would split the section } $text =~ s/\xA0/ /g; # Convert non-breaking spaces to entities $text =~ s/''/''/g; # It's not a formatting code } # end unless in data paragraph $self->_append($text); } ############################################################################### # # Functions to deal with =over ... =back regions for # # Bulleted lists # Numbered lists # Text lists # Block lists # sub _end_item_text { } # _start_Para will insert the : ############################################################################### # # _start_Para() # # Special handling for paragraphs that are part of an "over" block. # 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}) { $self->{_indent_text} = "\n" . (':' x $indent_level); } } ###################################################################### # # _end_Data # # Special handling for data paragraphs sub _end_Data { $_[0]->_output("\n\n") } 1; __END__ =head1 NAME Pod::Simple::Wiki::Mediawiki - A class for creating Pod to Mediawiki wiki filters. =head1 SYNOPSIS This module isn't used directly. Instead it is called via C: #!/usr/bin/perl -w use strict; use Pod::Simple::Wiki; my $parser = Pod::Simple::Wiki->new('mediawiki'); ... Convert Pod to a Mediawiki wiki format using the installed C utility: pod2wiki --style mediawiki file.pod > file.wiki =head1 DESCRIPTION The C module is used for converting Pod text to Wiki text. Pod (Plain Old Documentation) is a simple markup language used for writing Perl documentation. For an introduction to Mediawiki see: http://www.mediawiki.org/wiki/MediaWiki This module isn't generally invoked directly. Instead it is called via C. See the L and L documentation for more information. =head1 METHODS Pod::Simple::Wiki::Mediawiki inherits all of the methods of C and C. See L and L for more details. =head1 SEE ALSO This module also installs a C command line utility. See C for details. =head1 ACKNOWLEDGEMENTS Thanks Tony Sidaway for initial Wikipedia/MediaWiki support. Christopher J. Madsen for several major additions and tests. =head1 DISCLAIMER OF WARRANTY Please refer to the DISCLAIMER OF WARRANTY in L. =head1 AUTHORS John McNamara jmcnamara@cpan.org Christopher J. Madsen perl@cjmweb.net =head1 COPYRIGHT © MMIII-MMVIII, John McNamara. All Rights Reserved. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.