From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 65D821FA18 for ; Tue, 2 Nov 2021 23:55:37 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] doc: lei-q: document SEARCH TERMS prefixes Date: Tue, 2 Nov 2021 12:55:37 -1100 Message-Id: <20211102235537.27745-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: The new Documentation/common.perl file will be used for all manpages in the future. --- Documentation/common.perl | 65 +++++++++++++++++++++++++++++++++++++++ Documentation/include.mk | 3 ++ Documentation/lei-q.pod | 51 +++++++++++++++++++++++++++++- MANIFEST | 1 + lib/PublicInbox/Search.pm | 8 ++--- 5 files changed, 123 insertions(+), 5 deletions(-) create mode 100755 Documentation/common.perl diff --git a/Documentation/common.perl b/Documentation/common.perl new file mode 100755 index 000000000000..5fdbe8da055e --- /dev/null +++ b/Documentation/common.perl @@ -0,0 +1,65 @@ +#!perl -w +# Copyright (C) all contributors +# License: AGPL-3.0+ +use strict; +use Fcntl qw(SEEK_SET); +my $have_search = eval { require PublicInbox::Search; 1 }; +my $addr = 'meta@public-inbox.org'; +for my $pod (@ARGV) { + open my $fh, '+<', $pod or die "open($pod): $!"; + my $s = do { local $/; <$fh> } // die "read $!"; + my $orig = $s; + $s =~ s!^=head1 COPYRIGHT\n.+?^=head1([^\n]+)\n!=head1 COPYRIGHT + +Copyright all contributors L + +License: AGPL-3.0+ L + +=head1$1 + !ms; + + $s =~ s!^=head1 CONTACT\n.+?^=head1([^\n]+)\n!=head1 CONTACT + +Feedback welcome via plain-text mail to L + +The mail archives are hosted at L and +L + +=head1$1 + !ms; + $have_search and $s =~ s!^=for\scomment\n + ^AUTO-GENERATED-SEARCH-TERMS-BEGIN\n + .+? + ^=for\scomment\n + ^AUTO-GENERATED-SEARCH-TERMS-END\n + !search_terms()!emsx; + $s =~ s/[ \t]+$//sgm; + next if $s eq $orig; + seek($fh, 0, SEEK_SET) or die "seek: $!"; + truncate($fh, 0) or die "truncate: $!"; + print $fh $s or die "print: $!"; + close $fh or die "close: $!"; +} + +sub search_terms { + my $help = eval('\@PublicInbox::Search::HELP'); + my $s = ''; + my $pad = 0; + my $i; + for ($i = 0; $i < @$help; $i += 2) { + my $pfx = $help->[$i]; + my $n = length($pfx); + $pad = $n if $n > $pad; + $s .= $pfx . "\0"; + $s .= $help->[$i + 1]; + $s .= "\f\n"; + } + $pad += 2; + my $padding = ' ' x ($pad + 4); + $s =~ s/^/$padding/gms; + $s =~ s/^$padding(\S+)\0/" $1".(' ' x ($pad - length($1)))/egms; + $s =~ s/\f\n/\n/gs; + $s =~ s/^ //gms; + substr($s, 0, 0, "=for comment\nAUTO-GENERATED-SEARCH-TERMS-BEGIN\n\n"); + $s .= "\n=for comment\nAUTO-GENERATED-SEARCH-TERMS-END\n"; +} diff --git a/Documentation/include.mk b/Documentation/include.mk index 5f3ffcc56937..149f9e3ce42e 100644 --- a/Documentation/include.mk +++ b/Documentation/include.mk @@ -80,6 +80,9 @@ Documentation/flow.txt : Documentation/flow.ge touch -r Documentation/flow.ge $@+ mv $@+ $@ +Documentation/lei-q.pod : lib/PublicInbox/Search.pm Documentation/common.perl + $(PERL) -I lib -w Documentation/common.perl $@ + NEWS NEWS.atom NEWS.html : $(news_deps) $(PERL) -I lib -w Documentation/mknews.perl $@ $(RELEASES) diff --git a/Documentation/lei-q.pod b/Documentation/lei-q.pod index 574c12eb9d3a..fe281d7b0121 100644 --- a/Documentation/lei-q.pod +++ b/Documentation/lei-q.pod @@ -245,6 +245,55 @@ Default: C =back +=head1 SEARCH TERMS + +C supports the same search prefixes used by HTTP(S) public-inbox +instances: + +=for comment +AUTO-GENERATED-SEARCH-TERMS-BEGIN + + s: match within Subject e.g. s:"a quick brown fox" + d: match date-time range, git "approxidate" formats supported + Open-ended ranges such as `d:last.week..' and + `d:..2.days.ago' are supported + b: match within message body, including text attachments + nq: match non-quoted text within message body + q: match quoted text within message body + n: match filename of attachment(s) + t: match within the To header + c: match within the Cc header + f: match within the From header + a: match within the To, Cc, and From headers + tc: match within the To and Cc headers + l: match contents of the List-Id header + bs: match within the Subject and body + dfn: match filename from diff + dfa: match diff removed (-) lines + dfb: match diff added (+) lines + dfhh: match diff hunk header context (usually a function name) + dfctx: match diff context lines + dfpre: match pre-image git blob ID + dfpost: match post-image git blob ID + dfblob: match either pre or post-image git blob ID + rt: match received time, like `d:' if sender's clock was correct + +=for comment +AUTO-GENERATED-SEARCH-TERMS-END + +Additional search prefixes which only affect the local lei/store: + + L: match the given label + kw: match the given keywords + +See L for more info on labels and keywords. + +Most prefixes are probabilistic, meaning they support stemming +and wildcards (C<*>). Ranges (such as C) and boolean prefixes +do not support stemming or wildcards. +The upstream Xapian query parser documentation fully explains +the query syntax: L + =head1 TIPS C<-f reply> is intended to aid in turning a cover letter @@ -261,7 +310,7 @@ L =head1 COPYRIGHT -Copyright 2021 all contributors L +Copyright all contributors L License: AGPL-3.0+ L diff --git a/MANIFEST b/MANIFEST index 1e8f60fb41da..47eadad2e403 100644 --- a/MANIFEST +++ b/MANIFEST @@ -13,6 +13,7 @@ Documentation/RelNotes/v1.6.0.eml Documentation/RelNotes/v1.6.1.eml Documentation/RelNotes/v1.7.0.wip Documentation/clients.txt +Documentation/common.perl Documentation/dc-dlvr-spam-flow.txt Documentation/design_notes.txt Documentation/design_www.txt diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm index 600e6400d4b6..523003b3c269 100644 --- a/lib/PublicInbox/Search.pm +++ b/lib/PublicInbox/Search.pm @@ -155,9 +155,9 @@ my %prob_prefix = ( our @HELP = ( 's:' => 'match within Subject e.g. s:"a quick brown fox"', 'd:' => < 'match within message body, including text attachments', 'nq:' => 'match non-quoted text within message body', @@ -179,7 +179,7 @@ EOF 'dfpost:' => 'match post-image git blob ID', 'dfblob:' => 'match either pre or post-image git blob ID', 'rt:' => <