1 2package Text::Tabs; 3 4require Exporter; 5 6@ISA = (Exporter); 7@EXPORT = qw(expand unexpand $tabstop); 8 9use vars qw($VERSION $tabstop $debug); 10$VERSION = 2005.0824; 11 12use strict; 13 14BEGIN { 15 $tabstop = 8; 16 $debug = 0; 17} 18 19sub expand { 20 my @l; 21 my $pad; 22 for ( @_ ) { 23 my $s = ''; 24 for (split(/^/m, $_, -1)) { 25 my $offs = 0; 26 s{\t}{ 27 $pad = $tabstop - (pos() + $offs) % $tabstop; 28 $offs += $pad - 1; 29 " " x $pad; 30 }eg; 31 $s .= $_; 32 } 33 push(@l, $s); 34 } 35 return @l if wantarray; 36 return $l[0]; 37} 38 39sub unexpand 40{ 41 my (@l) = @_; 42 my @e; 43 my $x; 44 my $line; 45 my @lines; 46 my $lastbit; 47 for $x (@l) { 48 @lines = split("\n", $x, -1); 49 for $line (@lines) { 50 $line = expand($line); 51 @e = split(/(.{$tabstop})/,$line,-1); 52 $lastbit = pop(@e); 53 $lastbit = '' unless defined $lastbit; 54 $lastbit = "\t" 55 if $lastbit eq " "x$tabstop; 56 for $_ (@e) { 57 if ($debug) { 58 my $x = $_; 59 $x =~ s/\t/^I\t/gs; 60 print "sub on '$x'\n"; 61 } 62 s/ +$/\t/; 63 } 64 $line = join('',@e, $lastbit); 65 } 66 $x = join("\n", @lines); 67 } 68 return @l if wantarray; 69 return $l[0]; 70} 71 721; 73__END__ 74 75sub expand 76{ 77 my (@l) = @_; 78 for $_ (@l) { 79 1 while s/(^|\n)([^\t\n]*)(\t+)/ 80 $1. $2 . (" " x 81 ($tabstop * length($3) 82 - (length($2) % $tabstop))) 83 /sex; 84 } 85 return @l if wantarray; 86 return $l[0]; 87} 88 89 90=head1 NAME 91 92Text::Tabs -- expand and unexpand tabs per the unix expand(1) and unexpand(1) 93 94=head1 SYNOPSIS 95 96 use Text::Tabs; 97 98 $tabstop = 4; 99 @lines_without_tabs = expand(@lines_with_tabs); 100 @lines_with_tabs = unexpand(@lines_without_tabs); 101 102=head1 DESCRIPTION 103 104Text::Tabs does about what the unix utilities expand(1) and unexpand(1) 105do. Given a line with tabs in it, expand will replace the tabs with 106the appropriate number of spaces. Given a line with or without tabs in 107it, unexpand will add tabs when it can save bytes by doing so. Invisible 108compression with plain ascii! 109 110=head1 BUGS 111 112expand doesn't handle newlines very quickly -- do not feed it an 113entire document in one string. Instead feed it an array of lines. 114 115=head1 LICENSE 116 117Copyright (C) 1996-2002,2005 David Muir Sharnoff. 118Copyright (C) 2005 Aristotle Pagaltzis 119This module may be modified, used, copied, and redistributed at your own risk. 120Publicly redistributed modified versions must use a different name. 121 122