# = HISTORY SECTION =====================================================================
# ---------------------------------------------------------------------------------------
# version | date | author | changes
# ---------------------------------------------------------------------------------------
# 0.07 |02.01.03| JSTENZEL | modern run() call;
# 0.06 |27.02.02| JSTENZEL | auto-anchors headlines (for \REF);
# 0.05 |24.07.01| JSTENZEL | now adds additional lines to complete examples;
# 0.04 |26.03.01| JSTENZEL | adapted to new tag templates;
# |10.06.01| JSTENZEL | new script namespace "PerlPoint::Converter::pp2pod";
# | | JSTENZEL | more tag adaptations;
# 0.03 |07.12.00| JSTENZEL | new module namespace "PerlPoint";
# 0.02 |01.06.00| JSTENZEL | added comment transformation;
# 0.01 |27.05.00| JSTENZEL | new.
# ---------------------------------------------------------------------------------------
# = POD SECTION =========================================================================
=head1 NAME
B<pp2pod> - a Perl Point demo translator to POD
=head1 VERSION
This manual describes version B<0.07>.
=head1 DESCRIPTION
This is a demonstration application of the PP package. It
translates PP into POD.
=head1 SYNOPSIS
=head1 FILES
=head1 ENVIRONMENT
=head1 NOTES
This is a demonstration only. A real life pp2pod translator surely
should be more robust etc., the intention of this code is simply
to I<show the usage of PerlPoint::Package>, not a perfect translator.
=head1 SEE ALSO
PerlPoint::Parser
PerlPoint::Backend
=head1 AUTHOR
Copyright (c) Jochen Stenzel (perl@jochen-stenzel.de), 2000. All rights reserved.
=cut
# declare script package
package PerlPoint::Converter::pp2pod;
# declare version
$VERSION=$VERSION=0.07;
# pragmata
use strict;
# load modules
use Carp;
use Getopt::Long;
use PerlPoint::Tags;
use PerlPoint::Backend;
use PerlPoint::Constants;
use PerlPoint::Parser 0.37;
use PerlPoint::Tags::Basic;
use Getopt::ArgvFile qw(argvFile);
# declare variables
my (@streamData, @openLists, %options);
# get options
argvFile(home=>1, default=>1);
GetOptions(\%options,
"tagset=s@", # add a tag set to the scripts own tag declarations;
);
# import tags
PerlPoint::Tags::addTagSets(@{$options{tagset}}) if exists $options{tagset};
# build parser
my ($parser)=new PerlPoint::Parser;
# and call it
$parser->run(
stream => \@streamData,
files => \@ARGV,
headlineLinks => 1,
filter => 'perl|pod',
safe => exists $options{activeContents} ? $safe : undef,
activeBaseData => {
targetLanguage => 'POD',
userSettings => {map {$_=>1} exists $options{set} ? @{$options{set}} : ()},
},
predeclaredVars => {
CONVERTER_NAME => basename($0),
CONVERTER_VERSION => do {no strict 'refs'; ${join('::', __PACKAGE__, 'VERSION')}},
},
vispro => 1,
cache => (exists $options{cache} ? CACHE_ON : CACHE_OFF)
+ (exists $options{cacheCleanup} ? CACHE_CLEANUP : 0),
display => DISPLAY_ALL
+ (exists $options{noinfo} ? DISPLAY_NOINFO : 0)
+ (exists $options{nowarn} ? DISPLAY_NOWARN : 0),
trace => TRACE_NOTHING
+ ((exists $options{trace} and $options{trace} & TRACE_PARAGRAPHS) ? TRACE_PARAGRAPHS : 0)
+ ((exists $options{trace} and $options{trace} & TRACE_LEXER) ? TRACE_LEXER : 0)
+ ((exists $options{trace} and $options{trace} & TRACE_PARSER) ? TRACE_PARSER : 0)
+ ((exists $options{trace} and $options{trace} & TRACE_SEMANTIC) ? TRACE_SEMANTIC : 0)
+ ((exists $options{trace} and $options{trace} & TRACE_ACTIVE) ? TRACE_ACTIVE : 0)
+ ((exists $options{trace} and $options{trace} & TRACE_TMPFILES) ? TRACE_TMPFILES : 0),
) or exit(1);
# build a backend
my $backend=new PerlPoint::Backend(name=>'pp2pod', trace=>TRACE_NOTHING, display=>DISPLAY_NOINFO);
# register backend handlers
$backend->register(DIRECTIVE_DOCUMENT, sub {print "\n\n";});
$backend->register(DIRECTIVE_SIMPLE, \&handleSimple);
$backend->register(DIRECTIVE_TAG, \&handleTag);
$backend->register(DIRECTIVE_HEADLINE, \&handleHeadline);
$backend->register(DIRECTIVE_TEXT, sub {print "\n\n" if $_[1]==DIRECTIVE_COMPLETE;});
$backend->register($_, \&handleList) foreach (DIRECTIVE_ULIST, DIRECTIVE_OLIST, DIRECTIVE_DLIST);
$backend->register($_, \&handleListPoint) foreach (DIRECTIVE_UPOINT, DIRECTIVE_OPOINT, DIRECTIVE_DPOINT);
$backend->register(DIRECTIVE_LIST_LSHIFT, \&handleListShift);
$backend->register(DIRECTIVE_LIST_RSHIFT, \&handleListShift);
$backend->register(DIRECTIVE_BLOCK, \&handleSimple);
$backend->register(DIRECTIVE_VERBATIM, \&handleSimple);
$backend->register(DIRECTIVE_COMMENT, \&handleComment);
# and run it
$backend->run(\@streamData);
# SUBROUTINES ###############################################################################
# simple directive handlers
sub handleSimple
{
# get parameters
my ($opcode, $mode, @contents)=@_;
# simply print the token
print @contents;
# in case of an example, add additional lines to complete it
print "\n\n" if $mode==DIRECTIVE_COMPLETE and ($opcode==DIRECTIVE_BLOCK or $opcode==DIRECTIVE_VERBATIM)
}
# headlines
sub handleHeadline
{
# get parameters
my ($opcode, $mode, $level, @contents)=@_;
# act mode dependend
print "=head$level " if $mode==DIRECTIVE_START;
print "\n\n" if $mode==DIRECTIVE_COMPLETE;
}
# tags
sub handleTag
{
# get parameters
my ($opcode, $mode, $tag, $settings)=@_;
# declare tag translations
my %tags=(
B => 'B',
C => 'C',
E => 'E',
I => 'I',
);
# act mode dependend
print $tags{uc($tag)}, '<' if $mode==DIRECTIVE_START;
print '>' if $mode==DIRECTIVE_COMPLETE;
}
# list
sub handleList
{
# get parameters
my ($opcode, $mode)=@_;
# act list and mode dependend
unshift(@openLists, 0), print "=over 4\n\n" if $mode==DIRECTIVE_START;
shift(@openLists), print "=back\n\n" if $mode==DIRECTIVE_COMPLETE;
}
# list shift
sub handleListShift
{
# get parameters
my ($opcode, $mode)=@_;
# anything to do?
return unless $mode==DIRECTIVE_START;
# handle operation dependend
unshift(@openLists, 0), print "=over 4\n\n" if $opcode==DIRECTIVE_LIST_RSHIFT;
shift(@openLists), print "=back\n\n" if $opcode==DIRECTIVE_LIST_LSHIFT;
}
# unordered list point
sub handleListPoint
{
# get parameters
my ($opcode, $mode, @data)=@_;
# update list counter if the item begins
$openLists[0]++ if $mode==DIRECTIVE_START;
# act list and mode dependend
print "=item\n\n" if $mode==DIRECTIVE_START and $opcode==DIRECTIVE_UPOINT;
print "=item $openLists[0].\n\n" if $mode==DIRECTIVE_START and $opcode==DIRECTIVE_OPOINT;
print "=item $data[0].\n\n" if $mode==DIRECTIVE_START and $opcode==DIRECTIVE_DPOINT;
print "\n\n" if $mode==DIRECTIVE_COMPLETE;
}
# comment (there is no comment feature built into POD (which is
# intended for comments completely), so make it a foreign language)
sub handleComment
{
# get parameters
my ($opcode, $mode)=@_;
# act list and mode dependend
print "=for comment\n\n" if $mode==DIRECTIVE_START;
print "\n\n" if $mode==DIRECTIVE_COMPLETE;
}