#!/bin/bash # Script to publish markdown files from test/markdown/ to Nostr using nak # Usage: # ./scripts/publish-markdown.sh [filename] [relay1] [relay2] ... # ./scripts/publish-markdown.sh # Interactive mode # ./scripts/publish-markdown.sh tables.md # Publish specific file # ./scripts/publish-markdown.sh tables.md wss://relay.example.com # With relay set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" MARKDOWN_DIR="$PROJECT_ROOT/test/markdown" # Check if nak is installed if ! command -v nak &> /dev/null; then echo "Error: nak is not installed or not in PATH" echo "Install from: https://github.com/fiatjaf/nak" exit 1 fi # Function to publish a markdown file publish_file() { local file_path="$1" shift # Remove first argument, rest are relay URLs local relays=("$@") local filename=$(basename "$file_path") local identifier="${filename%.md}" # Remove .md extension echo "📝 Publishing: $filename" echo " Identifier: $identifier" # Read the markdown content local content=$(cat "$file_path") # Extract title from first H1 if available, otherwise use filename local title=$(echo "$content" | grep -m 1 "^# " | sed 's/^# //' || echo "$identifier") # Build nak command local nak_cmd="nak event -k 30023 -d \"$identifier\" -t \"title=\\\"$title\\\"\" --content -" # Add relays if provided if [ ${#relays[@]} -gt 0 ]; then nak_cmd="$nak_cmd ${relays[*]}" echo " Relays: ${relays[*]}" else echo " Note: No relays specified. Event will be created but not published." echo " Add relay URLs as arguments to publish, e.g.: wss://relay.example.com" fi # Publish as kind 30023 (NIP-23 blog post) # The "d" tag is required for replaceable events (kind 30023) # Using the filename (without extension) as the identifier echo "$content" | eval "$nak_cmd" if [ $? -eq 0 ]; then echo "✅ Successfully published: $filename" else echo "❌ Failed to publish: $filename" return 1 fi } # Check for NOSTR_SECRET_KEY if [ -z "$NOSTR_SECRET_KEY" ]; then echo "⚠️ Warning: NOSTR_SECRET_KEY environment variable not set" echo " You can set it with: export NOSTR_SECRET_KEY=your_key_here" echo " Or use --prompt-sec flag (nak will prompt for key)" echo "" fi # Main logic if [ $# -eq 0 ]; then # No arguments: list all markdown files and let user choose echo "Available markdown files:" echo "" files=("$MARKDOWN_DIR"/*.md) if [ ! -e "${files[0]}" ]; then echo "No markdown files found in $MARKDOWN_DIR" exit 1 fi # Display files with numbers declare -a file_array i=1 for file in "${files[@]}"; do filename=$(basename "$file") echo " $i) $filename" file_array[$i]="$file" ((i++)) done echo "" echo "Enter file number(s) to publish (space-separated), or 'all' for all files:" read -r selection echo "" echo "Enter relay URLs (space-separated, or press Enter to skip):" read -r relay_input # Parse relay URLs relays=() if [ -n "$relay_input" ]; then read -ra relays <<< "$relay_input" fi if [ "$selection" = "all" ]; then # Publish all files for file in "${files[@]}"; do publish_file "$file" "${relays[@]}" echo "" done else # Publish selected files for num in $selection; do if [ -n "${file_array[$num]}" ]; then publish_file "${file_array[$num]}" "${relays[@]}" echo "" else echo "⚠️ Invalid selection: $num" fi done fi else # Argument provided: publish specific file filename="$1" shift # Remove filename, rest are relay URLs relays=("$@") # If filename doesn't end with .md, add it if [[ ! "$filename" =~ \.md$ ]]; then filename="${filename}.md" fi file_path="$MARKDOWN_DIR/$filename" if [ ! -f "$file_path" ]; then echo "Error: File not found: $file_path" exit 1 fi publish_file "$file_path" "${relays[@]}" fi