dotfiles
Seven years worth of accumulated configuration cruft
dotfiles/scripts/.local/bin/bm
Download raw file: scripts/.local/bin/bm
#!/bin/sh
# A simple bookmark manager
set -e
BM_ROOT="$HOME/wiki/bookmarks"
#### Auxiliaries
bold() { echo -n "<span weight='bold'>$1</span>"; }
name() { full="$(realpath "$1")"; echo "${full##"$BM_ROOT/"}"; }
geturl() { awk '/^URL=.*$/{sub(/^URL=/, "", $1); print $1;}' "$path"; }
pp_bookmark() {
path="$1"
dirname "$path"
echo " └── $(basename "$path")"
echo " └→ $(geturl "$path")"
}
#### Subcommands
bm_rofi_add() {
link="$(xclip -o -sel clipboard)"
mesg="$(bold "Save 🔗") \"$link\""
if [ -n "$link" ]; then
name="$(
find "$BM_ROOT" -type d \
| rofi -no-fixed-num-lines -dmenu -p "Title" -mesg "$mesg"
)"
# If given just a directory, save bookmark to
# domain.tld/subdir/filename.ext under that directory
[ -d "$name" ] && name="$name/${link##*://}"
# If given an absolute path, truncate it to the
# relative part
[ "${name#*"$BM_ROOT"}" != "$name" ] && name="${name##"$BM_ROOT"/}"
if out="$(bm_add "$link" "$name" 2>&1)"; then
notify-send "🔖 Saved bookmark!" "📂 $name\n🔗 $link"
else
rofi -e "$out"
exit 1
fi
else
rofi -e "Can't save bookmark, nothing in clipboard!"
exit 1
fi
}
bm_rofi_select() {
url="$(
find "$BM_ROOT" -type f \
| while read -r path; do name "$path"; done \
| rofi -no-fixed-num-lines -dmenu -p "Copy 🔗" \
| xargs -I {} cat "$BM_ROOT/{}" \
| geturl
)"
if [ -n "$url" ]; then
echo "$url" | xclip -sel clipboard
notify-send "🔖 Bookmark copied to clipboard" "$url"
fi
}
bm_add() {
link="$1"
name="$2"
path="$BM_ROOT/$name"
if [ -f "$path" ]; then
echo "Bookmark already exists!"
return 1
else
mkdir -p "$(dirname "$path")"
printf "[InternetShortcut]\nURL=%s\n" "$link" > "$path"
fi
}
bm_list() {
dir="$1"
if [ -d "$dir" ]; then
dir="$(name "$dir")"
elif [ ! -d "$BM_ROOT/$dir" ]; then
echo "Directory doesn't exist: $dir" 1>&2
fi
find "$BM_ROOT/$dir" | while read -r path; do
if [ -d "$path" ]; then
echo "$path"
elif [ -f "$path" ]; then
echo " └── $(basename "$path")"
echo " └→ $(geturl "$path")"
fi
done
}
bm_find() {
sf "$BM_ROOT" "$1" | while read -r path; do
# Fixme mergre iwth list
pp_bookmark "$path"
done
}
bm_help() {
cat <<-EOF
A simple bookmark manager; usage: bm [command] [arguments]
Commands
bm ra,rofi-add Open a menu to save a bookmark
bm rs,rofi-select Find a bookmark and copy its URL
bm ls,list <dir> List bookmarks, optionally in a folder
bm a,add [url] [name] Add a URL
bm h,help,-h,-help,--help Print this message and exit
EOF
}
####
# FIXME: find and list need some work toe display a good tree output
# but we're otherwise pretty good here :)
cmd="$1"; [ "$#" -gt 0 ] && shift
case "$cmd" in
ra|rofi-add) bm_rofi_add ;;
rs|rofi-select) bm_rofi_select ;;
a|add) bm_add "$1" "$2"; pp_bookmark "$BM_ROOT/$2" ;;
ls|list) bm_list "$1" ;;
f|find) bm_find "$1" ;;
h|help|-h|--help) bm_help bm_help ;;
*) echo "bm: Invalid command '$cmd'" 1>&2; (bm_help) 1>&2; exit 1 ;;
esac