tags |
---|
meta |
function getMonday(date) {
const dayOfWeek = date.getDay();
const diff = dayOfWeek >= 1 // 1 - for 'Monday', for Sunday - it will be '0'
? dayOfWeek - 1 // 1 - for 'Monday', for Sunday - it will be '0'
: 6 - dayOfWeek;
const monday = new Date(date);
monday.setDate(date.getDate() - diff)
monday.setHours(0,0,0,0)
return monday;
}
function computeDay(dayNumber, offset = 0) {
const monday = getMonday(new Date())
const d = new Date(monday);
d.setDate(monday.getDate() + (dayNumber - 1) + offset)
return d.toISOString().slice(0,10);
}
// Mapping days to their respective ISO day numbers
const daysMapping = {
"Monday": 1, "Tuesday": 2, "Wednesday": 3,
"Thursday": 4, "Friday": 5, "Saturday": 6,
"Sunday": 7,
};
for (const [day, dayNumber] of Object.entries(daysMapping)) {
// Register functions (no change needed here)
silverbullet.registerFunction({ name: `last${day}` }, () => computeDay(dayNumber, -7));
silverbullet.registerFunction({ name: `this${day}` }, () => computeDay(dayNumber));
silverbullet.registerFunction({ name: `next${day}` }, () => computeDay(dayNumber, 7));
}
## Last week's days
- Monday: `{{lastMonday}}`
- Tuesday: `{{lastTuesday}}`
- Wednesday: `{{lastWednesday}}`
- Thursday: `{{lastThursday}}`
- Friday: `{{lastFriday}}`
- Saturday: `{{lastSaturday}}`
- Sunday: `{{lastSunday}}`
## This week's days
- Monday: `{{thisMonday}}`
- Tuesday: `{{thisTuesday}}`
- Wednesday: `{{thisWednesday}}`
- Thursday: `{{thisThursday}}`
- Friday: `{{thisFriday}}`
- Saturday: `{{thisSaturday}}`
- Sunday: `{{thisSunday}}`
## Next week's days
- Monday: `{{nextMonday}}`
- Tuesday: `{{nextTuesday}}`
- Wednesday: `{{nextWednesday}}`
- Thursday: `{{nextThursday}}`
- Friday: `{{nextFriday}}`
- Saturday: `{{nextSaturday}}`
- Sunday: `{{nextSunday}}`
function isPast(date) {
return Temporal.PlainDate.compare(Temporal.Now.plainDateISO(), date) > 0
}
function isFuture(date) {
return Temporal.PlainDate.compare(Temporal.Now.plainDateISO(), date) < 0
}
function isToday(date) {
return Temporal.PlainDate.compare(Temporal.Now.plainDateISO(), date) === 0
}
function prettifyDuration({ direction, duration }) {
const outStr = [];
if (duration.years > 0) {
outStr.push(`${duration.years}Y`)
}
if (duration.months > 0) {
outStr.push(`${duration.months}M`)
}
if (duration.days > 0) {
outStr.push(`${duration.days}D`)
}
if (duration.hours > 0) {
outStr.push(`${duration.hours}H`)
}
if (duration.minutes > 0) {
outStr.push(`${duration.minutes}m`)
}
if (outStr.length === 0) {
outStr.push("Now!")
}
const prefix = (direction === 'past') ? 'Passed: ' : 'Remains: '
return prefix + outStr.join('/')
}
function DateDiffString(rawDate) {
const parsedDate = Temporal.PlainDateTime.from(rawDate);
const now = Temporal.Now.plainDateTimeISO();
const duration = isPast(parsedDate)
? ({
direction: 'past',
duration: now.since(parsedDate, { largestUnit: 'years', smallestUnit: 'minute' })
})
: ({
direction: 'future',
duration: now.until(parsedDate, { largestUnit: 'years', smallestUnit: 'minute' })
})
return duration
}
function untilDateAnniversary(rawDate) {
const parsedDate = Temporal.PlainDateTime.from(rawDate);
const now = Temporal.Now.plainDateTimeISO();
const thisYearDate = new Temporal.PlainDate(
now.year, parsedDate.month, parsedDate.day,
parsedDate.hours, parsedDate.minutes
);
const nextYearDate = new Temporal.PlainDate(
now.year + 1, parsedDate.month, parsedDate.day,
parsedDate.hours, parsedDate.minutes
);
const duration = isPast(thisYearDate)
? now.until(nextYearDate, { largestUnit: 'years', smallestUnit: 'minute' })
: now.until(thisYearDate, { largestUnit: 'years', smallestUnit: 'minute' });
return ({
direction: 'future',
duration: duration
})
}
silverbullet.registerFunction("untilDate", (rawDate, yearly = false) => {
if (yearly) {
return prettifyDuration(untilDateAnniversary(rawDate));
} else {
return prettifyDuration(DateDiffString(rawDate))
}
})
{{untilDate("1995-05-15", true)}}
{{untilDate("1995-05-15")}}
{{untilDate("2024-08-18")}}