App-after
view release on metacpan or search on metacpan
# allow_dot => {
# summary => 'If turned off, will not allow "." or ".." in path',
# description => <<'_',
#
#This is most useful when combined with `starting_path` option to prevent user
#going up/outside the starting path.
#
#_
# schema => 'bool',
# default => 1,
# },
# },
# result_naked => 1,
# result => {
# schema => 'array',
# },
#};
#sub complete_file {
# require Complete::Path;
# require Encode;
# require File::Glob;
#
# my %args = @_;
# my $word = $args{word} // "";
# my $handle_tilde = $args{handle_tilde} // 1;
# my $allow_dot = $args{allow_dot} // 1;
# my $filter = $args{filter};
#
# my $result_prefix;
# my $starting_path = $args{starting_path} // '.';
# if ($handle_tilde && $word =~ s!\A(~[^/]*)/!!) {
# $result_prefix = "$1/";
# my @dir = File::Glob::glob($1);
# return [] unless @dir;
# $starting_path = Encode::decode('UTF-8', $dir[0]);
# } elsif ($allow_dot && $word =~ s!\A((?:\.\.?/+)+|/+)!!) {
# $starting_path = $1;
# $result_prefix = $1;
# $starting_path =~ s#/+\z## unless $starting_path =~ m!\A/!;
# }
#
# return [] if !$allow_dot &&
# $word =~ m!(?:\A|/)\.\.?(?:\z|/)!;
#
# my $list = sub {
# my ($path, $intdir, $isint) = @_;
# opendir my($dh), $path or return undef;
# my @res;
# for (sort readdir $dh) {
# next if ($_ eq '.' || $_ eq '..') && $intdir eq '';
# next if $isint && !(-d "$path/$_");
# push @res, Encode::decode('UTF-8', $_);
# }
# \@res;
# };
#
# if ($filter && !ref($filter)) {
# my @seqs = split /\s*\|\s*/, $filter;
# $filter = sub {
# my $name = shift;
# my @st = stat($name) or return 0;
# my $mode = $st[2];
# my $pass;
# SEQ:
# for my $seq (@seqs) {
# my $neg = sub { $_[0] };
# for my $c (split //, $seq) {
# if ($c eq '-') { $neg = sub { $_[0] ? 0 : 1 } }
# elsif ($c eq 'r') { next SEQ unless $neg->($mode & 0400) }
# elsif ($c eq 'w') { next SEQ unless $neg->($mode & 0200) }
# elsif ($c eq 'x') { next SEQ unless $neg->($mode & 0100) }
# elsif ($c eq 'f') { next SEQ unless $neg->($mode & 0100000)}
# elsif ($c eq 'd') { next SEQ unless $neg->($mode & 0040000)}
# else {
# die "Unknown character in filter: $c (in $seq)";
# }
# }
# $pass = 1; last SEQ;
# }
# $pass;
# };
# } elsif (!$filter && $args{file_regex_filter}) {
# $filter = sub {
# my $name = shift;
# return 1 if -d $name;
# return 0 unless -f _;
# return 1 if $name =~ $args{file_regex_filter};
# 0;
# };
# }
#
# if ($args{_dir}) {
# my $orig_filter = $filter;
# $filter = sub {
# my $name = shift;
# return 0 if $orig_filter && !$orig_filter->($name);
# return 0 unless (-d $name);
# 1;
# };
# }
#
# Complete::Path::complete_path(
# word => $word,
# list_func => $list,
# is_dir_func => sub { -d $_[0] },
# filter_func => $filter,
# starting_path => $starting_path,
# result_prefix => $result_prefix,
# );
#}
#
#$SPEC{complete_dir} = do {
# my $spec = {%{ $SPEC{complete_file} }};
#
# $spec->{summary} = 'Complete directory from local filesystem '.
# '(wrapper for complete_dir() that only picks directories)';
# delete $spec->{args}{file_regex_filter};
#
# $spec;
#};
#sub complete_dir {
( run in 1.675 second using v1.01-cache-2.11-cpan-5a3173703d6 )