#!/usr/bin/env bash set -o pipefail IFS= read -rd '' USAGE < "$ZID/index.adoc" edit_file "$ZID/index.adoc" on_save "$ZID" } delete_zettel() { [[ -d "$ZID" ]] && rm -fr "$ZID" commit_zettel "$ZID" } edit_file() { "$EDITOR" "$1" } edit_zet() { edit_file "$1/index.adoc" on_save "$1" } generate_links() { echo "$1" | while IFS= read -r line; do id="${line%% *}" title="${line#* }" echo "* link:../${id}/index.adoc[${title}]" done } get_latest_zettel() { find . -maxdepth 1 -type d -name '[0-9]*' -printf '%f\n' | sort -r | head -n 1 } get_title() { get_title_from_file "$1/index.adoc" } get_title_from_file() { head -n 1 "$1" | sed -e 's/^[#=] //' } main() { if [[ -z "$COMMAND" ]]; then show_usage exit 1 fi case "$COMMAND" in create | c) cmd_create "$@" ;; edit | e) cmd_edit "$@" ;; help | h) show_usage ;; id) cmd_id "$@" ;; links | l) cmd_links "$@" ;; push) cmd_push ;; search | s) cmd_search "$@" ;; view | v) cmd_view "$@" ;; *) echo "ERROR: $COMMAND" show_usage exit 1 ;; esac } new_zid() { EXISTING_ZETTELS=$(find . -maxdepth 1 -type d -regex './[0-9]+' | wc -l) echo $((EXISTING_ZETTELS + 1)) } on_save() { ZID="$1" if [[ -s "$ZID/index.adoc" ]]; then TITLE=$(get_title "$ZID") commit_zettel "$ZID" "$TITLE" else echo "Deleting empty zettel: $ZID" delete_zettel "$ZID" fi } parse_zet_list() { ZET_LIST=() while IFS= read -r ZID; do TITLE=$(get_title "$ZID") ZET_LIST+=("$ZID $TITLE") done } search_zettel() { if [[ "$*" == "latest" ]] || [[ "$*" == "l" ]]; then get_latest_zettel return fi QUERY="$*" git grep -i --name-only -P "\b$QUERY\b" | grep -o -E '[0-9]+' | sort -un } select_zet() { if [[ "${#ZET_LIST[@]}" == 0 ]]; then echo "No zettels to select" exit 1 fi if [[ "${#ZET_LIST[@]}" == 1 ]]; then SELECTED_ZET=$(awk '{ print $1 }' <<<"${ZET_LIST[0]}") return fi selector if [[ -z "$SELECTED_ZET" ]]; then echo "No zet selected" exit 1 fi } selector() { ITEM=$(printf "%s\n" "${ZET_LIST[@]}" | fzf --prompt="Select a zet: ") SELECTED_ZET=$(awk '{ print $1 }' <<< "$ITEM") } show_usage() { echo "$USAGE" } view_zettel() { cat "$1/index.adoc" } (cd "$ZET_DIR" && main "$@")