X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FPod%2FText%2FOverstrike.pm;h=00b505d44dc07364cb383bb8c73919b5822902c6;hb=2504ae5250790bc6da9ecd41645e0005cd550a86;hp=12ceee5a32fd78647dc27785af396d209bf59868;hpb=bf202ccda31f6f5f3fc5cd7b8446fa6ecacb1ac4;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Pod/Text/Overstrike.pm b/lib/Pod/Text/Overstrike.pm index 12ceee5..00b505d 100644 --- a/lib/Pod/Text/Overstrike.pm +++ b/lib/Pod/Text/Overstrike.pm @@ -1,8 +1,9 @@ # Pod::Text::Overstrike -- Convert POD data to formatted overstrike text -# $Id: Overstrike.pm,v 1.4 2001/11/15 08:04:18 eagle Exp $ # # Created by Joe Smith 30-Nov-2000 # (based on Pod::Text::Color by Russ Allbery ) +# Copyright 2000 Joe Smith . +# Copyright 2001, 2004, 2008 Russ Allbery . # # This program is free software; you may redistribute it and/or modify it # under the same terms as Perl itself. @@ -33,11 +34,7 @@ use vars qw(@ISA $VERSION); @ISA = qw(Pod::Text); -# Don't use the CVS revision as the version, since this module is also in Perl -# core and too many things could munge CVS magic revision strings. This -# number should ideally be the same as the CVS revision in podlators, however. -$VERSION = 1.04; - +$VERSION = 2.02; ############################################################################## # Overrides @@ -45,41 +42,55 @@ $VERSION = 1.04; # Make level one headings bold, overridding any existing formatting. sub cmd_head1 { - my $self = shift; - local $_ = shift; - s/\s+$//; - s/(.)\cH\1//g; - s/_\cH//g; - s/(.)/$1\b$1/g; - $self->SUPER::cmd_head1 ($_); + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($text); + $text =~ s/(.)/$1\b$1/g; + return $self->SUPER::cmd_head1 ($attrs, $text); } # Make level two headings bold, overriding any existing formatting. sub cmd_head2 { - my $self = shift; - local $_ = shift; - s/\s+$//; - s/(.)\cH\1//g; - s/_\cH//g; - s/(.)/$1\b$1/g; - $self->SUPER::cmd_head2 ($_); + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($text); + $text =~ s/(.)/$1\b$1/g; + return $self->SUPER::cmd_head2 ($attrs, $text); } # Make level three headings underscored, overriding any existing formatting. sub cmd_head3 { - my $self = shift; - local $_ = shift; - s/\s+$//; - s/(.)\cH\1//g; - s/_\cH//g; - s/(.)/_\b$1/g; - $self->SUPER::cmd_head3 ($_); + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($text); + $text =~ s/(.)/_\b$1/g; + return $self->SUPER::cmd_head3 ($attrs, $text); } -# Fix the various interior sequences. -sub seq_b { local $_ = $_[1]; s/(.)\cH\1//g; s/_\cH//g; s/(.)/$1\b$1/g; $_ } -sub seq_f { local $_ = $_[1]; s/(.)\cH\1//g; s/_\cH//g; s/(.)/_\b$1/g; $_ } -sub seq_i { local $_ = $_[1]; s/(.)\cH\1//g; s/_\cH//g; s/(.)/_\b$1/g; $_ } +# Level four headings look like level three headings. +sub cmd_head4 { + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($text); + $text =~ s/(.)/_\b$1/g; + return $self->SUPER::cmd_head4 ($attrs, $text); +} + +# The common code for handling all headers. We have to override to avoid +# interpolating twice and because we don't want to honor alt. +sub heading { + my ($self, $text, $indent, $marker) = @_; + $self->item ("\n\n") if defined $$self{ITEM}; + $text .= "\n" if $$self{opt_loose}; + my $margin = ' ' x ($$self{opt_margin} + $indent); + $self->output ($margin . $text . "\n"); + return ''; +} + +# Fix the various formatting codes. +sub cmd_b { local $_ = $_[0]->strip_format ($_[2]); s/(.)/$1\b$1/g; $_ } +sub cmd_f { local $_ = $_[0]->strip_format ($_[2]); s/(.)/_\b$1/g; $_ } +sub cmd_i { local $_ = $_[0]->strip_format ($_[2]); s/(.)/_\b$1/g; $_ } # Output any included code in bold. sub output_code { @@ -89,16 +100,20 @@ sub output_code { } # We unfortunately have to override the wrapping code here, since the normal -# wrapping code gets really confused by all the escape sequences. +# wrapping code gets really confused by all the backspaces. sub wrap { my $self = shift; local $_ = shift; my $output = ''; my $spaces = ' ' x $$self{MARGIN}; - my $width = $$self{width} - $$self{MARGIN}; + my $width = $$self{opt_width} - $$self{MARGIN}; while (length > $width) { - if (s/^((?:(?:[^\n]\cH)?[^\n]){0,$width})(\Z|\s+)// - || s/^((?:(?:[^\n]\cH)?[^\n]){$width})//) { + # This regex represents a single character, that's possibly underlined + # or in bold (in which case, it's three characters; the character, a + # backspace, and a character). Use [^\n] rather than . to protect + # against odd settings of $*. + my $char = '(?:[^\n][\b])?[^\n]'; + if (s/^((?>$char){0,$width})(?:\Z|\s+)//) { $output .= $spaces . $1 . "\n"; } else { last; @@ -106,7 +121,20 @@ sub wrap { } $output .= $spaces . $_; $output =~ s/\s+$/\n\n/; - $output; + return $output; +} + +############################################################################## +# Utility functions +############################################################################## + +# Strip all of the formatting from a provided string, returning the stripped +# version. +sub strip_format { + my ($self, $text) = @_; + $text =~ s/(.)[\b]\1/$1/g; + $text =~ s/_[\b]//g; + return $text; } ############################################################################## @@ -118,8 +146,14 @@ __END__ =head1 NAME +=for stopwords +overstrike + Pod::Text::Overstrike - Convert POD data to formatted overstrike text +=for stopwords +overstruck Overstruck Allbery terminal's + =head1 SYNOPSIS use Pod::Text::Overstrike; @@ -135,11 +169,11 @@ Pod::Text::Overstrike - Convert POD data to formatted overstrike text Pod::Text::Overstrike is a simple subclass of Pod::Text that highlights output text using overstrike sequences, in a manner similar to nroff. -Characters in bold text are overstruck (character, backspace, character) and -characters in underlined text are converted to overstruck underscores -(underscore, backspace, character). This format was originally designed for -hardcopy terminals and/or lineprinters, yet is readable on softcopy (CRT) -terminals. +Characters in bold text are overstruck (character, backspace, character) +and characters in underlined text are converted to overstruck underscores +(underscore, backspace, character). This format was originally designed +for hard-copy terminals and/or line printers, yet is readable on soft-copy +(CRT) terminals. Overstruck text is best viewed by page-at-a-time programs that take advantage of the terminal's B and I capabilities, such @@ -156,7 +190,11 @@ There may be some better approach possible. =head1 SEE ALSO -L, L +L, L + +The current version of this module is always available from its web site at +L. It is also part of the +Perl core distribution as of 5.6.0. =head1 AUTHOR @@ -166,7 +204,7 @@ Joe Smith , using the framework created by Russ Allbery =head1 COPYRIGHT AND LICENSE Copyright 2000 by Joe Smith . -Copyright 2001 by Russ Allbery . +Copyright 2001, 2004 by Russ Allbery . This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.