NAME
Prima::PodView - POD browser widget
SYNOPSIS
use Prima qw(Application);
use Prima::PodView;
my $window = Prima::MainWindow-> create;
my $podview = $window-> insert( 'Prima::PodView',
pack => { fill => 'both', expand => 1 }
);
$podview-> open_read;
$podview-> read("=head1 NAME\n\nI'm also a pod!\n\n");
$podview-> close_read;
run Prima;
DESCRIPTION
Prima::PodView contains a formatter ( in terms of perlpod ) and viewer
of POD content. It heavily employs its ascendant class Prima::TextView,
and is in turn base for the toolkit’s default help viewer
Prima::HelpViewer.
USAGE
The package consists of the several logically separated parts. These
include file locating and loading, formatting and navigation.
Content methods
The basic access to the content is not bound to the file system. The
POD content can be supplied without any file to the viewer. Indeed, the
file loading routine "load_file" is a mere wrapper to the content
loading functions:
open_read
Clears the current content and enters the reading mode. In this
mode the content can be appended by calling read that pushes the
raw POD content to the parser.
read TEXT
Supplies TEXT string to the parser. Manages basic indentation, but
the main formatting is performed inside add and add_formatted
Must be called only within open_read/close_read brackets
add TEXT, STYLE, INDENT
Formats TEXT string of a given STYLE ( one of "STYLE_XXX"
constants) with INDENT space.
Must be called only within open_read/close_read brackets.
add_formatted FORMAT, TEXT
Adds a pre-formatted TEXT with a given FORMAT, supplied by "=begin"
or "=for" POD directives. Prima::PodView understands ’text’ and
’podview’ FORMATs; the latter format is for Prima::PodView itself
and contains small number of commands, aimed at inclusion of images
into the document.
The ’podview’ commands are:
cut Example:
=for podview <cut>
=for text just text-formatter info
....
text-only info
...
=for podview </cut>
The <cut<gt> clause skips all POD input until cancelled. It is
used in conjunction with the following command, img, to allow a
POD manpage provide both graphic (’podview’, ’html’, etc ) and
text ( ’text’ ) content.
img src="SRC" [width="WIDTH"] [height="HEIGHT"] [cut="CUT"]
[frame="FRAME"]
An image inclusion command, where src is a relative or an
absolute path to an image file. In case if scaling is required,
"width" and "height" options can be set. When the image is a
multiframe image, the frame index can be set by "frame" option.
Special "cut" option, if set to a true value, activates the cut
behavior if ( and only if ) the image load operation was
unsuccessful. This make possible simultaneous use of ’podview’
and ’text’ :
=for podview <img src="graphic.gif" cut=1 >
=begin text
y .
| .
|.
+----- x
=end text
=for podview </cut>
In the example above ’graphic.gif’ will be shown if it can be
found and loaded, otherwise the poor-man-drawings would be
selected.
close_read
Closes the reading mode and starts the text rendering by calling
"format". Returns "undef" if there is no POD context, 1 otherwise.
Rendering
The rendering is started by "format" call, which returns ( almost )
immediately, initiating the mechanism of delayed rendering, which is
often time-consuming. "format"’s only parameter KEEP_OFFSET is a
boolean flag, which, if set to 1, remembers the current location on a
page, and when the rendered text approaches the location, scrolls the
document automatically.
The rendering is based an a document model, generated by
open_read/close_read session. The model is a set of same text blocks
defined by Prima::TextView, except that the header length is only three
integers:
M_INDENT - the block X-axis indent
M_TEXT_OFFSET - same as BLK_TEXT_OFFSET
M_FONT_ID - 0 or 1, because PodView's fontPalette contains only two fonts -
variable ( 0 ) and fixed ( 1 ).
The actual rendering is performed in "format_chunks", where model
blocks are transformed to the full text blocks, wrapped and pushed into
TextView-provided storage. In parallel, links and the corresponding
event rectangles are calculated on this stage.
Topics
Prima::PodView provides the "::topicView" property, which governs
whether the man page is viewed by topics or as a whole. When it is
viewed as topics, "{modelRange}" array selects the model blocks that
include the topic. Thus, having a single model loaded, text blocks
change dynamically.
Topics contained in "{topics}" array, each is an array with indices of
"T_XXX" constants:
T_MODEL_START - beginning of topic
T_MODEL_END - length of a topic
T_DESCRIPTION - topic name
T_STYLE - STYLE_XXX constant
T_ITEM_DEPTH - depth of =item recursion
T_LINK_OFFSET - offset in links array, started in the topic
Styles
"::styles" property provides access to the styles, applied to different
pod text parts. These styles are:
STYLE_CODE - style for pre-formatted text and C<>
STYLE_TEXT - normal text
STYLE_HEAD_1 - =head1
STYLE_HEAD_2 - =head2
STYLE_ITEM - =item
STYLE_LINK - style for L<> text
Each style is a hash with the following keys: "fontId", "fontSize",
"fontStyle", "color", "backColor", fully analogous to the
tb::BLK_DATA_XXX options. This functionality provides another layer of
accessibility to the pod formatter.
In addition to styles, Prima::PodView defined "colormap" entries for
"STYLE_LINK" and "STYLE_CODE":
COLOR_LINK_FOREGROUND
COLOR_LINK_BACKGROUND
COLOR_CODE_FOREGROUND
COLOR_CODE_BACKGROUND
The default colors in the styles are mapped into these entries.
Link and navigation methods
Prima::PodView provides a hand-icon mouse pointer highlight for the
link entries and as an interactive part, the link documents or topics
are loaded when the user presses the mouse button on the link. The
mechanics below that is as follows. "{contents}" of event rectangles, (
see Prima::TextView ) is responsible for distinguishing whether a mouse
is inside a link or not. When the link is activated, "link_click" is
called, which, in turn, calls "load_link" method. If the page is loaded
successfully, depending on "::topicView" property value, either
"select_topic" or "select_text_offset" method is called.
The family of file and link access functions consists of the following
methods:
load_file MANPAGE
Loads a manpage, if it can be found in the PATH or perl
installation directories. If unsuccessful, displays an error.
load_link LINK
LINK is a text in format of perlpod "L<>" link: "manpage/section".
Loads the manpage, if necessary, and selects the section.
load_bookmark BOOKMARK
Loads a bookmark string, prepared by make_bookmark function. Used
internally.
load_content CONTENT
Loads content into the viewer. Returns "undef" is there is no POD
context, 1 otherwise.
make_bookmark [ WHERE ]
Combines the information about the currently viewing manpage, topic
and text offset into a storable string. WHERE, an optional string
parameter, can be either omitted, in such case the current settings
are used, or be one of ’up’, ’next’ or ’prev’ strings.
The ’up’ string returns a bookmark to the upper level of the
manpage.
The ’next’ and ’prev’ return a bookmark to the next or the previous
topics in a manpage.
If the location cannot be stored or defined, "undef" is returned.