รռ0̸̢̲͉̹̙̪̞̮͊̾͛ͅռ avatar

Zettelkasten, but in a /bin/bash script

sn0n

Published: 01 Apr 2024 › Updated: 01 Apr 2024Zettelkasten, but in a /bin/bash script

Zettelkasten, but in a /bin/bash script

With the help of our wonderful overlords, "I" have composed a small bash script to take notes, tag em and move on.
Using #ranger https://github.com/ranger/ranger to explore and #helix https://github.com/helix-editor/helix life's a breeze!! Ok, I still have a little bit of work to do for a fully enjoyable helix experience, but ranger helps >

#!/bin/bash

# Function to create a tag file
create_tag_file() {
    touch "notes/$1.md"
    echo "Created tag file: $1.md"
}


# Function to prepend content to tag file
prepend_content_to_tag_file() {
    # Check if the tag file exists
    if [ -f "notes/$1.md" ]; then
        # Temporarily store the existing content
        existing_content=$(cat "notes/$1.md")
        # Write new content to the tag file
        echo "---" > "notes/$1.md"
        echo "title:$2" >> "notes/$1.md"
        echo "tags: [$3]" >> "notes/$1.md"
        echo "file: $5" >> "notes/$1.md"
        echo "---" >> "notes/$1.md"
        # Append the new content to the existing content
        echo "$4" >> "notes/$1.md"
        echo >> "notes/$1.md"
        echo "$existing_content" >> "notes/$1.md"
    else
        # If the tag file doesn't exist, create it and write the new content
        touch "notes/$1.md"
        echo "---" > "notes/$1.md"
        echo "title:$2" >> "notes/$1.md"
        echo "tags: [$3]" >> "notes/$1.md"
        echo "file: $5" >> "notes/$1.md"
        echo "---" >> "notes/$1.md"
        echo "$4" >> "notes/$1.md"
        echo >> "notes/$1.md"
    fi
}

# Function to format tags
format_tags() {
    # Remove non-alphanumeric characters and convert to lowercase
    tags=$(echo "$1" | tr -cd '[:alnum:] ' | tr '[:upper:]' '[:lower:]')
    # Convert space-separated tags to comma-separated string enclosed in square brackets
    formatted_tags=$(echo "[$tags]" | sed 's/ /,/g')
    echo "$formatted_tags"
}

# Create notes directory if it doesn't exist
mkdir -p notes/zetts

# Prompt user for title
read -p "Enter title: " title

# Prompt user for content
read -p "Enter content: " content

# Prompt user for tags
read -p "Enter tags (separated by spaces): " tags_input

# Format tags
formatted_tags=$(format_tags "$tags_input")

# Generate filename with milliseconds since epoch time
filename=$(date +%s%3N).md

# Limit content to 72 characters per line
formatted_content=$(echo "$content" | fold -s -w 72)

# Create YAML headline and write to file
echo -e "---\ntitle:$title\ntags: $formatted_tags\n---\n$formatted_content\n" > "notes/zetts/$filename"

echo "Zett created: notes/zetts/$filename"

# Insert content into all relevant tag files
IFS=',' read -ra tag_array <<< "${formatted_tags:1:-1}"
for tag in "${tag_array[@]}"; do
    tag=$(echo "$tag" | tr -d '[]')
    if [[ ! -z "$tag" ]]; then
        create_tag_file "$tag"
        prepend_content_to_tag_file "$tag" "$title" "$formatted_tags" "$formatted_content" "$filename"
    fi
done

echo "Content inserted into tag files."

Leave Zettelkasten, but in a /bin/bash script to:

Written by

Witness | Observer | Thinker | Creator => Words & Pictures, Things & Such

Read more #programming posts


Best Posts From รռ0̸̢̲͉̹̙̪̞̮͊̾͛ͅռ

We have not curated any of sn0n's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From รռ0̸̢̲͉̹̙̪̞̮͊̾͛ͅռ