134 lines
4.2 KiB
Bash
Executable File
134 lines
4.2 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Dmenu for doing everything web related
|
|
|
|
ScriptName=${0##*/}
|
|
Version=1.0.0
|
|
|
|
browser='dbrowsel'
|
|
search_engine='https://duckduckgo.com/?q='
|
|
|
|
# Set menu options:
|
|
SearchWeb='0. Search the web.'
|
|
OpenLink='1. Open a link.'
|
|
OpenBrowser='2. Open a browser.'
|
|
MenuOpen='3. Open a bookmark.'
|
|
MenuSave='4. Create new bookmark.'
|
|
RunFirefox='5. Run Firejailed Firefox.'
|
|
|
|
ChosenMenu=$(printf '%s\n%s\n%s\n%s\n%s\n%s' \
|
|
"$SearchWeb" "$OpenLink" "$OpenBrowser" "$MenuOpen" "$MenuSave" "$RunFirefox" \
|
|
| dmenu -i -l 10 -p "$ScriptName:")
|
|
|
|
# Open browser
|
|
if [ "$ChosenMenu" = "$OpenBrowser" ]; then
|
|
exec dbrowsel &
|
|
fi
|
|
|
|
# Open Link
|
|
if [ "$ChosenMenu" = "$OpenLink" ]; then
|
|
exec dbrowsel $(dmenu -i -l 10 -p "Link:") &
|
|
fi
|
|
|
|
# Search web
|
|
if [ "$ChosenMenu" = "$SearchWeb" ]; then
|
|
search=$(dmenu -l 1 -i -p "Search:")
|
|
[ "$search" ] && $($browser "$search_engine$(echo $search | sed -r 's/ /+/g')") &
|
|
fi
|
|
|
|
# run firefox
|
|
if [ "$ChosenMenu" = "$RunFirefox" ]; then
|
|
gtk-launch Firejail-Firefox
|
|
# Open bookmark:
|
|
elif [ "$ChosenMenu" = "$MenuOpen" ]; then
|
|
buku --np -p -f 5 \
|
|
| awk -F '\t' '{print $1, "-", $2, "#(" $3 ")"}' \
|
|
| dmenu -i -l 30 \
|
|
| awk '{print $1}' \
|
|
| xargs --no-run-if-empty buku --np -o
|
|
# Create bookmark:
|
|
elif [ "$ChosenMenu" = "$MenuSave" ]; then
|
|
# Get the name of the active window:
|
|
ActiveWindow=$(ps -p "$(xdotool getwindowfocus getwindowpid)" -o comm=)
|
|
|
|
# Set the name if the active window is a chromium based browser:
|
|
printf '%s' "$ActiveWindow" | grep -Eq 'chromium|chrome|brave' \
|
|
&& ActiveWindow='chromium-based'
|
|
### Haven't actually checked whether Chromium's window name is chromium.
|
|
|
|
# Get URL/title based on browser:
|
|
if [ "$ActiveWindow" = 'qutebrowser' ]; then
|
|
xdotool search --name qutebrowser key --clearmodifiers y P
|
|
sleep 0.1
|
|
URL=$(xclip -o)
|
|
sleep 0.1
|
|
xdotool search --name qutebrowser key --clearmodifiers y T
|
|
sleep 0.1
|
|
Title=$(xclip -o)
|
|
elif [ "$ActiveWindow" = 'chromium-based' ]; then
|
|
xdotool key --clearmodifiers ctrl+l
|
|
sleep 0.1
|
|
xdotool key --clearmodifiers ctrl+c
|
|
sleep 0.1
|
|
URL=$(xclip -o)
|
|
sleep 0.1
|
|
### Maybe write it to a file in the background to speed it up.
|
|
### Doesn't work for some generated sites.
|
|
Title=$(curl -s "$URL" \
|
|
| awk -F '<title>|</title>' '{for(i=2;i<=NF;i+=2){print $i}}' \
|
|
RS='' \
|
|
| recode html)
|
|
fi
|
|
|
|
# Prompt user to edit the URL:
|
|
EditedURL=$(printf "%s" "$URL" | dmenu -l 1 -p "Edit URL:")
|
|
[ "$EditedURL" ] && URL=$EditedURL
|
|
|
|
# Prompt user to edit the title:
|
|
EditedTitle=$(printf '%s' "$Title" | dmenu -l 1 -p 'Edit title:')
|
|
[ "$EditedTitle" ] && Title=$EditedTitle
|
|
|
|
# Prompt the user to pick tags for the bookmark:
|
|
BukuTags=$(buku --np -t)
|
|
BukuTags=$(printf '%s' "$BukuTags" \
|
|
| grep '[0-9]\..' \
|
|
| awk '{print $2}')
|
|
# awk is POSIX, but means you need to avoid spaces in tags.
|
|
#| grep -oP '(?<=[0-9]\.\s).+(?=\s\([0-9])')
|
|
# grep -oP is non-POSIX, but allows for spaces in tags.
|
|
while true; do
|
|
SelectedTag=$(printf '%s' "$BukuTags" \
|
|
| dmenu -i -l 30 \
|
|
-p "Add tags. SHIFT+ENTER to create a new tag. $Tags")
|
|
[ -z "$SelectedTag" ] && break
|
|
Tags="$Tags$SelectedTag,"
|
|
done
|
|
Tags=$(printf '%s' "${Tags%?}")
|
|
|
|
# Prompt the user to add a comment/description:
|
|
Comment=$(printf '' | dmenu -p 'Input comment:')
|
|
|
|
# Prompt the user whether they want the title and description to not update:
|
|
Immutability=$(printf 'No\nYes' | dmenu -i -p 'Enable immutability?')
|
|
[ "$Immutability" = 'Yes' ] && Immutable='--immutable 1'
|
|
[ "$Immutability" = 'No' ] && Immutable=''
|
|
|
|
# Create a preview for the user to see their input:
|
|
Lock=''
|
|
[ "$Immutability" = 'Yes' ] && Lock='(L)'
|
|
Confirmation=$(printf '%s\nIDN. %s %s\n > %s\n + %s\n # %s' \
|
|
'This is a preview. Press ENTER to confirm or ESCAPE to cancel.' \
|
|
"$Title" "$Lock" "$URL" "$Comment" "$Tags" \
|
|
| dmenu -i -l 5)
|
|
|
|
# If the user pressed ENTER, create the bookmark:
|
|
[ "$Confirmation" ] && \
|
|
buku $(printf '%s %s %s --title %s -c %s %s' \
|
|
'-a' "$URL" "$Tags" "$Title" "$Comment" "$Immutable")
|
|
elif [ -z "$ChosenMenu" ]; then
|
|
exit 1
|
|
else
|
|
printf 'ERROR: invalid selection.\n'
|
|
exit 1
|
|
fi
|