2025-09-06 23:26:35 +01:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
set -o pipefail
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
IFS= read -rd '' USAGE <<EOF
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
Zettel helper script.
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
Usage:
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-23 08:00:00 +01:00
|
|
|
zet create|new|c|n TITLE... : Create a new zettel
|
|
|
|
zet edit|e QUERY... : Search for a zettel and edit it
|
|
|
|
zet help|h : Show this help screen
|
|
|
|
zet id QUERY... : Search for a zettel and display its ID
|
|
|
|
zet latest : Edit the latest zettel
|
|
|
|
zet print|p QUERY... : Search for a zettel and print it
|
|
|
|
zet view|v QUERY... : Search for a zettel and view it
|
|
|
|
zet QUERY... : Print IDs and titles of zettels matching QUERY
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
EOF
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
set -o errexit
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
SELECTED_ZET=''
|
|
|
|
ZET_DIR=${ZET_DIR:-.}
|
|
|
|
ZET_LIST=()
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_create() {
|
|
|
|
create_zettel "${1^}"
|
|
|
|
}
|
2025-09-07 10:13:24 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_edit() {
|
2025-09-21 19:25:16 +01:00
|
|
|
QUERY="$*"
|
|
|
|
[[ -d "$QUERY" ]] && edit_zet "$QUERY"
|
|
|
|
|
|
|
|
parse_zet_list < <(search_zettel "$QUERY")
|
2025-09-17 23:41:24 +01:00
|
|
|
select_zet
|
|
|
|
edit_zet "$SELECTED_ZET"
|
|
|
|
}
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_id() {
|
|
|
|
parse_zet_list < <(search_zettel "$@")
|
|
|
|
select_zet
|
2025-09-07 00:06:08 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
echo "$SELECTED_ZET"
|
|
|
|
}
|
2025-09-07 10:08:08 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_links() {
|
|
|
|
QUERY="$1"
|
2025-09-07 10:08:08 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
generate_links "$(cmd_search "$QUERY")"
|
|
|
|
}
|
2025-09-07 18:54:55 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_search() {
|
|
|
|
parse_zet_list < <(search_zettel "$@")
|
|
|
|
printf "%s\n" "${ZET_LIST[@]}"
|
|
|
|
}
|
2025-09-07 18:54:55 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_view() {
|
2025-09-21 19:25:16 +01:00
|
|
|
QUERY="$*"
|
|
|
|
if [[ -d "$QUERY" ]]; then
|
|
|
|
view_zettel "$QUERY"
|
|
|
|
exit
|
|
|
|
fi
|
|
|
|
|
|
|
|
parse_zet_list < <(search_zettel "$QUERY")
|
2025-09-17 23:41:24 +01:00
|
|
|
select_zet
|
|
|
|
view_zettel "$SELECTED_ZET"
|
2025-09-06 23:26:35 +01:00
|
|
|
}
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
commit_zettel() {
|
|
|
|
ZID="$1"
|
|
|
|
MESSAGE="$2"
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
if [[ -z "$MESSAGE" ]]; then
|
|
|
|
get_title "$ZID"
|
2025-09-08 23:00:25 +01:00
|
|
|
fi
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
git add "$ZID"
|
|
|
|
git commit -m "$MESSAGE"
|
2025-09-22 22:29:45 +01:00
|
|
|
git push
|
2025-09-17 23:41:24 +01:00
|
|
|
}
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
create_zettel() {
|
|
|
|
TITLE="$1"
|
|
|
|
ZID=$(new_zid)
|
2025-09-07 00:06:08 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
mkdir -p "$ZID"
|
|
|
|
echo "= $TITLE" > "$ZID/index.adoc"
|
|
|
|
edit_file "$ZID/index.adoc"
|
|
|
|
on_save "$ZID"
|
|
|
|
}
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
delete_zettel() {
|
|
|
|
[[ -d "$ZID" ]] && rm -fr "$ZID"
|
|
|
|
commit_zettel "$ZID"
|
|
|
|
}
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
edit_file() {
|
|
|
|
"$EDITOR" "$1"
|
|
|
|
}
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
edit_zet() {
|
|
|
|
edit_file "$1/index.adoc"
|
|
|
|
on_save "$1"
|
2025-09-06 23:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
generate_links() {
|
2025-09-17 23:41:24 +01:00
|
|
|
echo "$1" | while IFS= read -r line; do
|
2025-09-06 23:26:35 +01:00
|
|
|
id="${line%% *}"
|
|
|
|
title="${line#* }"
|
|
|
|
echo "* link:../${id}/index.adoc[${title}]"
|
2025-09-17 23:41:24 +01:00
|
|
|
done
|
2025-09-06 23:26:35 +01:00
|
|
|
}
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
get_latest_zettel() {
|
2025-09-20 22:46:48 +01:00
|
|
|
find . -maxdepth 1 -type d -name '[0-9]*' -printf '%f\n' | sort -nr | head -n 1
|
2025-09-08 23:37:30 +01:00
|
|
|
}
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
get_title() {
|
|
|
|
get_title_from_file "$1/index.adoc"
|
2025-09-08 23:40:36 +01:00
|
|
|
}
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
get_title_from_file() {
|
|
|
|
head -n 1 "$1" | sed -e 's/^[#=] //'
|
2025-09-08 23:28:12 +01:00
|
|
|
}
|
|
|
|
|
2025-09-06 23:26:35 +01:00
|
|
|
main() {
|
2025-09-22 01:53:33 +01:00
|
|
|
case "$1" in
|
2025-09-23 08:00:00 +01:00
|
|
|
create | new | c | n)
|
2025-09-21 19:44:09 +01:00
|
|
|
shift 1
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_create "$@"
|
|
|
|
;;
|
|
|
|
|
|
|
|
edit | e)
|
2025-09-21 19:44:09 +01:00
|
|
|
shift 1
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_edit "$@"
|
|
|
|
;;
|
|
|
|
|
|
|
|
help | h)
|
|
|
|
show_usage
|
|
|
|
;;
|
|
|
|
|
|
|
|
id)
|
2025-09-21 19:44:09 +01:00
|
|
|
shift 1
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_id "$@"
|
|
|
|
;;
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-22 19:14:58 +01:00
|
|
|
latest)
|
|
|
|
ZID="$(get_latest_zettel)"
|
|
|
|
edit_zet "$ZID"
|
|
|
|
;;
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
links | l)
|
2025-09-21 19:44:09 +01:00
|
|
|
shift 1
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_links "$@"
|
|
|
|
;;
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
view | v)
|
2025-09-21 19:44:09 +01:00
|
|
|
shift 1
|
2025-09-17 23:41:24 +01:00
|
|
|
cmd_view "$@"
|
|
|
|
;;
|
|
|
|
|
|
|
|
*)
|
2025-09-21 19:44:09 +01:00
|
|
|
cmd_search "$@"
|
2025-09-17 23:41:24 +01:00
|
|
|
;;
|
|
|
|
esac
|
2025-09-06 23:26:35 +01:00
|
|
|
}
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
new_zid() {
|
2025-09-20 22:15:26 +01:00
|
|
|
EXISTING_ZETTELS=$(find . -maxdepth 1 -type d -regex './[0-9]+' | wc -l)
|
|
|
|
|
|
|
|
echo $((EXISTING_ZETTELS + 1))
|
2025-09-06 23:26:35 +01:00
|
|
|
}
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
on_save() {
|
|
|
|
ZID="$1"
|
2025-09-08 23:18:40 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
if [[ -s "$ZID/index.adoc" ]]; then
|
|
|
|
TITLE=$(get_title "$ZID")
|
|
|
|
commit_zettel "$ZID" "$TITLE"
|
|
|
|
else
|
|
|
|
echo "Deleting empty zettel: $ZID"
|
|
|
|
delete_zettel "$ZID"
|
|
|
|
fi
|
2025-09-06 23:26:35 +01:00
|
|
|
}
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
parse_zet_list() {
|
|
|
|
ZET_LIST=()
|
|
|
|
|
|
|
|
while IFS= read -r ZID; do
|
|
|
|
TITLE=$(get_title "$ZID")
|
|
|
|
ZET_LIST+=("$ZID $TITLE")
|
|
|
|
done
|
2025-09-06 23:26:35 +01:00
|
|
|
}
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
search_zettel() {
|
|
|
|
if [[ "$*" == "latest" ]] || [[ "$*" == "l" ]]; then
|
|
|
|
get_latest_zettel
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
QUERY="$*"
|
|
|
|
|
2025-09-22 01:53:33 +01:00
|
|
|
grep_args=("--extended-regexp")
|
|
|
|
[[ "$QUERY" != "" ]] && grep_args+=("--word-regex")
|
|
|
|
|
|
|
|
git grep -i --name-only "${grep_args[@]}" "$QUERY" | grep -o -E '[0-9]+' | sort -un
|
2025-09-17 23:41:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
select_zet() {
|
|
|
|
if [[ "${#ZET_LIST[@]}" == 0 ]]; then
|
|
|
|
echo "No zettels to select"
|
|
|
|
exit 1
|
|
|
|
fi
|
2025-09-06 23:26:35 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
if [[ "${#ZET_LIST[@]}" == 1 ]]; then
|
|
|
|
SELECTED_ZET=$(awk '{ print $1 }' <<<"${ZET_LIST[0]}")
|
|
|
|
return
|
2025-09-06 23:26:35 +01:00
|
|
|
fi
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
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")
|
2025-09-06 23:26:35 +01:00
|
|
|
}
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
show_usage() {
|
|
|
|
echo "$USAGE"
|
|
|
|
}
|
2025-09-07 10:07:38 +01:00
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
view_zettel() {
|
|
|
|
cat "$1/index.adoc"
|
2025-09-07 10:07:38 +01:00
|
|
|
}
|
|
|
|
|
2025-09-17 23:41:24 +01:00
|
|
|
(cd "$ZET_DIR" && main "$@")
|