scripts/qb

407 lines
11 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
# Vars {{{
readonly PROGNAME=$(basename "${0}")
readonly NBARGS="${#}"
## Test if DEBUG is already defined (by parent script,…)
[ -z "${DEBUG}" ] && DEBUG=1
## Colors
readonly PURPLE='\033[1;35m'
readonly RED='\033[0;31m'
readonly RESET='\033[0m'
readonly COLOR_DEBUG="${PURPLE}"
# }}}
usage() { # {{{
cat <<- EOF
usage: $PROGNAME [--debug,--help] [--git,--package,--venv]
Try to launch the most appropriate qutebrowser binary:
1. From venv
2. From APT package
3. From Git repository
EXAMPLES:
- Launch qutebrowser
${PROGNAME}
OPTIONS:
-d,--debug
Enable debug messages.
--git
Force to use QuteBrowser from Git repository.
--help
Print this help message.
--package
Force to use QuteBrowser from package.
--venv
Force to use QuteBrowser from Python Virtual ENVironment.
EOF
}
# }}}
define_vars() { # {{{
## List of process pattern to monitor
qutebrowser_proc_pattern="(qutebrowser)"
## Use Qutebrowser from Python Virtual Environment by default
QB_VENV_MODE="0"
## Qutebrowser possibles paths
QB_VENV_PYTHON_PATH="${HOME}/src/qutebrowser-venv/bin/python3"
QB_GIT_REPOSITORY="${HOME}/repos/qutebrowser"
## Store selected content to a temp file
choice_temp_file="$(mktemp -t ${PROGNAME}-XXXXXX.tmp)"
## Variables to get Qutebrowser currents buffers
QUTEBROWSER_SESSION_FILE="/tmp/qutebrowser_buffers_zsbd"
QUTEBROWSER_SOCKET_FILE="${XDG_RUNTIME_DIR}/qutebrowser/ipc-$(echo -n "$USER" | md5sum | cut -d' ' -f1)"
QUTEBROWSER_GLOBAL_CONTENT="/tmp/qutebrowser_global_content"
rm -f -- "${QUTEBROWSER_GLOBAL_CONTENT}" ; touch "${QUTEBROWSER_GLOBAL_CONTENT}"
QUTEBROWSER_QUICKMARK_FILE="${HOME}/.config/qutebrowser/quickmarks"
QUTEBROWSER_BOOKMARK_FILE="${HOME}/.config/qutebrowser/bookmarks/urls"
}
# }}}
debug_message() { # {{{
local_debug_message="${1}"
## Print message if DEBUG is enable (=0)
[ "${DEBUG}" -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' "DEBUG ${PROGNAME}: ${local_debug_message}"
return 0
}
# }}}
error_message() { # {{{
local_error_message="${1}"
local_error_code="${2}"
## Print message if DEBUG is enable (=0)
[ "${DEBUG}" -eq "0" ] && printf '%b\n' "ERROR ${PROGNAME}: ${RED}${local_error_message}${RESET}"
exit "${local_error_code:=66}"
}
# }}}
get_qutebrowser_bin() { # {{{
return_get_qutebrowser_bin="1"
## First try venv {{{
if [ "${QB_VENV_MODE}" -eq "0" ] && [ -f "${QB_VENV_PYTHON_PATH}" ]; then
debug_message "get_qutebrowser_bin \
Qutebrowser from ${RED}venv${COLOR_DEBUG} can be used."
QUTEBROWSER_BIN="${QB_VENV_PYTHON_PATH} -m qutebrowser"
return_get_qutebrowser_bin="0"
### Be sure to skip other MODE if not already defined
[ -z "${QB_PACKAGE_MODE}" ] && QB_PACKAGE_MODE="1"
[ -z "${QB_GIT_MODE}" ] && QB_GIT_MODE="1"
else
debug_message "get_qutebrowser_bin \
Qutebrowser from ${RED}venv${COLOR_DEBUG} not selected or can't be used."
### Be sure to test package MODE
QB_PACKAGE_MODE="0"
fi
## }}}
## Then try package {{{
if [ "${QB_PACKAGE_MODE}" -eq "0" ] && dpkg -l | grep -q qutebrowser ; then
debug_message "get_qutebrowser_bin \
Qutebrowser from ${RED}package${COLOR_DEBUG} will be used."
QUTEBROWSER_BIN="$(command qutebrowser)"
return_get_qutebrowser_bin="0"
### Be sure to skip other MODE if not already defined
[ -z "${QB_GIT_MODE}" ] && QB_GIT_MODE="1"
else
debug_message "get_qutebrowser_bin \
Qutebrowser from ${RED}package${COLOR_DEBUG} not selected or can't be used."
### Allow to try last MODE if not already defined
[ -z "${QB_GIT_MODE}" ] && QB_GIT_MODE="0"
fi
## }}}
## Finally, try git repository {{{
if [ "${QB_GIT_MODE}" -eq "0" ] && [ -f "${QB_GIT_REPOSITORY}/qutebrowser.py" ]; then
QUTEBROWSER_BIN="${QB_GIT_REPOSITORY}/qutebrowser.py --backend webengine"
debug_message "get_qutebrowser_bin \
Qutebrowser from ${RED}Git repository${COLOR_DEBUG} will finally be used."
return_get_qutebrowser_bin="0"
else
debug_message "get_qutebrowser_bin \
Qutebrowser from ${RED}git repository${COLOR_DEBUG} not selected or can't be used."
fi
## }}}
return "${return_get_qutebrowser_bin}"
}
# }}}
is_proc_running() { # {{{
local_proc_pattern="${1}"
local_count_proc_pattern="$(pgrep -f -- "${local_proc_pattern}" | wc -l)"
case "${local_count_proc_pattern}" in
0 ) ## No procs related to this pattern are running
return_proc_running="1"
;;
* ) ## At least one proc seems running
return_proc_running="0"
;;
esac
## Simple debug message to valid current variables
debug_message "is_proc_running \
procs running (with the pattern: ${RED}${local_proc_pattern}${COLOR_DEBUG}) on the current host: ${RED}${local_count_proc_pattern}${COLOR_DEBUG}."
return "${return_proc_running}"
}
# }}}
start_qutebrowser() { # {{{
return_start_qutebrowser="1"
if is_proc_running "${qutebrowser_proc_pattern}"; then
debug_message "start_qutebrowser \
Qutebrowser is already started."
else
debug_message "start_qutebrowser \
No existing instance of Qutebrowser. Starting…" >> /tmp/qb.log
sh -c "${QUTEBROWSER_BIN}"
return_start_qutebrowser="0"
fi
## In any case, be sure to focus to Qutebrowser
focus_to_qutebrowser
return "${return_start_qutebrowser}"
}
# }}}
focus_to_qutebrowser() { # {{{
## Get desktop and window ID of the first "qutebrowser" window
qutebrowser_desktop_id=$(command wmctrl -l | grep --max-count=1 "qutebrowser" | cut -d" " -f3)
qutebrowser_window_id=$(command wmctrl -l | grep --max-count=1 "qutebrowser" | cut -d" " -f1)
debug_message "focus_to_qutebrowser \
Qutebrowser window ID: ${RED}${qutebrowser_window_id}${COLOR_DEBUG} on desktop ID: ${RED}${qutebrowser_desktop_id}${COLOR_DEBUG}."
## Switch to Qutebrowser desktop and first window
command wmctrl -s "${qutebrowser_desktop_id}"
command wmctrl -i -R "${qutebrowser_window_id}"
}
# }}}
get_qutebrowser_buffers() { # {{{
## Clear previous buffers list
[ -f "${QUTEBROWSER_SESSION_FILE}" ] && rm -f -- "${QUTEBROWSER_SESSION_FILE}"
## Run save_buffers.py in Qutebrowser
echo '{"args":[":save-window-and-buffers"], "target_arg":"", "protocol_version":1}' |\
socat - UNIX-CONNECT:"$QUTEBROWSER_SOCKET_FILE"
## Wait to get the buffers list
i="0"
while [ "${i}" -lt "5" ]; do
if [ -f "${QUTEBROWSER_SESSION_FILE}" ]; then
break
else
sleep 0.01
fi
i=$((i+1))
done
sed "s/^/ff /g" "${QUTEBROWSER_SESSION_FILE}" >> "${QUTEBROWSER_GLOBAL_CONTENT}"
}
# }}}
get_qutebrowser_content() { # {{{
[ -S "${QUTEBROWSER_SOCKET_FILE}" ] && get_qutebrowser_buffers
[ -f "${QUTEBROWSER_QUICKMARK_FILE}" ] && sed "s/^/qq /g" "${QUTEBROWSER_QUICKMARK_FILE}" >> "${QUTEBROWSER_GLOBAL_CONTENT}"
[ -f "${QUTEBROWSER_BOOKMARK_FILE}" ] && sed "s/^/bb /g" "${QUTEBROWSER_BOOKMARK_FILE}" >> "${QUTEBROWSER_GLOBAL_CONTENT}"
}
# }}}
search_qb_content() { # {{{
get_qutebrowser_content
debug_message "search_qb_content \
Search in Qutebrowser's content ${QUTEBROWSER_GLOBAL_CONTENT} file."
st -g 90x30+0+540 -n QuteBrowser -t QuteBrowser -e sh -c "cat ${QUTEBROWSER_GLOBAL_CONTENT} | fzf +m > ${choice_temp_file}"
if [ -s "${choice_temp_file}" ]; then
debug_message "search_qb_content \
Store results in ${choice_temp_file}."
return_search_qb_content="0"
else
debug_message "search_qb_content \
Search aborded or can't find matching bookmark."
return_search_qb_content="1"
fi
return "${return_search_qb_content}"
}
# }}}
get_url() { # {{{
local_content=$(cat "${choice_temp_file}")
return_get_url="1"
debug_message "get_url \
Try to manage ${RED}$(cat "${choice_temp_file}")${COLOR_DEBUG}."
case "${local_content}" in
bb*http* ) ## Classic bookmark
url=$(printf "%s" "${local_content}" | sed -e "s;bb \(http.*\) .*;\1;")
return_get_url="0"
debug_message "get_url \
URL from classic bookmark ${RED}${url}${COLOR_DEBUG}."
;;
qq*http* ) ## Quickmark
url=$(printf "%s" "${local_content}" | sed -e "s;qq .*\(http.*\);\1;")
return_get_url="0"
debug_message "get_url \
URL from quickmark ${RED}${url}${COLOR_DEBUG}."
;;
ff*http ) ## Buffer
url=""
return_get_url="1"
debug_message "get_url \
Buffer not yet managed."
;;
* )
debug_message "get_url \
Content not yet managed."
;;
esac
return "${return_get_url}"
}
# }}}
open_in_qutebrowser() { # {{{
debug_message "open_in_qutebrowser \
Try to open ${RED}${url}${COLOR_DEBUG}"
sh -c "${QUTEBROWSER_BIN} ${url}"
}
# }}}
goto_existing_qutebrowser() { # {{{
debug_message "goto_existing_qutebrowser \
Try to open content in existing instance."
## Try to open Qutebrowser content
search_qb_content \
&& get_url \
&& open_in_qutebrowser
return 0
}
# }}}
main() { # {{{
## Define all vars
define_vars
## Try to get a working qutebrowser binary
### Or exit with error message and code 1
get_qutebrowser_bin \
|| error_message "Can't find a working qutebrowser binary." "1"
## Start Qutebrowser if needed
### And exit
start_qutebrowser \
&& exit 0
## Manage existing instance
goto_existing_qutebrowser \
&& exit 0
}
# }}}
# Manage arguments # {{{
## If there is argument(s)
if [ ! "${NBARGS}" -eq "0" ]; then
manage_arg="0"
# Parse all options (start with a "-") one by one
while printf -- '%s' "${1}" | grep -q -E -- "^-+"; do
case "${1}" in
-d|--debug ) ## Enable debug mode
## Enable DEBUG
DEBUG="0"
;;
--git ) ## Use Git repo
QB_GIT_MODE="0"
;;
-h|--help ) ## help
usage
## Exit after help informations
exit 0
;;
--package ) ## Use package
QB_PACKAGE_MODE="0"
;;
--venv ) ## Use Python venv
QB_VENV_MODE="0"
;;
* ) ## unknow option
printf '%b\n' "${RED}Invalid option: ${1}${RESET}"
printf '%b\n' "---"
usage
exit 1
;;
esac
debug_message "Arguments management \
${RED}${1}${COLOR_DEBUG} option managed."
## Move to the next argument
shift
manage_arg=$((manage_arg+1))
done
debug_message "Arguments management \
${RED}${manage_arg}${COLOR_DEBUG} argument(s) successfully managed."
else
debug_message "Arguments management \
No arguments/options to manage."
fi
# }}}
main
exit 255