use URI::Escape qw(uri_unescape);
use PublicInbox::MID qw($MID_EXTRACT);
-sub lcat_imap_uid_uri ($$) {
- my ($lei, $uid_uri) = @_;
- my $lms = $lei->{lse}->lms or return;
- my $oidhex = $lms->imap_oid($lei, $uid_uri);
- if (ref(my $err = $oidhex)) { # art2folder error
- $lei->qerr(@{$err->{qerr}}) if $err->{qerr};
+sub lcat_folder ($$$) {
+ my ($lei, $lms, $folder) = @_;
+ $lms //= $lei->lms or return;
+ my $folders = [ $folder];
+ my $err = $lms->arg2folder($lei, $folders);
+ $lei->qerr(@{$err->{qerr}}) if $err && $err->{qerr};
+ if ($err && $err->{fail}) {
+ $lei->child_error(1 << 8, "# unknown folder: $folder");
+ } else {
+ for my $f (@$folders) {
+ my $fid = $lms->fid_for($f);
+ push @{$lei->{lcat_fid}}, $fid;
+ }
+ }
+}
+
+sub lcat_imap_uri ($$) {
+ my ($lei, $uri) = @_;
+ my $lms = $lei->lms or return;
+ # cf. LeiXsearch->lcat_dump
+ if (defined $uri->uid) {
+ my $oidhex = $lms->imap_oid($lei, $uri);
+ if (ref(my $err = $oidhex)) { # art2folder error
+ $lei->qerr(@{$err->{qerr}}) if $err->{qerr};
+ }
+ push @{$lei->{lcat_blob}}, $oidhex;
+ } elsif (defined(my $fid = $lms->fid_for($$uri))) {
+ push @{$lei->{lcat_fid}}, $fid;
+ } else {
+ lcat_folder($lei, $lms, $$uri);
}
- push @{$lei->{lcat_blob}}, $oidhex; # cf. LeiToMail->wq_atexit_child
}
sub extract_1 ($$) {
if ($x =~ m!\b(imaps?://[^>]+)!i) {
my $u = $1;
require PublicInbox::URIimap;
- $u = PublicInbox::URIimap->new($u);
- defined($u->uid) ? lcat_imap_uid_uri($lei, $u) :
- $lei->child_error(1 << 8, "# no UID= in $u");
- '""'; # blank query, using {lcat_blob}
+ lcat_imap_uri($lei, PublicInbox::URIimap->new($u));
+ '""'; # blank query, using {lcat_blob} or {lcat_fid}
+ } elsif ($x =~ m!\b(maildir:.+)!i) {
+ lcat_folder($lei, undef, $1);
+ '""'; # blank query, using {lcat_blob} or {lcat_fid}
} elsif ($x =~ m!\b([a-z]+?://\S+)!i) {
my $u = $1;
$u =~ s/[\>\]\)\,\.\;]+\z//;
sub lei_lcat {
my ($lei, @argv) = @_;
my $lxs = $lei->lxs_prepare or return;
- $lei->ale->refresh_externals($lxs);
- my $sto = $lei->_lei_store(1);
- $lei->{lse} = $sto->search;
+ $lei->ale->refresh_externals($lxs, $lei);
+ $lei->_lei_store(1);
my $opt = $lei->{opt};
my %mset_opt = map { $_ => $opt->{$_} } qw(threads limit offset);
$mset_opt{asc} = $opt->{'reverse'} ? 1 : 0;
$lei->_start_query;
}
+sub _complete_lcat {
+ my ($lei, @argv) = @_;
+ my $lms = $lei->lms or return;
+ my $match_cb = $lei->complete_url_prepare(\@argv);
+ map { $match_cb->($_) } $lms->folders;
+}
+
1;