132 lines
3.5 KiB
Bash
Executable File
132 lines
3.5 KiB
Bash
Executable File
#!/usr/local/plan9/bin/rc
|
|
|
|
# Journal interval: daily, weekly, monthly, yearly
|
|
interval=daily
|
|
|
|
# Title format: full, date, day, year
|
|
# Examples:
|
|
# full: "wednesday 12 november 2025 22:11"
|
|
# date: "wednesday 12 november 2025"
|
|
# day: "wednesday"
|
|
# year: "2025"
|
|
titleformat=full
|
|
|
|
# Signature (optional, added to filename as ==signature)
|
|
signature=''
|
|
|
|
# Parse time offset argument (e.g., +2d, -3h, +15m)
|
|
offset=0
|
|
if(! ~ $#* 0) {
|
|
arg=$1
|
|
# Extract components using awk
|
|
sign=`{echo $arg | awk '{print substr($0,1,1)}'}
|
|
num=`{echo $arg | awk '{s=substr($0,2); sub(/[a-z]$/,"",s); print s}'}
|
|
unit=`{echo $arg | awk '{print substr($0,length($0))}'}
|
|
|
|
# Calculate offset in seconds
|
|
switch($unit) {
|
|
case d
|
|
offset=`{hoc -e 'int('$num' * 86400)'}
|
|
case h
|
|
offset=`{hoc -e 'int('$num' * 3600)'}
|
|
case m
|
|
offset=`{hoc -e 'int('$num' * 60)'}
|
|
}
|
|
|
|
# Apply sign
|
|
if(~ $sign '-') {
|
|
offset=`{hoc -e 'int(-1 * '$offset')'}
|
|
}
|
|
}
|
|
|
|
# Calculate reference timestamp based on interval
|
|
epoch=`{date -n}
|
|
|
|
# Adjust epoch to interval start if no offset provided
|
|
if(~ $#* 0) {
|
|
switch($interval) {
|
|
case weekly
|
|
# Get start of week (Monday)
|
|
# date outputs: Sun Nov 24 07:30:00 EST 2025
|
|
dow=`{date $epoch | awk '{print $1}'}
|
|
# Calculate days since Monday (Mon=0, Tue=1, ..., Sun=6)
|
|
daysback=0
|
|
switch($dow) {
|
|
case Mon; daysback=0
|
|
case Tue; daysback=1
|
|
case Wed; daysback=2
|
|
case Thu; daysback=3
|
|
case Fri; daysback=4
|
|
case Sat; daysback=5
|
|
case Sun; daysback=6
|
|
}
|
|
epoch=`{hoc -e 'int('$epoch' - ('$daysback' * 86400))'}
|
|
case monthly
|
|
# Get start of month (day 1)
|
|
# Extract year, month from current date
|
|
yearmonth=`{date $epoch | awk '{print $6 " " $2}'}
|
|
# Use date with format: Nov 1 2025
|
|
epoch=`{date -n `{echo $yearmonth | awk '{print $2 " 1 " $1}'}}
|
|
case yearly
|
|
# Get start of year (Jan 1)
|
|
year=`{date $epoch | awk '{print $6}'}
|
|
epoch=`{date -n 'Jan 1 '^$year}
|
|
}
|
|
}
|
|
|
|
targetepoch=`{hoc -e 'int('$epoch' + '$offset')'}
|
|
|
|
# Get formatted date (e.g., "Wednesday 12 November 2025 22:11")
|
|
datefull=`{date $targetepoch | awk '
|
|
BEGIN {
|
|
m["Jan"]="January"; m["Feb"]="February"; m["Mar"]="March"
|
|
m["Apr"]="April"; m["May"]="May"; m["Jun"]="June"
|
|
m["Jul"]="July"; m["Aug"]="August"; m["Sep"]="September"
|
|
m["Oct"]="October"; m["Nov"]="November"; m["Dec"]="December"
|
|
d["Sun"]="Sunday"; d["Mon"]="Monday"; d["Tue"]="Tuesday"
|
|
d["Wed"]="Wednesday"; d["Thu"]="Thursday"; d["Fri"]="Friday"
|
|
d["Sat"]="Saturday"
|
|
}
|
|
{
|
|
split($4, t, ":")
|
|
print d[$1], $3, m[$2], $6, t[1]":"t[2]
|
|
}'}
|
|
|
|
# Format title based on titleformat setting
|
|
switch($titleformat) {
|
|
case full
|
|
title=`{echo $datefull | awk '{print tolower($0)}'}
|
|
case date
|
|
title=`{echo $datefull | awk '{print tolower($1 " " $2 " " $3 " " $4)}'}
|
|
case day
|
|
title=`{echo $datefull | awk '{print tolower($1)}'}
|
|
case year
|
|
title=`{echo $datefull | awk '{print $4}'}
|
|
case *
|
|
# Default to full if invalid format specified
|
|
title=`{echo $datefull | awk '{print tolower($0)}'}
|
|
}
|
|
|
|
# Always filter by date only (ignore time) to find existing entries for the interval
|
|
filtertitle=`{echo $datefull | awk '{print tolower($1 " " $2 " " $3 " " $4)}'}
|
|
|
|
# Apply filter
|
|
echo 'filter title:'''$"filtertitle'''' | 9p write denote/ctl
|
|
|
|
# Check if there are any results
|
|
results=`{9p read denote/index}
|
|
|
|
# If no results, create new journal entry
|
|
if(~ $#results 0) {
|
|
if(! ~ $signature '') {
|
|
echo '''journal/:'$"title'=='^$signature''' journal' | 9p write denote/new
|
|
}
|
|
if not {
|
|
echo '''journal/:'$"title''' journal' | 9p write denote/new
|
|
}
|
|
}
|
|
if not Denote 'denote:'$results(1)
|
|
|
|
# Clear filter
|
|
echo 'filter' | 9p write denote/ctl
|