HTML-EP-Explorer
view release on metacpan or search on metacpan
lib/HTML/EP/Explorer.pm view on Meta::CPAN
}
if ($found) {
$self->print("Found it.\n") if $debug;
} elsif (@{$self->{'filetypes'}}) {
$found = $self->{'filetypes'}->[0];
$self->print("Choosing default file type $found->{'name'}\n")
if $debug;
} else {
$self->print("No file type found.\n");
}
$found->{'selected'} = 'SELECTED' if $found;
my $name = $found ? $found->{'name'} : '';
if (!defined($session->{'filetype'}) ||
$session->{'filetype'} ne $name) {
$self->{'modified'} = 1;
$session->{'filetype'} = $name;
}
$self->print("Filetype is $found->{'name'}.\n")
if $self->{'debug'} and $found;
$self->{'filetype'} = $found;
'';
}
sub _ep_explorer_browse {
my $self = shift; my $attr = shift;
my $cgi = $self->{'cgi'};
my $debug = $self->{'debug'};
my $session = $self->{'session'};
$self->{'modified'} = 0;
my $dir_template = $self->{'dir_template'}
or die "Missing template variable: dir_template";
my $item = $attr->{'item'} || die "Missing item name";
$self->_ep_explorer_basedir($attr);
$self->_ep_explorer_filetype($attr);
$self->_ep_explorer_sortby($attr);
my $dir = HTML::EP::Explorer::Dir->new($self->{'basedir'});
my $list = $dir->Read($self->{'filetype'}->{'re'});
my $sortby = $self->{'sortby'};
my $updir;
if ($list->[0]->IsDir()
and $list->[0]->{'name'} eq File::Spec->updir()) {
$updir = shift @$list;
}
$self->print("Sorting by $sortby.\n") if $debug;
if ($sortby eq 'type') {
@$list = sort {
if ($a->IsDir()) {
$b->IsDir() ? $a->{'name'} cmp $b->{'name'} : -1;
} elsif ($b->IsDir()) {
return 1;
} else {
my $ae = ($a =~ /\.(.*?)$/) ? $1 : '';
my $be = ($b =~ /\.(.*?)$/) ? $1 : '';
($ae cmp $be) || ($a->{'name'} cmp $b->{'name'});
}
} @$list;
} elsif ($sortby eq 'uid') {
@$list = sort { (getpwuid($a->{'uid'}) || '') cmp
(getpwuid($b->{'uid'}) || '')} @$list;
} elsif ($sortby eq 'gid') {
@$list = sort { (getgrgid($a->{'gid'}) || '') cmp
(getgrgid($b->{'gid'}) || '')} @$list;
} elsif ($sortby =~ /^(?:size|[amc]time)$/) {
@$list = sort { $a->{$sortby} <=> $b->{$sortby} } @$list;
} else {
@$list = sort { $a->{$sortby} cmp $b->{$sortby} } @$list;
}
unshift(@$list, $updir)
if $updir and !$self->{'in_top_dir'};
my $output = '';
$self->{'i'} = 0;
foreach my $i (@$list) {
$self->{$item} = $i;
$output .= $i->AsHtml($self, $item);
++$self->{'i'};
}
$self->_ep_session_store($attr) if $self->{'modified'};
$output;
}
sub _format_ACTIONS {
my $self = shift; my $item = shift;
my $str = '';
foreach my $action (@{$self->{'actions'}}) {
$self->{'action'} = $action;
$self->{'icon'} = $action->{'icon'} ?
qq{<img src="$action->{'icon'}" alt="$action->{'name'}">} :
$action->{'name'};
$str .= $self->ParseVars($self->{'action_template'});
}
$str;
}
sub FindAction {
my $self = shift; my $attr = shift;
my $cgi = $self->{'cgi'};
my $name = $cgi->param('faction') || $attr->{'faction'} ||
die "Missing action name";
my $debug = $self->{'debug'};
$self->print("FindAction: Looking for $name\n") if $debug;
my $action;
foreach my $a (@{$self->{'actions'}}) {
if ($a->{'name'} eq $name) {
$action = $a;
last;
}
}
$self->{'action'} = $action or die "Unknown action: $name";
$self->print("Selected action is $action->{'name'}\n") if $debug;
$action;
}
sub FindStatusAction {
my $self = shift; my $script = shift; my $attr = shift;
my $debug = $self->{'debug'};
$self->print("FindStatusAction: Looking for $script\n") if $debug;
lib/HTML/EP/Explorer.pm view on Meta::CPAN
my @files;
my $file;
if (($file = $cgi->param('files')) || ($file = $attr->{'files'})) {
@files = split(" ", $file);
} elsif (($file = $cgi->param('file')) || ($file = $attr->{'file'})) {
@files = $file;
} else {
die "Missing file name";
}
$self->print("Selected files are:\n", map{" $_\n"} @files) if $debug;
my $command = $action->{'script'};
my $files;
if ($command =~ /\$files/) {
# Can handle multiple files
$files = join(" ", map {
quotemeta(HTML::EP::Explorer::File->new($_)->{'file'})
} @files);
$command =~ s/\$files/$files/sg;
$command .= " 2>&1" if $attr->{'execute'};
} else {
my @commands;
foreach my $file (@files) {
my $c = $command;
my $f = quotemeta(HTML::EP::Explorer::File->new($file)->{'file'});
$c =~ s/\$file/$f/sg;
push(@commands, $attr->{'execute'} ? "$c 2>&1" : $c);
}
$command = join(";", @commands);
}
$self->print("Selected command is $command\n") if $debug;
local $ENV{'user'} = quotemeta($self->User());
local $ENV{'files'} = $files if $files;
if ($attr->{'execute'}) {
return `$command`;
} else {
return $command;
}
}
sub User {
$ENV{'REMOTE_USER'} || "anonymous";
}
sub _format_MODE {
my $self = shift; my $mode = shift;
(($mode & 0400) ? "r" : "-") .
(($mode & 0200) ? "w" : "-") .
(($mode & 04000) ? "s" : (($mode & 0100) ? "x" : "-")) .
(($mode & 040) ? "r" : "-") .
(($mode & 020) ? "w" : "-") .
(($mode & 02000) ? "s" : (($mode & 010) ? "x" : "-")) .
(($mode & 04) ? "r" : "-") .
(($mode & 02) ? "w" : "-") .
(($mode & 01) ? "x" : "-");
}
sub _format_UID {
my $self = shift; my $uid = shift;
my $u = getpwuid($uid);
defined $u ? $u : $uid;
}
sub _format_GID {
my $self = shift; my $gid = shift;
my $g = getgrgid($gid);
defined $g ? $g : $gid;
}
sub _format_DATE {
my $self = shift; my $time = shift;
return '' unless $time;
return $self->_format_TIME(scalar(localtime($time)));
}
sub _format_SELECTED {
my $self = shift; shift() ? "SELECTED" : "";
}
package HTML::EP::Explorer::File;
sub new {
my $proto = shift; my $file = shift;
$file =~ s/^file://;
my $self = { 'file' => $file, @_ };
$self->{'name'} ||= File::Basename::basename($file);
$self->{'url'} ||= "file:$file";
bless($self, (ref($proto) || $proto));
}
sub IsDir { 0 }
sub AsHtml {
my $self = shift; my $ep = shift;
foreach my $ft (@{$ep->{'filetypes'}}) {
if ($ft->{'icon'} && $self->{'name'} =~ /$ft->{'re'}/) {
$self->{'icon'} = $ft->{'icon'};
last;
}
}
$self->{'icon'} = "unknown.gif" unless $self->{'icon'};
$ep->ParseVars($ep->{'file_template'}
or die "Missing template variable: file_template");
}
package HTML::EP::Explorer::Dir;
sub new {
my $proto = shift; my $dir = shift;
$dir =~ s/^file://;
my $self = { 'dir' => $dir, @_ };
$self->{'name'} ||= File::Basename::basename($dir);
$self->{'url'} ||= "file:$dir";
bless($self, (ref($proto) || $proto));
}
sub IsDir { 1 }
sub AsHtml {
( run in 1.646 second using v1.01-cache-2.11-cpan-13bb782fe5a )