main
 1#!/usr/bin/env bash
 2# List denote notes for raffi script filter.
 3# Outputs Alfred Script Filter JSON format.
 4# Usage: denote-raffi [query]
 5set -euo pipefail
 6
 7query="${1:-}"
 8DENOTE_DIR="${HOME}/desktop/org/denotes"
 9
10if [[ ! -d "$DENOTE_DIR" ]]; then
11    jq -n '{"items": [{"title": "Denote directory not found", "subtitle": "'"$DENOTE_DIR"'", "arg": ""}]}'
12    exit 0
13fi
14
15items="[]"
16while IFS= read -r f; do
17    [[ -z "$f" ]] && continue
18    name=$(basename "$f")
19    # Extract title from denote filename: YYYYMMDDTHHMMSS--title__keywords.org
20    title=$(echo "$name" | sed -E 's/^[0-9]{8}T[0-9]{6}--//;s/__.*$//;s/\.org$//;s/-/ /g')
21    # Extract keywords
22    keywords=$(echo "$name" | sed -E 's/^.*__//;s/\.org$//;s/_/, /g')
23    if [[ "$keywords" == "$name" ]]; then
24        keywords=""
25    fi
26    subtitle="$keywords"
27    if [[ -n "$query" ]] && ! echo "$title $keywords" | grep -qi "$query"; then
28        continue
29    fi
30    items=$(jq --arg title "$title" --arg sub "$subtitle" --arg arg "$f" \
31        '. + [{"title": $title, "subtitle": $sub, "arg": $arg}]' <<< "$items")
32done < <(find "$DENOTE_DIR" -name '*.org' -type f | sort -r)
33
34if [[ "$items" == "[]" ]]; then
35    jq -n '{"items": [{"title": "No notes found", "subtitle": "No denote notes matching query", "arg": ""}]}'
36    exit 0
37fi
38
39jq -n --argjson items "$items" '{"items": $items}'