-
Notifications
You must be signed in to change notification settings - Fork 2
/
org-tasks-file-sync.ts
66 lines (59 loc) · 1.93 KB
/
org-tasks-file-sync.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { LRParser } from '@lezer/lr';
import { TFile, Vault, EventRef } from "obsidian";
import { OrgmodePluginSettings } from 'settings';
import { OrgmodeTask, parseOrgmodeTasks, cycleOrgmodeTaskStatusContent } from 'org-tasks';
export class OrgTasksSync {
private onModifiedRef: EventRef | null
private unloaded: boolean
constructor(
private settings: OrgmodePluginSettings,
private orgmodeParser: LRParser,
private vault: Vault
) {
this.vault = vault
this.settings = settings
this.onModifiedRef = null
this.unloaded = false
this.orgmodeParser = orgmodeParser
}
public onunload() {
if (!this.unloaded) {
if (this.onModifiedRef !== null) {
this.vault.offref(this.onModifiedRef)
}
this.unloaded = true
}
}
public onmodified(tfile: TFile, callback: (tasks: OrgmodeTask[]) => any) {
if (this.unloaded) {
return
}
if (this.onModifiedRef !== null) {
this.vault.offref(this.onModifiedRef)
}
this.onModifiedRef = this.vault.on("modify", async (file: TFile) => {
if (file !== tfile) {
return
}
const newest_orgmode_content = await this.vault.read(tfile)
const orgmode_tasks: Array<OrgmodeTask> = parseOrgmodeTasks(newest_orgmode_content, this.settings, this.orgmodeParser)
callback(orgmode_tasks)
})
}
public async updateTaskStatus(tfile: TFile, orgmode_task: OrgmodeTask): Promise<void> {
if (this.unloaded) {
return
}
await this.vault.process(tfile, (newest_orgmode_content: string) => {
const replaced_content = cycleOrgmodeTaskStatusContent(orgmode_task, newest_orgmode_content)
return replaced_content
})
}
public async getTasks(tfile: TFile): Promise<OrgmodeTask[]> {
if (this.unloaded) {
return
}
const orgmode_tasks: Array<OrgmodeTask> = parseOrgmodeTasks(await this.vault.read(tfile), this.settings, this.orgmodeParser)
return orgmode_tasks
}
}