From d4ade4fe6df2ca4c31e4fa897d989da3313e8166 Mon Sep 17 00:00:00 2001 From: Oliver Davies Date: Sat, 6 Sep 2025 23:26:35 +0100 Subject: [PATCH] Initial commit --- zet | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 zet diff --git a/zet b/zet new file mode 100644 index 0000000..949bb5f --- /dev/null +++ b/zet @@ -0,0 +1,151 @@ +#!/usr/bin/env bash + +set -euo pipefail + +EDITOR="${EDITOR:-nvim}" +ZET_DIR="$HOME/Documents/zet" + +mkdir -p "$ZET_DIR" + +commit_changes() { + filename="$1" + commit_message="$2" + + git -C "$ZET_DIR" diff --quiet "$filename" || { + read -rp "Commit?: " commit_choice + + if [[ "$commit_choice" =~ ^[Yy]$ ]]; then + git -C "$ZET_DIR" add "$filename" + + commit_message="${commit_message//$ZET_DIR\//}" + commit_message="${commit_message//\/index.adoc/}" + + git -C "$ZET_DIR" commit -m "$commit_message" + + echo "Changes committed." + else + echo "Changes not committed." + fi + } +} + +delete_zet() { + id="$1" + dir="${ZET_DIR}/${id}" + + if [[ -d "$dir" ]]; then + mv -v "$dir" "/tmp/zet-${id}" + else + echo "Note not found: $id" >&2 + exit 1 + fi +} + +edit_zet() { + query="$1" + + file="${ZET_DIR}/${query}/index.adoc" + + if [[ -f "$file" ]]; then + "$EDITOR" "$file" + + commit_changes "$file" "Edited $file" + else + result="$(search_zets "$query")" + result_count="$(echo "$result" | grep -c '^')" + + if [[ "$result_count" -eq 0 ]]; then + echo "No results found for query: $query" >&2 + exit 1 + elif [[ "$result_count" -eq 1 ]]; then + id="$(echo "$result" | awk '{print $1}')" + else + selected="$(echo "$result" | sort | fzf)" || exit 0 + + id="$(echo "$selected" | awk '{print $1}')" + fi + + edit_zet "$id" + fi +} + +generate_links() { + query="$1" + + related="$(search_zets "$query")" + + echo "$related" | while IFS= read -r line; do + id="${line%% *}" + title="${line#* }" + echo "* link:../${id}/index.adoc[${title}]" + done | sort +} + +main() { + [[ $# -eq 0 ]] && show_titles && exit + + case "${1:-}" in + delete) delete_zet "$2" ;; + edit) edit_zet "$2" ;; + find|search) shift 1; search_zets "$@" ;; + git) shift 1; run_git_command "$@" ;; + links) generate_links "$2" ;; + new|create) shift 1; new_zet "$@" ;; + source) show_zet "$2" ;; + titles) show_titles ;; + *) search_zets "$1"; + esac +} + +new_zet() { + filename="${ZET_DIR}/$(date "+%Y%m%d%H%M%S")/index.adoc" + mkdir -p "$(dirname "$filename")" + + title="$*" + echo "= $title" > "$filename" + + "$EDITOR" "$filename" + + run_git_command add --intent-to-add "$filename" + commit_changes "$filename" "Added $filename" +} + +run_git_command() { + git -C "$ZET_DIR" "$@" +} + +search_zets() { + query="$*" + + grep --files-with-matches --recursive --ignore-case "$query" "$ZET_DIR" | grep '/index\.adoc$' | while read -r filepath; do + dirpath=$(dirname "$filepath") + relpath="${dirpath#"$ZET_DIR/"}" + + echo -n "$relpath " + + head -n 1 "$filepath" | sed 's/^= //' + done +} + +show_titles() { + find "$ZET_DIR" -type f -name 'index.adoc' | while read -r filename; do + id=$(basename "$(dirname "$filename")") + title=$(head -n 1 "$filename" | sed 's/^= //' | sed 's/^# //') + + echo "$id $title" + done | sort +} + +show_zet() { + id="$1" + file="${ZET_DIR}/${id}/index.adoc" + + if [[ -f "$file" ]]; then + cat "$file" && exit 0 + fi + + echo "Note not found: $id" >&2 + exit 1 +} + +main "$@"