diff --git a/jrnl/Journal.py b/jrnl/Journal.py index a7b6521b..a405debe 100644 --- a/jrnl/Journal.py +++ b/jrnl/Journal.py @@ -131,7 +131,7 @@ class Journal(object): if n: self.entries = self.entries[-n:] - def filter(self, tags=[], start_date=None, end_date=None, starred=False, strict=False, short=False): + def filter(self, tags=[], start_date=None, end_date=None, starred=False, strict=False, short=False, phrase=''): """Removes all entries from the journal that don't match the filter. tags is a list of tags, each being a string that starts with one of the @@ -141,6 +141,8 @@ class Journal(object): starred limits journal to starred entries + phrase limits journal to entries with the given phrase + If strict is True, all tags must be present in an entry. If false, the entry is kept if any tag is present.""" self.search_tags = set([tag.lower() for tag in tags]) @@ -155,6 +157,7 @@ class Journal(object): and (not starred or entry.starred) and (not start_date or entry.date >= start_date) and (not end_date or entry.date <= end_date) + and (phrase in entry.title or phrase in entry.body) ] if short: if tags: diff --git a/jrnl/cli.py b/jrnl/cli.py index 434cfc5c..b6507601 100644 --- a/jrnl/cli.py +++ b/jrnl/cli.py @@ -37,6 +37,7 @@ def parse_args(args=None): reading.add_argument('-and', dest='strict', action="store_true", help='Filter by tags using AND (default: OR)') reading.add_argument('-starred', dest='starred', action="store_true", help='Show only starred entries') reading.add_argument('-n', dest='limit', default=None, metavar="N", help="Shows the last n entries matching the filter. '-n 3' and '-3' have the same effect.", nargs="?", type=int) + reading.add_argument('-p', dest='phrase', metavar="WORD", help="Shows entries with the given phrase.", nargs="*", type=str, default=None) exporting = parser.add_argument_group('Export / Import', 'Options for transmogrifying your journal') exporting.add_argument('--short', dest='short', action="store_true", help='Show only titles or line containing the search tags') @@ -64,7 +65,7 @@ def guess_mode(args, config): elif args.decrypt is not False or args.encrypt is not False or args.export is not False or any((args.short, args.tags, args.edit)): compose = False export = True - elif any((args.start_date, args.end_date, args.on_date, args.limit, args.strict, args.starred)): + elif any((args.start_date, args.end_date, args.on_date, args.limit, args.strict, args.starred)) or args.phrase is not None: # Any sign of displaying stuff? compose = False elif args.text and all(word[0] in config['tagsymbols'] for word in " ".join(args.text).split()): @@ -233,7 +234,8 @@ def run(manual_args=None): start_date=args.start_date, end_date=args.end_date, strict=args.strict, short=args.short, - starred=args.starred) + starred=args.starred, + phrase=' '.join(args.phrase) if args.phrase is not None else '') journal.limit(args.limit) # Reading mode