]> nmode's Git Repositories - Fey/blob - lib/App/Fey.pm
Add Fey.pm module
[Fey] / lib / App / Fey.pm
1 package App::Fey;
2
3 use strict;
4 use warnings;
5 use Exporter 'import';
6
7 our @EXPORT_OK = qw(fey);
8 our $version = '0.01';
9
10 sub new {
11 my ($class, $args) = @_;
12 my $config = do ($ENV{XDG_CONFIG_HOME} // "$ENV{HOME}/.config") . '/fey/config.pl';
13 my $placeholder = $args->{placeholder} // $config->{placeholder} // '//f';
14
15 my $self = {
16 contexts => $args->{contexts} // $config->{contexts} // { default => 1 },
17 placeholder => $placeholder,
18 mime_query => $args->{mime_query} // $config->{mime_query} // "file --brief --mime-type $placeholder",
19 targets => $args->{targets} // $config->{targets} // {}
20 };
21
22 bless $self, $class;
23 }
24
25 sub launch {
26 my ($self, $file_or_uri) = @_;
27
28 if ($file_or_uri =~ m|^file://(.+)|) {
29 $file_or_uri = $1;
30 }
31
32 my ($mime_or_uri, $targets);
33 if (-e $file_or_uri) {
34 $mime_or_uri = $self->{mime_query} =~ s/$self->{placeholder}/"$file_or_uri"/r;
35 $mime_or_uri = `$mime_or_uri`;
36 } else {
37 $mime_or_uri = $file_or_uri;
38 }
39
40 for my $target (@{ $self->{targets} }) {
41 for my $pattern (@{ $target->{patterns} }) {
42 if ($mime_or_uri =~ /$pattern/) {
43 my $associations = $target->{associations};
44 for my $context (keys %{ $associations }) {
45 if ($self->{contexts}->{$context}) {
46 my $command = $associations->{$context};
47 $command =~ s/$self->{placeholder}/"$file_or_uri"/;
48 `$command`;
49 return;
50 }
51 }
52 }
53 }
54 }
55 }
56
57 sub fey {
58 App::Fey->new($_[1] // {})->launch($_[0] // die 'Error: No file or URI specified.');
59 }