#!/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