ulthar.xyz > Repos

dotfiles

Seven years worth of accumulated configuration cruft
About Files Commits git clone https://ulthar.xyz/repos/dotfiles/dotfiles.git

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
Generated 2025-03-07 15:24:27 -0700 by RepoRat