PPresenter

 view release on metacpan or  search on metacpan

ChangeLog  view on Meta::CPAN

* Fix for image-alias bug on non-UNIX in PPresenter/Image.pm
  by [Slavan Rezic]
* $ENV{TEMP} is used when $ENV{TMPDIR} does not exists, and has a different
  default on Win*.  Problem reported by [Slavan Rezic]
* [Johnathan Burchill] implemented <SUB> and <SUP> in
  PPresenter/Formatter/Markup_place.pm
* [Stephen Riehm] scripts present(-xml|-ppr)? search more thoroughly
  for the libraries.

v1.15 2001/02/17
* Changed the interface to Image::Magick somewhat, because that package
  gave some problems (core-dumps and such like).  Now, transport between
  Image::Magick and Tk::Photo objects is done by a base64'd gif i.s.o
  a xpm.

v1.14 2000/10/24
* Removed some `local @_' warnings.
* Moved to PPresenter.org domain.

v1.13  2000/7/4  (one year's celebration)
* Added XML handling, by Johan Vromans <jvromans@squirrel.nl>
* Command present installed from subdir ppr.  Demo's for using PPresenter
  as library moved to ppr/demo.
* Command present-xml installed from subdir xml.  Demo's for XML implementation
  based on the PPresenter library are located in xml/demo.
* Removed demo directory, because the demo's are split based on their type.
* Added some images in PPresenter/images.
* Manual-pages for present, present-ppr, present-xml, but they need more
  detail.

v1.11
* Fixed use of tkPhoto images instead when Image::Magick is not installed.

v1.10
* Excellent logo by Phil Regnauld <regnauld@ftf.net>
* Renamed Presenter::TRACE into the correct PPresenter::TRACE.
* Added -exportPhases (Dynamic)
* Added -callbacks (Slide)
* Added -enableCallbacks (show->new)
* Redesigned the way that slides can be exported on the lower level.
  Interfaces to website creation and image-production changed only
  very little.

ChangeLog  view on Meta::CPAN

  Bad idea about `get' in names was taken from Java, but only troubles
  the readability.
* Implemented complex decoration, including page footers.
* changed implementation of templates to work with new decoration
  techniques.
* Renamed doc to doc_html
* Created bin/present which can start *.ppr and *.xml files.
* Created doc_pod/present.pod for present.1
* Place-holders for PPresenter::Import::XML and PPresenter::Import::MagicPoint,
  which will implement translations between those two formats and PPresenter.
* Resizing images with Image::Magick does not work properly on the
  border of transparent and normal pixels.  Also, conversion from an
  Image::Magick pixels to a tkPhoto does not work properly.  Created a
  work-around to create nicer results.
* Added Markup tags FOOTER (markup for footer-texts), N (switch to normal
  font), and PROP (select proportional font).
* Added callbacks for slides, which are code-hooks into the display process
  of a slide.

v1.00
Thanks to Slaven Rezic:
* Removed dependency from Time::Hires because Tk defines (but does document)
  a timeofday(), with the same functionality.

ChangeLog  view on Meta::CPAN

* Shows phases to go for a slide.
* Exporting slides to images works (requires ImageMagick).

v0.93 1999/09/08
* Few fixes.
* Introduction of special characters in markup-language.
* Initial code to dump slides to postscript, images and HTML.

v0.92 1999/08/12
* Implemented (and documented) scaling of images
* optional use of Image::Magick

v0.91 1999/08/02
* Documented all the features.
* fixed some things.
* Closing in to version 1

v0.28 1999/07/28
* Full rewrite to allow multiple screens in one show.

v0.21 1999/07/04

MODULES  view on Meta::CPAN

        SlideControl.pm    Slide timing display.
        SlideButtonBar.pm  Row of buttons representing slides.
        TagControl.pm      Slide selection control
    Slide.pm           One slide.
    SlideView.pm       The presentation of one slide on one screen.
    Program.pm         Manages the runtime transition inside a slide.
    tkTimerLabel.pm    Tk::Label showing a time-stamp.

    Image.pm           Image manipulation
    Image/
        Magick.pm          When Image::Magick is installed.
        tkPhoto.pm         Primitive Tk images.

STYLE-ELEMENTS
    StyleElem.pm       Extends Object with functions on all style-elements.

    Style.pm           Represents a style: collection of lists of other
                       style elemens.
    Style/
        Default.pm         Normal style.
        SlideNotes.pm      Style specific to slide-notes.

