my $self = shift;
my $options = ref $_[0] ? shift : {};
+ if (!(-t STDIN)) {
+ _read_stdin(\@_);
+ }
+ if (!@_ || $options->{interactive}) {
+ open STDIN, '<', '/dev/tty';
+ _read_stdin(\@_);
+ }
die "No files or URIs specified.\n" unless @_;
if ($options->{group}) {
my $pid = fork;
next if $pid;
- my $handler = $self->_get_handler($file_or_uri);
+ my $handler = $self->_get_handler($options, $file_or_uri);
$handler->($file_or_uri) if $handler;
return;
}
} else {
for my $file_or_uri (@_) {
- my $handler = $self->_get_handler($file_or_uri);
+ my $handler = $self->_get_handler($options, $file_or_uri);
$handler->($file_or_uri) if $handler;
}
}
my ($groups, $handlers) = ({}, {});
for my $file_or_uri (@_) {
- my $handler = $self->_get_handler($file_or_uri);
+ my $handler = $self->_get_handler($options, $file_or_uri);
if ($handler) {
$groups->{"$handler"} //= [];
push @{ $groups->{"$handler"} }, $file_or_uri;
return if $pid;
}
- my $handler = $self->_get_handler($_[0]);
+ my $handler = $self->_get_handler($options, $_[0]);
$handler->(@_) if $handler;
}
sub _get_handler {
my $self = shift;
+ my $options = shift;
my $file_or_uri = $_[0] =~ m|^file://(.+)| ? $1 : $_[0];
my $mime_or_uri = -e $file_or_uri ? $self->{mime_query}->($file_or_uri) : $file_or_uri;
for my $pattern (@{ $target->{patterns} }) {
if ($mime_or_uri =~ /$pattern/) {
my $associations = $target->{associations};
+
+ my $context = $options->{context};
+ my $handler = $associations->{$context} if $context;
+ return $handler if defined $handler;
+
for my $context (keys %{ $associations }) {
if ($self->{contexts}->{$context}->()) {
return $associations->{$context};
}
}
+sub _read_stdin {
+ for my $file_or_uri (<STDIN>) {
+ chomp $file_or_uri;
+ push @{ $_[0] }, $file_or_uri;
+ }
+}
+
sub fey {
App::Fey->new(ref $_[0] ? $_[0] : {})->launch(@_);
}