source: for-distributions/trunk/bin/windows/perl/lib/Text/Tabs.pm@ 14489

Last change on this file since 14489 was 14489, checked in by oranfry, 17 years ago

upgrading to perl 5.8

File size: 2.2 KB
Line 
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
Note: See TracBrowser for help on using the repository browser.