FAQ-OMatic
view release on metacpan or search on metacpan
lib/FAQ/OMatic/Part.pm view on Meta::CPAN
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.#
# #
# Jon Howell can be contacted at: #
# 6211 Sudikoff Lab, Dartmouth College #
# Hanover, NH 03755-3510 #
# jonh@cs.dartmouth.edu #
# #
# An electronic copy of the GPL is available at: #
# http://www.gnu.org/copyleft/gpl.html #
# #
##############################################################################
use strict;
###
### A FAQ::OMatic::Part is a member of a FAQ::OMatic::Item, and contains one chunk of
### text, plus its attributions, modification date, and other
### characteristics.
###
package FAQ::OMatic::Part;
use FAQ::OMatic;
use FAQ::OMatic::Item;
use FAQ::OMatic::Appearance;
use FAQ::OMatic::Set;
use FAQ::OMatic::I18N;
use Text::Tabs;
sub new {
my ($class) = shift;
my $part = {};
bless $part;
$part->{'Type'} = ''; # type is always defined, since '' is a
# valid type.
$part->{'Text'} = ''; # might as well define the text, since
# that's the point of a part.
$part->{'Author-Set'} = new FAQ::OMatic::Set('keepOrdered');
return $part;
}
sub loadFromCodeClosure {
my $self = shift;
my $closure = shift; # a sub that returns one line for each call
my $filename = shift;
my $item = shift;
my $partnum = shift;
my ($lines) = 0;
my ($text) = "";
# THANKS to "John R. Jackson" <jrj@gandalf.cc.purdue.edu> for
# grepping for unprotected while constructs.
while (defined($_ = &{$closure})) {
chomp;
my ($key,$value) = FAQ::OMatic::keyValue($_);
if ($key eq 'Author') {
# convert old-style 'Author' keys to 'Author-Set' keys
# transparently. Eventually all such items will get written
# out with updated header keys.
$key = 'Author-Set';
}
if ($key eq 'DateOfPart') {
# convert old-style 'DateOfPart' keys to 'LastModifiedSecs' keys
# transparently.
$value = FAQ::OMatic::Item::compactDateToSecs($value);
# turn back into seconds
$key = 'LastModifiedSecs';
}
if ($key eq 'Lines') {
# Lines header is always last before the text content of a Part
$lines = $value;
last;
} elsif ($key =~ m/-Set$/) {
# header key ends in '-Set' -- that means it may appear multiple
# times.
if (not defined($self->{$key})) {
$self->{$key} = new FAQ::OMatic::Set;
}
$self->{$key}->insert($value);
} elsif ($key ne '') {
$self->{$key} = $value;
if (($key eq 'Type') and ($value eq 'directory')) {
# keep a quick way for the item object to find the part that
# holds the directory
$item->{'directoryHint'} = $partnum;
}
} else {
FAQ::OMatic::gripe('problem',
"FAQ::OMatic::Part::loadFromCodeClosure was confused by this header in file $filename: \"$_\"");
}
}
# THANKS to "John R. Jackson" <jrj@gandalf.cc.purdue.edu> for
# grepping for unprotected while constructs.
while (($lines>0) and defined($_ = &{$closure})) {
$text .= $_;
$lines--;
}
# verify that EndPart shows up in the right place
$_ = &{$closure};
if (not defined $_) {
FAQ::OMatic::gripe('problem',
"FAQ::OMatic::Part::loadFromCodeClosure file $filename part $partnum didn't end right.");
}
my ($key,$value) = FAQ::OMatic::keyValue($_);
if (($key ne 'EndPart') or ($value != $partnum)) {
FAQ::OMatic::gripe('problem', "FAQ::OMatic::Part::loadFromCodeClosure file $filename part $partnum didn't end with EndPart.");
}
$self->{'Text'} = $text;
}
sub displayAsFile {
my $self = shift;
my $rt = "";
my $key;
foreach $key (sort keys %{$self}) {
if (($key =~ m/^[a-z]/)
or ($key eq 'Text')) {
next;
# these keys get ignored or written out later (Text)
} elsif ($key =~ m/-Set$/) {
my $a;
foreach $a ($self->getSet($key)->getList()) {
$rt .= "$key: $a\n";
( run in 3.224 seconds using v1.01-cache-2.11-cpan-2398b32b56e )