diff --git a/.local/bin/chadmarked b/.local/bin/chadmarked new file mode 100644 index 00000000..414eac95 --- /dev/null +++ b/.local/bin/chadmarked @@ -0,0 +1,95 @@ +#!/bin/sh + +URLQUERY_FILE="~/.local/share/larbs/urlquery" +ACTION_MENU='@@' + +read_bookmarks() { + if [ ! -f "$URLQUERY_FILE" ] || [ ! -s "$URLQUERY_FILE" ]; then + echo "[]" + else + jq '.' "$URLQUERY_FILE" + fi +} + +write_bookmarks() { + echo "$1" > "${URLQUERY_FILE}.tmp" && mv "${URLQUERY_FILE}.tmp" "$URLQUERY_FILE" +} + +update_bookmark_popularity() { + jq --arg name "$1" '(.[] | select(.[0] == $name))[2] += 1' +} + +contains_search() { + case "$1" in + *"search"*) return 0 ;; + *) return 1 ;; + esac +} + +bookmarks=$(read_bookmarks) + + while true; do + SELECTION=$(echo "$bookmarks" | jq -r '. | sort_by(.[2]) | reverse | .[] | .[0]' | dmenu -l 10 -p "Bookmarks") + + if [ -z "$SELECTION" ] || [ "$SELECTION" != "$ACTION_MENU" ]; then + write_bookmarks "$bookmarks" + break + fi + + ACTION=$(echo "Add a New Bookmark\nDelete a Bookmark\nEdit a Bookmark" | dmenu -l 3 -p "Action") + + case "$ACTION" in + "Add a New Bookmark") + URL=$(xclip -o) + if echo "$URL" | grep -q "^http"; then + if ! echo "$bookmarks" | jq -e --arg url "$URL" '.[] | select(.[1] == $url)' > /dev/null; then + NAME=$(dmenu -l 0 -p "Name") + bookmarks=$(echo "$bookmarks" | jq --arg name "$NAME" --arg url "$URL" '. |= .+ [[ $name, $url, 0 ]]') + notify-send "'$NAME' is bookmarked." + else + notify-send "The URL is already in the list." + fi + else + notify-send "The clipboard content is not a valid URL." + fi + ;; + "Delete a Bookmark") + NAME=$(echo "$bookmarks" | jq -r '.[] | .[0]' | dmenu -p "Delete") + if [ -n "$NAME" ]; then + bookmarks=$(echo "$bookmarks" | jq --arg name "$NAME" 'del(.[] | select(.[0] == $name))') + notify-send "'$NAME' is deleted." + fi + ;; + "Edit a Bookmark") + NAME=$(echo "$bookmarks" | jq -r '.[] | .[0]' | dmenu -p "Edit") + FIELD=$(echo "name\nURL" | dmenu -l 2 -p "Edit") + + if [ -n "$NAME" ] && [ -n "$FIELD" ]; then + NEW_VALUE=$(dmenu -l 0 -p "New $FIELD") + if [ "$FIELD" = "name" ]; then + bookmarks=$(echo "$bookmarks" | jq --arg name "$NAME" --arg new_name "$NEW_VALUE" '(.[] | select(.[0] == $name))[0] = $new_name') + else + bookmarks=$(echo "$bookmarks" | jq --arg name "$NAME" --arg new_url "$NEW_VALUE" '(.[] | select(.[0] == $name))[1] = $new_url') + fi + notify-send "'$NAME' is updated." + fi + ;; + esac +done + +if [ -n "$SELECTION" ] && [ "$SELECTION" != "$ACTION_MENU" ]; then + URL=$(echo "$bookmarks" | jq -r --arg name "$SELECTION" '.[] | select(.[0] == $name) | .[1]') + + if [ -z "$URL" ] || [ "$URL" = "null" ]; then + exit 0 + fi + + if contains_search "$URL"; then + QUERY=$(dmenu -l 0 -p "Search") + URL="${URL}${QUERY}" + fi + + bookmarks=$(echo "$bookmarks" | update_bookmark_popularity "$SELECTION") + write_bookmarks "$bookmarks" + $BROWSER "$URL" +fi