Marty Oehme
643deaebec
The `papis tags` command is extended with the functionality to not just display all tags used in current query, sorted alphabetically, but also to display how often they appear. Use `papis tags -c` to show a space-separated count of how often each tag is used next to the tag name, in descending order.
58 lines
1.6 KiB
Python
Executable file
58 lines
1.6 KiB
Python
Executable file
#!/usr/bin/env python
|
|
# papis-short-help: List all tags occuring in query items
|
|
#
|
|
# Takes a query and spits out a sorted list of all tags contained therein,
|
|
# nothing more.
|
|
# Can be very useful for things like picking a tag or two and listing all
|
|
# items that contain it:
|
|
# $ papis tags "*" | fzf | xargs papis show "tags:{}"
|
|
|
|
import argparse
|
|
from papis import database
|
|
from papis.database.base import Database
|
|
|
|
from papis.document import Document
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
"--count", "-c", help="the query to search for", action="store_true"
|
|
)
|
|
parser.add_argument("query", nargs="*", help="the query to search for", default="*")
|
|
args = parser.parse_args()
|
|
|
|
|
|
def main(db: Database, args) -> None:
|
|
query = " ".join(args.query)
|
|
docs: list[Document] = db.query(query)
|
|
|
|
all_tags: dict[str, int] = {}
|
|
for doc in docs:
|
|
t: list[str] | str = doc.get("tags", "")
|
|
tags = (
|
|
t.replace(";", ",").replace(" ", "").split(",") if isinstance(t, str) else t
|
|
)
|
|
|
|
for tag in tags:
|
|
if tag == '':
|
|
continue
|
|
all_tags[tag] = all_tags.get(tag, 0) + 1
|
|
|
|
if args.count:
|
|
print_tags_and_counts(all_tags)
|
|
else:
|
|
print_tags_only(all_tags)
|
|
|
|
def print_tags_only(all_tags):
|
|
for tag in sorted(all_tags):
|
|
print(tag)
|
|
|
|
def print_tags_and_counts(all_tags):
|
|
for tag, count in sorted(all_tags.items(), key=lambda d: d[1], reverse=True):
|
|
if args.count:
|
|
print(tag, count)
|
|
else:
|
|
print(tag)
|
|
|
|
if __name__ == "__main__":
|
|
main(database.get(), args)
|