/usr/share/perl5/Text/Flow.pm is in libtext-flow-perl 0.01-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | package Text::Flow;
use Moose;
use Text::Flow::Wrap;
our $VERSION = '0.01';
our $AUTHORITY = 'cpan:STEVAN';
has 'check_height' => (
is => 'rw',
isa => 'CodeRef',
required => 1,
);
has 'wrapper' => (
is => 'rw',
isa => 'Text::Flow::Wrap',
required => 1,
);
sub flow {
my ($self, $text) = @_;
my $paragraphs = $self->wrapper->disassemble_paragraphs($text);
my @sections = ([]);
foreach my $paragraph (@$paragraphs) {
push @{$sections[-1]} => [];
foreach my $line (@$paragraph) {
unless ($self->check_height->($sections[-1])) {
push @sections => [[]];
}
push @{$sections[-1]->[-1]} => $line;
}
}
#use Data::Dumper;
#warn Dumper \@sections;
return map {
chomp; $_;
} map {
$self->wrapper->reassemble_paragraphs($_);
} @sections;
}
no Moose;
1;
__END__
=pod
=head1 NAME
Text::Flow - Flexible text flowing and word wrapping for not just ASCII output.
=head1 SYNOPSIS
use Text::Flow;
# use it on ASCII text ...
my $flow = Text::Flow->new(
check_height => sub {
my $paras = shift;
sum(map { scalar @$_ } @$paras) <= 10;
},
wrapper => Text::Flow::Wrap->new(
check_width => sub { length($_[0]) < 70 }
),
);
my @sections = $flow->flow($text);
# @sections will now be an array of strings, each string
# will contain no more than 10 lines of text each of which
# will be no longer then 70 characters long
# or use it on text in a PDF file ...
my $flow = Text::Flow->new(
check_height => sub {
my $paras = shift;
(sum(map { scalar @$_ } @$paras) * $pdf->get_font_height) < 200;
},
wrapper => Text::Flow::Wrap->new(
check_width => sub {
my $string = shift;
$pdf->get_string_width($string) < 100
},
)
);
my @sections = $flow->flow($text);
# @sections will now be an array of strings, each string
# will contain text which will fit within 200 pts and
# each line will be no longer then 100 pts wide
=head1 DESCRIPTION
This module provides a flexible way to wrap and flow text for both
ASCII and non-ASCII outputs.
=head2 Another Text Wrap module!!?!?!
The main purpose of this module is to provide text wrapping and flowing
features without being tied down to ASCII based output and fixed-width
fonts. My needs were for a more sophisticated text control in PDF and GIF
output formats in particular.
=head1 METHODS
=over 4
=item B<new (%params)>
This constructs the new Text::Flow instance, and accepts parameters for
the C<wrapper> and C<check_height> variables.
=item B<wrapper (?$wrapper)>
This is the accessor for the internally help Text::Flow::Wrapper instance
which is used by Text::Flow to wrap the individual lines.
=item B<check_height>
This is the accessor for the CODE ref which is used to check the height
of the current paragraph. It gets as an argument, an array-ref of paragraphs,
each of which is also an array-ref of text lines. The most common usage
is shown in the SYNOPSIS above, but you can really do anything you want
with them. It is expected to return a Boolean value, true if the height is
still okay, and false if the max height has been reached.
=item B<flow ($text)>
This method preforms the text flowing. It returns an array of strings which
can be treated as complete blocks of text. It will handle paragraph breaks
and line breaks for you.
=back
=head2 Introspection
=over 4
=item B<meta>
Returns the Moose meta object associated with this class.
=back
=head1 TODO
I wanted to write some tests for using this with GD modules as well. I suppose
we will have to wait until 0.02 for that.
=head1 SIMILAR MODULES
There are a bunch of other text wrapping and flowing modules out there, but
they are all meant for use in ASCII outout only. This just didn't work for
my needs, so I wrote this one. If you need to wrap ASCII text and want to
do it in a much simpler manner then this module provides, then I suggest
checking out those modules. This module is specifically made for when those
other modules are no longer powerful and flexible enough.
=head1 BUGS
All complex software has bugs lurking in it, and this module is no
exception. If you find a bug please either email me, or add the bug
to cpan-RT.
=head1 AUTHOR
Stevan Little E<lt>stevan@iinteractive.comE<gt>
=head1 COPYRIGHT AND LICENSE
Copyright 2007 by Infinity Interactive, Inc.
L<http://www.iinteractive.com>
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
|