X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FText%2FTabs.pm;h=610e870c11fb2eff24066073243db25cb67eb898;hb=fe0438b3fdd7184c1a19b7c24a3a26460d03083a;hp=4024d7b6859d2e4a3620a9686b929a5252b29e10;hpb=1fef88e72b0b21420614d87ecab0aaedf3725271;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Text/Tabs.pm b/lib/Text/Tabs.pm index 4024d7b..610e870 100644 --- a/lib/Text/Tabs.pm +++ b/lib/Text/Tabs.pm @@ -7,7 +7,7 @@ require Exporter; @EXPORT = qw(expand unexpand $tabstop); use vars qw($VERSION $tabstop $debug); -$VERSION = 96.051501; +$VERSION = 2007.1117; use strict; @@ -16,37 +16,45 @@ BEGIN { $debug = 0; } -sub expand -{ - my @l = @_; - for $_ (@l) { - 1 while s/(^|\n)([^\t\n]*)(\t+)/ - $1. $2 . (" " x - ($tabstop * length($3) - - (length($2) % $tabstop))) - /sex; +sub expand { + my @l; + my $pad; + for ( @_ ) { + my $s = ''; + for (split(/^/m, $_, -1)) { + my $offs = 0; + s{\t}{ + $pad = $tabstop - (pos() + $offs) % $tabstop; + $offs += $pad - 1; + " " x $pad; + }eg; + $s .= $_; + } + push(@l, $s); } return @l if wantarray; - return @l[0]; + return $l[0]; } sub unexpand { - my @l = @_; + my (@l) = @_; my @e; my $x; my $line; my @lines; my $lastbit; + my $ts_as_space = " "x$tabstop; for $x (@l) { @lines = split("\n", $x, -1); for $line (@lines) { $line = expand($line); @e = split(/(.{$tabstop})/,$line,-1); $lastbit = pop(@e); - $lastbit = '' unless defined $lastbit; + $lastbit = '' + unless defined $lastbit; $lastbit = "\t" - if $lastbit eq " "x$tabstop; + if $lastbit eq $ts_as_space; for $_ (@e) { if ($debug) { my $x = $_; @@ -60,38 +68,69 @@ sub unexpand $x = join("\n", @lines); } return @l if wantarray; - return @l[0]; + return $l[0]; } 1; __END__ +sub expand +{ + my (@l) = @_; + for $_ (@l) { + 1 while s/(^|\n)([^\t\n]*)(\t+)/ + $1. $2 . (" " x + ($tabstop * length($3) + - (length($2) % $tabstop))) + /sex; + } + return @l if wantarray; + return $l[0]; +} + =head1 NAME -Text::Tabs - expand and unexpand tabs per the unix expand(1) and unexpand(1) +Text::Tabs -- expand and unexpand tabs per the unix expand(1) and unexpand(1) =head1 SYNOPSIS - use Text::Tabs; + use Text::Tabs; - $tabstop = 4; - @lines_without_tabs = expand(@lines_with_tabs); - @lines_with_tabs = unexpand(@lines_without_tabs); + $tabstop = 4; # default = 8 + @lines_without_tabs = expand(@lines_with_tabs); + @lines_with_tabs = unexpand(@lines_without_tabs); =head1 DESCRIPTION -Text::Tabs does about what the unix utilities expand(1) and unexpand(1) +Text::Tabs does about what the unix utilities expand(1) and unexpand(1) do. Given a line with tabs in it, expand will replace the tabs with the appropriate number of spaces. Given a line with or without tabs in -it, unexpand will add tabs when it can save bytes by doing so. Invisible -compression with plain ascii! +it, unexpand will add tabs when it can save bytes by doing so (just +like C). Invisible compression with plain ASCII! + +=head1 EXAMPLE + + #!perl + # unexpand -a + use Text::Tabs; + + while (<>) { + print unexpand $_; + } + +Instead of the C comand, use: + + perl -MText::Tabs -n -e 'print expand $_' + +Instead of the C command, use: -=head1 BUGS + perl -MText::Tabs -n -e 'print unexpand $_' -expand doesn't handle newlines very quickly -- do not feed it an -entire document in one string. Instead feed it an array of lines. +=head1 LICENSE -=head1 AUTHOR +Copyright (C) 1996-2002,2005,2006 David Muir Sharnoff. +Copyright (C) 2005 Aristotle Pagaltzis +This module may be modified, used, copied, and redistributed at your own risk. +Publicly redistributed modified versions must use a different name. -David Muir Sharnoff EFE