Alt-Acme-Math-XS-CPP

 view release on metacpan or  search on metacpan

inc/Inline/denter.pm  view on Meta::CPAN

    $key = '';
    my $line = $o->{line};
    $o->_next_line;
    while (not $o->{done} and
           $o->{lines}[0] ne $marker) {
        $key .= $o->{lines}[0] . "\n";
        $o->_next_line;
    }
    croak M02_no_key_end_marker($marker, $line) if $o->{done};
    chomp $key if $chomp;
    $o->_next_line;
    $o->_setup_line;
    return $key;
}

sub _undent_array {
    my @values;
    my $o = shift;
    my $level = $o->{level} + 1;
    $o->_next_line;
    $o->_setup_line;
    while ($o->{level} == $level) {
        push @values, $o->_undent_data;
    }
    croak $o->M06_invalid_indent_level if $o->{level} > $level;
    return @values;
}

sub _undent_scalar {
    my $values;
    my $o = shift;
    my $level = $o->{level} + 1;
    $o->_next_line;
    $o->_setup_line;
    croak $o->M06_invalid_indent_level if $o->{level} != $level;
    croak $o->M07_invalid_scalar_value if $o->{content} =~ /^[\%\@\$\\]/;
    return $o->_undent_undef if $o->{content} =~ /^\?/;
    return $o->_undent_value;
}

sub _undent_undef {
    my $o = shift;
    $o->_next_line;
    $o->_setup_line;
    return undef;
}

sub _next_line {
    my $o = shift;
    $o->{done}++, $o->{level} = -1, return unless @{$o->{lines}};
    local $_ = shift @{$o->{lines}};
    $o->{line}++;
}

sub _setup_line {
    my $o = shift;
    $o->{done}++, $o->{level} = -1, return unless @{$o->{lines}};
    my ($width, $tabwidth) = @{$o}{qw(width tabwidth)};
    while (1) {
        local $_ = $o->{lines}[0];
        # expand tabs in leading whitespace;
        $o->next_line, next if /^(\s*$|\#)/; # skip comments and blank lines
        while (s{^( *)(\t+)}
               {' ' x (length($1) + length($2) * $tabwidth -
                       length($1) % $tabwidth)}e){}
        croak $o->M01_invalid_indent_width unless /^(( {$width})*)(\S.*)$/;
        $o->{level} = length($1) / $width;
        $o->{content} = $3;
        last;
    }
}

sub indent {
    my $o = shift;
    my $package = caller;
    $package = caller(1) if $package eq 'Inline::denter';
    my $stream = '';
    $o->{key} = '';
    while (@_) {
        local $_ = shift;
        $stream .= $o->indent_name($_, shift), next
          if (/^\*$package\::\w+$/);
        $stream .= $o->indent_data($_);
    }
    return $stream;
}

sub indent_data {
    my $o = shift;
    local $_ = shift;
    return $o->indent_undef($_)
      if not defined;
    return $o->indent_value($_)
      if (not ref);
    return $o->indent_hash($_)
      if (ref eq 'HASH' and not /=/ or /=HASH/);
    return $o->indent_array($_)
      if (ref eq 'ARRAY' and not /=/ or /=ARRAY/);
    return $o->indent_scalar($_)
      if (ref eq 'SCALAR' and not /=/ or /=SCALAR/);
    return $o->indent_ref($_)
      if (ref eq 'REF');
    return "$_\n";
}

sub indent_value {
    my ($o, $data) = @_;
    my $stream;
    if ($data =~ /\n/) {
        my $marker = 'EOV';
        $marker++ while $data =~ /^$marker$/m;
        my $chomp = ($data =~ s/\n\Z//) ? '' : '-';
        $stream = "<<$marker$chomp\n";
        $stream .= $o->{key}, $o->{key} = '' if $o->{key};
        $stream .= "$data\n$marker\n";
    }
    elsif ($data =~ /^[\s\%\@\$\\?\"]|\s$/ or
           $data =~ /\Q$o->{comma}\E/ or
           $data =~ /[\x00-\x1f]/ or
           $data eq '') {
        $stream = qq{"$data"\n};



( run in 1.116 second using v1.01-cache-2.11-cpan-97f6503c9c8 )