dotfiles

My personal shell configs and stuff
git clone git://git.alex.balgavy.eu/dotfiles.git
Log | Files | Refs | Submodules | README | LICENSE

commit 0cf3ea8a3cd222fc82220b110b8cbbb307335f9b
parent 0ac5ab33bee74716f38baa63b02921a32c5d4f9c
Author: Alex Balgavy <alex@balgavy.eu>
Date:   Mon, 11 Jan 2021 23:57:55 +0100

pocketbook-notes: improvements & clearing

Added option to clear notes from a book. Plus some misc improvements.

Diffstat:
Mscripts/pocketbook-notes | 86++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 70 insertions(+), 16 deletions(-)

diff --git a/scripts/pocketbook-notes b/scripts/pocketbook-notes @@ -1,22 +1,77 @@ #!/bin/sh die() { printf "%s\n" "$1" >&2 && exit 1; } +usage() { + cat <<EOF +Usage: +pocketbook-notes command /path/to/books.db '%wildcarded%book%title%' + +Commands: + get + clear + prune + help +EOF +} for dep in 'sqlite3' 'sed' 'jq'; do command -v "$dep" >/dev/null 2>&1 || die "Error: $dep not installed." done -[ $# -eq 2 ] || die "Usage: pocketbook-notes /path/to/books.db '%wildcarded%book%title%'" -books_db="$1" -[ -f "$books_db" ] || die "Couldn't read $books_db." -title_wild="$2" -# to grep a whole DB, do: `sqlite3 <filename> .dump | grep -i 'whatever'` -# TODO: maybe do some explicit ordering? -sqlite3 "$books_db" \ - "select Tags.Val - from items join tags on (Items.OID = Tags.ItemID) - where Items.ParentID = (select OID from Books where Title like '$title_wild') - and TypeId = (select OID from TypeNames where TypeName = 'obj.book_mark') - and TagId = (select OID from TagNames where TagName = 'bm.quotation');" \ - | sed '$!s/$/,/; 1s/^/[/; $s/$/]/' \ - | jq -r '.[].text' \ - | sed '/^$/d; s/^/* /'- \ No newline at end of file +case "$1" in + get) + [ $# -eq 3 ] || { usage; die "Three arguments required."; } + books_db="$2" + [ -f "$books_db" ] || die "Couldn't read $books_db." + title_wild="$3" + # to grep a whole DB, do: `sqlite3 <filename> .dump | grep -i 'whatever'` + # don't judge me on that jq script. I know that double-capture sucks. + sqlite3 "$books_db" \ + "pragma foreign_keys = on; + select Tags.Val + from items join tags on (Items.OID = Tags.ItemID) + where Items.ParentID in (select OID from Books where Title like \"$title_wild\") + and TypeId = (select OID from TypeNames where TypeName = \"obj.book_mark\") + and TagId = (select OID from TagNames where TagName = \"bm.quotation\");" \ + | sed '$!s/$/,/; 1s/^/[/; $s/$/]/' \ + | jq -r '[to_entries | .[] | select(.value | has("begin")) | .value] + | map({ + text: (.text | gsub("\n"; "")), + page: (.begin | capture("(?<page>(?<=word\\?page=)[0-9]+)") | .page | tonumber), + offset: (.begin | capture("(?<offs>(?<=offs=)[0-9]+(?=##))") | .offs | tonumber) + }) | sort_by(.page, .offset) | .[].text' \ + | sed '/^$/d; s/^/* /' + ;; + clear) + [ $# -eq 3 ] || { usage; die "Three arguments required."; } + books_db="$2" + [ -f "$books_db" ] || die "Couldn't read $books_db." + title_wild="$3" + printf "Clear all notes from %s? " "$title_wild" + read -r conf + case $conf in + Y*|y*) + sqlite3 "$books_db" \ + "pragma foreign_keys = on; + delete from Items + where OID in (select Tags.ItemID from Tags where Tags.TagId = (select OID from TagNames where TagName = 'bm.quotation')) + and Items.ParentId = (select OID from Books where Title like '$title_wild') + and Items.TypeId = (select OID from TypeNames where TypeName = 'obj.book_mark');" + printf "Notes cleared.\n" + ;; + *) + printf "Cancelled.\n" + exit 0 + ;; + esac + ;; + prune) + printf "TODO: remove all notes from books not present on device.\n" + ;; + help) + usage + exit 0 + ;; + *) + printf "Unsupported command.\n" + ;; +esac