From 3ed68f01974a48ffa4512d7526e898023a04bc25 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Fri, 21 Oct 2016 17:15:10 +0530 Subject: [PATCH] Add regex search support. --- README.md | 4 +++- buku | 12 ++++++++++-- buku.1 | 4 ++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b91b205..d9de3b5 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ `buku` is a powerful bookmark management utility written in Python3 and SQLite3. When I started writing it, I couldn't find a flexible cmdline solution with a private, portable, merge-able database along with browser integration. Hence, `buku` (after my son's nickname). -With tagging and multiple options to search bookmarks, including a deep scan mode (particularly for URLs), finding a bookmark is very easy. Multiple search results can be opened in the browser at once. +With tagging and multiple options to search bookmarks, including regex and a deep scan mode (particularly for URLs), finding a bookmark is very easy. Multiple search results can be opened in the browser at once. Though a terminal utility, it's possible to add bookmarks to `buku` without touching the terminal! Refer to the section on [GUI integration](#gui-integration). If you prefer the terminal, thanks to the shell completion scripts, you don't need to memorize any of the options. There's an Easter egg to revisit random forgotten bookmarks too. @@ -160,6 +160,7 @@ Shell completion scripts for Bash, Fish and Zsh can be found in respective subdi special keyword - "blank": list entries with empty title/tag --deep match substrings ('pen' matches 'opened') + --sreg expr run a regex search --st, --stag [...] search bookmarks by tag list tags alphabetically, if no arguments @@ -224,6 +225,7 @@ Shell completion scripts for Bash, Fish and Zsh can be found in respective subdi - -s : match any of the keywords in URL, title or tags. - -S : match all the keywords in URL, title or tags. - --deep : match **substrings** (`match` matches `rematched`) in URL, title and tags. + - --sreg : match a regular expression (ignores --deep). - --st : search bookmarks by tag, or show all tags alphabetically. - Search results are indexed serially. This index is different from actual database index of a bookmark record which is shown in bold within `[]` after the URL. - **Encryption** is optional and manual. AES256 algorithm is used. To use encryption, the database file should be unlocked (-k) before using buku and locked (-l) afterwards. Between these 2 operations, the database file lies unencrypted on the disk, and NOT in memory. Also, note that the database file is *unencrypted on creation*. diff --git a/buku b/buku index cb2520f..d124863 100755 --- a/buku +++ b/buku @@ -668,7 +668,8 @@ class BukuDb: self.conn.commit() - def searchdb(self, keywords, all_keywords=False, delete=False, deep=False): + def searchdb(self, keywords, all_keywords=False, delete=False, deep=False, + regex=False): '''Search the database for an entries with tags or URL or title info matching keywords and list those. @@ -699,7 +700,8 @@ class BukuDb: else: # Match any keyword in URL or Title for token in keywords: if not deep: - token = '\\b' + token + '\\b' + if not regex: + token = '\\b' + token + '\\b' query = '%s tags REGEXP ? OR URL REGEXP ? OR metadata \ REGEXP ? OR desc REGEXP ? OR' % (query) else: @@ -1726,6 +1728,7 @@ if __name__ == '__main__': special keyword - "blank": list entries with empty title/tag --deep match substrings ('pen' matches 'opened') +--sreg expr run a regex search --st, --stag [...] search bookmarks by tag list tags alphabetically, if no arguments''') addarg = search_grp.add_argument @@ -1733,6 +1736,7 @@ if __name__ == '__main__': help=argparse.SUPPRESS) addarg('-S', '--sall', nargs='+', metavar='keyword', help=argparse.SUPPRESS) + addarg('--sreg', nargs=1, metavar='keyword', help=argparse.SUPPRESS) addarg('--deep', dest='deep', action='store_true', help=argparse.SUPPRESS) addarg('--st', '--stag', nargs='*', dest='stag', action=CustomTagSearchAction, metavar='keyword', @@ -1907,6 +1911,10 @@ if __name__ == '__main__': else: bdb.searchdb(args.sall, True, (args.delete is not None), args.deep) + # Run a regular expression search + elif args.sreg is not None: + bdb.searchdb(args.sreg, False, (args.delete is not None), regex=True) + # Search bookmarks by tag and delete if wanted elif tagsearch: if len(args.stag) > 0: diff --git a/buku.1 b/buku.1 index 4ac112b..93c4dbc 100644 --- a/buku.1 +++ b/buku.1 @@ -51,6 +51,7 @@ URLs are unique in DB. The same URL cannot be added twice. - -s : match any of the keywords in URL, title or tags. - -S : match all the keywords in URL, title or tags. - --deep : match \fBsubstrings\fR (`match` matches `rematched`) in URL, title and tags. + - --sreg : match a regular expression (ignores --deep). - --st : search bookmarks by tag, or show all tags alphabetically. - Search results are indexed serially. This index is different from actual database index of a bookmark record which is shown in bold within '[]' after the URL. .PP @@ -95,6 +96,9 @@ Special keyword: .br "blank": list entries with empty title/tag .TP +.BI \--sreg " expr" +Scan for a regular expression match. +.TP .BI \--deep Search modifier to match substrings. Works with -s, -S. .TP