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 )