Acme-Indent

 view release on metacpan or  search on metacpan

lib/Acme/Indent.pm  view on Meta::CPAN

package Acme::Indent;
$Acme::Indent::VERSION = '0.04';
use strict;
use warnings;

use Carp;

require Exporter;
our @ISA       = qw(Exporter);
our @EXPORT    = qw(ai);
our @EXPORT_OK = qw();

sub ai {
    my @lines = split m{\n}xms, $_[0];

    my $result = '';
    my $empty = '';

    my $shft = 0;
    my $data = 0;

    for my $l (@lines) {
        unless ($data) {
            if ($l =~ m{\A (\s*) \S}xms) {
                $shft = length($1);
                $data = 1;
            }
        }

        if ($data) {
            my ($spaces, $text);

            if (length($l) >= $shft) {
                $spaces = substr($l, 0, $shft);
                $text = substr($l, $shft);
            }
            else {
                $spaces = $l;
                $text = '';
            }

            if ($spaces =~ m{\S}xms) {
                carp "Found characters ('$spaces') in indentation zone";
            }

            if ($text =~ m{\S}xms) {
                $result .= $empty.$text."\n";
                $empty = '';
            }
            else {
                $empty .= "\n";
            }
        }
    }

    return $result;
}

1;

__END__

=head1 NAME

Acme::Indent - Proper indentation for multi-line strings

=head1 SYNOPSIS

    use Acme::Indent qw(ai);

    my $mini_prog = ai(q^
        my $token = 'B';
        print "Begin test $token\n";



( run in 2.545 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )