package Pod::Simple::Wiki::Googlecode;
use warnings;
use strict;
use vars qw(@ISA $VERSION);
@ISA = qw(Pod::Simple::Wiki);
$VERSION = '0.03';
###############################################################################
#
# The tag to wiki mappings.
#
my $tags = {
'' => '*',
'' => '*',
'' => '_',
'' => '_',
'' => '`',
'' => '`',
'
' => "{{{\n",
'' => "\n}}}\n\n",
'' => "\n----\n= ",
'
' => " =\n\n",
'' => "\n== ",
'
' => " ==\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;
return $self;
}
###############################################################################
#
# _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 . ' ');
$self->{_googlecode_list} = 1;
$self->{_googlecode_num} = $indent_level + 2;
}
}
###############################################################################
#
# _skip_headings()
#
# Formatting in headings doesn't look great or is ignored in some formats.
#
sub _skip_headings {
my $self = shift;
if ($self->{_in_head1} or
$self->{_in_head2} or
$self->{_in_head3} or
$self->{_in_head4})
{
return 1;
}
}
###############################################################################
#
# _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];
# Only escape CamelCase in GoogleCode Wiki paragraphs
if (not $self->{_in_Para}) {
$self->{_wiki_text} .= $text;
return;
}
# Split the text into tokens but maintain the whitespace
my @tokens = split /(\s+)/, $text;
for (@tokens) {
next unless /\S/; # Ignore the whitespace
next if m[^(ht|f)tp://]; # Ignore URLs
s/([A-Z][a-z]+[A-Z]\w+)/!$1/g; # Escape with !
}
# Rejoin the tokens and whitespace.
$self->{_wiki_text} .= join '', @tokens;
}
###############################################################################
#
# Functions to deal with =over ... =back regions for
#
# Bulleted lists
# Numbered lists
# Text lists
# Block lists
#
sub _end_item_text {
$_[0]->_output(' ' . '=' x $_[0]->{_googlecode_num} . "\n");
$_[0]->{_googlecode_list} = 0;
}
###############################################################################
#
# _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}) {
# Do something here is necessary
}
if ($self->{_googlecode_list}) {
if (not $self->{_in_over_text} and $self->{_googlecode_list} == 1) {
$self->_append("\n");
}
if ($self->{_in_over_text} and $self->{_googlecode_list} == 2) {
$self->_append("\n");
}
if (not ($self->{_in_over_text} and $self->{_googlecode_list} == 1)) {
$self->_append(' ' x $indent_level);
}
$self->{_googlecode_list}++;
}
}
###############################################################################
#
# _end_Para()
#
# Special handling for paragraphs that are part of an "over_text" block.
# This is mainly required be Kwiki.
#
sub _end_Para {
my $self = shift;
# Only add a newline if the paragraph isn't part of a text.
if ($self->{_in_over_text}) {
# Workaround for the fact that Kwiki doesn't have a definition block.
#$self->_output("\n");
}
else {
$self->_output("\n");
}
$self->_output("\n")
}
1;
__END__
=head1 NAME
Pod::Simple::Wiki::Googlecode - A class for creating Pod to Google Code Wiki filters.
=head1 SYNOPSIS
This module isn't used directly. Instead it is called via L:
use Pod::Simple::Wiki;
my $parser = Pod::Simple::Wiki->new('googlecode');
...
Convert Pod to a Google Code wiki format using the installed C utility:
pod2wiki --style googlecode 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 Google Code Wiki Syntax see: http://code.google.com/p/support/wiki/WikiSyntax
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::GoogleCode inherits all of the methods of C and C. See L and L for more details.
=head1 AUTHOR
Fayland Lam, C<< >>
=head1 COPYRIGHT & LICENSE
Copyright 2008 Fayland Lam, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut