Compare commits

..

2 Commits

8 changed files with 22 additions and 45 deletions

View File

@@ -42,7 +42,7 @@ labelWhitespace = whitespace:[ \t\r]+ {
} }
} }
tag = "#" tag:[a-zA-Z0-9-/]+ { tag = "#" tag:[a-zA-Z0-9-]+ {
return { return {
span: "tag", span: "tag",
value: tag.join("") value: tag.join("")
@@ -74,15 +74,13 @@ delete = type:deleteIcon _ action:[a-zA-Z]+ {
/**************************************************************************************************************************************/ /**************************************************************************************************************************************/
reminder = reminderIcon _ time:(defaultTime / longTime / shortTime)|..,(_ "," _)| { reminder = reminderIcon _ time:(longTime / shortTime)? {
return { return {
feature: "reminder", feature: "reminder",
time time
} }
} }
defaultTime = "_"
longTime = hour:[0-9]|1..2| ":" minute:[0-9]|1..2| { longTime = hour:[0-9]|1..2| ":" minute:[0-9]|1..2| {
return `${hour.join("").padStart(2, '0')}:${minute.join("").padStart(2, '0')}`; return `${hour.join("").padStart(2, '0')}:${minute.join("").padStart(2, '0')}`;
} }

View File

@@ -7,5 +7,5 @@ buildNpmPackage {
pname = "obsidian-tasks-reminder"; pname = "obsidian-tasks-reminder";
version = "0.0.1"; version = "0.0.1";
src = ./.; src = ./.;
npmDepsHash = "sha256-qSCP2eerP9oQcpLsEj2XE2X6vap8MMTuydzWItlAHuA="; npmDepsHash = "sha256-aWFq1EFyz9PpKTaQaCjpxN89Zj1pvRxdku4HX4PEXbM=";
} }

View File

@@ -16,14 +16,14 @@ const backends = [
export async function remind(config: Config, profileConfig: ProfileConfig, db: TaskDatabase) { export async function remind(config: Config, profileConfig: ProfileConfig, db: TaskDatabase) {
const now = dayjs().format("HH:mm"); const now = dayjs().format("HH:mm");
await run(config, profileConfig, db[now]); await run(config, profileConfig, db, db[now]);
if(profileConfig?.defaultTime && profileConfig?.defaultTime === now) { if(profileConfig?.defaultTime && profileConfig?.defaultTime === now) {
run(config, profileConfig, db._); run(config, profileConfig, db, db.default);
} }
} }
async function run(config: Config, profileConfig: ProfileConfig, tasks?: Task[]) { async function run(config: Config, profileConfig: ProfileConfig, db: TaskDatabase, tasks?: Task[]) {
if(!tasks) { if(!tasks) {
return; return;
} }

View File

@@ -164,10 +164,10 @@ function defaultMapper(task: Task): NtfyDTO {
} }
} }
function defaultCombineMapper(tasks: Task[], bullet = (index: number) => "-"): NtfyDTO { function defaultCombineMapper(tasks: Task[], bullet = "-"): NtfyDTO {
const text = tasks const text = tasks
.toSorted((a, b) => b.priority - a.priority) .toSorted((a, b) => b.priority - a.priority)
.map((t, i) => `${bullet(i)} ${t.label}`) .map(t => `${bullet} ${t.label}`)
.join("\n"); .join("\n");
const priority = mapPriority(Math.max(...tasks.map(t => t.priority))); const priority = mapPriority(Math.max(...tasks.map(t => t.priority)));

View File

@@ -1,10 +1,6 @@
import fs from "fs"; import fs from "fs";
import { Task, TaskDatabase } from "../types/task"; import { Task, TaskDatabase } from "../types/task";
type FlatReminder = {
task: Task;
time: string;
}
/** /**
* Applies the mapper for each task from list, groups them by time and dumps the data into JSON formatted file. * Applies the mapper for each task from list, groups them by time and dumps the data into JSON formatted file.
@@ -25,29 +21,12 @@ export function serializeDatabase(tasks: Task[]): string {
* Applies the mapper for each task from list and groups them by time. * Applies the mapper for each task from list and groups them by time.
*/ */
export function createDatabase(tasks: Task[]): TaskDatabase { export function createDatabase(tasks: Task[]): TaskDatabase {
return tasks
.flatMap(flatTimes)
.reduce(pushTaskToDatabase, {} as TaskDatabase);
}
/** return tasks.filter(t => t.reminder).reduce((acc, t) => {
* Returns list pairs of input task and consecutive reminder times. if (t.reminder) {
* If reminder is missing, returns empty array. (acc[t.reminder] = (acc[t.reminder] || [])).push(t);
* If reminder is empty array, returns ['_'], where '_' designates the default time. };
* @param task input task
* @returns list pairs of input task and consecutive reminder times
*/
function flatTimes(task: Task): FlatReminder[] {
if (task.reminder === undefined) {
return [];
}
return task.reminder.length === 0 return acc;
? [{ task, time: '_' }] }, {} as TaskDatabase);
: task.reminder.map(time => ({ task, time }));
}
function pushTaskToDatabase(db: TaskDatabase, { task, time }: FlatReminder): TaskDatabase {
(db[time] = db[time] ?? []).push(task);
return db;
} }

View File

@@ -128,11 +128,11 @@ export class DynamicTask implements Task {
return this.#features<ParsedTaskDependency>("dependency").find(x => x.type === '⛔')?.deps || []; return this.#features<ParsedTaskDependency>("dependency").find(x => x.type === '⛔')?.deps || [];
} }
get reminder(): string[]|undefined { get reminder(): string|undefined {
const feature = this.parsed.meta.find(x => x.feature === 'reminder'); const feature = this.parsed.meta.find(x => x.feature === 'reminder');
if (feature) { if (feature) {
return feature.time; return feature.time || "default";
} }
return undefined; return undefined;
@@ -209,7 +209,7 @@ export class DynamicTask implements Task {
o("delete", this.onDelete), o("delete", this.onDelete),
o("id", this.id), o("id", this.id),
o("deps", this.dependsOn?.join(",")), o("deps", this.dependsOn?.join(",")),
o("reminder", this.reminder?.join(",")), o("reminder", this.reminder),
o("tags", this.tags.join(",")) o("tags", this.tags.join(","))
]; ];
@@ -255,7 +255,7 @@ export class DynamicTask implements Task {
break; break;
case 'reminder': case 'reminder':
segments.push(['⏰', meta.time.join(",")]); segments.push(['⏰', meta.time]);
break; break;
case 'recurrence': case 'recurrence':

View File

@@ -54,5 +54,5 @@ export type ParsedTaskDependency = {
export type ParsedTaskReminder = { export type ParsedTaskReminder = {
feature: 'reminder'; feature: 'reminder';
time: string[]; time: string;
} }

View File

@@ -17,7 +17,7 @@ export type Task = {
onDelete?: string; onDelete?: string;
id?: string; id?: string;
dependsOn?: string[]; dependsOn?: string[];
reminder?: string[]; reminder?: string;
sourceFile: string; sourceFile: string;
sourceLine: number; sourceLine: number;
source: string; source: string;