NetServer-Portal

 view release on metacpan or  search on metacpan

lib/NetServer/Portal/Pi.pm  view on Meta::CPAN

		    for (my $c=0; $c < $cols; $c++) {
			my $cel = $got[$l + $c*$per] || '';
			$cel .= ' 'x($maxlen - length $cel);
			$row .= $cel;
		    }
		    push @grid, $row;
		}
		@got = @grid;
	    }
	}
	$o->add_buffer(\@got);

    } elsif (@{$o->{Path}} and $in eq 'ls') {
	my @p = @{$o->{Path}};
	
	my $Dumper = new_dumper([ $p[$#p] ]);
	$Dumper->Maxdepth(1);
	$o->add_buffer([split /\n/,  $Dumper->Dump]);

    } elsif ($in =~ m,^cd (\s+/)? $,x) {
	@{$o->{Package}} = ();
	@{$o->{Path}} = ();
	
    } elsif ($in =~ s/^cd\s+//) {
	my @at = $o->resolve_path($in);
	return if (@at == 1 and !defined $at[0]);
	@{$o->{Package}} = ();
	while (@at and !ref $at[0]) {
	    push @{$o->{Package}}, shift(@at);
	}
	@{$o->{Path}} = @at;

    } else {
	$in .= "\n" if $in !~ /\n$/;
	my @warn;
	local $SIG{__WARN__} = sub {
	    push @warn, @_;
	};
	my $pack = join('::', @{$o->{Package}}) || 'main';
	my @eval = eval "no strict;\n#line 1 \"input\"\npackage $pack;\n$in";
	if ($@) {
	    $o->add_buffer([split /\n/, "package $pack;\n$in---\n$@"]);
	} else {
	    my $warns='';
	    $warns = join('', @warn)."---\n"
		if @warn;
	    my $Dumper = new_dumper(\@eval);
	    $o->add_buffer([split /\n/, "package $pack;\n$in---\n".$warns.
			    $Dumper->Dump]);
	}
    }
    pop @{$o->{O}} if @{$o->{O}} > 16;
}

sub resolve_path {
    my ($o, $path) = @_;
    my @at = (@{$o->{Package}}, @{$o->{Path}});
    @at=()
	if $path =~ s,^/,,;
    if ($path =~ m,^[\w\.\:/-]+$,) {
	my @step = split m'/+', $path;
	for my $step (@step) {
	    next if $step eq '.';
	    if ($step eq '..') {
		pop @at;
	    } else {
		if (@at and ref $at[$#at]) {
		    my $at = $at[$#at];
		    my $to;
		    if (reftype $at eq 'ARRAY') {
			$to = $at->[$step];
		    } elsif (reftype $at eq 'HASH') {
			$to = $at->[$step];
		    } else {
			$o->{error} = "Can't cd $step through '$at'.";
			return @at;
		    }
		    if (!ref $to) {
			$o->{error} = "Can't cd $step into '$to'.";
			return @at;
		    }
		    push @at, $to;
		} else {
		    $step =~ s/::$//;
		    push @at, $step;
		}
	    }
	}
	@at;
    } else {
	my $package = join('::', @{$o->{Package}}) || 'main';
	my @r = eval "no strict;\n#line 1 \"input\"\npackage $package;\n$path";
	if ($@) {
	    $o->{error} = $@;
	    return undef;
	}
	if (!@r) {
	    $o->{error} = "Nothing there.";
	} elsif (@r == 1) {
	    if (ref $r[0]) {
		return (@at, $r[0])
	    } else {
		$o->{error} = "Can't cd into '$r[0]'";
		return undef;
	    }
	} else {
	    return (@at, \@r);
	}
    }
}

1;



( run in 0.943 second using v1.01-cache-2.11-cpan-71847e10f99 )