~kris/dots

srice

ref: e98f3b030dc24445bd55c68d95d2d81933fd68b3 srice/.local/bin/dmenu/dsnip -rw-r--r-- 2.4 KiB
e98f3b03 — Kris Yotam chore: sync local state after restore (push updates, no pull) a month ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/env bash
###############################################################################
# dsnip — Bookmark launcher: category browse + full-text search via dmenu
#
# DB: ~/.local/share/karbs/bookmarks.db
# Usage:
#   dsnip          — open launcher
#   dsnip-seed     — import legacy snippets file (run once)
#   bm add         — add a bookmark from the terminal
#
# Maintainer:   Kris Yotam <krisyotam@pm.me>
# License:      MIT
# Created:      2026-04-05
###############################################################################

DB="${XDG_DATA_HOME:-$HOME/.local/share}/karbs/bookmarks.db"
CAT_ICON="󰉋  "
DM="dmenu -i -l 25 -c -bw 2"

sqlite3 "$DB" "
  CREATE TABLE IF NOT EXISTS bookmarks (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    name        TEXT NOT NULL,
    url         TEXT NOT NULL UNIQUE,
    category    TEXT NOT NULL DEFAULT 'Uncategorized',
    tags        TEXT NOT NULL DEFAULT '',
    description TEXT NOT NULL DEFAULT ''
  );
" 2>/dev/null

# Escape single quotes for inline SQL
sq() { printf '%s' "${1//\'/\'\'}"; }

build_list() {
    sqlite3 "$DB" "SELECT DISTINCT '${CAT_ICON}' || category FROM bookmarks ORDER BY category;"
    printf '%.0s─' {1..40}; echo
    sqlite3 "$DB" "
        SELECT '[' || category || '] ' || name ||
            CASE WHEN tags != '' THEN '  # ' || tags ELSE '' END
        FROM bookmarks ORDER BY category, name;"
}

chosen=$(build_list | $DM -p "  Bookmarks")
[ -z "$chosen" ] && exit 0
[[ "$chosen" == ─* ]] && exit 0

if [[ "$chosen" == "${CAT_ICON}"* ]]; then
    cat="${chosen#${CAT_ICON}}"
    safe_cat=$(sq "$cat")
    chosen2=$(sqlite3 "$DB" "
        SELECT name || CASE WHEN tags != '' THEN '  # ' || tags ELSE '' END
        FROM bookmarks WHERE category = '${safe_cat}' ORDER BY name;" \
        | $DM -p "  ${cat}")
    [ -z "$chosen2" ] && exit 0
    name=$(printf '%s' "$chosen2" | sed 's/  # .*//')
    safe_name=$(sq "$name")
    url=$(sqlite3 "$DB" "SELECT url FROM bookmarks WHERE category = '${safe_cat}' AND name = '${safe_name}' LIMIT 1;")
else
    name_part=$(printf '%s' "$chosen" | sed 's/  # .*//')
    cat=$(printf '%s' "$name_part" | sed 's/^\[\([^]]*\)\].*/\1/')
    name=$(printf '%s' "$name_part" | sed 's/^\[[^]]*\] //')
    safe_cat=$(sq "$cat")
    safe_name=$(sq "$name")
    url=$(sqlite3 "$DB" "SELECT url FROM bookmarks WHERE category = '${safe_cat}' AND name = '${safe_name}' LIMIT 1;")
fi

[ -z "$url" ] && exit 0
xdg-open "$url" &>/dev/null & disown