1
0
.dotfiles/home/bin/podwrap

138 lines
2.6 KiB
Plaintext
Raw Permalink Normal View History

2014-02-28 23:42:51 +00:00
#!/usr/bin/perl -w
=head1 NAME
podwrap - Word wrapper for (not only) POD document files.
=head1 USAGE
podwrap [options] <file.pod>
=head1 DESCRIPTION
This script is for applying word wrapping to a POD document file. This should
B<not> be used on a Perl module; only POD text.
It will (re)format all the paragraphs in the POD document to apply a word wrap
at whatever character width you want (default is 80 characters).
It could also be applied to plain text documents, but is primarily meant for
POD documents.
=head1 OPTIONS
=over 4
=item --width, -w <width>
Specify the character width to wrap words at; default is 80.
=item --save, -s
Save changes back to the source file. By default the changes are printed to
STDOUT and not saved to the source file.
=back
=head1 AUTHOR
Noah Petherbridge, http://sh.kirsle.net/
=cut
use strict;
use warnings;
use Getopt::Long;
# Get command line options.
my %o = (
width => 80,
save => undef,
help => undef,
);
GetOptions (
'width|w=i' => \$o{width},
'save|s' => \$o{save},
'help|h|?' => \$o{help},
);
# Help and Usage
if ($o{help}) {
exec("perldoc $0");
}
elsif (scalar(@ARGV) == 0) {
print "Usage: podwrap [options] <filename.pod>\n"
. "See: podwrap --help for help\n";
exit(1);
}
# Read the file.
my $source = shift(@ARGV);
if (!-e $source) {
print "Can't read source file $source: not found\n";
exit(1);
}
open (READ, $source) or die "Can't open $source: $!";
my @pod = <READ>;
close (READ);
chomp @pod;
# Parse it a paragraph at a time.
my @paragraph = ();
my @output = ();
my $inParagraph = 0;
foreach my $line (@pod) {
$line =~ s/[\x0A\x0D]//g;
if (length $line == 0) {
push (@output,"");
$inParagraph = 0;
push (@output, wordWrap($o{width}, @paragraph));
@paragraph = ();
next;
}
elsif (length $line > 0 && $inParagraph == 0) {
$inParagraph = 1;
}
if ($inParagraph) {
push (@paragraph, $line);
}
}
if (scalar(@paragraph) > 0) {
push(@output, wordWrap($o{width}, @paragraph));
}
if ($o{save}) {
open (WRITE, ">$source") or die "Can't write $source: $!";
print WRITE join("\n",@output);
close (WRITE);
print "Wrote: $source\n";
}
else {
print join("\n",@output);
}
sub wordWrap {
my ($width,@lines) = @_;
# Don't apply wrapping for verbatim paragraphs.
if ($lines[0] =~ /^\s+/) {
return (@lines);
}
my @words = split(/\s+/, join(" ",@lines));
my $wrapped = "";
my $w = 0;
for (my $i = 0; $i < scalar(@words); $i++) {
my $wlen = length($words[$i]);
if (($w + $wlen + 1) > $width) {
$wrapped .= "\n";
$w = 0;
}
$wrapped .= "$words[$i] ";
$w += $wlen + 1;
}
return split(/\n/, $wrapped);
}