#!/usr/bin/env bash set -euo pipefail ############################################################################### # DWRITE — dmenu content opener for krisyotam.com # # Maintainer: Kris Yotam # License: MIT # Created: 2026-02-15 # Updated: 2026-02-22 # Description: Select content type and file via dmenu, open in Typora. # TIL and Now entries open $EDITOR for markdown writing, then # auto-create the entry via generateMetadata.js on save. ############################################################################### CONTENT_DIR="$HOME/content" PROJECT_DIR="$HOME/dev/krisyotam.com" GEN_META="$PROJECT_DIR/public/scripts/keep/generateMetadata.js" # Content types with nerd font icons declare -A TYPE_ICONS=( [blog]="󰬞" [diary]="󰃮" [essays]="󰬝" [fiction]="󰂺" [news]="󰎕" [notes]="󰏪" [ocs]="󰏫" [papers]="󰈙" [progymnasmata]="󰑴" [reviews]="󰓥" [verse]="󱗝" [til]="󰛄" [now]="󰔛" ) CONTENT_TYPES=(blog diary essays fiction news notes ocs papers progymnasmata reviews verse til now) # Select content type type_menu() { local entries="" for t in "${CONTENT_TYPES[@]}"; do entries+="${TYPE_ICONS[$t]:-󰈙} $t"$'\n' done echo "$entries" | dmenu -i -l 13 -p "write:" | awk '{print $2}' } # Select file from content type file_menu() { local type="$1" local dir="$CONTENT_DIR/$type" [[ ! -d "$dir" ]] && exit 1 ls "$dir"/*.mdx 2>/dev/null | xargs -I{} basename {} .mdx | sort | dmenu -i -l 20 -p "$type:" } # Write a TIL entry write_til() { local tmpfile tmpfile="$(mktemp /tmp/dwrite-til-XXXXXX.md)" # Prompt for optional title local title title="$(echo "" | dmenu -p "TIL title (optional):" 2>/dev/null)" || true # Auto-generate title from date if skipped if [[ -z "$title" ]]; then title="$(date +'%B %d, %Y')" fi # Open editor ${EDITOR:-nano} "$tmpfile" # Check if user wrote anything if [[ ! -s "$tmpfile" ]]; then rm -f "$tmpfile" notify-send "dwrite" "TIL entry cancelled (empty file)" 2>/dev/null || true exit 0 fi # Create entry via generateMetadata.js node "$GEN_META" \ --type til \ --title "$title" \ --content-file "$tmpfile" \ --status "Finished" \ --certainty "certain" \ --importance 9 \ --category "til" \ --state "active" rm -f "$tmpfile" notify-send "dwrite" "TIL entry created: $title" 2>/dev/null || true } # Write a Now entry write_now() { local tmpfile tmpfile="$(mktemp /tmp/dwrite-now-XXXXXX.md)" # Auto-generate title from month local title title="$(date +'%B %Y')" # Open editor ${EDITOR:-nano} "$tmpfile" # Check if user wrote anything if [[ ! -s "$tmpfile" ]]; then rm -f "$tmpfile" notify-send "dwrite" "Now entry cancelled (empty file)" 2>/dev/null || true exit 0 fi # Create entry via generateMetadata.js node "$GEN_META" \ --type now \ --title "$title" \ --content-file "$tmpfile" \ --status "Finished" \ --certainty "certain" \ --importance 9 \ --category "now" \ --state "active" rm -f "$tmpfile" notify-send "dwrite" "Now entry created: $title" 2>/dev/null || true } # Main type="$(type_menu)" [[ -z "$type" ]] && exit 0 case "$type" in til) write_til ;; now) write_now ;; *) file="$(file_menu "$type")" [[ -z "$file" ]] && exit 0 typora "$CONTENT_DIR/$type/$file.mdx" >/dev/null 2>&1 & disown ;; esac