MODULES  view on Meta::CPAN

        Plain.pm           Markup with default pre-formatted.
        Simple.pm          Markup with simple lists.

    Template.pm        Organizing layout.
        Default.pm

EXPORT
    Export.pm          Extends Object and provides contact between GPP and
                       the exporter modules.
        Website/HTML.pm           Convert into website.
        Images/ImageMagick.pm     Screen-dumps to image with Image::Magick.
        Handouts/IM_PostScript.pm Export to postscript document with Image::Magick.
        Handouts/PostScript.pm    Tk postscript dump of screen (very poor result)

PPresenter/Decoration.pm  view on Meta::CPAN

    
    $deco;
}

sub check_nestImages($@)
{   my ($deco, $geom) = (shift, shift);

    if(defined $geom)
    {   foreach (@_)
        {   next unless ref $_;
            next if $_->isa('PPresenter::Image::Magick');
            # Photo objects are already sized.
            die "-nestImages geometry only on filenames and Magick objects.\n";
        }
    }
    else
    {   foreach (@_)
        {   next unless ref @_;
            next if $_->isa('PPresenter::Image');
            die "-nestImages wants filenames or PPresenter::Image objects.\n";
        }

PPresenter/Export/Handouts/IM_PostScript.pm  view on Meta::CPAN

    die "Cannot read image from file $file: $error.\n" if $error;
    unlink $file;

    $export->fitToPaper($list->[-1], $width, $height);
}

sub make1slide_pp($$)
{   my ($export, $files) = @_;
    my ($width, $height) = $export->paperSizePixels;

    my $all_images = Image::Magick->new;

    foreach (@$files)
    {   $export->read_image($all_images, $_, $width, $height);
        $all_images->Set(page => "${width}x${height}");
    }

    $all_images;
}

sub make2slides_pp($$)
{   my ($export, $files) = @_;
    my ($width, $height) = $export->paperSizePixels;

    my $all_images = Image::Magick->new;

    while(@$files)
    {   my $part  = Image::Magick->new;
        $export->read_image($part, shift @$files, $width, $height/2);
        $export->read_image($part, shift @$files, $width, $height/2);
        push @$all_images, (@$part > 1 ? $part->Append : pop @$part);
    }

    $all_images;
}

sub make4slides_pp($$)
{   my ($export, $files) = @_;
    my ($width, $height) = $export->paperSizePixels;
    $width /= 2; $height /= 2;

    my $all_images = Image::Magick->new;

    while(@$files)
    {   my $page = Image::Magick->new;
        my $part1 = Image::Magick->new;
        $export->read_image($part1, shift @$files, $width, $height);
        $export->read_image($part1, shift @$files, $width, $height);
        push @$page, $part1->Append(-stack => 0);
        my $part2 = Image::Magick->new;
        $export->read_image($part2, shift @$files, $width, $height);
        $export->read_image($part2, shift @$files, $width, $height);
        push @$page, $part2->Append(-stack => 0);
        push @$all_images, $page->Append(-stack => 1);
    }

    $all_images;
}

#

PPresenter/Export/Images/ImageMagick.pm  view on Meta::CPAN


# This module has it's own Tk interface, but is also extended
# by more complex objects.

use strict;
use PPresenter::Export;
use base 'PPresenter::Export';

use Tk;
use Tk::Dialog;
use Image::Magick;

use constant ObjDefaults =>
{ -name        => 'Images with ImageMagick'
, -aliases     => [ 'images', 'im images', 'IM images', 'IM Images' ]

, -outputDir   => 'slideImages'
};

sub view2image($$$)
{   my ($export, $show, $slide, $view) = @_;

PPresenter/Export/Images/ImageMagick.pm  view on Meta::CPAN

    my $image = $export->windowImage($show, $slide, $view);
    return unless defined $image;

    $export->polishImage($image);
    $image;
}

sub readImage($)
{   my ($export, $file) = @_;

    my $img   = Image::Magick->new;
    my $error = $img->Read($file);
    return $img unless $error;

    print "Magick error on reading image from $file: $error\n";
    undef;
}

sub polishImage($)
{   my ($export, $img) =@_;

PPresenter/Image/Magick.pm  view on Meta::CPAN

# Copyright (C) 2000-2002, Free Software Foundation FSF.

package PPresenter::Image::Magick;

use strict;
use PPresenter::Image;
use base 'PPresenter::Image';

use Image::Magick;
use Tk::Photo;

sub convert($@)     # Convert Image::Magick to PPresenter::Image::Magick
{   my $class = shift;

    my (@magicks, @images);
    push @magicks, @{(shift)}  # magicks are lists of images.
        while @_ && ref $_[0] && $_[0]->isa('Image::Magick');

    foreach (@magicks)
    {   my $img = $class->new
        ( -file   => ($_->Get('filename') || $_->Get('base_filename'))
        , -resize => 0
        , @_
        );

        $img->{source} = $_;
        push @images, $img;

        print PPresenter::TRACE "Added Image::Magick image $img.\n";
    }

    @images;
}

sub prepare($$)
{   my ($img, $viewport, $canvas) = @_;

    #
    # Check if the preparation has been done before.

PPresenter/Image/Magick.pm  view on Meta::CPAN

    #
    # Read the raw image from file.
    #

    my ($orig, $copy);
    if(ref $img->{source})
    {   # Image already read from file.
        $orig = $img->{source};
    }
    else
    {   $orig = Image::Magick->new;
        if(my $err = $orig->Read($img->{source}))
        {   print "$err while reading $img->{source}.\n";
            return undef;
        }
    }

    #
    # Transparency
    #

PPresenter/Images.pm  view on Meta::CPAN

    {   require PPresenter::Image::tkPhoto;
        my $img = PPresenter::Image::tkPhoto->convert(@_);

        warn "Two images named $img.\n"
           if $^W && $self->findImage($img);

        push @{$self->{images}}, $img;
        return $img;
    }

    if($obj->isa('Image::Magick'))
    {   require PPresenter::Image::Magick;
        my @imgs = PPresenter::Image::Magick->convert(@_);
        foreach (@imgs)
        {   warn "Image $_ redefined.  Use -name to diverse them.\n"
                if $self->findImage($_);
        }
        push @{$self->{images}}, @imgs;
        return @imgs;
    }

    warn "What do you try to feed me? A ",ref $obj," is not an image, is it?\n";
    return;

PPresenter/Images.pm  view on Meta::CPAN

    @options{'dev', 'ino'} = (stat $source)[0,1];
    $options{source}       = $source;

    foreach (@{$self->{images}})
    {   return $_ if $_->sameSource(\%options);
    }

    print PPresenter::TRACE "Defining new image $source.\n";

    if($show->hasImageMagick)
    {   require PPresenter::Image::Magick;
        $img = PPresenter::Image::Magick->new(%options);
    }
    else
    {   require PPresenter::Image::tkPhoto;
        $img = PPresenter::Image::tkPhoto->new(%options);
    }

    return unless $img;

    push @{$self->{images}}, $img;
    $img;

PPresenter/Show.pm  view on Meta::CPAN

}

sub exporters() {@{shift->{exporters}}}

my $image_magick_installed;

sub hasImageMagick()
{   my $show = shift;

    unless(defined $image_magick_installed)
    {   eval 'require Image::Magick';
        $image_magick_installed = ($@ eq '');
        warn "Improve image quality by installing Image::Magick.\n"
            unless $image_magick_installed;
    }

    return $image_magick_installed;
}

sub runsOnX()
{   my $show = shift;
    exists $ENV{DISPLAY};
}

doc_html/decoration/index.html  view on Meta::CPAN

<DT><B>-nestImages =&gt; [ </B> <I>geometry, image, ... </I> <B>]</B>
<DD>List of images to be used in unordered-lists
    (as created by a <A HREF=../formatter/index.html>formatter</A>)
    <P>
    The color and shape of the images used may change with the images on the
    background and the colors for the foreground, so are defined in
    this style-element.
    <P>
    When you specify a geometry, you can specify a list of image-names,
    filenames, or
    <A HREF=../image/magick.html>PPresenter::<WBR>Image::Magick</A> objects.
    <A HREF=../image/tkphoto.html>PPresenter::<WBR>Image::tkPhoto</A> objects
    are not allowed, because they are already scaled on definition.
    <P>
    When the geometry is <CODE>undef</CODE> then the list can contain
    image-names, filenames, and
    <A HREF=../image/index.html>PPresenter::Image</A> objects.  The images
    will not be scaled.
    <P>
    See the examples on how to create and use
    <A HREF=../image/index.html>images</A>.

doc_html/export/index.html  view on Meta::CPAN

<A HREF=../index.html>Portable Presenter</A> is a package designed to give
presentations.  Sometimes, you may want to print the slides to create
hand-outs or for corrections.  You may also want to convert your presentation
into a website.  All use of the slide-data for other use than an
actual presentation is covered by this export modules.
<P>
<FONT COLOR=red>WARNINGS</FONT>:
<UL>
<LI>These exporters will only work on X11 (Unix) systems because it
    uses <CODE>xwd</CODE> to hardcopy the slides.<BR>
<LI>These exporters will only work if you have Image::Magick installed.
<LI>The undocumented exporters contain some problems (bugs/misfeatures).
</UL>
<P>
We are open to contributions.
&nbsp;
</TD></TR>
<TR><TD VALIGN=top>
<A HREF=#exporters>Exporters</A><BR>
<A HREF=#using>Using</A><BR>
<A HREF=#options>Options</A><BR>

doc_html/export/index.html  view on Meta::CPAN

The following exports are currently implemented, have initial coding,
or are under study.  

<DL>
<DT><A HREF=website/html.html>PPresenter::Export::Website::HTML</A>
<DD>Converts slides and slide-notes into web-pages.  Slides can only be
    converted to images within the HTML pages.  In the future, it will
    also be possible to include the slide information as real HTML.
    <P>
<DT><A HREF=images/imagemagick.html>PPresenter::Export::Images::ImageMagick</A>
<DD>Convert all slides into images using Image::Magick.
    Each slide(view) as one seperate file, in hardly any imaginable format.
    <P>
<DT><B>PPresenter::Export::PostScript</B>
<DD>Convert slides into PostScript using standard Tk.
    Tk is able to produce real postscript, but only includes text in
    a character-size which may be close to the size you requested.  Images
    and such are not included.
    <P>
    The results are of such a poor quality that I refuse the documentation
    of this module to be included.
    <P>
<DT><B>PPresenter::Export::IM_PostScript</B>
<DD>Convert slides into PostScript using Image::Magick, but as images.
    This produces huge postscript files, and does not work perfectly yet.
    Apparently some misunderstanding between me and PerlMagick interface.
    <P>
    The results are not acceptable yet, but I promise documentation when
    this module works well enough.
</DL>

Exporters can only be used when the presentation is run, because most of
them hardcopy the screen.

doc_html/export/website/html.html  view on Meta::CPAN

<A HREF=../index.html>Portable Presenter</A> is a package designed to give
presentations.  Doing the presentation is one thing, but you like to
have this show publicly available afterwards.
<P>
The most popular way to present your slides after "the real thing" is
by creating a website.  The module
<CODE>PPresenter::<WBR>Export::<WBR>Website::HTML.pm</CODE> can do this
for you, although this is not a really easy thing: you need a bit more
knowledge about Perl for this.
<P>
This export option is useless whithout Image::Magick installed.

<H2><A NAME=simple>A Simple Website</A></H2>

Exporters are not automatically added to your show.  It is not (but could be)
a part of a style.  So: anywhere in your program you have to add the line
<PRE>
   $show->addExporter('PPresenter::Export::Website::HTML');
</PRE>
Start the show.  When the compilation of the exporter module is successful,
you can access the options of the module via the background module.

doc_html/export/website/html.html  view on Meta::CPAN

The Website object extends to <A HREF=im_images.html#options>IM_Images</A>
object and the general <A HREF=index.html#options>Export</A> object.
Next to those options, you may set:
<DL>
<DT><B>-slideAs =&gt;</B> <I>way-to-dump</I><BR>
    <B>-notesAs =&gt;</B> <I>way-to-dump</I>
<DD>The default settings how the slides should be included in the
    webpages.  The way-do-dump value is one of
    <DL>
    <DT><B>IMAGE</B>
    <DD>Requires Image::Magick.  The screens are copied using XWD and
        then converted into the specified format and width.
    <DT><B>TABLE</B>
    <DD>The template should have a makeHTMLTable function and the
        formatter shall provide a toHTML function for this to work.
        The text is transformed into HTML which should show similar to
        the screen.
    <DT><B>LINEAR</B>
    <DD>The formatter should provide a makeHTMLLinear function for
        this to work.  The template layout be be lost, but the content
        of slides is translated into HTML.

doc_html/image/index.html  view on Meta::CPAN


An important part of the design of
<A HREF=../../index.html>Portable Presenter</A> is the requirement for
screen-size independency; fonts and also images are scaled, dependent on
the actual screen-size.
<P>
There are two packages which handle images which you can use:
<UL>
<LI><A HREF=tkphoto.html>Tk::Photo images</A>, which are part of tk, but
    only support a view formats and rather primitive operations;
<LI><A HREF=magick.html>Image::Magick images</A>, which is a package
    available for many operating-systems, capable of processing hardly
    any image format imaginable.<BR>
    See the <A HREF=../download/index.html>download page</A> on how
    to retrieve this optional package.
</UL>
<P>
They way how images work do differ on which package you use: Tk::Photo
images are related to a canvas
(say <A HREF=../viewport/index.html>viewport</A>), while Image::Magick
images are device independent.

<H2><A NAME=general>General</A> Image Options</H2>

<DL>
<DT><B>-file =&gt;</B> <I>filename</I>
<DD>The name of the file to be used.  PPresenter searches the directories in
    the <CODE>imageDirs</CODE> list (see the <CODE>addImageDir</CODE>
    function described below) for the file, except when this is an
    absolute path, of course.

doc_html/image/index.html  view on Meta::CPAN

<PRE>
   use PPresenter;
   my $show = PPresenter-&gt;new;
   $show-&gt;addSlide(-template =&gt; 'main'
     , -main =&gt; '&lt;IMG SRC=image.gif&gt;');
</PRE>
Options to the <CODE>IMG</CODE> tag of the markup-formatter are
<CODE>RESIZE</CODE> (reflects -resize), <CODE>ENLARGE</CODE> (-enlarge),
<CODE>BASE</CODE> (-sizeBase), and some more for markup.
<P>
If the package Image::Magick is installed, then PPresenter will resize the image with
ImageMagick.  In that case, nearly all imaginable image formats can be
used.  If the package is not installed, the image is read via Tk::Photo,
which supports only a small set of formats (see manual on Tk::Photo).

<H4>Example 2: Same image twice</H4>
If you use the same image for the second time in the same show, those
specified options will be neglected: the first use is defining the image.
<PRE>
   use PPresenter;
   my $show = PPresenter-&gt;new;

doc_html/image/index.html  view on Meta::CPAN

filename, the basename of the filename, or other aliases (as with all
PPresenter-objects, you may specify an option
<PRE>
    -aliases =&gt; [ 'alias', 'alias2', ... ]
</PRE>

<H4>Example 4: Reading the images yourself</H4>

It is possible to read the images yourself, in your Perl-program, and
then offer it to PPresenter.  The possibilities are different if you want to
use Tk::Photo or Image::Magick;
<A HREF=tkphoto.html>Tk::Photo</A> images are related to a MainWindow
(<A HREF=../viewport/index.html>viewport</A>), while
<A HREF=magick.html>Image::Magick</A> images are not.
Read their manual-pages for more details.
<P>
If you have created you own Photo or Magick image, you can add this to
PPresenter with:
<PRE>
   $object = ...; # create Tk::Photo or Image::Magick object
   $show-&gt;image($object, -name =&gt; 'image');
</PRE>
You do not have to specify a name in case of Image::Magick (the
output filename will be taken by default), but it is clearer this
way.

<HR NOSHADE>
Portable Presenter is written and maintained by
<A HREF=http://mark.overmeer.net>Mark Overmeer</A>.
Copyright (C) 2000-2002, Free Software Foundation FSF.


    </TD></TR>

doc_html/image/magick.html  view on Meta::CPAN

the actual screen-size.
<P>
<BLOCKQUOTE>
<CODE>\begin{commercial}</CODE><BR>
<A HREF=http://wizards.dupont.com/cristy/ImageMagick/>ImageMagick</A> is an
excelent package which is able to read, convert, modify, and write close
to every type of image from script and from a graphical interface. Install it
now!<BR>
<CODE>\end{commercial}</CODE>
</BLOCKQUOTE>
PPresenter will automatically use Image::Magick when it is installed.  There is no
performance reason to decide differently.
<P>
You can defined Image::Magick images in two ways:
<UL>
<LI>Implicit: use an image in your slide description, for instance
    with
<PRE>
  $show->addSlide(-main =&gt; '&lt;IMG SRC=image.xpm&gt');
</PRE>
    In this case, you have created a Tk::Photo object via an Image::Magick
    object, but are not able to control it.
    Why not directly a <A HREF=tkphoto.html>Tk::Photo</A>?
    Because now you can use <EM>any</EM> image format, and get very nice
    scaling results for free!
    <P>

<LI>Explicit: define an image and refer to it later.  In contrary to
    Tk::Photo objects, the Image::Magick objects are not window dependent
    until displayed.
</UL>
The explicit way is demonstrated on this page. The implicit way is the
same for Tk::Photo objects and Image::Magick object, which is described
on the <A HREF=index.html>main image page</A>.

<H2><A NAME=options>Magick options</A></H2>

There are no special options for Image::Magick objects: the
<A HREF=index.html#general>general options</A> define all.

<H2><A NAME=functions>ImageMagick functions</A></H2>

If you want to create images with ImageMagick, you do not need to read the
documentation of PPresenter: they are not connected at all.  A small example to
demonstrate:
<PRE>
   use PPresenter;
   use Image::Magick;

   my $image = Image::Magick-&gt;new;
   $image-&gt;Read('image.tiff');
   $image-&gt;Scale('25%x50%');
   ...

   my $show = PPresenter-&gt;new;
   $show-&gt;image($image, -name =&gt; 'image');
</PRE>
On the moment you add the image to the show, the Magick structure is
taken.  You should not try to change the object after this.

doc_html/image/magick.html  view on Meta::CPAN

<H4>Example 1: Own symbols for unordered lists</H4>

Usually, the dots used to precede a list-item in an unordered list (for
instance used by the <A HREF=../formatter/markup.html>markup formatter</A>),
is defined by the <A HREF=../decoration/index.html>decoration</A> option
<CODE>-nestImages</CODE>.  The dots can be specified as filename or as
objects.
<P>
<PRE>
   use PPresenter;
   use Image::Magick;

   my $dots = Image::Magick-&gt;new;
   $dots-&gt;Read('redball.gif', 'blueball.pct');

   my $show = PPresenter-&gt;new;
   my @p    = $show-&gt;image(@$dots);
   $show-&gt;change( decoration  =&gt; 'ALL'
                , -nestImages =&gt; [ undef, @p ] )
</PRE>
One Image::Magick can contain a list of images.

<P>
<HR NOSHADE>
Portable Presenter is written and maintained by
<A HREF=http://mark.overmeer.net>Mark Overmeer</A>.
Copyright (C) 2000-2002, Free Software Foundation FSF.


    </TD></TR>

doc_html/image/tkphoto.html  view on Meta::CPAN

    to control it, although there are some options which you can use when
    you use the <A HREF=../formatter/markup.html>markup formatter</A>.
    <P>

<LI>Explicit: define an image and refer to it later.  For this, you have to
    know that Tk::Photo objects are related to a MainWindow.  A PPresenter show
    can contain different <A HREF=../viewport/index.html>viewports</A>, so
    you have to tell beforehand to which of them the image will be used.
</UL>
The explicit way is demonstrated on this page. The implicit way is the
same for Tk::Photo objects and Image::Magick object, which is described
on the <A HREF=index.html>main image page</A>.

<H2><A NAME=options>tkPhoto options</A></H2>

There are no special options for tkPhoto objects: the
<A HREF=index.html#general>general options</A> define all.

<H2><A NAME=functions>tkPhoto functions</A></H2>

Each Tk::Photo object is related to a MainWindow, to one

doc_html/manual.html  view on Meta::CPAN

            <A HREF=function/select.html>select</A>, or
            <A HREF=function/change.html>change</A>
            style elements.<BR>
            Debugging,
            designing, and
            creation of styles.
        </UL>
    <LI><A HREF=image/index.html><B><FONT COLOR=green>Images</FONT></B></A>
        created with
        <A HREF=image/tkphoto.html>Tk::Photo</A> or
        <A HREF=image/magick.html>Image::Magick</A>.
    <LI>a list of
        <A HREF=viewport/index.html><B><FONT COLOR=green>viewports</FONT></B></A>
        showing slides.
    <LI>one <A HREF=viewport/control.html><B><FONT COLOR=green>control viewport</FONT></B></A>,
        which shows
        slide notes,
        names of the neighbouring slides,
        a slide-buttons bar, and
        a progress bar.
    <LI>a <B><FONT COLOR=green>background menu</FONT></B> is hidden behind the



( run in 1.454 second using v1.01-cache-2.11-cpan-beeb90c9504 )