From e1c0a3cd170af9465d1c0c07b1900e2630dc0d32 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Tue, 27 Sep 2022 17:03:44 +0200 Subject: [PATCH] some more work! --- src/main.ts | 21 +-- src/tracker.ts | 130 ++++++++++-------- .../obsidian-simple-time-tracker/main.js | 110 ++++++++------- test-vault/track-note-test.md | 3 +- 4 files changed, 146 insertions(+), 118 deletions(-) diff --git a/src/main.ts b/src/main.ts index 6a3a55b..5ae4415 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,7 @@ -import { ButtonComponent, MarkdownView, Plugin, TextComponent } from "obsidian"; +import { ButtonComponent, Plugin, TextComponent } from "obsidian"; import { defaultSettings, SimpleTimeTrackerSettings } from "./settings"; import { SimpleTimeTrackerSettingsTab } from "./settings-tab"; -import { Tracker } from "./tracker"; +import { displayTracker, endEntry, isRunning, loadTracker, saveTracker, startEntry, Tracker } from "./tracker"; export default class SimpleTimeTrackerPlugin extends Plugin { @@ -16,18 +16,23 @@ export default class SimpleTimeTrackerPlugin extends Plugin { e.empty(); e.addClass("simple-time-tracker"); - let tracker = Tracker.load(s); + let tracker = loadTracker(s); let name = new TextComponent(e) .setPlaceholder("Name this segment"); new ButtonComponent(e) .setButtonText("Start") - .onClick(() => { - tracker.start(name.getValue()); - - // TODO how do we save to the code block?? - tracker.save(); + .onClick(async () => { + if (isRunning(tracker)) { + endEntry(tracker); + } else { + startEntry(tracker, name.getValue()); + } + name.setValue(""); + await saveTracker(tracker, this.app, i.getSectionInfo(e)); }); + + displayTracker(tracker, e); }); } diff --git a/src/tracker.ts b/src/tracker.ts index cb3fdbb..7bb6ead 100644 --- a/src/tracker.ts +++ b/src/tracker.ts @@ -1,65 +1,75 @@ -import { MarkdownSectionInformation } from "obsidian"; +import { App, MarkdownSectionInformation } from "obsidian"; export class Tracker { - - entries: Entry[] = []; - - display(element: HTMLElement): void { - let list = element.createEl("ul"); - for (let entry of this.entries) - list.createEl("li", { text: entry.toString() }); - } - - - start(name: string): void { - // date constructor returns the current date - let entry = new Entry(name, new Date()); - this.entries.push(entry); - } - - end(): void { - - } - - save(): void { - // TODO save - JSON.stringify(this); - } - - static load(json: string): Tracker { - if (json) { - try { - return JSON.parse(json); - } catch (e) { - console.log(`Failed to parse Tracker from ${json}`); - } - } - return new Tracker(); - } + entries: Entry[]; } -export class Entry { - - private name: string; - private startTime: Date; - private endTime: Date; - - constructor(name: string, startTime: Date) { - this.name = name; - this.startTime = startTime; - } - - toString(): string { - let ret = ""; - if (this.name) - ret += `${this.name}: `; - - // if the days or months are different, we want to add the full date - if (this.startTime.getDay() != this.endTime.getDay() || this.startTime.getMonth() != this.endTime.getMonth()) { - ret += `${this.startTime.toLocaleString()} - ${this.endTime.toLocaleString()}`; - } else { - ret += `${this.startTime.toLocaleTimeString()} - ${this.endTime.toLocaleTimeString()}`; - } - return ret; - } +export interface Entry { + name: string; + startTime: number; + endTime: number; +} + +export function startEntry(tracker: Tracker, name: string): void { + // date constructor returns the current date + let entry: Entry = { name: name, startTime: Date.now(), endTime: null }; + tracker.entries.push(entry); +}; + +export function endEntry(tracker: Tracker): void { + let last = tracker.entries.last(); + last.endTime = Date.now(); +} + +export function isRunning(tracker: Tracker): boolean { + let last = tracker.entries.last(); + return last != null && !last.endTime; +} + +export async function saveTracker(tracker: Tracker, app: App, section: MarkdownSectionInformation): Promise { + let file = app.workspace.getActiveFile(); + let content = await app.vault.cachedRead(file); + + // figure out what part of the content we have to edit + let lines = content.split("\n"); + let prev = lines.filter((_, i) => i <= section.lineStart).join("\n"); + let next = lines.filter((_, i) => i >= section.lineEnd).join("\n"); + // edit only the code block content, leave the rest untouched + content = `${prev}\n${JSON.stringify(tracker)}\n${next}`; + + await app.vault.modify(file, content); +} + +export function loadTracker(json: string): Tracker { + if (json) { + try { + return JSON.parse(json); + } catch (e) { + console.log(`Failed to parse Tracker from ${json}`); + } + } + return { entries: [] }; +} + +export function displayTracker(tracker: Tracker, element: HTMLElement): void { + let list = element.createEl("ul"); + for (let entry of tracker.entries) + list.createEl("li", { text: displayEntry(entry) }); +}; + +export function displayEntry(entry: Entry): string { + // TODO add an option to display this as an interval rather than a from - to string + let ret = ""; + if (entry.name) + ret += `${entry.name}: `; + + let start = new Date(entry.startTime); + ret += `${start.toLocaleString()} - `; + + if (entry.endTime) { + let end = new Date(entry.endTime); + ret += `${end.toLocaleString()}`; + } + + return ret; } diff --git a/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js b/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js index 17a0001..6aa3174 100644 --- a/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js +++ b/test-vault/.obsidian/plugins/obsidian-simple-time-tracker/main.js @@ -72,52 +72,58 @@ var SimpleTimeTrackerSettingsTab = class extends import_obsidian.PluginSettingTa }; // src/tracker.ts -var Tracker = class { - constructor() { - this.entries = []; - } - display(element) { - let list = element.createEl("ul"); - for (let entry of this.entries) - list.createEl("li", { text: entry.toString() }); - } - start(name) { - let entry = new Entry(name, new Date()); - this.entries.push(entry); - } - end() { - } - save() { - JSON.stringify(this); - } - static load(json) { - if (json) { - try { - return JSON.parse(json); - } catch (e) { - console.log(`Failed to parse Tracker from ${json}`); - } +function startEntry(tracker, name) { + let entry = { name, startTime: Date.now(), endTime: null }; + tracker.entries.push(entry); +} +function endEntry(tracker) { + let last = tracker.entries.last(); + last.endTime = Date.now(); +} +function isRunning(tracker) { + let last = tracker.entries.last(); + return last != null && !last.endTime; +} +function saveTracker(tracker, app, section) { + return __async(this, null, function* () { + let file = app.workspace.getActiveFile(); + let content = yield app.vault.cachedRead(file); + let lines = content.split("\n"); + let prev = lines.filter((_, i) => i <= section.lineStart).join("\n"); + let next = lines.filter((_, i) => i >= section.lineEnd).join("\n"); + content = `${prev} +${JSON.stringify(tracker)} +${next}`; + yield app.vault.modify(file, content); + }); +} +function loadTracker(json) { + if (json) { + try { + return JSON.parse(json); + } catch (e) { + console.log(`Failed to parse Tracker from ${json}`); } - return new Tracker(); } -}; -var Entry = class { - constructor(name, startTime) { - this.name = name; - this.startTime = startTime; + return { entries: [] }; +} +function displayTracker(tracker, element) { + let list = element.createEl("ul"); + for (let entry of tracker.entries) + list.createEl("li", { text: displayEntry(entry) }); +} +function displayEntry(entry) { + let ret = ""; + if (entry.name) + ret += `${entry.name}: `; + let start = new Date(entry.startTime); + ret += `${start.toLocaleString()} - `; + if (entry.endTime) { + let end = new Date(entry.endTime); + ret += `${end.toLocaleString()}`; } - toString() { - let ret = ""; - if (this.name) - ret += `${this.name}: `; - if (this.startTime.getDay() != this.endTime.getDay() || this.startTime.getMonth() != this.endTime.getMonth()) { - ret += `${this.startTime.toLocaleString()} - ${this.endTime.toLocaleString()}`; - } else { - ret += `${this.startTime.toLocaleTimeString()} - ${this.endTime.toLocaleTimeString()}`; - } - return ret; - } -}; + return ret; +} // src/main.ts var SimpleTimeTrackerPlugin = class extends import_obsidian2.Plugin { @@ -128,12 +134,18 @@ var SimpleTimeTrackerPlugin = class extends import_obsidian2.Plugin { this.registerMarkdownCodeBlockProcessor("simple-time-tracker", (s, e, i) => { e.empty(); e.addClass("simple-time-tracker"); - let tracker = Tracker.load(s); + let tracker = loadTracker(s); let name = new import_obsidian2.TextComponent(e).setPlaceholder("Name this segment"); - new import_obsidian2.ButtonComponent(e).setButtonText("Start").onClick(() => { - tracker.start(name.getValue()); - tracker.save(); - }); + new import_obsidian2.ButtonComponent(e).setButtonText("Start").onClick(() => __async(this, null, function* () { + if (isRunning(tracker)) { + endEntry(tracker); + } else { + startEntry(tracker, name.getValue()); + } + name.setValue(""); + yield saveTracker(tracker, this.app, i.getSectionInfo(e)); + })); + displayTracker(tracker, e); }); }); } @@ -148,4 +160,4 @@ var SimpleTimeTrackerPlugin = class extends import_obsidian2.Plugin { }); } }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy10YWIudHMiLCAic3JjL3RyYWNrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCwgTWFya2Rvd25WaWV3LCBQbHVnaW4sIFRleHRDb21wb25lbnQgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZGVmYXVsdFNldHRpbmdzLCBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgU2ltcGxlVGltZVRyYWNrZXJTZXR0aW5nc1RhYiB9IGZyb20gXCIuL3NldHRpbmdzLXRhYlwiO1xyXG5pbXBvcnQgeyBUcmFja2VyIH0gZnJvbSBcIi4vdHJhY2tlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2ltcGxlVGltZVRyYWNrZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cclxuXHRzZXR0aW5nczogU2ltcGxlVGltZVRyYWNrZXJTZXR0aW5ncztcclxuXHJcblx0YXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3NUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHJcblx0XHR0aGlzLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IoXCJzaW1wbGUtdGltZS10cmFja2VyXCIsIChzLCBlLCBpKSA9PiB7XHJcblx0XHRcdGUuZW1wdHkoKTtcclxuXHRcdFx0ZS5hZGRDbGFzcyhcInNpbXBsZS10aW1lLXRyYWNrZXJcIik7XHJcblxyXG5cdFx0XHRsZXQgdHJhY2tlciA9IFRyYWNrZXIubG9hZChzKTtcclxuXHJcblx0XHRcdGxldCBuYW1lID0gbmV3IFRleHRDb21wb25lbnQoZSlcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJOYW1lIHRoaXMgc2VnbWVudFwiKTtcclxuXHRcdFx0bmV3IEJ1dHRvbkNvbXBvbmVudChlKVxyXG5cdFx0XHRcdC5zZXRCdXR0b25UZXh0KFwiU3RhcnRcIilcclxuXHRcdFx0XHQub25DbGljaygoKSA9PiB7XHJcblx0XHRcdFx0XHR0cmFja2VyLnN0YXJ0KG5hbWUuZ2V0VmFsdWUoKSk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVE9ETyBob3cgZG8gd2Ugc2F2ZSB0byB0aGUgY29kZSBibG9jaz8/XHJcblx0XHRcdFx0XHR0cmFja2VyLnNhdmUoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG59XHJcbiIsICJleHBvcnQgY29uc3QgZGVmYXVsdFNldHRpbmdzOiBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzID0ge1xyXG5cclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlVGltZVRyYWNrZXJTZXR0aW5ncyB7XHJcblxyXG59XHJcbiIsICJpbXBvcnQgeyBBcHAsIFBsdWdpblNldHRpbmdUYWIgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luIGZyb20gXCIuL21haW5cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblxyXG4gICAgcGx1Z2luOiBTaW1wbGVUaW1lVHJhY2tlclBsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBTaW1wbGVUaW1lVHJhY2tlclBsdWdpbikge1xyXG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIH1cclxuXHJcbiAgICBkaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDJcIiwgeyB0ZXh0OiBcIlNpbXBsZSBUaW1lIFRyYWNrZXIgU2V0dGluZ3NcIiB9KTtcclxuXHJcbiAgICAgICAgLy8gVE9ETyBzZXR0aW5ncyBnbyBoZXJlXHJcblxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoclwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4gYW5kIHdhbnQgdG8gc3VwcG9ydCBpdHMgZGV2ZWxvcG1lbnQsIHlvdSBjYW4gZG8gc28gdGhyb3VnaCBteSB3ZWJzaXRlIGJ5IGNsaWNraW5nIHRoaXMgZmFuY3kgaW1hZ2UhXCIgfSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImFcIiwgeyBocmVmOiBcImh0dHBzOi8vZWxscGVjay5kZS9zdXBwb3J0XCIgfSlcclxuICAgICAgICAgICAgLmNyZWF0ZUVsKFwiaW1nXCIsIHsgYXR0cjogeyBzcmM6IFwiaHR0cHM6Ly9lbGxwZWNrLmRlL3Jlcy9nZW5lcmFsc3VwcG9ydC5wbmdcIiB9LCBjbHM6IFwic2ltcGxlLXRpbWUtdHJhY2tlci1zdXBwb3J0XCIgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwgImltcG9ydCB7IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmV4cG9ydCBjbGFzcyBUcmFja2VyIHtcblxuICAgIGVudHJpZXM6IEVudHJ5W10gPSBbXTtcblxuICAgIGRpc3BsYXkoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgbGV0IGxpc3QgPSBlbGVtZW50LmNyZWF0ZUVsKFwidWxcIik7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMuZW50cmllcylcbiAgICAgICAgICAgIGxpc3QuY3JlYXRlRWwoXCJsaVwiLCB7IHRleHQ6IGVudHJ5LnRvU3RyaW5nKCkgfSk7XG4gICAgfVxuXG5cbiAgICBzdGFydChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gZGF0ZSBjb25zdHJ1Y3RvciByZXR1cm5zIHRoZSBjdXJyZW50IGRhdGVcbiAgICAgICAgbGV0IGVudHJ5ID0gbmV3IEVudHJ5KG5hbWUsIG5ldyBEYXRlKCkpO1xuICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfVxuXG4gICAgZW5kKCk6IHZvaWQge1xuXG4gICAgfVxuXG4gICAgc2F2ZSgpOiB2b2lkIHtcbiAgICAgICAgLy8gVE9ETyBzYXZlXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgIH1cblxuICAgIHN0YXRpYyBsb2FkKGpzb246IHN0cmluZyk6IFRyYWNrZXIge1xuICAgICAgICBpZiAoanNvbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIHBhcnNlIFRyYWNrZXIgZnJvbSAke2pzb259YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmFja2VyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW50cnkge1xuXG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBzdGFydFRpbWU6IERhdGU7XG4gICAgcHJpdmF0ZSBlbmRUaW1lOiBEYXRlO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzdGFydFRpbWU6IERhdGUpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zdGFydFRpbWUgPSBzdGFydFRpbWU7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldCA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLm5hbWUpXG4gICAgICAgICAgICByZXQgKz0gYCR7dGhpcy5uYW1lfTogYDtcblxuICAgICAgICAvLyBpZiB0aGUgZGF5cyBvciBtb250aHMgYXJlIGRpZmZlcmVudCwgd2Ugd2FudCB0byBhZGQgdGhlIGZ1bGwgZGF0ZVxuICAgICAgICBpZiAodGhpcy5zdGFydFRpbWUuZ2V0RGF5KCkgIT0gdGhpcy5lbmRUaW1lLmdldERheSgpIHx8IHRoaXMuc3RhcnRUaW1lLmdldE1vbnRoKCkgIT0gdGhpcy5lbmRUaW1lLmdldE1vbnRoKCkpIHtcbiAgICAgICAgICAgIHJldCArPSBgJHt0aGlzLnN0YXJ0VGltZS50b0xvY2FsZVN0cmluZygpfSAtICR7dGhpcy5lbmRUaW1lLnRvTG9jYWxlU3RyaW5nKCl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldCArPSBgJHt0aGlzLnN0YXJ0VGltZS50b0xvY2FsZVRpbWVTdHJpbmcoKX0gLSAke3RoaXMuZW5kVGltZS50b0xvY2FsZVRpbWVTdHJpbmcoKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUFxRTs7O0FDQTlELElBQU0sa0JBQTZDOzs7QUNBMUQsc0JBQXNDO0FBRy9CLGlEQUEyQyxpQ0FBaUI7QUFBQSxFQUkvRCxZQUFZLEtB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 +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy10YWIudHMiLCAic3JjL3RyYWNrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCwgUGx1Z2luLCBUZXh0Q29tcG9uZW50IH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRlZmF1bHRTZXR0aW5ncywgU2ltcGxlVGltZVRyYWNrZXJTZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XHJcbmltcG9ydCB7IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3NUYWIgfSBmcm9tIFwiLi9zZXR0aW5ncy10YWJcIjtcclxuaW1wb3J0IHsgZGlzcGxheVRyYWNrZXIsIGVuZEVudHJ5LCBpc1J1bm5pbmcsIGxvYWRUcmFja2VyLCBzYXZlVHJhY2tlciwgc3RhcnRFbnRyeSwgVHJhY2tlciB9IGZyb20gXCIuL3RyYWNrZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHJcblx0c2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3M7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFwic2ltcGxlLXRpbWUtdHJhY2tlclwiLCAocywgZSwgaSkgPT4ge1xyXG5cdFx0XHRlLmVtcHR5KCk7XHJcblx0XHRcdGUuYWRkQ2xhc3MoXCJzaW1wbGUtdGltZS10cmFja2VyXCIpO1xyXG5cclxuXHRcdFx0bGV0IHRyYWNrZXIgPSBsb2FkVHJhY2tlcihzKTtcclxuXHJcblx0XHRcdGxldCBuYW1lID0gbmV3IFRleHRDb21wb25lbnQoZSlcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJOYW1lIHRoaXMgc2VnbWVudFwiKTtcclxuXHRcdFx0bmV3IEJ1dHRvbkNvbXBvbmVudChlKVxyXG5cdFx0XHRcdC5zZXRCdXR0b25UZXh0KFwiU3RhcnRcIilcclxuXHRcdFx0XHQub25DbGljayhhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAoaXNSdW5uaW5nKHRyYWNrZXIpKSB7XHJcblx0XHRcdFx0XHRcdGVuZEVudHJ5KHRyYWNrZXIpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0c3RhcnRFbnRyeSh0cmFja2VyLCBuYW1lLmdldFZhbHVlKCkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bmFtZS5zZXRWYWx1ZShcIlwiKTtcclxuXHRcdFx0XHRcdGF3YWl0IHNhdmVUcmFja2VyKHRyYWNrZXIsIHRoaXMuYXBwLCBpLmdldFNlY3Rpb25JbmZvKGUpKTtcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdGRpc3BsYXlUcmFja2VyKHRyYWNrZXIsIGUpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFNldHRpbmdzLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuIiwgImV4cG9ydCBjb25zdCBkZWZhdWx0U2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3MgPSB7XHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzIHtcclxuXHJcbn1cclxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgU2ltcGxlVGltZVRyYWNrZXJQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHJcbiAgICBwbHVnaW46IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luKSB7XHJcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiU2ltcGxlIFRpbWUgVHJhY2tlciBTZXR0aW5nc1wiIH0pO1xyXG5cclxuICAgICAgICAvLyBUT0RPIHNldHRpbmdzIGdvIGhlcmVcclxuXHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImhyXCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIsIHsgdGV4dDogXCJJZiB5b3UgbGlrZSB0aGlzIHBsdWdpbiBhbmQgd2FudCB0byBzdXBwb3J0IGl0cyBkZXZlbG9wbWVudCwgeW91IGNhbiBkbyBzbyB0aHJvdWdoIG15IHdlYnNpdGUgYnkgY2xpY2tpbmcgdGhpcyBmYW5jeSBpbWFnZSFcIiB9KTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiYVwiLCB7IGhyZWY6IFwiaHR0cHM6Ly9lbGxwZWNrLmRlL3N1cHBvcnRcIiB9KVxyXG4gICAgICAgICAgICAuY3JlYXRlRWwoXCJpbWdcIiwgeyBhdHRyOiB7IHNyYzogXCJodHRwczovL2VsbHBlY2suZGUvcmVzL2dlbmVyYWxzdXBwb3J0LnBuZ1wiIH0sIGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXN1cHBvcnRcIiB9KTtcclxuICAgIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgQXBwLCBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgY2xhc3MgVHJhY2tlciB7XG4gICAgZW50cmllczogRW50cnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnRyeSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHN0YXJ0VGltZTogbnVtYmVyO1xuICAgIGVuZFRpbWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0RW50cnkodHJhY2tlcjogVHJhY2tlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gZGF0ZSBjb25zdHJ1Y3RvciByZXR1cm5zIHRoZSBjdXJyZW50IGRhdGVcbiAgICBsZXQgZW50cnk6IEVudHJ5ID0geyBuYW1lOiBuYW1lLCBzdGFydFRpbWU6IERhdGUubm93KCksIGVuZFRpbWU6IG51bGwgfTtcbiAgICB0cmFja2VyLmVudHJpZXMucHVzaChlbnRyeSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZW5kRW50cnkodHJhY2tlcjogVHJhY2tlcik6IHZvaWQge1xuICAgIGxldCBsYXN0ID0gdHJhY2tlci5lbnRyaWVzLmxhc3QoKTtcbiAgICBsYXN0LmVuZFRpbWUgPSBEYXRlLm5vdygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSdW5uaW5nKHRyYWNrZXI6IFRyYWNrZXIpOiBib29sZWFuIHtcbiAgICBsZXQgbGFzdCA9IHRyYWNrZXIuZW50cmllcy5sYXN0KCk7XG4gICAgcmV0dXJuIGxhc3QgIT0gbnVsbCAmJiAhbGFzdC5lbmRUaW1lO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVRyYWNrZXIodHJhY2tlcjogVHJhY2tlciwgYXBwOiBBcHAsIHNlY3Rpb246IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGZpbGUgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICBsZXQgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuXG4gICAgLy8gZmlndXJlIG91dCB3aGF0IHBhcnQgb2YgdGhlIGNvbnRlbnQgd2UgaGF2ZSB0byBlZGl0XG4gICAgbGV0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICBsZXQgcHJldiA9IGxpbmVzLmZpbHRlcigoXywgaSkgPT4gaSA8PSBzZWN0aW9uLmxpbmVTdGFydCkuam9pbihcIlxcblwiKTtcbiAgICBsZXQgbmV4dCA9IGxpbmVzLmZpbHRlcigoXywgaSkgPT4gaSA+PSBzZWN0aW9uLmxpbmVFbmQpLmpvaW4oXCJcXG5cIik7XG4gICAgLy8gZWRpdCBvbmx5IHRoZSBjb2RlIGJsb2NrIGNvbnRlbnQsIGxlYXZlIHRoZSByZXN0IHVudG91Y2hlZFxuICAgIGNvbnRlbnQgPSBgJHtwcmV2fVxcbiR7SlNPTi5zdHJpbmdpZnkodHJhY2tlcil9XFxuJHtuZXh0fWA7XG5cbiAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIGNvbnRlbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFRyYWNrZXIoanNvbjogc3RyaW5nKTogVHJhY2tlciB7XG4gICAgaWYgKGpzb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIHBhcnNlIFRyYWNrZXIgZnJvbSAke2pzb259YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZW50cmllczogW10gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlUcmFja2VyKHRyYWNrZXI6IFRyYWNrZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgbGV0IGxpc3QgPSBlbGVtZW50LmNyZWF0ZUVsKFwidWxcIik7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgdHJhY2tlci5lbnRyaWVzKVxuICAgICAgICBsaXN0LmNyZWF0ZUVsKFwibGlcIiwgeyB0ZXh0OiBkaXNwbGF5RW50cnkoZW50cnkpIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlFbnRyeShlbnRyeTogRW50cnkpOiBzdHJpbmcge1xuICAgIC8vIFRPRE8gYWRkIGFuIG9wdGlvbiB0byBkaXNwbGF5IHRoaXMgYXMgYW4gaW50ZXJ2YWwgcmF0aGVyIHRoYW4gYSBmcm9tIC0gdG8gc3RyaW5nXG4gICAgbGV0IHJldCA9IFwiXCI7XG4gICAgaWYgKGVudHJ5Lm5hbWUpXG4gICAgICAgIHJldCArPSBgJHtlbnRyeS5uYW1lfTogYDtcblxuICAgIGxldCBzdGFydCA9IG5ldyBEYXRlKGVudHJ5LnN0YXJ0VGltZSk7XG4gICAgcmV0ICs9IGAke3N0YXJ0LnRvTG9jYWxlU3RyaW5nKCl9IC0gYDtcblxuICAgIGlmIChlbnRyeS5lbmRUaW1lKSB7XG4gICAgICAgIGxldCBlbmQgPSBuZXcgRGF0ZShlbnRyeS5lbmRUaW1lKTtcbiAgICAgICAgcmV0ICs9IGAke2VuZC50b0xvY2FsZVN0cmluZygpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFBdUQ7OztBQ0FoRCxJQUFNLGtCQUE2Qzs7O0FDQTFELHNCQUFzQztBQUcvQixpREFBMkMsaUNBQWlCO0FBQUEsRUFJL0QsWUFBWSxLQUFVLFFBQWlDO0FBQ25ELFVBQU0sS0FBSztBQUNYLFNBQUss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 diff --git a/test-vault/track-note-test.md b/test-vault/track-note-test.md index 8938bda..90c6aa3 100644 --- a/test-vault/track-note-test.md +++ b/test-vault/track-note-test.md @@ -1,6 +1,7 @@ This is a time tracker: ```simple-time-tracker - +{"entries":[{"name":"","startTime":1664290639233,"endTime":1664290642003},{"name":"","startTime":1664290643788,"endTime":1664290647600},{"name":"","startTime":1664290650678,"endTime":1664290653168},{"name":"Another segment","startTime":1664290658822,"endTime":1664290662444},{"name":"","startTime":1664290690793,"endTime":1664290692366},{"name":"","startTime":1664290695119,"endTime":1664290696140}]} ``` +