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 :) if [ "$(basename "$0")" = "bm" ] && ! (return >/dev/null 2>&1); then 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 fi