#!/usr/bin/env bash
# Yamada Hayao
# Twitter: @Hayao0819
# Email : hayao@fascode.net
#
# kokkiemouse
# Mastodon: @kokkiemouse@mstdn.jp
# Email : kokkiemouse@fascode.net
#
# (c) 2019-2021 Fascode Network.
#
set -e
force=false
fascodelive=false
simulation=false
bookmark_file="${HOME}/.config/gtk-3.0/bookmarks"
remove () {
local _list
local _file
_list=($(echo "$@"))
for _file in "${_list[@]}"; do
if [[ -f ${_file} ]]; then
rm -f "${_file}"
elif [[ -d ${_file} ]]; then
rm -rf "${_file}"
fi
done
}
_help() {
echo "usage ${0} [options] [command]"
echo
echo " General options:"
echo " -f | --force Force overwriting"
echo " -s | --simulation Enable simulation"
echo " -h | --help This help message and exit"
echo
echo " General command:"
echo " add
Add a item to the sidebar"
echo " delete Delete item from the sidebar"
echo " alldelete Delete all sidebar items"
echo " init Initializes the sidebar"
echo " help This help message and exit"
}
output() {
if [[ "${simulation}" = true ]]; then
echo "${@}"
else
echo "${@}" >> "${bookmark_file}"
fi
}
_msg_error() {
echo "${@}" >&2
}
prepare() {
if [[ ! -d "$(dirname "${bookmark_file}")" ]]; then
mkdir -p "$(dirname "${bookmark_file}")"
fi
if [[ ! -f "${bookmark_file}" ]]; then
touch "${bookmark_file}"
fi
}
add() {
if [[ "${simulation}" = false ]]; then
prepare
fi
local dir
for dir in ${@}; do
if [[ ! -d "${dir}" ]]; then
_msg_error "${dir} does not exist."
exit 1
else
output "file://${dir} $(basename "${dir}")"
fi
done
}
delete() {
if [[ ! -f "${bookmark_file}" ]]; then
_msg_error "Bookmark file does not exist."
exit 1
fi
local _dir _count _line_contain _remove_line=() _url _remove_count i=1
for (( i = 1; i <= "${#}"; i++)); do
cd "${PWD}"
_dir="$(eval echo '$'${i})"
_url="$(realpath "${_dir}" | sed "s/ /%20/g")"
cd "${OLDPWD}"
for _count in $(seq 1 $(cat "${bookmark_file}" | wc -l )); do
_line_contain="$(cat "${bookmark_file}" | head -n "${_count}" | tail -n 1 | cut -d ' ' -f 1)"
_line_contain="${_line_contain#file://}"
if [[ "${_url}" = "${_line_contain}" ]] || [[ "${_url}" = "file://${_line_contain}" ]]; then
_remove_line+=("${_count}")
fi
done
_remove_count=0
if (( "${#_remove_line[@]}" == 0 )); then
_msg_error "${_dir} is not registered in the sidebar."
continue
fi
for _count in ${_remove_line[@]}; do
if [[ "${simulation}" = true ]]; then
sed "${_count}d" "${bookmark_file}"
else
_count="$(( _count - _remove_count ))"
sed -i "${_count}d" "${bookmark_file}"
_remove_count="$(( _remove_count + 1 ))"
fi
done
done
}
init() {
if [[ "${simulation}" = false ]]; then
remove "${bookmark_file}"
prepare
fi
source "${HOME}/.config/user-dirs.dirs"
init_dirs=(
"${XDG_DOCUMENTS_DIR}"
"${XDG_DOWNLOAD_DIR}"
"${XDG_MUSIC_DIR}"
"${XDG_PICTURES_DIR}"
"${XDG_VIDEOS_DIR}"
)
local dir
for dir in "${init_dirs[@]}"; do
output "file://${dir} $(basename "${dir}")"
done
}
# Argument analysis and processing
options="${@}"
_opt_short="fhts"
_opt_long="force,help,fascodelive,t-mart,takebayashi,simulation"
OPT=$(getopt -o ${_opt_short} -l ${_opt_long} -- "${@}")
if [[ ${?} != 0 ]]; then
exit 1
fi
eval set -- "${OPT}"
unset OPT
unset _opt_short
unset _opt_long
while true; do
case ${1} in
-s | --simulation)
simulation=true
shift 1
;;
-f | --force)
force=true
shift 1
;;
-h | --help)
_help
shift 1
exit 0
;;
--fascodelive)
fascodelive=true
shift 1
;;
--t-mart)
echo "さすが店長、青春ブタ野郎だね"
shift 1
exit 0
;;
--takebayashi)
echo "竹林さん。チノちゃんかわいい最高!!"
shift 1
exit 0
;;
-t)
if [[ "$(basename $0)" == "alterlinux-gtk-bookmarks" ]]; then
echo "さすが店長、青春ブタ野郎だね"
else
echo "竹林さん。チノちゃんかわいい最高!!"
fi
shift 1
exit 0
;;
--)
shift
break
;;
*)
_msg_error "Invalid argument '${1}'"
_help
exit 1
;;
esac
done
mode="${1}"
case "${1}" in
add)
shift 1
if [[ -z "${*}" ]]; then
_msg_error "Please specify a directory."
exit 1
else
add "${@}"
fi
exit 0
;;
alldelete)
shift 1
if [[ "${simulation}" = false ]]; then
remove "${bookmark_file}"
fi
;;
init)
shift 1
if [[ -f "${bookmark_file}" ]] && [[ "${force}" = false ]] && [[ "${simulation}" = false ]] && [[ -n "$(cat "${bookmark_file}" 2>/dev/null)" ]]; then
_msg_error "The sidebar already exists. Use -f to force initialization."
exit 1
else
init
fi
;;
delete)
shift 1
if [[ -z "${*}" ]]; then
_msg_error "Please specify a directory."
exit 1
else
delete "${@}"
fi
exit 0
;;
help)
shift 1
_help
;;
*)
_msg_error "Please specify a command."
exit 1
;;
esac
if [[ "${fascodelive}" = true ]]; then
remove "${HOME}/.config/autostart/gensidebar.desktop"
fi