Files
Obsidian_vault_template/.obsidian/plugins/pomodoro-timer/main.js

5323 lines
207 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __publicField = (obj, key, value) => {
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
return value;
};
// node_modules/obsidian-daily-notes-interface/dist/main.js
var require_main = __commonJS({
"node_modules/obsidian-daily-notes-interface/dist/main.js"(exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var obsidian = require("obsidian");
var DEFAULT_DAILY_NOTE_FORMAT = "YYYY-MM-DD";
var DEFAULT_WEEKLY_NOTE_FORMAT = "gggg-[W]ww";
var DEFAULT_MONTHLY_NOTE_FORMAT = "YYYY-MM";
var DEFAULT_QUARTERLY_NOTE_FORMAT = "YYYY-[Q]Q";
var DEFAULT_YEARLY_NOTE_FORMAT = "YYYY";
function shouldUsePeriodicNotesSettings(periodicity) {
var _a, _b;
const periodicNotes = window.app.plugins.getPlugin("periodic-notes");
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a[periodicity]) == null ? void 0 : _b.enabled);
}
function getDailyNoteSettings() {
var _a, _b, _c, _d;
try {
const { internalPlugins, plugins } = window.app;
if (shouldUsePeriodicNotesSettings("daily")) {
const { format: format2, folder: folder2, template: template2 } = ((_b = (_a = plugins.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.daily) || {};
return {
format: format2 || DEFAULT_DAILY_NOTE_FORMAT,
folder: (folder2 == null ? void 0 : folder2.trim()) || "",
template: (template2 == null ? void 0 : template2.trim()) || ""
};
}
const { folder, format, template } = ((_d = (_c = internalPlugins.getPluginById("daily-notes")) == null ? void 0 : _c.instance) == null ? void 0 : _d.options) || {};
return {
format: format || DEFAULT_DAILY_NOTE_FORMAT,
folder: (folder == null ? void 0 : folder.trim()) || "",
template: (template == null ? void 0 : template.trim()) || ""
};
} catch (err) {
console.info("No custom daily note settings found!", err);
}
}
function getWeeklyNoteSettings() {
var _a, _b, _c, _d, _e, _f, _g;
try {
const pluginManager = window.app.plugins;
const calendarSettings = (_a = pluginManager.getPlugin("calendar")) == null ? void 0 : _a.options;
const periodicNotesSettings = (_c = (_b = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _b.settings) == null ? void 0 : _c.weekly;
if (shouldUsePeriodicNotesSettings("weekly")) {
return {
format: periodicNotesSettings.format || DEFAULT_WEEKLY_NOTE_FORMAT,
folder: ((_d = periodicNotesSettings.folder) == null ? void 0 : _d.trim()) || "",
template: ((_e = periodicNotesSettings.template) == null ? void 0 : _e.trim()) || ""
};
}
const settings2 = calendarSettings || {};
return {
format: settings2.weeklyNoteFormat || DEFAULT_WEEKLY_NOTE_FORMAT,
folder: ((_f = settings2.weeklyNoteFolder) == null ? void 0 : _f.trim()) || "",
template: ((_g = settings2.weeklyNoteTemplate) == null ? void 0 : _g.trim()) || ""
};
} catch (err) {
console.info("No custom weekly note settings found!", err);
}
}
function getMonthlyNoteSettings() {
var _a, _b, _c, _d;
const pluginManager = window.app.plugins;
try {
const settings2 = shouldUsePeriodicNotesSettings("monthly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.monthly) || {};
return {
format: settings2.format || DEFAULT_MONTHLY_NOTE_FORMAT,
folder: ((_c = settings2.folder) == null ? void 0 : _c.trim()) || "",
template: ((_d = settings2.template) == null ? void 0 : _d.trim()) || ""
};
} catch (err) {
console.info("No custom monthly note settings found!", err);
}
}
function getQuarterlyNoteSettings() {
var _a, _b, _c, _d;
const pluginManager = window.app.plugins;
try {
const settings2 = shouldUsePeriodicNotesSettings("quarterly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.quarterly) || {};
return {
format: settings2.format || DEFAULT_QUARTERLY_NOTE_FORMAT,
folder: ((_c = settings2.folder) == null ? void 0 : _c.trim()) || "",
template: ((_d = settings2.template) == null ? void 0 : _d.trim()) || ""
};
} catch (err) {
console.info("No custom quarterly note settings found!", err);
}
}
function getYearlyNoteSettings() {
var _a, _b, _c, _d;
const pluginManager = window.app.plugins;
try {
const settings2 = shouldUsePeriodicNotesSettings("yearly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.yearly) || {};
return {
format: settings2.format || DEFAULT_YEARLY_NOTE_FORMAT,
folder: ((_c = settings2.folder) == null ? void 0 : _c.trim()) || "",
template: ((_d = settings2.template) == null ? void 0 : _d.trim()) || ""
};
} catch (err) {
console.info("No custom yearly note settings found!", err);
}
}
function join2(...partSegments) {
let parts = [];
for (let i = 0, l = partSegments.length; i < l; i++) {
parts = parts.concat(partSegments[i].split("/"));
}
const newParts = [];
for (let i = 0, l = parts.length; i < l; i++) {
const part = parts[i];
if (!part || part === ".")
continue;
else
newParts.push(part);
}
if (parts[0] === "")
newParts.unshift("");
return newParts.join("/");
}
function basename(fullPath) {
let base = fullPath.substring(fullPath.lastIndexOf("/") + 1);
if (base.lastIndexOf(".") != -1)
base = base.substring(0, base.lastIndexOf("."));
return base;
}
async function ensureFolderExists(path) {
const dirs = path.replace(/\\/g, "/").split("/");
dirs.pop();
if (dirs.length) {
const dir = join2(...dirs);
if (!window.app.vault.getAbstractFileByPath(dir)) {
await window.app.vault.createFolder(dir);
}
}
}
async function getNotePath(directory, filename) {
if (!filename.endsWith(".md")) {
filename += ".md";
}
const path = obsidian.normalizePath(join2(directory, filename));
await ensureFolderExists(path);
return path;
}
async function getTemplateInfo(template) {
const { metadataCache, vault } = window.app;
const templatePath = obsidian.normalizePath(template);
if (templatePath === "/") {
return Promise.resolve(["", null]);
}
try {
const templateFile = metadataCache.getFirstLinkpathDest(templatePath, "");
const contents = await vault.cachedRead(templateFile);
const IFoldInfo = window.app.foldManager.load(templateFile);
return [contents, IFoldInfo];
} catch (err) {
console.error(`Failed to read the daily note template '${templatePath}'`, err);
new obsidian.Notice("Failed to read the daily note template");
return ["", null];
}
}
function getDateUID(date, granularity = "day") {
const ts = date.clone().startOf(granularity).format();
return `${granularity}-${ts}`;
}
function removeEscapedCharacters(format) {
return format.replace(/\[[^\]]*\]/g, "");
}
function isFormatAmbiguous(format, granularity) {
if (granularity === "week") {
const cleanFormat = removeEscapedCharacters(format);
return /w{1,2}/i.test(cleanFormat) && (/M{1,4}/.test(cleanFormat) || /D{1,4}/.test(cleanFormat));
}
return false;
}
function getDateFromFile(file, granularity) {
return getDateFromFilename(file.basename, granularity);
}
function getDateFromPath(path, granularity) {
return getDateFromFilename(basename(path), granularity);
}
function getDateFromFilename(filename, granularity) {
const getSettings = {
day: getDailyNoteSettings,
week: getWeeklyNoteSettings,
month: getMonthlyNoteSettings,
quarter: getQuarterlyNoteSettings,
year: getYearlyNoteSettings
};
const format = getSettings[granularity]().format.split("/").pop();
const noteDate = window.moment(filename, format, true);
if (!noteDate.isValid()) {
return null;
}
if (isFormatAmbiguous(format, granularity)) {
if (granularity === "week") {
const cleanFormat = removeEscapedCharacters(format);
if (/w{1,2}/i.test(cleanFormat)) {
return window.moment(
filename,
// If format contains week, remove day & month formatting
format.replace(/M{1,4}/g, "").replace(/D{1,4}/g, ""),
false
);
}
}
}
return noteDate;
}
var DailyNotesFolderMissingError = class extends Error {
};
async function createDailyNote2(date) {
const app = window.app;
const { vault } = app;
const moment4 = window.moment;
const { template, format, folder } = getDailyNoteSettings();
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
const filename = date.format(format);
const normalizedPath = await getNotePath(folder, filename);
try {
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, moment4().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename).replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
const now2 = moment4();
const currentDate = date.clone().set({
hour: now2.get("hour"),
minute: now2.get("minute"),
second: now2.get("second")
});
if (calc) {
currentDate.add(parseInt(timeDelta, 10), unit);
}
if (momentFormat) {
return currentDate.format(momentFormat.substring(1).trim());
}
return currentDate.format(format);
}).replace(/{{\s*yesterday\s*}}/gi, date.clone().subtract(1, "day").format(format)).replace(/{{\s*tomorrow\s*}}/gi, date.clone().add(1, "d").format(format)));
app.foldManager.save(createdFile, IFoldInfo);
return createdFile;
} catch (err) {
console.error(`Failed to create file: '${normalizedPath}'`, err);
new obsidian.Notice("Unable to create new file.");
}
}
function getDailyNote2(date, dailyNotes) {
var _a;
return (_a = dailyNotes[getDateUID(date, "day")]) != null ? _a : null;
}
function getAllDailyNotes2() {
const { vault } = window.app;
const { folder } = getDailyNoteSettings();
const dailyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
if (!dailyNotesFolder) {
throw new DailyNotesFolderMissingError("Failed to find daily notes folder");
}
const dailyNotes = {};
obsidian.Vault.recurseChildren(dailyNotesFolder, (note) => {
if (note instanceof obsidian.TFile) {
const date = getDateFromFile(note, "day");
if (date) {
const dateString = getDateUID(date, "day");
dailyNotes[dateString] = note;
}
}
});
return dailyNotes;
}
var WeeklyNotesFolderMissingError = class extends Error {
};
function getDaysOfWeek() {
const { moment: moment4 } = window;
let weekStart = moment4.localeData()._week.dow;
const daysOfWeek = [
"sunday",
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday"
];
while (weekStart) {
daysOfWeek.push(daysOfWeek.shift());
weekStart--;
}
return daysOfWeek;
}
function getDayOfWeekNumericalValue(dayOfWeekName) {
return getDaysOfWeek().indexOf(dayOfWeekName.toLowerCase());
}
async function createWeeklyNote(date) {
const { vault } = window.app;
const { template, format, folder } = getWeeklyNoteSettings();
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
const filename = date.format(format);
const normalizedPath = await getNotePath(folder, filename);
try {
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
const now2 = window.moment();
const currentDate = date.clone().set({
hour: now2.get("hour"),
minute: now2.get("minute"),
second: now2.get("second")
});
if (calc) {
currentDate.add(parseInt(timeDelta, 10), unit);
}
if (momentFormat) {
return currentDate.format(momentFormat.substring(1).trim());
}
return currentDate.format(format);
}).replace(/{{\s*title\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi, (_, dayOfWeek, momentFormat) => {
const day = getDayOfWeekNumericalValue(dayOfWeek);
return date.weekday(day).format(momentFormat.trim());
}));
window.app.foldManager.save(createdFile, IFoldInfo);
return createdFile;
} catch (err) {
console.error(`Failed to create file: '${normalizedPath}'`, err);
new obsidian.Notice("Unable to create new file.");
}
}
function getWeeklyNote(date, weeklyNotes) {
var _a;
return (_a = weeklyNotes[getDateUID(date, "week")]) != null ? _a : null;
}
function getAllWeeklyNotes() {
const weeklyNotes = {};
if (!appHasWeeklyNotesPluginLoaded()) {
return weeklyNotes;
}
const { vault } = window.app;
const { folder } = getWeeklyNoteSettings();
const weeklyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
if (!weeklyNotesFolder) {
throw new WeeklyNotesFolderMissingError("Failed to find weekly notes folder");
}
obsidian.Vault.recurseChildren(weeklyNotesFolder, (note) => {
if (note instanceof obsidian.TFile) {
const date = getDateFromFile(note, "week");
if (date) {
const dateString = getDateUID(date, "week");
weeklyNotes[dateString] = note;
}
}
});
return weeklyNotes;
}
var MonthlyNotesFolderMissingError = class extends Error {
};
async function createMonthlyNote(date) {
const { vault } = window.app;
const { template, format, folder } = getMonthlyNoteSettings();
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
const filename = date.format(format);
const normalizedPath = await getNotePath(folder, filename);
try {
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
const now2 = window.moment();
const currentDate = date.clone().set({
hour: now2.get("hour"),
minute: now2.get("minute"),
second: now2.get("second")
});
if (calc) {
currentDate.add(parseInt(timeDelta, 10), unit);
}
if (momentFormat) {
return currentDate.format(momentFormat.substring(1).trim());
}
return currentDate.format(format);
}).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename));
window.app.foldManager.save(createdFile, IFoldInfo);
return createdFile;
} catch (err) {
console.error(`Failed to create file: '${normalizedPath}'`, err);
new obsidian.Notice("Unable to create new file.");
}
}
function getMonthlyNote(date, monthlyNotes) {
var _a;
return (_a = monthlyNotes[getDateUID(date, "month")]) != null ? _a : null;
}
function getAllMonthlyNotes() {
const monthlyNotes = {};
if (!appHasMonthlyNotesPluginLoaded()) {
return monthlyNotes;
}
const { vault } = window.app;
const { folder } = getMonthlyNoteSettings();
const monthlyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
if (!monthlyNotesFolder) {
throw new MonthlyNotesFolderMissingError("Failed to find monthly notes folder");
}
obsidian.Vault.recurseChildren(monthlyNotesFolder, (note) => {
if (note instanceof obsidian.TFile) {
const date = getDateFromFile(note, "month");
if (date) {
const dateString = getDateUID(date, "month");
monthlyNotes[dateString] = note;
}
}
});
return monthlyNotes;
}
var QuarterlyNotesFolderMissingError = class extends Error {
};
async function createQuarterlyNote(date) {
const { vault } = window.app;
const { template, format, folder } = getQuarterlyNoteSettings();
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
const filename = date.format(format);
const normalizedPath = await getNotePath(folder, filename);
try {
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
const now2 = window.moment();
const currentDate = date.clone().set({
hour: now2.get("hour"),
minute: now2.get("minute"),
second: now2.get("second")
});
if (calc) {
currentDate.add(parseInt(timeDelta, 10), unit);
}
if (momentFormat) {
return currentDate.format(momentFormat.substring(1).trim());
}
return currentDate.format(format);
}).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename));
window.app.foldManager.save(createdFile, IFoldInfo);
return createdFile;
} catch (err) {
console.error(`Failed to create file: '${normalizedPath}'`, err);
new obsidian.Notice("Unable to create new file.");
}
}
function getQuarterlyNote(date, quarterly) {
var _a;
return (_a = quarterly[getDateUID(date, "quarter")]) != null ? _a : null;
}
function getAllQuarterlyNotes() {
const quarterly = {};
if (!appHasQuarterlyNotesPluginLoaded()) {
return quarterly;
}
const { vault } = window.app;
const { folder } = getQuarterlyNoteSettings();
const quarterlyFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
if (!quarterlyFolder) {
throw new QuarterlyNotesFolderMissingError("Failed to find quarterly notes folder");
}
obsidian.Vault.recurseChildren(quarterlyFolder, (note) => {
if (note instanceof obsidian.TFile) {
const date = getDateFromFile(note, "quarter");
if (date) {
const dateString = getDateUID(date, "quarter");
quarterly[dateString] = note;
}
}
});
return quarterly;
}
var YearlyNotesFolderMissingError = class extends Error {
};
async function createYearlyNote(date) {
const { vault } = window.app;
const { template, format, folder } = getYearlyNoteSettings();
const [templateContents, IFoldInfo] = await getTemplateInfo(template);
const filename = date.format(format);
const normalizedPath = await getNotePath(folder, filename);
try {
const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => {
const now2 = window.moment();
const currentDate = date.clone().set({
hour: now2.get("hour"),
minute: now2.get("minute"),
second: now2.get("second")
});
if (calc) {
currentDate.add(parseInt(timeDelta, 10), unit);
}
if (momentFormat) {
return currentDate.format(momentFormat.substring(1).trim());
}
return currentDate.format(format);
}).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename));
window.app.foldManager.save(createdFile, IFoldInfo);
return createdFile;
} catch (err) {
console.error(`Failed to create file: '${normalizedPath}'`, err);
new obsidian.Notice("Unable to create new file.");
}
}
function getYearlyNote(date, yearlyNotes) {
var _a;
return (_a = yearlyNotes[getDateUID(date, "year")]) != null ? _a : null;
}
function getAllYearlyNotes() {
const yearlyNotes = {};
if (!appHasYearlyNotesPluginLoaded()) {
return yearlyNotes;
}
const { vault } = window.app;
const { folder } = getYearlyNoteSettings();
const yearlyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder));
if (!yearlyNotesFolder) {
throw new YearlyNotesFolderMissingError("Failed to find yearly notes folder");
}
obsidian.Vault.recurseChildren(yearlyNotesFolder, (note) => {
if (note instanceof obsidian.TFile) {
const date = getDateFromFile(note, "year");
if (date) {
const dateString = getDateUID(date, "year");
yearlyNotes[dateString] = note;
}
}
});
return yearlyNotes;
}
function appHasDailyNotesPluginLoaded() {
var _a, _b;
const { app } = window;
const dailyNotesPlugin = app.internalPlugins.plugins["daily-notes"];
if (dailyNotesPlugin && dailyNotesPlugin.enabled) {
return true;
}
const periodicNotes = app.plugins.getPlugin("periodic-notes");
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.daily) == null ? void 0 : _b.enabled);
}
function appHasWeeklyNotesPluginLoaded() {
var _a, _b;
const { app } = window;
if (app.plugins.getPlugin("calendar")) {
return true;
}
const periodicNotes = app.plugins.getPlugin("periodic-notes");
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.weekly) == null ? void 0 : _b.enabled);
}
function appHasMonthlyNotesPluginLoaded() {
var _a, _b;
const { app } = window;
const periodicNotes = app.plugins.getPlugin("periodic-notes");
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.monthly) == null ? void 0 : _b.enabled);
}
function appHasQuarterlyNotesPluginLoaded() {
var _a, _b;
const { app } = window;
const periodicNotes = app.plugins.getPlugin("periodic-notes");
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.quarterly) == null ? void 0 : _b.enabled);
}
function appHasYearlyNotesPluginLoaded() {
var _a, _b;
const { app } = window;
const periodicNotes = app.plugins.getPlugin("periodic-notes");
return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a.yearly) == null ? void 0 : _b.enabled);
}
function getPeriodicNoteSettings(granularity) {
const getSettings = {
day: getDailyNoteSettings,
week: getWeeklyNoteSettings,
month: getMonthlyNoteSettings,
quarter: getQuarterlyNoteSettings,
year: getYearlyNoteSettings
}[granularity];
return getSettings();
}
function createPeriodicNote(granularity, date) {
const createFn = {
day: createDailyNote2,
month: createMonthlyNote,
week: createWeeklyNote
};
return createFn[granularity](date);
}
exports.DEFAULT_DAILY_NOTE_FORMAT = DEFAULT_DAILY_NOTE_FORMAT;
exports.DEFAULT_MONTHLY_NOTE_FORMAT = DEFAULT_MONTHLY_NOTE_FORMAT;
exports.DEFAULT_QUARTERLY_NOTE_FORMAT = DEFAULT_QUARTERLY_NOTE_FORMAT;
exports.DEFAULT_WEEKLY_NOTE_FORMAT = DEFAULT_WEEKLY_NOTE_FORMAT;
exports.DEFAULT_YEARLY_NOTE_FORMAT = DEFAULT_YEARLY_NOTE_FORMAT;
exports.appHasDailyNotesPluginLoaded = appHasDailyNotesPluginLoaded;
exports.appHasMonthlyNotesPluginLoaded = appHasMonthlyNotesPluginLoaded;
exports.appHasQuarterlyNotesPluginLoaded = appHasQuarterlyNotesPluginLoaded;
exports.appHasWeeklyNotesPluginLoaded = appHasWeeklyNotesPluginLoaded;
exports.appHasYearlyNotesPluginLoaded = appHasYearlyNotesPluginLoaded;
exports.createDailyNote = createDailyNote2;
exports.createMonthlyNote = createMonthlyNote;
exports.createPeriodicNote = createPeriodicNote;
exports.createQuarterlyNote = createQuarterlyNote;
exports.createWeeklyNote = createWeeklyNote;
exports.createYearlyNote = createYearlyNote;
exports.getAllDailyNotes = getAllDailyNotes2;
exports.getAllMonthlyNotes = getAllMonthlyNotes;
exports.getAllQuarterlyNotes = getAllQuarterlyNotes;
exports.getAllWeeklyNotes = getAllWeeklyNotes;
exports.getAllYearlyNotes = getAllYearlyNotes;
exports.getDailyNote = getDailyNote2;
exports.getDailyNoteSettings = getDailyNoteSettings;
exports.getDateFromFile = getDateFromFile;
exports.getDateFromPath = getDateFromPath;
exports.getDateUID = getDateUID;
exports.getMonthlyNote = getMonthlyNote;
exports.getMonthlyNoteSettings = getMonthlyNoteSettings;
exports.getPeriodicNoteSettings = getPeriodicNoteSettings;
exports.getQuarterlyNote = getQuarterlyNote;
exports.getQuarterlyNoteSettings = getQuarterlyNoteSettings;
exports.getTemplateInfo = getTemplateInfo;
exports.getWeeklyNote = getWeeklyNote;
exports.getWeeklyNoteSettings = getWeeklyNoteSettings;
exports.getYearlyNote = getYearlyNote;
exports.getYearlyNoteSettings = getYearlyNoteSettings;
}
});
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => PomodoroTimerPlugin
});
module.exports = __toCommonJS(main_exports);
// src/TimerView.ts
var import_obsidian4 = require("obsidian");
// node_modules/svelte/src/runtime/internal/utils.js
function noop() {
}
function run(fn) {
return fn();
}
function blank_object() {
return /* @__PURE__ */ Object.create(null);
}
function run_all(fns) {
fns.forEach(run);
}
function is_function(thing) {
return typeof thing === "function";
}
function safe_not_equal(a, b) {
return a != a ? b == b : a !== b || a && typeof a === "object" || typeof a === "function";
}
function is_empty(obj) {
return Object.keys(obj).length === 0;
}
function subscribe(store, ...callbacks) {
if (store == null) {
for (const callback of callbacks) {
callback(void 0);
}
return noop;
}
const unsub = store.subscribe(...callbacks);
return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;
}
function component_subscribe(component, store, callback) {
component.$$.on_destroy.push(subscribe(store, callback));
}
// node_modules/svelte/src/runtime/internal/globals.js
var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : (
// @ts-ignore Node typings have this
global
);
// node_modules/svelte/src/runtime/internal/ResizeObserverSingleton.js
var ResizeObserverSingleton = class {
/** @param {ResizeObserverOptions} options */
constructor(options) {
/**
* @private
* @readonly
* @type {WeakMap<Element, import('./private.js').Listener>}
*/
__publicField(this, "_listeners", "WeakMap" in globals ? /* @__PURE__ */ new WeakMap() : void 0);
/**
* @private
* @type {ResizeObserver}
*/
__publicField(this, "_observer");
/** @type {ResizeObserverOptions} */
__publicField(this, "options");
this.options = options;
}
/**
* @param {Element} element
* @param {import('./private.js').Listener} listener
* @returns {() => void}
*/
observe(element2, listener) {
this._listeners.set(element2, listener);
this._getObserver().observe(element2, this.options);
return () => {
this._listeners.delete(element2);
this._observer.unobserve(element2);
};
}
/**
* @private
*/
_getObserver() {
var _a;
return (_a = this._observer) != null ? _a : this._observer = new ResizeObserver((entries) => {
var _a2;
for (const entry of entries) {
ResizeObserverSingleton.entries.set(entry.target, entry);
(_a2 = this._listeners.get(entry.target)) == null ? void 0 : _a2(entry);
}
});
}
};
ResizeObserverSingleton.entries = "WeakMap" in globals ? /* @__PURE__ */ new WeakMap() : void 0;
// node_modules/svelte/src/runtime/internal/dom.js
var is_hydrating = false;
function start_hydrating() {
is_hydrating = true;
}
function end_hydrating() {
is_hydrating = false;
}
function append(target, node) {
target.appendChild(node);
}
function append_styles(target, style_sheet_id, styles) {
const append_styles_to = get_root_for_style(target);
if (!append_styles_to.getElementById(style_sheet_id)) {
const style = element("style");
style.id = style_sheet_id;
style.textContent = styles;
append_stylesheet(append_styles_to, style);
}
}
function get_root_for_style(node) {
if (!node)
return document;
const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;
if (root && /** @type {ShadowRoot} */
root.host) {
return (
/** @type {ShadowRoot} */
root
);
}
return node.ownerDocument;
}
function append_stylesheet(node, style) {
append(
/** @type {Document} */
node.head || node,
style
);
return style.sheet;
}
function insert(target, node, anchor) {
target.insertBefore(node, anchor || null);
}
function detach(node) {
if (node.parentNode) {
node.parentNode.removeChild(node);
}
}
function destroy_each(iterations, detaching) {
for (let i = 0; i < iterations.length; i += 1) {
if (iterations[i])
iterations[i].d(detaching);
}
}
function element(name) {
return document.createElement(name);
}
function svg_element(name) {
return document.createElementNS("http://www.w3.org/2000/svg", name);
}
function text(data) {
return document.createTextNode(data);
}
function space() {
return text(" ");
}
function empty() {
return text("");
}
function listen(node, event, handler, options) {
node.addEventListener(event, handler, options);
return () => node.removeEventListener(event, handler, options);
}
function attr(node, attribute, value) {
if (value == null)
node.removeAttribute(attribute);
else if (node.getAttribute(attribute) !== value)
node.setAttribute(attribute, value);
}
function children(element2) {
return Array.from(element2.childNodes);
}
function set_data(text2, data) {
data = "" + data;
if (text2.data === data)
return;
text2.data = /** @type {string} */
data;
}
function set_input_value(input, value) {
input.value = value == null ? "" : value;
}
function set_style(node, key, value, important) {
if (value == null) {
node.style.removeProperty(key);
} else {
node.style.setProperty(key, value, important ? "important" : "");
}
}
function get_custom_elements_slots(element2) {
const result = {};
element2.childNodes.forEach(
/** @param {Element} node */
(node) => {
result[node.slot || "default"] = true;
}
);
return result;
}
// node_modules/svelte/src/runtime/internal/lifecycle.js
var current_component;
function set_current_component(component) {
current_component = component;
}
function get_current_component() {
if (!current_component)
throw new Error("Function called outside component initialization");
return current_component;
}
function afterUpdate(fn) {
get_current_component().$$.after_update.push(fn);
}
// node_modules/svelte/src/runtime/internal/scheduler.js
var dirty_components = [];
var binding_callbacks = [];
var render_callbacks = [];
var flush_callbacks = [];
var resolved_promise = /* @__PURE__ */ Promise.resolve();
var update_scheduled = false;
function schedule_update() {
if (!update_scheduled) {
update_scheduled = true;
resolved_promise.then(flush);
}
}
function add_render_callback(fn) {
render_callbacks.push(fn);
}
var seen_callbacks = /* @__PURE__ */ new Set();
var flushidx = 0;
function flush() {
if (flushidx !== 0) {
return;
}
const saved_component = current_component;
do {
try {
while (flushidx < dirty_components.length) {
const component = dirty_components[flushidx];
flushidx++;
set_current_component(component);
update(component.$$);
}
} catch (e) {
dirty_components.length = 0;
flushidx = 0;
throw e;
}
set_current_component(null);
dirty_components.length = 0;
flushidx = 0;
while (binding_callbacks.length)
binding_callbacks.pop()();
for (let i = 0; i < render_callbacks.length; i += 1) {
const callback = render_callbacks[i];
if (!seen_callbacks.has(callback)) {
seen_callbacks.add(callback);
callback();
}
}
render_callbacks.length = 0;
} while (dirty_components.length);
while (flush_callbacks.length) {
flush_callbacks.pop()();
}
update_scheduled = false;
seen_callbacks.clear();
set_current_component(saved_component);
}
function update($$) {
if ($$.fragment !== null) {
$$.update();
run_all($$.before_update);
const dirty = $$.dirty;
$$.dirty = [-1];
$$.fragment && $$.fragment.p($$.ctx, dirty);
$$.after_update.forEach(add_render_callback);
}
}
function flush_render_callbacks(fns) {
const filtered = [];
const targets = [];
render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));
targets.forEach((c) => c());
render_callbacks = filtered;
}
// node_modules/svelte/src/runtime/internal/transitions.js
var outroing = /* @__PURE__ */ new Set();
var outros;
function group_outros() {
outros = {
r: 0,
c: [],
p: outros
// parent group
};
}
function check_outros() {
if (!outros.r) {
run_all(outros.c);
}
outros = outros.p;
}
function transition_in(block, local) {
if (block && block.i) {
outroing.delete(block);
block.i(local);
}
}
function transition_out(block, local, detach2, callback) {
if (block && block.o) {
if (outroing.has(block))
return;
outroing.add(block);
outros.c.push(() => {
outroing.delete(block);
if (callback) {
if (detach2)
block.d(1);
callback();
}
});
block.o(local);
} else if (callback) {
callback();
}
}
// node_modules/svelte/src/runtime/internal/each.js
function ensure_array_like(array_like_or_iterator) {
return (array_like_or_iterator == null ? void 0 : array_like_or_iterator.length) !== void 0 ? array_like_or_iterator : Array.from(array_like_or_iterator);
}
// node_modules/svelte/src/shared/boolean_attributes.js
var _boolean_attributes = (
/** @type {const} */
[
"allowfullscreen",
"allowpaymentrequest",
"async",
"autofocus",
"autoplay",
"checked",
"controls",
"default",
"defer",
"disabled",
"formnovalidate",
"hidden",
"inert",
"ismap",
"loop",
"multiple",
"muted",
"nomodule",
"novalidate",
"open",
"playsinline",
"readonly",
"required",
"reversed",
"selected"
]
);
var boolean_attributes = /* @__PURE__ */ new Set([..._boolean_attributes]);
// node_modules/svelte/src/runtime/internal/Component.js
function create_component(block) {
block && block.c();
}
function mount_component(component, target, anchor) {
const { fragment, after_update } = component.$$;
fragment && fragment.m(target, anchor);
add_render_callback(() => {
const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);
if (component.$$.on_destroy) {
component.$$.on_destroy.push(...new_on_destroy);
} else {
run_all(new_on_destroy);
}
component.$$.on_mount = [];
});
after_update.forEach(add_render_callback);
}
function destroy_component(component, detaching) {
const $$ = component.$$;
if ($$.fragment !== null) {
flush_render_callbacks($$.after_update);
run_all($$.on_destroy);
$$.fragment && $$.fragment.d(detaching);
$$.on_destroy = $$.fragment = null;
$$.ctx = [];
}
}
function make_dirty(component, i) {
if (component.$$.dirty[0] === -1) {
dirty_components.push(component);
schedule_update();
component.$$.dirty.fill(0);
}
component.$$.dirty[i / 31 | 0] |= 1 << i % 31;
}
function init(component, options, instance6, create_fragment6, not_equal, props, append_styles2 = null, dirty = [-1]) {
const parent_component = current_component;
set_current_component(component);
const $$ = component.$$ = {
fragment: null,
ctx: [],
// state
props,
update: noop,
not_equal,
bound: blank_object(),
// lifecycle
on_mount: [],
on_destroy: [],
on_disconnect: [],
before_update: [],
after_update: [],
context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),
// everything else
callbacks: blank_object(),
dirty,
skip_bound: false,
root: options.target || parent_component.$$.root
};
append_styles2 && append_styles2($$.root);
let ready = false;
$$.ctx = instance6 ? instance6(component, options.props || {}, (i, ret, ...rest) => {
const value = rest.length ? rest[0] : ret;
if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
if (!$$.skip_bound && $$.bound[i])
$$.bound[i](value);
if (ready)
make_dirty(component, i);
}
return ret;
}) : [];
$$.update();
ready = true;
run_all($$.before_update);
$$.fragment = create_fragment6 ? create_fragment6($$.ctx) : false;
if (options.target) {
if (options.hydrate) {
start_hydrating();
const nodes = children(options.target);
$$.fragment && $$.fragment.l(nodes);
nodes.forEach(detach);
} else {
$$.fragment && $$.fragment.c();
}
if (options.intro)
transition_in(component.$$.fragment);
mount_component(component, options.target, options.anchor);
end_hydrating();
flush();
}
set_current_component(parent_component);
}
var SvelteElement;
if (typeof HTMLElement === "function") {
SvelteElement = class extends HTMLElement {
constructor($$componentCtor, $$slots, use_shadow_dom) {
super();
/** The Svelte component constructor */
__publicField(this, "$$ctor");
/** Slots */
__publicField(this, "$$s");
/** The Svelte component instance */
__publicField(this, "$$c");
/** Whether or not the custom element is connected */
__publicField(this, "$$cn", false);
/** Component props data */
__publicField(this, "$$d", {});
/** `true` if currently in the process of reflecting component props back to attributes */
__publicField(this, "$$r", false);
/** @type {Record<string, CustomElementPropDefinition>} Props definition (name, reflected, type etc) */
__publicField(this, "$$p_d", {});
/** @type {Record<string, Function[]>} Event listeners */
__publicField(this, "$$l", {});
/** @type {Map<Function, Function>} Event listener unsubscribe functions */
__publicField(this, "$$l_u", /* @__PURE__ */ new Map());
this.$$ctor = $$componentCtor;
this.$$s = $$slots;
if (use_shadow_dom) {
this.attachShadow({ mode: "open" });
}
}
addEventListener(type, listener, options) {
this.$$l[type] = this.$$l[type] || [];
this.$$l[type].push(listener);
if (this.$$c) {
const unsub = this.$$c.$on(type, listener);
this.$$l_u.set(listener, unsub);
}
super.addEventListener(type, listener, options);
}
removeEventListener(type, listener, options) {
super.removeEventListener(type, listener, options);
if (this.$$c) {
const unsub = this.$$l_u.get(listener);
if (unsub) {
unsub();
this.$$l_u.delete(listener);
}
}
}
async connectedCallback() {
this.$$cn = true;
if (!this.$$c) {
let create_slot = function(name) {
return () => {
let node;
const obj = {
c: function create() {
node = element("slot");
if (name !== "default") {
attr(node, "name", name);
}
},
/**
* @param {HTMLElement} target
* @param {HTMLElement} [anchor]
*/
m: function mount(target, anchor) {
insert(target, node, anchor);
},
d: function destroy(detaching) {
if (detaching) {
detach(node);
}
}
};
return obj;
};
};
await Promise.resolve();
if (!this.$$cn) {
return;
}
const $$slots = {};
const existing_slots = get_custom_elements_slots(this);
for (const name of this.$$s) {
if (name in existing_slots) {
$$slots[name] = [create_slot(name)];
}
}
for (const attribute of this.attributes) {
const name = this.$$g_p(attribute.name);
if (!(name in this.$$d)) {
this.$$d[name] = get_custom_element_value(name, attribute.value, this.$$p_d, "toProp");
}
}
this.$$c = new this.$$ctor({
target: this.shadowRoot || this,
props: {
...this.$$d,
$$slots,
$$scope: {
ctx: []
}
}
});
const reflect_attributes = () => {
this.$$r = true;
for (const key in this.$$p_d) {
this.$$d[key] = this.$$c.$$.ctx[this.$$c.$$.props[key]];
if (this.$$p_d[key].reflect) {
const attribute_value = get_custom_element_value(
key,
this.$$d[key],
this.$$p_d,
"toAttribute"
);
if (attribute_value == null) {
this.removeAttribute(this.$$p_d[key].attribute || key);
} else {
this.setAttribute(this.$$p_d[key].attribute || key, attribute_value);
}
}
}
this.$$r = false;
};
this.$$c.$$.after_update.push(reflect_attributes);
reflect_attributes();
for (const type in this.$$l) {
for (const listener of this.$$l[type]) {
const unsub = this.$$c.$on(type, listener);
this.$$l_u.set(listener, unsub);
}
}
this.$$l = {};
}
}
// We don't need this when working within Svelte code, but for compatibility of people using this outside of Svelte
// and setting attributes through setAttribute etc, this is helpful
attributeChangedCallback(attr2, _oldValue, newValue) {
var _a;
if (this.$$r)
return;
attr2 = this.$$g_p(attr2);
this.$$d[attr2] = get_custom_element_value(attr2, newValue, this.$$p_d, "toProp");
(_a = this.$$c) == null ? void 0 : _a.$set({ [attr2]: this.$$d[attr2] });
}
disconnectedCallback() {
this.$$cn = false;
Promise.resolve().then(() => {
if (!this.$$cn) {
this.$$c.$destroy();
this.$$c = void 0;
}
});
}
$$g_p(attribute_name) {
return Object.keys(this.$$p_d).find(
(key) => this.$$p_d[key].attribute === attribute_name || !this.$$p_d[key].attribute && key.toLowerCase() === attribute_name
) || attribute_name;
}
};
}
function get_custom_element_value(prop, value, props_definition, transform) {
var _a;
const type = (_a = props_definition[prop]) == null ? void 0 : _a.type;
value = type === "Boolean" && typeof value !== "boolean" ? value != null : value;
if (!transform || !props_definition[prop]) {
return value;
} else if (transform === "toAttribute") {
switch (type) {
case "Object":
case "Array":
return value == null ? null : JSON.stringify(value);
case "Boolean":
return value ? "" : null;
case "Number":
return value == null ? null : value;
default:
return value;
}
} else {
switch (type) {
case "Object":
case "Array":
return value && JSON.parse(value);
case "Boolean":
return value;
case "Number":
return value != null ? +value : value;
default:
return value;
}
}
}
var SvelteComponent = class {
constructor() {
/**
* ### PRIVATE API
*
* Do not use, may change at any time
*
* @type {any}
*/
__publicField(this, "$$");
/**
* ### PRIVATE API
*
* Do not use, may change at any time
*
* @type {any}
*/
__publicField(this, "$$set");
}
/** @returns {void} */
$destroy() {
destroy_component(this, 1);
this.$destroy = noop;
}
/**
* @template {Extract<keyof Events, string>} K
* @param {K} type
* @param {((e: Events[K]) => void) | null | undefined} callback
* @returns {() => void}
*/
$on(type, callback) {
if (!is_function(callback)) {
return noop;
}
const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []);
callbacks.push(callback);
return () => {
const index = callbacks.indexOf(callback);
if (index !== -1)
callbacks.splice(index, 1);
};
}
/**
* @param {Partial<Props>} props
* @returns {void}
*/
$set(props) {
if (this.$$set && !is_empty(props)) {
this.$$.skip_bound = true;
this.$$set(props);
this.$$.skip_bound = false;
}
}
};
// node_modules/svelte/src/shared/version.js
var PUBLIC_VERSION = "4";
// node_modules/svelte/src/runtime/internal/disclose-version/index.js
if (typeof window !== "undefined")
(window.__svelte || (window.__svelte = { v: /* @__PURE__ */ new Set() })).v.add(PUBLIC_VERSION);
// src/TaskItemComponent.svelte
function add_css(target) {
append_styles(target, "svelte-u70618", ".pomodoro-tasks-item-desc.svelte-u70618{flex:1;overflow:hidden;width:100%;pointer-events:none;cursor:pointer}");
}
function create_fragment(ctx) {
let div;
return {
c() {
div = element("div");
attr(div, "class", "pomodoro-tasks-item-desc svelte-u70618");
},
m(target, anchor) {
insert(target, div, anchor);
ctx[3](div);
},
p: noop,
i: noop,
o: noop,
d(detaching) {
if (detaching) {
detach(div);
}
ctx[3](null);
}
};
}
function instance($$self, $$props, $$invalidate) {
let { render } = $$props;
let { content } = $$props;
let el;
afterUpdate(() => {
el.empty();
render(content, el);
});
function div_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
el = $$value;
$$invalidate(0, el);
});
}
$$self.$$set = ($$props2) => {
if ("render" in $$props2)
$$invalidate(1, render = $$props2.render);
if ("content" in $$props2)
$$invalidate(2, content = $$props2.content);
};
return [el, render, content, div_binding];
}
var TaskItemComponent = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance, create_fragment, safe_not_equal, { render: 1, content: 2 }, add_css);
}
};
var TaskItemComponent_default = TaskItemComponent;
// src/utils.ts
var import_obsidian = require("obsidian");
var import_obsidian_daily_notes_interface = __toESM(require_main());
// src/serializer/TaskModels.ts
var _TaskRegularExpressions = class {
};
var TaskRegularExpressions = _TaskRegularExpressions;
TaskRegularExpressions.dateFormat = "YYYY-MM-DD";
TaskRegularExpressions.dateTimeFormat = "YYYY-MM-DD HH:mm";
// Matches indentation before a list marker (including > for potentially nested blockquotes or Obsidian callouts)
TaskRegularExpressions.indentationRegex = /^([\s\t>]*)/;
// Matches - * and + list markers, or numbered list markers (eg 1.)
TaskRegularExpressions.listMarkerRegex = /([-*+]|[0-9]+\.)/;
// Matches a checkbox and saves the status character inside
TaskRegularExpressions.checkboxRegex = /\[(.)\]/u;
// Matches the rest of the task after the checkbox.
TaskRegularExpressions.afterCheckboxRegex = / *(.*)/u;
// Main regex for parsing a line. It matches the following:
// - Indentation
// - List marker
// - Status character
// - Rest of task after checkbox markdown
// See Task.extractTaskComponents() for abstraction around this regular expression.
// That is private for now, but could be made public in future if needed.
TaskRegularExpressions.taskRegex = new RegExp(
_TaskRegularExpressions.indentationRegex.source + _TaskRegularExpressions.listMarkerRegex.source + " +" + _TaskRegularExpressions.checkboxRegex.source + _TaskRegularExpressions.afterCheckboxRegex.source,
"u"
);
// Used with the "Create or Edit Task" command to parse indentation and status if present
TaskRegularExpressions.nonTaskRegex = new RegExp(
_TaskRegularExpressions.indentationRegex.source + _TaskRegularExpressions.listMarkerRegex.source + "? *(" + _TaskRegularExpressions.checkboxRegex.source + ")?" + _TaskRegularExpressions.afterCheckboxRegex.source,
"u"
);
// Used with "Toggle Done" command to detect a list item that can get a checkbox added to it.
TaskRegularExpressions.listItemRegex = new RegExp(
_TaskRegularExpressions.indentationRegex.source + _TaskRegularExpressions.listMarkerRegex.source
);
// Match on block link at end.
TaskRegularExpressions.blockLinkRegex = / \^[a-zA-Z0-9-]+$/u;
// Regex to match all hash tags, basically hash followed by anything but the characters in the negation.
// To ensure URLs are not caught it is looking of beginning of string tag and any
// tag that has a space in front of it. Any # that has a character in front
// of it will be ignored.
// EXAMPLE:
// description: '#dog #car http://www/ddd#ere #house'
// matches: #dog, #car, #house
// MAINTENANCE NOTE:
// If hashTags is modified, please update 'Recognising Tags' in Tags.md in the docs.
TaskRegularExpressions.hashTags = /(^|\s)#[^ !@#$%^&*(),.?":{}|<>]+/g;
TaskRegularExpressions.hashTagsFromEnd = new RegExp(
_TaskRegularExpressions.hashTags.source + "$"
);
// src/utils.ts
function getTemplater(app) {
return app.plugins.plugins["templater-obsidian"];
}
async function parseWithTemplater(app, tfile, templateContent, log) {
const templater = getTemplater(app);
if (!templater)
return templateContent;
const preamble = `<%* const log = ${JSON.stringify(
log
)}; log.begin = moment(log.begin); log.end = moment(log.end); %>`;
return await templater.templater.parse_template(
{ target_file: tfile, run_mode: 4 },
`${preamble}${templateContent}`
);
}
var ensureFileExists = async (app, path) => {
const dirs = path.replace(/\\/g, "/").split("/");
dirs.pop();
if (dirs.length) {
const dir = join(...dirs);
if (!app.vault.getAbstractFileByPath(dir)) {
await app.vault.createFolder(dir);
}
}
const file = app.vault.getAbstractFileByPath(path);
if (file) {
if (file instanceof import_obsidian.TFile) {
const md = file;
if (md.extension == "md") {
return md;
} else {
throw new Error(`invalid file extension: ${md.extension}`);
}
} else {
throw new Error(`invalid file path: ${path}`);
}
} else {
return await app.vault.create(path, "");
}
};
var join = (...partSegments) => {
let parts = [];
for (let i = 0, l = partSegments.length; i < l; i++) {
parts = parts.concat(partSegments[i].split("/"));
}
const newParts = [];
for (let i = 0, l = parts.length; i < l; i++) {
const part = parts[i];
if (!part || part === ".")
continue;
else
newParts.push(part);
}
if (parts[0] === "")
newParts.unshift("");
return newParts.join("/");
};
var getDailyNoteFile = async () => {
const file = (0, import_obsidian_daily_notes_interface.getDailyNote)((0, import_obsidian.moment)(), (0, import_obsidian_daily_notes_interface.getAllDailyNotes)());
if (!file) {
return await (0, import_obsidian_daily_notes_interface.createDailyNote)((0, import_obsidian.moment)());
}
return file;
};
var HASH_TAGS_REG_EXP = /(^|\s)#[^ !@#$%^&*(),.?":{}|<>]+/g;
function extractHashtags(description) {
var _a, _b;
return (_b = (_a = description.match(HASH_TAGS_REG_EXP)) == null ? void 0 : _a.map((tag) => tag.trim())) != null ? _b : [];
}
function extractTaskComponents(line) {
const regexMatch = line.match(TaskRegularExpressions.taskRegex);
if (regexMatch === null) {
return null;
}
const indentation = regexMatch[1];
const listMarker = regexMatch[2];
const statusString = regexMatch[3];
const status = statusString;
let body = regexMatch[4].trim();
const blockLinkMatch = body.match(TaskRegularExpressions.blockLinkRegex);
const blockLink = blockLinkMatch !== null ? blockLinkMatch[0] : "";
if (blockLink !== "") {
body = body.replace(TaskRegularExpressions.blockLinkRegex, "").trim();
}
return { indentation, listMarker, status, body, blockLink };
}
function toInlineFieldRegex(innerFieldRegex) {
const fieldRegex = [
"(?:",
/* */
/(?=[^\]]+\])\[/,
// Try to match '[' if there's a ']' later in the string
/* */
"|",
/* */
/(?=[^)]+\))\(/,
// Otherwise, match '(' if there's a ')' later in the string
")",
/ */,
innerFieldRegex,
/ */,
/[)\]]/,
/(?: *,)?/,
// Allow trailing comma, enables workaround from #1913 for rendering issue
/$/
// Regexes are matched from the end of the string forwards
].map((val) => val instanceof RegExp ? val.source : val).join("");
return new RegExp(fieldRegex, innerFieldRegex.flags);
}
// node_modules/svelte/src/runtime/store/index.js
var subscriber_queue = [];
function readable(value, start) {
return {
subscribe: writable(value, start).subscribe
};
}
function writable(value, start = noop) {
let stop;
const subscribers = /* @__PURE__ */ new Set();
function set(new_value) {
if (safe_not_equal(value, new_value)) {
value = new_value;
if (stop) {
const run_queue = !subscriber_queue.length;
for (const subscriber of subscribers) {
subscriber[1]();
subscriber_queue.push(subscriber, value);
}
if (run_queue) {
for (let i = 0; i < subscriber_queue.length; i += 2) {
subscriber_queue[i][0](subscriber_queue[i + 1]);
}
subscriber_queue.length = 0;
}
}
}
}
function update2(fn) {
set(fn(value));
}
function subscribe2(run2, invalidate = noop) {
const subscriber = [run2, invalidate];
subscribers.add(subscriber);
if (subscribers.size === 1) {
stop = start(set, update2) || noop;
}
run2(value);
return () => {
subscribers.delete(subscriber);
if (subscribers.size === 0 && stop) {
stop();
stop = null;
}
};
}
return { set, update: update2, subscribe: subscribe2 };
}
function derived(stores, fn, initial_value) {
const single = !Array.isArray(stores);
const stores_array = single ? [stores] : stores;
if (!stores_array.every(Boolean)) {
throw new Error("derived() expects stores as input, got a falsy value");
}
const auto = fn.length < 2;
return readable(initial_value, (set, update2) => {
let started = false;
const values = [];
let pending = 0;
let cleanup = noop;
const sync = () => {
if (pending) {
return;
}
cleanup();
const result = fn(single ? values[0] : values, set, update2);
if (auto) {
set(result);
} else {
cleanup = is_function(result) ? result : noop;
}
};
const unsubscribers = stores_array.map(
(store, i) => subscribe(
store,
(value) => {
values[i] = value;
pending &= ~(1 << i);
if (started) {
sync();
}
},
() => {
pending |= 1 << i;
}
)
);
started = true;
sync();
return function stop() {
run_all(unsubscribers);
cleanup();
started = false;
};
});
}
// src/serializer/DefaultTaskSerializer.ts
var DEFAULT_SYMBOLS = {
// NEW_TASK_FIELD_EDIT_REQUIRED
prioritySymbols: {
Highest: "\u{1F53A}",
High: "\u23EB",
Medium: "\u{1F53C}",
Low: "\u{1F53D}",
Lowest: "\u23EC",
None: ""
},
startDateSymbol: "\u{1F6EB}",
createdDateSymbol: "\u2795",
scheduledDateSymbol: "\u23F3",
dueDateSymbol: "\u{1F4C5}",
doneDateSymbol: "\u2705",
cancelledDateSymbol: "\u274C",
recurrenceSymbol: "\u{1F501}",
pomodorosSymbol: "\u{1F345}::",
TaskFormatRegularExpressions: {
// The following regex's end with `$` because they will be matched and
// removed from the end until none are left.
priorityRegex: /([🔺⏫🔼🔽⏬])$/u,
startDateRegex: /🛫 *(\d{4}-\d{2}-\d{2})$/u,
createdDateRegex: / *(\d{4}-\d{2}-\d{2})$/u,
scheduledDateRegex: /[⏳⌛] *(\d{4}-\d{2}-\d{2})$/u,
dueDateRegex: /[📅📆🗓] *(\d{4}-\d{2}-\d{2})$/u,
doneDateRegex: /✅ *(\d{4}-\d{2}-\d{2})$/u,
cancelledDateRegex: /❌ *(\d{4}-\d{2}-\d{2})$/u,
recurrenceRegex: /🔁 ?([a-zA-Z0-9, !]+)$/iu,
pomodorosRegex: toInlineFieldRegex(/🍅:: *(\d* *\/? *\d*)/)
}
};
var DefaultTaskSerializer = class {
constructor(symbols) {
this.symbols = symbols;
}
/**
* Given the string captured in the first capture group of
* {@link DefaultTaskSerializerSymbols.TaskFormatRegularExpressions.priorityRegex},
* returns the corresponding Priority level.
*
* @param p String captured by priorityRegex
* @returns Corresponding priority if parsing was successful, otherwise {@link Priority.None}
*/
parsePriority(p) {
const { prioritySymbols } = this.symbols;
switch (p) {
case prioritySymbols.Lowest:
return "5" /* Lowest */;
case prioritySymbols.Low:
return "4" /* Low */;
case prioritySymbols.Medium:
return "2" /* Medium */;
case prioritySymbols.High:
return "1" /* High */;
case prioritySymbols.Highest:
return "0" /* Highest */;
default:
return "3" /* None */;
}
}
/* Parse TaskDetails from the textual description of a {@link Task}
*
* @param line The string to parse
*
* @return {TaskDetails}
*/
deserialize(line) {
const { TaskFormatRegularExpressions } = this.symbols;
let matched;
let priority = "3" /* None */;
let startDate = null;
let scheduledDate = null;
let dueDate = null;
let doneDate = null;
let cancelledDate = null;
let createdDate = null;
let recurrenceRule = "";
let pomodoros = "";
let trailingTags = "";
const maxRuns = 20;
let runs = 0;
do {
matched = false;
const pomodorosMatch = line.match(
TaskFormatRegularExpressions.pomodorosRegex
);
if (pomodorosMatch !== null) {
pomodoros = pomodorosMatch[1];
line = line.replace(TaskFormatRegularExpressions.pomodorosRegex, "").trim();
matched = true;
}
const priorityMatch = line.match(
TaskFormatRegularExpressions.priorityRegex
);
if (priorityMatch !== null) {
priority = this.parsePriority(priorityMatch[1]);
line = line.replace(TaskFormatRegularExpressions.priorityRegex, "").trim();
matched = true;
}
const doneDateMatch = line.match(
TaskFormatRegularExpressions.doneDateRegex
);
if (doneDateMatch !== null) {
doneDate = window.moment(
doneDateMatch[1],
TaskRegularExpressions.dateFormat
);
line = line.replace(TaskFormatRegularExpressions.doneDateRegex, "").trim();
matched = true;
}
const cancelledDateMatch = line.match(
TaskFormatRegularExpressions.cancelledDateRegex
);
if (cancelledDateMatch !== null) {
cancelledDate = window.moment(
cancelledDateMatch[1],
TaskRegularExpressions.dateFormat
);
line = line.replace(
TaskFormatRegularExpressions.cancelledDateRegex,
""
).trim();
matched = true;
}
const dueDateMatch = line.match(
TaskFormatRegularExpressions.dueDateRegex
);
if (dueDateMatch !== null) {
dueDate = window.moment(
dueDateMatch[1],
TaskRegularExpressions.dateFormat
);
line = line.replace(TaskFormatRegularExpressions.dueDateRegex, "").trim();
matched = true;
}
const scheduledDateMatch = line.match(
TaskFormatRegularExpressions.scheduledDateRegex
);
if (scheduledDateMatch !== null) {
scheduledDate = window.moment(
scheduledDateMatch[1],
TaskRegularExpressions.dateFormat
);
line = line.replace(
TaskFormatRegularExpressions.scheduledDateRegex,
""
).trim();
matched = true;
}
const startDateMatch = line.match(
TaskFormatRegularExpressions.startDateRegex
);
if (startDateMatch !== null) {
startDate = window.moment(
startDateMatch[1],
TaskRegularExpressions.dateFormat
);
line = line.replace(TaskFormatRegularExpressions.startDateRegex, "").trim();
matched = true;
}
const createdDateMatch = line.match(
TaskFormatRegularExpressions.createdDateRegex
);
if (createdDateMatch !== null) {
createdDate = window.moment(
createdDateMatch[1],
TaskRegularExpressions.dateFormat
);
line = line.replace(TaskFormatRegularExpressions.createdDateRegex, "").trim();
matched = true;
}
const recurrenceMatch = line.match(
TaskFormatRegularExpressions.recurrenceRegex
);
if (recurrenceMatch !== null) {
recurrenceRule = recurrenceMatch[1].trim();
line = line.replace(TaskFormatRegularExpressions.recurrenceRegex, "").trim();
matched = true;
}
const tagsMatch = line.match(TaskRegularExpressions.hashTagsFromEnd);
if (tagsMatch != null) {
line = line.replace(TaskRegularExpressions.hashTagsFromEnd, "").trim();
matched = true;
const tagName = tagsMatch[0].trim();
trailingTags = trailingTags.length > 0 ? [tagName, trailingTags].join(" ") : tagName;
}
runs++;
} while (matched && runs <= maxRuns);
if (trailingTags.length > 0)
line += " " + trailingTags;
return {
description: line,
priority,
startDate,
createdDate,
scheduledDate,
dueDate,
doneDate,
cancelledDate,
recurrenceRule,
pomodoros,
tags: extractHashtags(line)
};
}
};
// src/serializer/DataviewTaskSerializer.ts
var DATAVIEW_SYMBOLS = {
// NEW_TASK_FIELD_EDIT_REQUIRED
prioritySymbols: {
Highest: "priority:: highest",
High: "priority:: high",
Medium: "priority:: medium",
Low: "priority:: low",
Lowest: "priority:: lowest",
None: ""
},
startDateSymbol: "start::",
createdDateSymbol: "created::",
scheduledDateSymbol: "scheduled::",
dueDateSymbol: "due::",
doneDateSymbol: "completion::",
cancelledDateSymbol: "cancelled::",
recurrenceSymbol: "repeat::",
pomodorosSymbol: "\u{1F345}::",
TaskFormatRegularExpressions: {
priorityRegex: toInlineFieldRegex(
/priority:: *(highest|high|medium|low|lowest)/
),
startDateRegex: toInlineFieldRegex(/start:: *(\d{4}-\d{2}-\d{2})/),
createdDateRegex: toInlineFieldRegex(/created:: *(\d{4}-\d{2}-\d{2})/),
scheduledDateRegex: toInlineFieldRegex(
/scheduled:: *(\d{4}-\d{2}-\d{2})/
),
dueDateRegex: toInlineFieldRegex(/due:: *(\d{4}-\d{2}-\d{2})/),
doneDateRegex: toInlineFieldRegex(/completion:: *(\d{4}-\d{2}-\d{2})/),
cancelledDateRegex: toInlineFieldRegex(
/cancelled:: *(\d{4}-\d{2}-\d{2})/
),
recurrenceRegex: toInlineFieldRegex(/repeat:: *([a-zA-Z0-9, !]+)/),
pomodorosRegex: toInlineFieldRegex(/🍅:: *(\d* *\/? *\d*)/)
}
};
var DataviewTaskSerializer = class extends DefaultTaskSerializer {
constructor() {
super(DATAVIEW_SYMBOLS);
}
parsePriority(p) {
switch (p) {
case "highest":
return "0" /* Highest */;
case "high":
return "1" /* High */;
case "medium":
return "2" /* Medium */;
case "low":
return "4" /* Low */;
case "lowest":
return "5" /* Lowest */;
default:
return "3" /* None */;
}
}
};
// src/serializer/index.ts
var POMODORO_REGEX = new RegExp(
"(?:(?=[^\\]]+\\])\\[|(?=[^)]+\\))\\() *\u{1F345}:: *(\\d* *\\/? *\\d*) *[)\\]](?: *,)?"
);
var DESERIALIZERS = {
TASKS: new DefaultTaskSerializer(DEFAULT_SYMBOLS),
DATAVIEW: new DataviewTaskSerializer()
};
// src/Tasks.ts
var Tasks = class {
constructor(plugin) {
this.unsubscribers = [];
this.state = {
list: []
};
this.plugin = plugin;
this._store = writable(this.state);
this.unsubscribers.push(
this._store.subscribe((state) => {
this.state = state;
})
);
this.unsubscribers.push(
derived(this.plugin.tracker, ($tracker) => {
var _a;
return (_a = $tracker.file) == null ? void 0 : _a.path;
}).subscribe(() => {
var _a;
let file = (_a = this.plugin.tracker) == null ? void 0 : _a.file;
if (file) {
this.loadFileTasks(file);
} else {
this.clearTasks();
}
})
);
this.subscribe = this._store.subscribe;
this.plugin.registerEvent(
plugin.app.metadataCache.on(
"changed",
(file, content, cache) => {
var _a, _b;
if (file.extension === "md" && file == this.plugin.tracker.file) {
let tasks = resolveTasks(
this.plugin.getSettings().taskFormat,
file,
content,
cache
);
this._store.update((state) => {
state.list = tasks;
return state;
});
if ((_b = (_a = this.plugin.tracker) == null ? void 0 : _a.task) == null ? void 0 : _b.blockLink) {
let task = tasks.find(
(item) => {
var _a2, _b2;
return item.blockLink && item.blockLink === ((_b2 = (_a2 = this.plugin.tracker) == null ? void 0 : _a2.task) == null ? void 0 : _b2.blockLink);
}
);
if (task) {
this.plugin.tracker.sync(task);
}
}
}
}
)
);
}
static getDeserializer(format) {
return DESERIALIZERS[format];
}
loadFileTasks(file) {
if (file.extension == "md") {
this.plugin.app.vault.cachedRead(file).then((c) => {
let tasks = resolveTasks(
this.plugin.getSettings().taskFormat,
file,
c,
this.plugin.app.metadataCache.getFileCache(file)
);
this._store.update(() => ({
list: tasks
}));
});
} else {
this._store.update(() => ({
file,
list: []
}));
}
}
clearTasks() {
this._store.update(() => ({
list: []
}));
}
destroy() {
for (let unsub of this.unsubscribers) {
unsub();
}
}
};
function resolveTasks(format, file, content, metadata) {
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
if (!content || !metadata) {
return [];
}
let cache = {};
const lines = content.split("\n");
for (let rawElement of metadata.listItems || []) {
if (rawElement.task) {
let lineNr = rawElement.position.start.line;
let line = lines[lineNr];
const components = extractTaskComponents(line);
if (!components) {
continue;
}
let detail = DESERIALIZERS[format].deserialize(components.body);
let [actual, expected] = detail.pomodoros.split("/");
const dateformat = "YYYY-MM-DD";
let item = {
text: line,
path: file.path,
fileName: file.name,
name: detail.description,
status: components.status,
blockLink: components.blockLink,
checked: rawElement.task != "" && rawElement.task != " ",
description: detail.description,
done: (_b = (_a = detail.doneDate) == null ? void 0 : _a.format(dateformat)) != null ? _b : "",
due: (_d = (_c = detail.dueDate) == null ? void 0 : _c.format(dateformat)) != null ? _d : "",
created: (_f = (_e = detail.createdDate) == null ? void 0 : _e.format(dateformat)) != null ? _f : "",
cancelled: (_h = (_g = detail.cancelledDate) == null ? void 0 : _g.format(dateformat)) != null ? _h : "",
scheduled: (_j = (_i = detail.scheduledDate) == null ? void 0 : _i.format(dateformat)) != null ? _j : "",
start: (_l = (_k = detail.startDate) == null ? void 0 : _k.format(dateformat)) != null ? _l : "",
priority: detail.priority,
recurrence: detail.recurrenceRule,
expected: expected ? parseInt(expected) : 0,
actual: actual === "" ? 0 : parseInt(actual),
tags: detail.tags,
line: lineNr
};
cache[lineNr] = item;
}
}
return Object.values(cache);
}
// src/Settings.ts
var import_obsidian2 = require("obsidian");
var _PomodoroSettings = class extends import_obsidian2.PluginSettingTab {
constructor(plugin, settings2) {
super(plugin.app, plugin);
this.updateSettings = (newSettings, refreshUI = false) => {
_PomodoroSettings.settings.update((settings2) => {
this._settings = { ...settings2, ...newSettings };
if (refreshUI) {
this.display();
}
return this._settings;
});
};
this.plugin = plugin;
this._settings = { ..._PomodoroSettings.DEFAULT_SETTINGS, ...settings2 };
_PomodoroSettings.settings.set(this._settings);
this.unsubscribe = _PomodoroSettings.settings.subscribe((settings3) => {
var _a;
this.plugin.saveData(settings3);
this._settings = settings3;
(_a = this.plugin.timer) == null ? void 0 : _a.setupTimer();
});
}
getSettings() {
return this._settings;
}
unload() {
this.unsubscribe();
}
display() {
const { containerEl } = this;
containerEl.empty();
new import_obsidian2.Setting(containerEl).setName("Enable Status Bar Timer").addToggle((toggle) => {
toggle.setValue(this._settings.useStatusBarTimer);
toggle.onChange((value) => {
this.updateSettings({ useStatusBarTimer: value });
});
});
new import_obsidian2.Setting(containerEl).setHeading().setName("Notification");
new import_obsidian2.Setting(containerEl).setName("Use System Notification").addToggle((toggle) => {
toggle.setValue(this._settings.useSystemNotification);
toggle.onChange((value) => {
this.updateSettings({ useSystemNotification: value });
});
});
new import_obsidian2.Setting(containerEl).setName("Sound Notification").addToggle((toggle) => {
toggle.setValue(this._settings.notificationSound);
toggle.onChange((value) => {
this.updateSettings({ notificationSound: value }, true);
});
});
if (this._settings.notificationSound) {
new import_obsidian2.Setting(containerEl).setName("Custom Notification Audio").addText((text2) => {
text2.inputEl.style.width = "100%";
text2.setPlaceholder("path/to/sound.mp3");
text2.setValue(this._settings.customSound);
text2.onChange((value) => {
this.updateSettings({ customSound: value });
});
}).addExtraButton((button) => {
button.setIcon("play");
button.setTooltip("play");
button.onClick(() => {
var _a;
(_a = this.plugin.timer) == null ? void 0 : _a.playAudio();
});
});
}
new import_obsidian2.Setting(containerEl).setHeading().setName("Task");
new import_obsidian2.Setting(containerEl).setName("Enable Task Tracking").setDesc(
"Important: Enabling this feature will automatically add a block ID when activating a task, unless a block ID is already present."
).addToggle((toggle) => {
toggle.setValue(this._settings.enableTaskTracking);
toggle.onChange((value) => {
this.updateSettings({ enableTaskTracking: value });
});
});
new import_obsidian2.Setting(containerEl).setName("Show Task Progress Background").addToggle((toggle) => {
toggle.setValue(this._settings.showTaskProgress);
toggle.onChange((value) => {
this.updateSettings({ showTaskProgress: value });
});
});
new import_obsidian2.Setting(containerEl).setName("Task Format").addDropdown((dropdown) => {
dropdown.selectEl.style.width = "160px";
dropdown.addOptions({
TASKS: "Tasks Emoji Format",
DATAVIEW: "Dataview"
});
dropdown.setValue(this._settings.taskFormat);
dropdown.onChange((value) => {
this.updateSettings(
{ taskFormat: value },
true
);
});
});
new import_obsidian2.Setting(containerEl).setHeading().setName("Log");
new import_obsidian2.Setting(containerEl).setName("Log File").addDropdown((dropdown) => {
dropdown.selectEl.style.width = "160px";
dropdown.addOptions({
NONE: "None",
DAILY: "Daily note",
FILE: "File"
});
dropdown.setValue(this._settings.logFile);
dropdown.onChange((value) => {
this.updateSettings({ logFile: value }, true);
});
});
if (this._settings.logFile != "NONE") {
if (this._settings.logFile === "FILE") {
new import_obsidian2.Setting(containerEl).setName("Log file path").setDesc("The file to log pomodoro sessions to").addText((text2) => {
text2.inputEl.style.width = "300px";
text2.setValue(this._settings.logPath);
text2.onChange((value) => {
this.updateSettings({ logPath: value });
});
});
}
new import_obsidian2.Setting(containerEl).setName("Log Level").addDropdown((dropdown) => {
dropdown.selectEl.style.width = "160px";
dropdown.addOptions({
ALL: "All",
WORK: "Work",
BREAK: "Break"
});
dropdown.setValue(this._settings.logLevel);
dropdown.onChange((value) => {
this.updateSettings({ logLevel: value });
});
});
const hasTemplater = !!getTemplater(this.app);
let example = "";
if (this._settings.logFormat == "SIMPLE") {
example = `**WORK(25m)**: from ${(0, import_obsidian2.moment)().subtract(25, "minutes").format("HH:mm")} - ${(0, import_obsidian2.moment)().format("HH:mm")}`;
}
if (this._settings.logFormat == "VERBOSE") {
example = `- \u{1F345} (pomodoro::WORK) (duration:: 25m) (begin:: ${(0, import_obsidian2.moment)().subtract(25, "minutes").format("YYYY-MM-DD HH:mm")}) - (end:: ${(0, import_obsidian2.moment)().format(
"YYYY-MM-DD HH:mm"
)})`;
}
new import_obsidian2.Setting(containerEl).setName("Log Format").setDesc(example).addDropdown((dropdown) => {
dropdown.selectEl.style.width = "160px";
dropdown.addOptions({
SIMPLE: "Simple",
VERBOSE: "Verbose",
CUSTOM: "Custom"
});
dropdown.setValue(this._settings.logFormat);
dropdown.onChange((value) => {
this.updateSettings(
{ logFormat: value },
true
);
});
});
if (this._settings.logFormat == "CUSTOM") {
const logTemplate = new import_obsidian2.Setting(containerEl).setName(
"Log template"
);
if (hasTemplater) {
logTemplate.addTextArea((text2) => {
text2.inputEl.style.width = "100%";
text2.inputEl.style.resize = "vertical";
text2.setPlaceholder("<% templater script goes here %>");
text2.setValue(this._settings.logTemplate);
text2.onChange((value) => {
this.updateSettings({ logTemplate: value });
});
});
} else {
logTemplate.setDesc(
createFragment((fragment) => {
const text1 = document.createElement("span");
text1.setText("Requires ");
text1.style.color = "var(--text-error)";
const a = document.createElement("a");
a.setText("Templater");
a.href = "obsidian://show-plugin?id=templater-obsidian";
const text2 = document.createElement("span");
text2.setText(
" plugin to be enabled, then click the refresh button"
);
text2.style.color = "var(--text-error)";
fragment.append(text1, a, text2);
})
).addButton((button) => {
button.setIcon("refresh-ccw");
button.onClick(() => {
this.display();
});
});
}
}
}
new import_obsidian2.Setting(containerEl).addButton((button) => {
button.setButtonText("Restore Settings");
button.onClick(() => {
this.updateSettings(_PomodoroSettings.DEFAULT_SETTINGS, true);
});
});
}
};
var PomodoroSettings = _PomodoroSettings;
PomodoroSettings.DEFAULT_SETTINGS = {
workLen: 25,
breakLen: 5,
autostart: false,
useStatusBarTimer: false,
notificationSound: true,
customSound: "",
showTaskProgress: true,
enableTaskTracking: false,
logFile: "NONE",
logFocused: false,
logPath: "",
logLevel: "ALL",
logTemplate: "",
logFormat: "VERBOSE",
useSystemNotification: false,
taskFormat: "TASKS"
};
PomodoroSettings.settings = writable(
_PomodoroSettings.DEFAULT_SETTINGS
);
// src/stores.ts
var settings = PomodoroSettings.settings;
// src/TasksComponent.svelte
var import_obsidian3 = require("obsidian");
function add_css2(target) {
append_styles(target, "svelte-1ipipwe", ".pomodoro-tasks-wrapper.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{width:100%;border:1px solid var(--background-modifier-border);border-radius:5px}.pomodoro-tasks-header-title.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{width:100%;background-color:var(--background-modifier-active-hover);padding:0.5rem 1rem;font-size:1rem;font-weight:bold;display:flex;justify-content:space-between;align-items:flex-end}.pomodoro-tasks-header-title.svelte-1ipipwe .pomodoro-tasks-file-name.svelte-1ipipwe.svelte-1ipipwe{flex:1;text-wrap:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:5px}.pomodoro-tasks-file-name.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{cursor:pointer}.pomodoro-tasks-header-title.svelte-1ipipwe .pomodoro-tasks-count.svelte-1ipipwe.svelte-1ipipwe{width:50px}.pomodoro-tasks-list.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe,.pomodoro-tasks-active.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{border-top:1px solid var(--background-modifier-border);width:100%}.pomodoro-tasks-item.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{display:flex;flex-direction:column;width:100%;padding:0.5rem 1rem;display:flex}.pomodoro-tasks-list.svelte-1ipipwe .pomodoro-tasks-item.svelte-1ipipwe.svelte-1ipipwe{cursor:pointer}.pomodoro-tasks-toolbar.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{width:100%}.pomodoro-tasks-count.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{color:var(--text-faint);font-size:0.8rem;text-wrap:nowrap}.pomodoro-tasks-filters.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{padding:0.5rem 1rem}.pomodoro-tasks-text-filter.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{border-top:1px solid var(--background-modifier-border);padding:0.5rem 0rem}.pomodoro-tasks-wrapper.svelte-1ipipwe input.svelte-1ipipwe.svelte-1ipipwe{width:100%;font-size:0.8rem;border:none;border-radius:0;background:transparent}.pomodoro-tasks-wrapper.svelte-1ipipwe input.svelte-1ipipwe.svelte-1ipipwe:active{border:none;box-shadow:none}.pomodoro-tasks-wrapper.svelte-1ipipwe input.svelte-1ipipwe.svelte-1ipipwe:focus{border:none;box-shadow:none}.pomodoro-tasks-text-filter.svelte-1ipipwe input.svelte-1ipipwe.svelte-1ipipwe{height:0.8rem}.pomodoro-tasks-filter.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{font-size:0.8rem;padding:1px 7px;border-radius:10px;cursor:pointer;color:var(--text-muted)}.pomodoro-tasks-name.svelte-1ipipwe svg.svelte-1ipipwe.svelte-1ipipwe{margin-right:5px}.pomodoro-tasks-name.svelte-1ipipwe svg.svelte-1ipipwe.svelte-1ipipwe{color:var(--color-blue)}.pomodoro-tasks-checked.svelte-1ipipwe .pomodoro-tasks-name.svelte-1ipipwe svg.svelte-1ipipwe{color:var(--color-green)}.pomodoro-tasks-name.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{width:100%;display:flex;align-items:baseline}.filter-active.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{background-color:var(--interactive-accent);color:var(--text-on-accent-inverted)}.pomodoro-tasks-item.svelte-1ipipwe+.pomodoro-tasks-item.svelte-1ipipwe.svelte-1ipipwe{border-top:1px solid var(--background-modifier-border)}.pomodoro-tasks-checked.svelte-1ipipwe .pomodoro-tasks-name.svelte-1ipipwe.svelte-1ipipwe{text-decoration:line-through;color:var(--text-muted)}.pomodoro-tasks-pin.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{cursor:pointer;padding-right:3px}.pomodoro-tasks-remove.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{cursor:pointer}.pomodoro-tasks-progress.svelte-1ipipwe.svelte-1ipipwe.svelte-1ipipwe{font-size:0.7rem;color:var(--text-muted);text-align:end;text-wrap:nowrap;overflow:hidden}");
}
function get_each_context(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[23] = list[i];
return child_ctx;
}
function create_if_block(ctx) {
let div2;
let div1;
let div0;
let span0;
let t0;
let span1;
let t1_value = (
/*$tracker*/
ctx[6].file.name + ""
);
let t1;
let t2;
let span2;
let t3_value = (
/*filtered*/
ctx[5].length + ""
);
let t3;
let t4;
let t5;
let t6;
let current;
let mounted;
let dispose;
function select_block_type(ctx2, dirty) {
if (!/*$tracker*/
ctx2[6].pinned)
return create_if_block_5;
return create_else_block_1;
}
let current_block_type = select_block_type(ctx, -1);
let if_block0 = current_block_type(ctx);
let if_block1 = (
/*$tasks*/
ctx[4].list.length > 0 && create_if_block_3(ctx)
);
let if_block2 = (
/*filtered*/
ctx[5].length > 0 && create_if_block_1(ctx)
);
return {
c() {
div2 = element("div");
div1 = element("div");
div0 = element("div");
span0 = element("span");
if_block0.c();
t0 = space();
span1 = element("span");
t1 = text(t1_value);
t2 = space();
span2 = element("span");
t3 = text(t3_value);
t4 = text(" tasks");
t5 = space();
if (if_block1)
if_block1.c();
t6 = space();
if (if_block2)
if_block2.c();
attr(span0, "class", "pomodoro-tasks-pin svelte-1ipipwe");
attr(span1, "class", "pomodoro-tasks-file-name svelte-1ipipwe");
attr(span2, "class", "pomodoro-tasks-count svelte-1ipipwe");
attr(div0, "class", "pomodoro-tasks-header-title svelte-1ipipwe");
attr(div1, "class", "pomodoro-tasks-header");
attr(div2, "class", "pomodoro-tasks-wrapper svelte-1ipipwe");
},
m(target, anchor) {
insert(target, div2, anchor);
append(div2, div1);
append(div1, div0);
append(div0, span0);
if_block0.m(span0, null);
append(div0, t0);
append(div0, span1);
append(span1, t1);
append(div0, t2);
append(div0, span2);
append(span2, t3);
append(span2, t4);
append(div1, t5);
if (if_block1)
if_block1.m(div1, null);
append(div2, t6);
if (if_block2)
if_block2.m(div2, null);
current = true;
if (!mounted) {
dispose = [
listen(
span0,
"click",
/*togglePinned*/
ctx[9]
),
listen(
span1,
"click",
/*openFile*/
ctx[14]
)
];
mounted = true;
}
},
p(ctx2, dirty) {
if (current_block_type !== (current_block_type = select_block_type(ctx2, dirty))) {
if_block0.d(1);
if_block0 = current_block_type(ctx2);
if (if_block0) {
if_block0.c();
if_block0.m(span0, null);
}
}
if ((!current || dirty & /*$tracker*/
64) && t1_value !== (t1_value = /*$tracker*/
ctx2[6].file.name + ""))
set_data(t1, t1_value);
if ((!current || dirty & /*filtered*/
32) && t3_value !== (t3_value = /*filtered*/
ctx2[5].length + ""))
set_data(t3, t3_value);
if (
/*$tasks*/
ctx2[4].list.length > 0
) {
if (if_block1) {
if_block1.p(ctx2, dirty);
} else {
if_block1 = create_if_block_3(ctx2);
if_block1.c();
if_block1.m(div1, null);
}
} else if (if_block1) {
if_block1.d(1);
if_block1 = null;
}
if (
/*filtered*/
ctx2[5].length > 0
) {
if (if_block2) {
if_block2.p(ctx2, dirty);
if (dirty & /*filtered*/
32) {
transition_in(if_block2, 1);
}
} else {
if_block2 = create_if_block_1(ctx2);
if_block2.c();
transition_in(if_block2, 1);
if_block2.m(div2, null);
}
} else if (if_block2) {
group_outros();
transition_out(if_block2, 1, 1, () => {
if_block2 = null;
});
check_outros();
}
},
i(local) {
if (current)
return;
transition_in(if_block2);
current = true;
},
o(local) {
transition_out(if_block2);
current = false;
},
d(detaching) {
if (detaching) {
detach(div2);
}
if_block0.d();
if (if_block1)
if_block1.d();
if (if_block2)
if_block2.d();
mounted = false;
run_all(dispose);
}
};
}
function create_else_block_1(ctx) {
let svg;
let line0;
let line1;
let path0;
let path1;
return {
c() {
svg = svg_element("svg");
line0 = svg_element("line");
line1 = svg_element("line");
path0 = svg_element("path");
path1 = svg_element("path");
attr(line0, "x1", "2");
attr(line0, "x2", "22");
attr(line0, "y1", "2");
attr(line0, "y2", "22");
attr(line1, "x1", "12");
attr(line1, "x2", "12");
attr(line1, "y1", "17");
attr(line1, "y2", "22");
attr(path0, "d", "M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h12");
attr(path1, "d", "M15 9.34V6h1a2 2 0 0 0 0-4H7.89");
attr(svg, "xmlns", "http://www.w3.org/2000/svg");
attr(svg, "width", "12");
attr(svg, "height", "12");
attr(svg, "viewBox", "0 0 24 24");
attr(svg, "fill", "none");
attr(svg, "stroke", "currentColor");
attr(svg, "stroke-width", "2");
attr(svg, "stroke-linecap", "round");
attr(svg, "stroke-linejoin", "round");
attr(svg, "class", "lucide lucide-pin-off");
},
m(target, anchor) {
insert(target, svg, anchor);
append(svg, line0);
append(svg, line1);
append(svg, path0);
append(svg, path1);
},
d(detaching) {
if (detaching) {
detach(svg);
}
}
};
}
function create_if_block_5(ctx) {
let svg;
let line;
let path;
return {
c() {
svg = svg_element("svg");
line = svg_element("line");
path = svg_element("path");
attr(line, "x1", "12");
attr(line, "x2", "12");
attr(line, "y1", "17");
attr(line, "y2", "22");
attr(path, "d", "M5 17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6h1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4h1v4.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24Z");
attr(svg, "xmlns", "http://www.w3.org/2000/svg");
attr(svg, "width", "12");
attr(svg, "height", "12");
attr(svg, "viewBox", "0 0 24 24");
attr(svg, "fill", "none");
attr(svg, "stroke", "currentColor");
attr(svg, "stroke-width", "2");
attr(svg, "stroke-linecap", "round");
attr(svg, "stroke-linejoin", "round");
attr(svg, "class", "lucide lucide-pin");
},
m(target, anchor) {
insert(target, svg, anchor);
append(svg, line);
append(svg, path);
},
d(detaching) {
if (detaching) {
detach(svg);
}
}
};
}
function create_if_block_3(ctx) {
let div0;
let t0;
let div2;
let div1;
let span0;
let t1;
let span0_class_value;
let t2;
let span1;
let t3;
let span1_class_value;
let t4;
let span2;
let t5;
let span2_class_value;
let t6;
let div3;
let input;
let mounted;
let dispose;
let if_block = (
/*$tracker*/
ctx[6].task && create_if_block_4(ctx)
);
return {
c() {
div0 = element("div");
if (if_block)
if_block.c();
t0 = space();
div2 = element("div");
div1 = element("div");
span0 = element("span");
t1 = text("All");
t2 = space();
span1 = element("span");
t3 = text("Todo");
t4 = space();
span2 = element("span");
t5 = text("Completed");
t6 = space();
div3 = element("div");
input = element("input");
attr(div0, "class", "pomodoro-tasks-active svelte-1ipipwe");
attr(span0, "class", span0_class_value = "pomodoro-tasks-filter " + /*status*/
(ctx[2] === "" ? "filter-active" : "") + " svelte-1ipipwe");
attr(span1, "class", span1_class_value = "pomodoro-tasks-filter " + /*status*/
(ctx[2] === "todo" ? "filter-active" : "") + " svelte-1ipipwe");
attr(span2, "class", span2_class_value = "pomodoro-tasks-filter " + /*status*/
(ctx[2] === "completed" ? "filter-active" : "") + " svelte-1ipipwe");
attr(div1, "class", "pomodoro-tasks-filters svelte-1ipipwe");
attr(div2, "class", "pomodoro-tasks-toolbar svelte-1ipipwe");
attr(input, "type", "text");
attr(input, "placeholder", "Search...");
attr(input, "class", "svelte-1ipipwe");
attr(div3, "class", "pomodoro-tasks-text-filter svelte-1ipipwe");
},
m(target, anchor) {
insert(target, div0, anchor);
if (if_block)
if_block.m(div0, null);
insert(target, t0, anchor);
insert(target, div2, anchor);
append(div2, div1);
append(div1, span0);
append(span0, t1);
append(div1, t2);
append(div1, span1);
append(span1, t3);
append(div1, t4);
append(div1, span2);
append(span2, t5);
insert(target, t6, anchor);
insert(target, div3, anchor);
append(div3, input);
set_input_value(
input,
/*query*/
ctx[3]
);
if (!mounted) {
dispose = [
listen(
span0,
"click",
/*click_handler*/
ctx[17]
),
listen(
span1,
"click",
/*click_handler_1*/
ctx[18]
),
listen(
span2,
"click",
/*click_handler_2*/
ctx[19]
),
listen(
input,
"input",
/*input_input_handler*/
ctx[20]
)
];
mounted = true;
}
},
p(ctx2, dirty) {
if (
/*$tracker*/
ctx2[6].task
) {
if (if_block) {
if_block.p(ctx2, dirty);
} else {
if_block = create_if_block_4(ctx2);
if_block.c();
if_block.m(div0, null);
}
} else if (if_block) {
if_block.d(1);
if_block = null;
}
if (dirty & /*status*/
4 && span0_class_value !== (span0_class_value = "pomodoro-tasks-filter " + /*status*/
(ctx2[2] === "" ? "filter-active" : "") + " svelte-1ipipwe")) {
attr(span0, "class", span0_class_value);
}
if (dirty & /*status*/
4 && span1_class_value !== (span1_class_value = "pomodoro-tasks-filter " + /*status*/
(ctx2[2] === "todo" ? "filter-active" : "") + " svelte-1ipipwe")) {
attr(span1, "class", span1_class_value);
}
if (dirty & /*status*/
4 && span2_class_value !== (span2_class_value = "pomodoro-tasks-filter " + /*status*/
(ctx2[2] === "completed" ? "filter-active" : "") + " svelte-1ipipwe")) {
attr(span2, "class", span2_class_value);
}
if (dirty & /*query*/
8 && input.value !== /*query*/
ctx2[3]) {
set_input_value(
input,
/*query*/
ctx2[3]
);
}
},
d(detaching) {
if (detaching) {
detach(div0);
detach(t0);
detach(div2);
detach(t6);
detach(div3);
}
if (if_block)
if_block.d();
mounted = false;
run_all(dispose);
}
};
}
function create_if_block_4(ctx) {
let div1;
let div0;
let input;
let input_value_value;
let t;
let span;
let mounted;
let dispose;
return {
c() {
var _a;
div1 = element("div");
div0 = element("div");
input = element("input");
t = space();
span = element("span");
span.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x svelte-1ipipwe"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg>`;
attr(input, "type", "text");
input.value = input_value_value = /*$tracker*/
(_a = ctx[6].task) == null ? void 0 : _a.name;
attr(input, "class", "svelte-1ipipwe");
attr(span, "class", "pomodoro-tasks-remove svelte-1ipipwe");
attr(div0, "class", "pomodoro-tasks-name svelte-1ipipwe");
attr(div1, "class", "pomodoro-tasks-item svelte-1ipipwe");
},
m(target, anchor) {
insert(target, div1, anchor);
append(div1, div0);
append(div0, input);
append(div0, t);
append(div0, span);
if (!mounted) {
dispose = [
listen(
input,
"input",
/*changeTaskName*/
ctx[10]
),
listen(
span,
"click",
/*removeTask*/
ctx[11]
)
];
mounted = true;
}
},
p(ctx2, dirty) {
var _a;
if (dirty & /*$tracker*/
64 && input_value_value !== (input_value_value = /*$tracker*/
(_a = ctx2[6].task) == null ? void 0 : _a.name) && input.value !== input_value_value) {
input.value = input_value_value;
}
},
d(detaching) {
if (detaching) {
detach(div1);
}
mounted = false;
run_all(dispose);
}
};
}
function create_if_block_1(ctx) {
let div;
let current;
let each_value = ensure_array_like(
/*filtered*/
ctx[5]
);
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i));
}
const out = (i) => transition_out(each_blocks[i], 1, 1, () => {
each_blocks[i] = null;
});
return {
c() {
div = element("div");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
attr(div, "class", "pomodoro-tasks-list svelte-1ipipwe");
},
m(target, anchor) {
insert(target, div, anchor);
for (let i = 0; i < each_blocks.length; i += 1) {
if (each_blocks[i]) {
each_blocks[i].m(div, null);
}
}
current = true;
},
p(ctx2, dirty) {
if (dirty & /*progress, filtered, activeTask, showTaskMenu, progressText, r*/
45472) {
each_value = ensure_array_like(
/*filtered*/
ctx2[5]
);
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
transition_in(each_blocks[i], 1);
} else {
each_blocks[i] = create_each_block(child_ctx);
each_blocks[i].c();
transition_in(each_blocks[i], 1);
each_blocks[i].m(div, null);
}
}
group_outros();
for (i = each_value.length; i < each_blocks.length; i += 1) {
out(i);
}
check_outros();
}
},
i(local) {
if (current)
return;
for (let i = 0; i < each_value.length; i += 1) {
transition_in(each_blocks[i]);
}
current = true;
},
o(local) {
each_blocks = each_blocks.filter(Boolean);
for (let i = 0; i < each_blocks.length; i += 1) {
transition_out(each_blocks[i]);
}
current = false;
},
d(detaching) {
if (detaching) {
detach(div);
}
destroy_each(each_blocks, detaching);
}
};
}
function create_else_block(ctx) {
let svg;
let circle;
return {
c() {
svg = svg_element("svg");
circle = svg_element("circle");
attr(circle, "cx", "12");
attr(circle, "cy", "12");
attr(circle, "r", "10");
attr(svg, "xmlns", "http://www.w3.org/2000/svg");
attr(svg, "width", "12");
attr(svg, "height", "12");
attr(svg, "viewBox", "0 0 24 24");
attr(svg, "fill", "none");
attr(svg, "stroke", "currentColor");
attr(svg, "stroke-width", "2");
attr(svg, "stroke-linecap", "round");
attr(svg, "stroke-linejoin", "round");
attr(svg, "class", "lucide lucide-circle svelte-1ipipwe");
},
m(target, anchor) {
insert(target, svg, anchor);
append(svg, circle);
},
d(detaching) {
if (detaching) {
detach(svg);
}
}
};
}
function create_if_block_2(ctx) {
let svg;
let path;
return {
c() {
svg = svg_element("svg");
path = svg_element("path");
attr(path, "d", "M20 6 9 17l-5-5");
attr(svg, "xmlns", "http://www.w3.org/2000/svg");
attr(svg, "width", "12");
attr(svg, "height", "12");
attr(svg, "viewBox", "0 0 24 24");
attr(svg, "fill", "none");
attr(svg, "stroke", "currentColor");
attr(svg, "stroke-width", "2");
attr(svg, "stroke-linecap", "round");
attr(svg, "stroke-linejoin", "round");
attr(svg, "class", "lucide lucide-check svelte-1ipipwe");
},
m(target, anchor) {
insert(target, svg, anchor);
append(svg, path);
},
d(detaching) {
if (detaching) {
detach(svg);
}
}
};
}
function create_each_block(ctx) {
let div2;
let div0;
let t0;
let taskitemcomponent;
let t1;
let div1;
let t2_value = (
/*progressText*/
ctx[13](
/*item*/
ctx[23]
) + ""
);
let t2;
let t3;
let div2_class_value;
let current;
let mounted;
let dispose;
function select_block_type_1(ctx2, dirty) {
if (
/*item*/
ctx2[23].checked
)
return create_if_block_2;
return create_else_block;
}
let current_block_type = select_block_type_1(ctx, -1);
let if_block = current_block_type(ctx);
taskitemcomponent = new TaskItemComponent_default({
props: {
render: (
/*r*/
ctx[7]
),
content: (
/*item*/
ctx[23].description
)
}
});
function click_handler_3() {
return (
/*click_handler_3*/
ctx[21](
/*item*/
ctx[23]
)
);
}
return {
c() {
div2 = element("div");
div0 = element("div");
if_block.c();
t0 = space();
create_component(taskitemcomponent.$$.fragment);
t1 = space();
div1 = element("div");
t2 = text(t2_value);
t3 = space();
attr(div0, "class", "pomodoro-tasks-name svelte-1ipipwe");
attr(div1, "class", "pomodoro-tasks-progress svelte-1ipipwe");
set_style(div2, "background", "linear-gradient(to right, rgba(var(--color-green-rgb),0.25) " + /*progress*/
ctx[12](
/*item*/
ctx[23]
) + "%, transparent 0%)");
attr(div2, "class", div2_class_value = "pomodoro-tasks-item " + /*item*/
(ctx[23].checked ? "pomodoro-tasks-checked" : "") + " svelte-1ipipwe");
},
m(target, anchor) {
insert(target, div2, anchor);
append(div2, div0);
if_block.m(div0, null);
append(div0, t0);
mount_component(taskitemcomponent, div0, null);
append(div2, t1);
append(div2, div1);
append(div1, t2);
append(div2, t3);
current = true;
if (!mounted) {
dispose = [
listen(div2, "click", click_handler_3),
listen(div2, "contextmenu", function() {
if (is_function(
/*showTaskMenu*/
ctx[15](
/*item*/
ctx[23]
)
))
ctx[15](
/*item*/
ctx[23]
).apply(this, arguments);
})
];
mounted = true;
}
},
p(new_ctx, dirty) {
ctx = new_ctx;
if (current_block_type !== (current_block_type = select_block_type_1(ctx, dirty))) {
if_block.d(1);
if_block = current_block_type(ctx);
if (if_block) {
if_block.c();
if_block.m(div0, t0);
}
}
const taskitemcomponent_changes = {};
if (dirty & /*filtered*/
32)
taskitemcomponent_changes.content = /*item*/
ctx[23].description;
taskitemcomponent.$set(taskitemcomponent_changes);
if ((!current || dirty & /*filtered*/
32) && t2_value !== (t2_value = /*progressText*/
ctx[13](
/*item*/
ctx[23]
) + ""))
set_data(t2, t2_value);
if (!current || dirty & /*filtered*/
32) {
set_style(div2, "background", "linear-gradient(to right, rgba(var(--color-green-rgb),0.25) " + /*progress*/
ctx[12](
/*item*/
ctx[23]
) + "%, transparent 0%)");
}
if (!current || dirty & /*filtered*/
32 && div2_class_value !== (div2_class_value = "pomodoro-tasks-item " + /*item*/
(ctx[23].checked ? "pomodoro-tasks-checked" : "") + " svelte-1ipipwe")) {
attr(div2, "class", div2_class_value);
}
},
i(local) {
if (current)
return;
transition_in(taskitemcomponent.$$.fragment, local);
current = true;
},
o(local) {
transition_out(taskitemcomponent.$$.fragment, local);
current = false;
},
d(detaching) {
if (detaching) {
detach(div2);
}
if_block.d();
destroy_component(taskitemcomponent);
mounted = false;
run_all(dispose);
}
};
}
function create_fragment2(ctx) {
let if_block_anchor;
let current;
let if_block = (
/*$tracker*/
ctx[6].file && create_if_block(ctx)
);
return {
c() {
if (if_block)
if_block.c();
if_block_anchor = empty();
},
m(target, anchor) {
if (if_block)
if_block.m(target, anchor);
insert(target, if_block_anchor, anchor);
current = true;
},
p(ctx2, [dirty]) {
if (
/*$tracker*/
ctx2[6].file
) {
if (if_block) {
if_block.p(ctx2, dirty);
if (dirty & /*$tracker*/
64) {
transition_in(if_block, 1);
}
} else {
if_block = create_if_block(ctx2);
if_block.c();
transition_in(if_block, 1);
if_block.m(if_block_anchor.parentNode, if_block_anchor);
}
} else if (if_block) {
group_outros();
transition_out(if_block, 1, 1, () => {
if_block = null;
});
check_outros();
}
},
i(local) {
if (current)
return;
transition_in(if_block);
current = true;
},
o(local) {
transition_out(if_block);
current = false;
},
d(detaching) {
if (detaching) {
detach(if_block_anchor);
}
if (if_block)
if_block.d(detaching);
}
};
}
function instance2($$self, $$props, $$invalidate) {
let filtered;
let $settings;
let $tasks, $$unsubscribe_tasks = noop, $$subscribe_tasks = () => ($$unsubscribe_tasks(), $$unsubscribe_tasks = subscribe(tasks, ($$value) => $$invalidate(4, $tasks = $$value)), tasks);
let $tracker, $$unsubscribe_tracker = noop, $$subscribe_tracker = () => ($$unsubscribe_tracker(), $$unsubscribe_tracker = subscribe(tracker, ($$value) => $$invalidate(6, $tracker = $$value)), tracker);
component_subscribe($$self, settings, ($$value) => $$invalidate(22, $settings = $$value));
$$self.$$.on_destroy.push(() => $$unsubscribe_tasks());
$$self.$$.on_destroy.push(() => $$unsubscribe_tracker());
let { tasks } = $$props;
$$subscribe_tasks();
let { tracker } = $$props;
$$subscribe_tracker();
let { render } = $$props;
const r = (content, el) => {
render(content, el);
};
let status = "";
let query = "";
const activeTask = (task) => {
tracker.active(task);
};
const togglePinned = () => {
tracker.togglePinned();
};
const changeTaskName = (e) => {
let target = e.target;
tracker.setTaskName(target.value);
};
const removeTask = () => {
tracker.clear();
};
const progress = (item) => {
if (!$settings.showTaskProgress) {
return 0;
}
if (item.expected > 0 && item.actual >= 0) {
return (item.actual / item.expected * 100).toFixed(2);
}
return 0;
};
const progressText = (item) => {
let { actual, expected } = item;
if (expected > 0) {
let unfinished = expected - actual;
let max = Math.max(expected, actual);
if (max > 10) {
if (unfinished > 0) {
return `\u25CC x ${unfinished} \u{1F345} x ${actual}`;
} else {
return `\u{1F345} x ${expected} \u{1F96B} x ${Math.abs(unfinished)}`;
}
} else {
if (unfinished > 0) {
return `${"\u{1F345}".repeat(actual)}${"\u25CC".repeat(unfinished)}`;
} else {
return `${"\u{1F345}".repeat(expected)}${"\u{1F96B}".repeat(Math.abs(unfinished))}`;
}
}
} else {
return actual > 10 ? `\u{1F345} x ${actual}` : actual > 0 ? `${"\u{1F345}".repeat(actual)}` : `- -`;
}
};
const openFile = (e) => {
tracker.openFile(e);
};
const showTaskMenu = (task) => (e) => {
const menu = new import_obsidian3.Menu();
menu.addItem((item) => {
item.setTitle("Open").onClick(() => {
tracker.openTask(e, task);
});
});
menu.showAtMouseEvent(e);
};
const click_handler = () => $$invalidate(2, status = "");
const click_handler_1 = () => $$invalidate(2, status = "todo");
const click_handler_2 = () => $$invalidate(2, status = "completed");
function input_input_handler() {
query = this.value;
$$invalidate(3, query);
}
const click_handler_3 = (item) => {
activeTask(item);
};
$$self.$$set = ($$props2) => {
if ("tasks" in $$props2)
$$subscribe_tasks($$invalidate(0, tasks = $$props2.tasks));
if ("tracker" in $$props2)
$$subscribe_tracker($$invalidate(1, tracker = $$props2.tracker));
if ("render" in $$props2)
$$invalidate(16, render = $$props2.render);
};
$$self.$$.update = () => {
if ($$self.$$.dirty & /*$tasks, query, status*/
28) {
$:
$$invalidate(5, filtered = $tasks ? $tasks.list.filter((item) => {
let statusMatch = true;
let textMatch = true;
if (query) {
textMatch = item.name.toLowerCase().includes(query.toLowerCase());
}
if (status) {
if (status === "todo")
statusMatch = !item.checked;
if (status === "completed")
statusMatch = item.checked;
}
return statusMatch && textMatch;
}) : []);
}
};
return [
tasks,
tracker,
status,
query,
$tasks,
filtered,
$tracker,
r,
activeTask,
togglePinned,
changeTaskName,
removeTask,
progress,
progressText,
openFile,
showTaskMenu,
render,
click_handler,
click_handler_1,
click_handler_2,
input_input_handler,
click_handler_3
];
}
var TasksComponent = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance2, create_fragment2, safe_not_equal, { tasks: 0, tracker: 1, render: 16 }, add_css2);
}
};
var TasksComponent_default = TasksComponent;
// src/TimerSettingsComponent.svelte
function add_css3(target) {
append_styles(target, "svelte-5jyrhn", ".pomodoro-settings-wrapper.svelte-5jyrhn.svelte-5jyrhn,.pomodoro-settings-list.svelte-5jyrhn.svelte-5jyrhn,.pomodoro-settings-item.svelte-5jyrhn.svelte-5jyrhn{width:100%}.pomodoro-settings-wrapper.svelte-5jyrhn.svelte-5jyrhn{border:1px solid var(--background-modifier-border);border-radius:5px}.pomodoro-settings-item.svelte-5jyrhn.svelte-5jyrhn{display:flex;font-size:0.8rem;align-items:center;justify-content:space-between;height:2rem;padding:0.5rem 1rem}.pomodoro-settings-item.svelte-5jyrhn+.pomodoro-settings-item.svelte-5jyrhn{border-top:1px solid var(--background-modifier-border)}.pomodoro-settings-item.svelte-5jyrhn input[type='number'].svelte-5jyrhn{font-size:0.8rem;border:none;border-radius:0;height:0.8rem;text-align:end;background:transparent}.pomodoro-settings-item.svelte-5jyrhn input[type='number'].svelte-5jyrhn:active{border:none;box-shadow:none}.pomodoro-settings-item.svelte-5jyrhn input[type='number'].svelte-5jyrhn:focus{border:none;box-shadow:none}");
}
function create_fragment3(ctx) {
let div16;
let div15;
let div2;
let div0;
let t1;
let div1;
let input0;
let input0_value_value;
let t2;
let div5;
let div3;
let t4;
let div4;
let input1;
let input1_value_value;
let t5;
let div8;
let div6;
let t7;
let div7;
let input2;
let t8;
let div11;
let div9;
let t10;
let div10;
let input3;
let t11;
let div14;
let div12;
let t13;
let div13;
let input4;
let mounted;
let dispose;
return {
c() {
div16 = element("div");
div15 = element("div");
div2 = element("div");
div0 = element("div");
div0.textContent = "Work";
t1 = space();
div1 = element("div");
input0 = element("input");
t2 = space();
div5 = element("div");
div3 = element("div");
div3.textContent = "Break";
t4 = space();
div4 = element("div");
input1 = element("input");
t5 = space();
div8 = element("div");
div6 = element("div");
div6.textContent = "Auto-start";
t7 = space();
div7 = element("div");
input2 = element("input");
t8 = space();
div11 = element("div");
div9 = element("div");
div9.textContent = "Notification Sound";
t10 = space();
div10 = element("div");
input3 = element("input");
t11 = space();
div14 = element("div");
div12 = element("div");
div12.textContent = "Prefer Saving to Task File";
t13 = space();
div13 = element("div");
input4 = element("input");
attr(div0, "class", "pomodoro-settings-label");
input0.value = input0_value_value = /*$settings*/
ctx[0].workLen;
attr(input0, "min", "1");
attr(input0, "type", "number");
attr(input0, "class", "svelte-5jyrhn");
attr(div1, "class", "pomodoro-settings-control");
attr(div2, "class", "pomodoro-settings-item svelte-5jyrhn");
attr(div3, "class", "pomodoro-settings-label");
input1.value = input1_value_value = /*$settings*/
ctx[0].breakLen;
attr(input1, "min", "0");
attr(input1, "type", "number");
attr(input1, "class", "svelte-5jyrhn");
attr(div4, "class", "pomodoro-settings-control");
attr(div5, "class", "pomodoro-settings-item svelte-5jyrhn");
attr(div6, "class", "pomodoro-settings-label");
attr(input2, "type", "checkbox");
attr(div7, "class", "pomodoro-settings-control");
attr(div8, "class", "pomodoro-settings-item svelte-5jyrhn");
attr(div9, "class", "pomodoro-settings-label");
attr(input3, "type", "checkbox");
attr(div10, "class", "pomodoro-settings-control");
attr(div11, "class", "pomodoro-settings-item svelte-5jyrhn");
attr(div12, "class", "pomodoro-settings-label");
attr(input4, "type", "checkbox");
attr(div13, "class", "pomodoro-settings-control");
attr(div14, "class", "pomodoro-settings-item svelte-5jyrhn");
attr(div15, "class", "pomodoro-settings-list svelte-5jyrhn");
attr(div16, "class", "pomodoro-settings-wrapper svelte-5jyrhn");
},
m(target, anchor) {
insert(target, div16, anchor);
append(div16, div15);
append(div15, div2);
append(div2, div0);
append(div2, t1);
append(div2, div1);
append(div1, input0);
append(div15, t2);
append(div15, div5);
append(div5, div3);
append(div5, t4);
append(div5, div4);
append(div4, input1);
append(div15, t5);
append(div15, div8);
append(div8, div6);
append(div8, t7);
append(div8, div7);
append(div7, input2);
input2.checked = /*$settings*/
ctx[0].autostart;
append(div15, t8);
append(div15, div11);
append(div11, div9);
append(div11, t10);
append(div11, div10);
append(div10, input3);
input3.checked = /*$settings*/
ctx[0].notificationSound;
append(div15, t11);
append(div15, div14);
append(div14, div12);
append(div14, t13);
append(div14, div13);
append(div13, input4);
input4.checked = /*$settings*/
ctx[0].logFocused;
if (!mounted) {
dispose = [
listen(
input0,
"change",
/*updateWorkLen*/
ctx[1]
),
listen(
input1,
"change",
/*updateBreakLen*/
ctx[2]
),
listen(
input2,
"change",
/*input2_change_handler*/
ctx[3]
),
listen(
input3,
"change",
/*input3_change_handler*/
ctx[4]
),
listen(
input4,
"change",
/*input4_change_handler*/
ctx[5]
)
];
mounted = true;
}
},
p(ctx2, [dirty]) {
if (dirty & /*$settings*/
1 && input0_value_value !== (input0_value_value = /*$settings*/
ctx2[0].workLen) && input0.value !== input0_value_value) {
input0.value = input0_value_value;
}
if (dirty & /*$settings*/
1 && input1_value_value !== (input1_value_value = /*$settings*/
ctx2[0].breakLen) && input1.value !== input1_value_value) {
input1.value = input1_value_value;
}
if (dirty & /*$settings*/
1) {
input2.checked = /*$settings*/
ctx2[0].autostart;
}
if (dirty & /*$settings*/
1) {
input3.checked = /*$settings*/
ctx2[0].notificationSound;
}
if (dirty & /*$settings*/
1) {
input4.checked = /*$settings*/
ctx2[0].logFocused;
}
},
i: noop,
o: noop,
d(detaching) {
if (detaching) {
detach(div16);
}
mounted = false;
run_all(dispose);
}
};
}
function instance3($$self, $$props, $$invalidate) {
let $settings;
component_subscribe($$self, settings, ($$value) => $$invalidate(0, $settings = $$value));
const updateWorkLen = (e) => {
const target = e.target;
const value = parseInt(target.value);
settings.update((s) => {
if (value >= 1) {
s.workLen = value;
}
target.value = s.workLen.toString();
return s;
});
};
const updateBreakLen = (e) => {
const target = e.target;
const value = parseInt(target.value);
settings.update((s) => {
if (value >= 0) {
s.breakLen = value;
}
target.value = s.workLen.toString();
return s;
});
};
function input2_change_handler() {
$settings.autostart = this.checked;
settings.set($settings);
}
function input3_change_handler() {
$settings.notificationSound = this.checked;
settings.set($settings);
}
function input4_change_handler() {
$settings.logFocused = this.checked;
settings.set($settings);
}
return [
$settings,
updateWorkLen,
updateBreakLen,
input2_change_handler,
input3_change_handler,
input4_change_handler
];
}
var TimerSettingsComponent = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance3, create_fragment3, safe_not_equal, {}, add_css3);
}
};
var TimerSettingsComponent_default = TimerSettingsComponent;
// src/TimerViewComponent.svelte
function add_css4(target) {
append_styles(target, "svelte-1bkzjfd", ".container.svelte-1bkzjfd.svelte-1bkzjfd{width:100%;min-width:200px;display:flex;flex-direction:column;height:100%}.main.svelte-1bkzjfd.svelte-1bkzjfd{width:100%;display:flex;flex-direction:column;align-items:center;z-index:2}.timer.svelte-1bkzjfd.svelte-1bkzjfd{position:relative;width:160px;height:160px}.timer.svelte-1bkzjfd svg.svelte-1bkzjfd{-webkit-transform:rotate(-90deg);transform:rotate(-90deg);z-index:3}.timer-display.svelte-1bkzjfd.svelte-1bkzjfd{position:absolute;width:100%;height:160px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;z-index:4;padding:30px}.timer-text.svelte-1bkzjfd.svelte-1bkzjfd{display:block;color:var(--pomodoro-timer-text-color);font-size:1.1em;font-weight:bold;margin-block-start:1rem;margin-block-end:1.75rem}.status.svelte-1bkzjfd.svelte-1bkzjfd{font-size:0.7rem;display:flex;align-items:center}.status.svelte-1bkzjfd span.svelte-1bkzjfd{display:inline-block}.circle_timer.svelte-1bkzjfd.svelte-1bkzjfd{stroke:var(--pomodoro-timer-color)}.circle_animation.svelte-1bkzjfd.svelte-1bkzjfd{stroke-dasharray:440;stroke-dashoffset:440;stroke:var(--pomodoro-timer-elapsed-color)}.btn-group.svelte-1bkzjfd.svelte-1bkzjfd{margin-top:1rem;display:flex;justify-content:space-between;width:160px}.control.svelte-1bkzjfd.svelte-1bkzjfd{cursor:pointer}.control.svelte-1bkzjfd.svelte-1bkzjfd:hover{opacity:0.7}.control.svelte-1bkzjfd svg.svelte-1bkzjfd:active{opacity:0.5}.pomodoro-extra.svelte-1bkzjfd.svelte-1bkzjfd{width:100%;margin-top:2rem}.breath.svelte-1bkzjfd.svelte-1bkzjfd{width:5px;height:5px;margin-top:5px;display:inline-block;position:absolute;left:55px;background-color:var(--pomodoro-timer-dot-color);border-radius:5px;transform:translate(-50%, -50%);animation:svelte-1bkzjfd-blink 1s linear infinite}@keyframes svelte-1bkzjfd-blink{0%,100%{opacity:1}50%{opacity:0}}");
}
function create_if_block_42(ctx) {
let span;
return {
c() {
span = element("span");
attr(span, "class", "breath svelte-1bkzjfd");
},
m(target, anchor) {
insert(target, span, anchor);
},
d(detaching) {
if (detaching) {
detach(span);
}
}
};
}
function create_else_block_12(ctx) {
let span;
return {
c() {
span = element("span");
span.textContent = "Break";
attr(span, "class", "mode svelte-1bkzjfd");
},
m(target, anchor) {
insert(target, span, anchor);
},
d(detaching) {
if (detaching) {
detach(span);
}
}
};
}
function create_if_block_32(ctx) {
let span;
return {
c() {
span = element("span");
span.textContent = "Work";
attr(span, "class", "mode svelte-1bkzjfd");
},
m(target, anchor) {
insert(target, span, anchor);
},
d(detaching) {
if (detaching) {
detach(span);
}
}
};
}
function create_else_block2(ctx) {
let span;
let mounted;
let dispose;
return {
c() {
span = element("span");
span.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pause svelte-1bkzjfd"><rect width="4" height="16" x="6" y="4"></rect><rect width="4" height="16" x="14" y="4"></rect></svg>`;
attr(span, "class", "control svelte-1bkzjfd");
},
m(target, anchor) {
insert(target, span, anchor);
if (!mounted) {
dispose = listen(
span,
"click",
/*pause*/
ctx[9]
);
mounted = true;
}
},
p: noop,
d(detaching) {
if (detaching) {
detach(span);
}
mounted = false;
dispose();
}
};
}
function create_if_block_22(ctx) {
let span;
let mounted;
let dispose;
return {
c() {
span = element("span");
span.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-play svelte-1bkzjfd"><polygon points="5 3 19 12 5 21 5 3"></polygon></svg>`;
attr(span, "class", "control svelte-1bkzjfd");
},
m(target, anchor) {
insert(target, span, anchor);
if (!mounted) {
dispose = listen(
span,
"click",
/*start*/
ctx[7]
);
mounted = true;
}
},
p: noop,
d(detaching) {
if (detaching) {
detach(span);
}
mounted = false;
dispose();
}
};
}
function create_if_block_12(ctx) {
let timersettingscomponent;
let current;
timersettingscomponent = new TimerSettingsComponent_default({});
return {
c() {
create_component(timersettingscomponent.$$.fragment);
},
m(target, anchor) {
mount_component(timersettingscomponent, target, anchor);
current = true;
},
p: noop,
i(local) {
if (current)
return;
transition_in(timersettingscomponent.$$.fragment, local);
current = true;
},
o(local) {
transition_out(timersettingscomponent.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(timersettingscomponent, detaching);
}
};
}
function create_if_block2(ctx) {
let taskscomponent;
let current;
taskscomponent = new TasksComponent_default({
props: {
tasks: (
/*tasks*/
ctx[1]
),
tracker: (
/*tracker*/
ctx[2]
),
render: (
/*render*/
ctx[3]
)
}
});
return {
c() {
create_component(taskscomponent.$$.fragment);
},
m(target, anchor) {
mount_component(taskscomponent, target, anchor);
current = true;
},
p(ctx2, dirty) {
const taskscomponent_changes = {};
if (dirty & /*tasks*/
2)
taskscomponent_changes.tasks = /*tasks*/
ctx2[1];
if (dirty & /*tracker*/
4)
taskscomponent_changes.tracker = /*tracker*/
ctx2[2];
if (dirty & /*render*/
8)
taskscomponent_changes.render = /*render*/
ctx2[3];
taskscomponent.$set(taskscomponent_changes);
},
i(local) {
if (current)
return;
transition_in(taskscomponent.$$.fragment, local);
current = true;
},
o(local) {
transition_out(taskscomponent.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(taskscomponent, detaching);
}
};
}
function create_fragment4(ctx) {
let div7;
let div5;
let div3;
let div2;
let div0;
let t0;
let t1;
let span0;
let t2;
let div1;
let span1;
let t3_value = (
/*$timer*/
ctx[4].remained.human + ""
);
let t3;
let t4;
let svg0;
let g;
let circle0;
let circle1;
let t5;
let div4;
let span2;
let t6;
let t7;
let span3;
let t8;
let span4;
let t9;
let div6;
let current_block_type_index;
let if_block3;
let current;
let mounted;
let dispose;
let if_block0 = (
/*$timer*/
ctx[4].running && create_if_block_42(ctx)
);
function select_block_type(ctx2, dirty) {
if (
/*$timer*/
ctx2[4].mode === "WORK"
)
return create_if_block_32;
return create_else_block_12;
}
let current_block_type = select_block_type(ctx, -1);
let if_block1 = current_block_type(ctx);
function select_block_type_1(ctx2, dirty) {
if (!/*$timer*/
ctx2[4].running)
return create_if_block_22;
return create_else_block2;
}
let current_block_type_1 = select_block_type_1(ctx, -1);
let if_block2 = current_block_type_1(ctx);
const if_block_creators = [create_if_block2, create_if_block_12];
const if_blocks = [];
function select_block_type_2(ctx2, dirty) {
if (
/*extra*/
ctx2[5] == "tasks"
)
return 0;
if (
/*extra*/
ctx2[5] == "settings"
)
return 1;
return -1;
}
if (~(current_block_type_index = select_block_type_2(ctx, -1))) {
if_block3 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
}
return {
c() {
div7 = element("div");
div5 = element("div");
div3 = element("div");
div2 = element("div");
div0 = element("div");
if (if_block0)
if_block0.c();
t0 = space();
if_block1.c();
t1 = space();
span0 = element("span");
t2 = space();
div1 = element("div");
span1 = element("span");
t3 = text(t3_value);
t4 = space();
svg0 = svg_element("svg");
g = svg_element("g");
circle0 = svg_element("circle");
circle1 = svg_element("circle");
t5 = space();
div4 = element("div");
span2 = element("span");
span2.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list-todo svelte-1bkzjfd"><rect x="3" y="5" width="6" height="6" rx="1"></rect><path d="m3 17 2 2 4-4"></path><path d="M13 6h8"></path><path d="M13 12h8"></path><path d="M13 18h8"></path></svg>`;
t6 = space();
if_block2.c();
t7 = space();
span3 = element("span");
span3.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-rotate-ccw svelte-1bkzjfd"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"></path><path d="M3 3v5h5"></path></svg>`;
t8 = space();
span4 = element("span");
span4.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings-2 svelte-1bkzjfd"><path d="M20 7h-9"></path><path d="M14 17H5"></path><circle cx="17" cy="17" r="3"></circle><circle cx="7" cy="7" r="3"></circle></svg>`;
t9 = space();
div6 = element("div");
if (if_block3)
if_block3.c();
attr(span0, "class", "svelte-1bkzjfd");
attr(div0, "class", "status control svelte-1bkzjfd");
attr(span1, "class", "timer-text svelte-1bkzjfd");
attr(div1, "class", "control svelte-1bkzjfd");
attr(div2, "class", "timer-display svelte-1bkzjfd");
attr(circle0, "class", "circle_timer svelte-1bkzjfd");
attr(circle0, "r", "69.85699");
attr(circle0, "cy", "81");
attr(circle0, "cx", "81");
attr(circle0, "stroke-width", "2");
attr(circle0, "fill", "none");
attr(circle1, "class", "circle_animation svelte-1bkzjfd");
attr(circle1, "r", "69.85699");
attr(circle1, "cy", "81");
attr(circle1, "cx", "81");
attr(circle1, "stroke-width", "8");
attr(circle1, "fill", "none");
set_style(
circle1,
"stroke-dashoffset",
/*strokeOffset*/
ctx[6]
);
attr(svg0, "class", "timer svelte-1bkzjfd");
attr(svg0, "width", "160");
attr(svg0, "height", "160");
attr(svg0, "xmlns", "http://www.w3.org/2000/svg");
attr(div3, "class", "timer svelte-1bkzjfd");
attr(span2, "class", "control svelte-1bkzjfd");
attr(span3, "class", "control svelte-1bkzjfd");
attr(span4, "class", "control svelte-1bkzjfd");
attr(div4, "class", "btn-group svelte-1bkzjfd");
attr(div5, "class", "main svelte-1bkzjfd");
attr(div6, "class", "pomodoro-extra svelte-1bkzjfd");
attr(div7, "class", "container svelte-1bkzjfd");
},
m(target, anchor) {
insert(target, div7, anchor);
append(div7, div5);
append(div5, div3);
append(div3, div2);
append(div2, div0);
if (if_block0)
if_block0.m(div0, null);
append(div0, t0);
if_block1.m(div0, null);
append(div0, t1);
append(div0, span0);
append(div2, t2);
append(div2, div1);
append(div1, span1);
append(span1, t3);
append(div3, t4);
append(div3, svg0);
append(svg0, g);
append(g, circle0);
append(g, circle1);
append(div5, t5);
append(div5, div4);
append(div4, span2);
append(div4, t6);
if_block2.m(div4, null);
append(div4, t7);
append(div4, span3);
append(div4, t8);
append(div4, span4);
append(div7, t9);
append(div7, div6);
if (~current_block_type_index) {
if_blocks[current_block_type_index].m(div6, null);
}
current = true;
if (!mounted) {
dispose = [
listen(
div0,
"click",
/*toggleMode*/
ctx[11]
),
listen(
div1,
"click",
/*toggleTimer*/
ctx[10]
),
listen(
span2,
"click",
/*click_handler*/
ctx[13]
),
listen(
span3,
"click",
/*reset*/
ctx[8]
),
listen(
span4,
"click",
/*click_handler_1*/
ctx[14]
)
];
mounted = true;
}
},
p(ctx2, [dirty]) {
if (
/*$timer*/
ctx2[4].running
) {
if (if_block0) {
} else {
if_block0 = create_if_block_42(ctx2);
if_block0.c();
if_block0.m(div0, t0);
}
} else if (if_block0) {
if_block0.d(1);
if_block0 = null;
}
if (current_block_type !== (current_block_type = select_block_type(ctx2, dirty))) {
if_block1.d(1);
if_block1 = current_block_type(ctx2);
if (if_block1) {
if_block1.c();
if_block1.m(div0, t1);
}
}
if ((!current || dirty & /*$timer*/
16) && t3_value !== (t3_value = /*$timer*/
ctx2[4].remained.human + ""))
set_data(t3, t3_value);
if (!current || dirty & /*strokeOffset*/
64) {
set_style(
circle1,
"stroke-dashoffset",
/*strokeOffset*/
ctx2[6]
);
}
if (current_block_type_1 === (current_block_type_1 = select_block_type_1(ctx2, dirty)) && if_block2) {
if_block2.p(ctx2, dirty);
} else {
if_block2.d(1);
if_block2 = current_block_type_1(ctx2);
if (if_block2) {
if_block2.c();
if_block2.m(div4, t7);
}
}
let previous_block_index = current_block_type_index;
current_block_type_index = select_block_type_2(ctx2, dirty);
if (current_block_type_index === previous_block_index) {
if (~current_block_type_index) {
if_blocks[current_block_type_index].p(ctx2, dirty);
}
} else {
if (if_block3) {
group_outros();
transition_out(if_blocks[previous_block_index], 1, 1, () => {
if_blocks[previous_block_index] = null;
});
check_outros();
}
if (~current_block_type_index) {
if_block3 = if_blocks[current_block_type_index];
if (!if_block3) {
if_block3 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2);
if_block3.c();
} else {
if_block3.p(ctx2, dirty);
}
transition_in(if_block3, 1);
if_block3.m(div6, null);
} else {
if_block3 = null;
}
}
},
i(local) {
if (current)
return;
transition_in(if_block3);
current = true;
},
o(local) {
transition_out(if_block3);
current = false;
},
d(detaching) {
if (detaching) {
detach(div7);
}
if (if_block0)
if_block0.d();
if_block1.d();
if_block2.d();
if (~current_block_type_index) {
if_blocks[current_block_type_index].d();
}
mounted = false;
run_all(dispose);
}
};
}
var offset = 440;
function instance4($$self, $$props, $$invalidate) {
let strokeOffset;
let $timer, $$unsubscribe_timer = noop, $$subscribe_timer = () => ($$unsubscribe_timer(), $$unsubscribe_timer = subscribe(timer, ($$value) => $$invalidate(4, $timer = $$value)), timer);
$$self.$$.on_destroy.push(() => $$unsubscribe_timer());
let { timer } = $$props;
$$subscribe_timer();
let { tasks } = $$props;
let { tracker } = $$props;
let { render } = $$props;
let extra = "tasks";
const start = () => {
if (!$timer.running) {
timer.start();
}
};
const reset = () => {
timer.reset();
};
const pause = () => {
if ($timer.running) {
timer.pause();
}
};
const toggleTimer = () => {
timer.toggleTimer();
};
const toggleMode = () => {
timer.toggleMode();
};
const toggleExtra = (value) => {
if (extra === value) {
$$invalidate(5, extra = "close");
return;
}
$$invalidate(5, extra = value);
};
const click_handler = () => {
toggleExtra("tasks");
};
const click_handler_1 = () => {
toggleExtra("settings");
};
$$self.$$set = ($$props2) => {
if ("timer" in $$props2)
$$subscribe_timer($$invalidate(0, timer = $$props2.timer));
if ("tasks" in $$props2)
$$invalidate(1, tasks = $$props2.tasks);
if ("tracker" in $$props2)
$$invalidate(2, tracker = $$props2.tracker);
if ("render" in $$props2)
$$invalidate(3, render = $$props2.render);
};
$$self.$$.update = () => {
if ($$self.$$.dirty & /*$timer*/
16) {
$:
$$invalidate(6, strokeOffset = $timer.remained.millis * offset / $timer.count);
}
};
return [
timer,
tasks,
tracker,
render,
$timer,
extra,
strokeOffset,
start,
reset,
pause,
toggleTimer,
toggleMode,
toggleExtra,
click_handler,
click_handler_1
];
}
var TimerViewComponent = class extends SvelteComponent {
constructor(options) {
super();
init(
this,
options,
instance4,
create_fragment4,
safe_not_equal,
{
timer: 0,
tasks: 1,
tracker: 2,
render: 3
},
add_css4
);
}
};
var TimerViewComponent_default = TimerViewComponent;
// src/TimerView.ts
var import_obsidian5 = require("obsidian");
var VIEW_TYPE_TIMER = "timer-view";
var TimerView = class extends import_obsidian4.ItemView {
constructor(plugin, leaf) {
super(leaf);
this.plugin = plugin;
this.icon = "timer";
}
getViewType() {
return VIEW_TYPE_TIMER;
}
getDisplayText() {
return "Timer";
}
async onOpen() {
this.component = new TimerViewComponent_default({
target: this.contentEl,
props: {
timer: this.plugin.timer,
tasks: this.plugin.tasks,
tracker: this.plugin.tracker,
render: (content, el) => {
import_obsidian5.MarkdownRenderer.render(
this.plugin.app,
content,
el,
"",
this
);
}
}
});
}
async onClose() {
var _a;
(_a = this.component) == null ? void 0 : _a.$destroy();
}
};
// src/main.ts
var import_obsidian10 = require("obsidian");
// src/StatusBarComponent.svelte
var import_obsidian8 = require("obsidian");
// src/clock.worker.ts
function inlineWorker() {
let blob = new Blob(['"use strict";var e=!1,s=()=>{e&&(self.postMessage(new Date().getTime()),requestAnimationFrame(s))};self.onmessage=async({data:n})=>{n?e||(e=!0,s()):e=!1};\n'], { type: "text/javascript" });
let url = URL.createObjectURL(blob);
let worker = new Worker(url);
URL.revokeObjectURL(url);
return worker;
}
// src/Timer.ts
var import_obsidian7 = require("obsidian");
// src/Logger.ts
var import_obsidian6 = require("obsidian");
var Logger = class {
constructor(plugin) {
this.plugin = plugin;
}
async log(ctx) {
const logFile = await this.resolveLogFile(ctx);
const log = this.createLog(ctx);
if (logFile) {
const logText = await this.toText(log, logFile);
if (logText) {
await this.plugin.app.vault.append(logFile, `
${logText}`);
}
}
return logFile;
}
async resolveLogFile(ctx) {
const settings2 = this.plugin.getSettings();
if (settings2.logLevel !== "ALL" && settings2.logLevel !== ctx.mode) {
return;
}
if (settings2.logFocused && ctx.task.path && ctx.task.path.endsWith("md")) {
const file = this.plugin.app.vault.getAbstractFileByPath(
ctx.task.path
);
if (file && file instanceof import_obsidian6.TFile) {
return file;
}
}
if (settings2.logFile === "NONE") {
return;
}
if (settings2.logFile === "DAILY") {
return await getDailyNoteFile();
}
if (settings2.logFile === "FILE") {
if (settings2.logPath) {
let path = settings2.logPath;
if (!path.endsWith("md")) {
path += ".md";
}
try {
return await ensureFileExists(this.plugin.app, path);
} catch (error) {
if (error instanceof Error) {
new import_obsidian6.Notice(error.message);
}
return;
}
}
}
}
createLog(ctx) {
return {
mode: ctx.mode,
duration: Math.floor(ctx.elapsed / 6e4),
begin: ctx.startTime,
end: new Date().getTime(),
session: ctx.duration,
task: ctx.task,
finished: ctx.count == ctx.elapsed
};
}
async toText(log, file) {
const settings2 = this.plugin.getSettings();
if (settings2.logFormat === "CUSTOM" && getTemplater(this.plugin.app)) {
try {
return await parseWithTemplater(
this.plugin.app,
file,
settings2.logTemplate,
log
);
} catch (e) {
new import_obsidian6.Notice("Invalid template");
console.error("invalid templat:", e);
return "";
}
} else {
if (!log.finished) {
return "";
}
let begin = (0, import_obsidian6.moment)(log.begin);
let end = (0, import_obsidian6.moment)(log.end);
if (settings2.logFormat === "SIMPLE") {
return `**${log.mode}(${log.duration}m)**: ${begin.format(
"HH:mm"
)} - ${end.format("HH:mm")}`;
}
if (settings2.logFormat === "VERBOSE") {
const emoji = log.mode == "WORK" ? "\u{1F345}" : "\u{1F964}";
return `- ${emoji} (pomodoro::${log.mode}) (duration:: ${log.duration}m) (begin:: ${begin.format(
"YYYY-MM-DD HH:mm"
)}) - (end:: ${end.format("YYYY-MM-DD HH:mm")})`;
}
return "";
}
}
};
// src/Notification.ts
var Notification_default = "data:audio/ogg;base64,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AABQ4AAAEGCDpsTiAIWGrAQAQgIAHIpiWZrmeZ4niqapmiRJ0zxPFEXRNE1TVUmSpnmeKIqiaZqmqrIsTfM8URRF01RVVYWmeZ4oiqJpqqrqwvM8TxRF0TRV1XXheZ4niqJomqrquhBFUTRN01RNVXVdIIqmaZqqqqquC0RPFE1TVV3XdYHniaJpqqqrui4QTdNUVVV1XVkGmKZpqqrryjJAVVXVdV1XlgGqqqqu67qyDFBV13VdWZZlAK7rurIsywIAAA4cAAACjKCTjCqLsNGECw9AoSErAoAoAADAGKYUU8owJiGkEBrGJIQUQiYlpdJSqiCkUlIpFYRUSiolo5RSailVEFIpqZQKQiollVIAANiBAwDYgYVQaMhKACAPAIAwRinGGHNOIqQUY845JxFSijHnnJNKMeacc85JKRlzzDnnpJTOOeecc1JK5pxzzjkppXPOOeeclFJK55xzTkopJYTOQSellNI555wTAABU4AAAEGCjyOYEI0GFhqwEAFIBAAyOY1ma5nmiaJqWJGma53meKJqmJkma5nmeJ4qqyfM8TxRF0TRVled5niiKommqKtcVRdM0TVVVXbIsiqZpmqrqujBN01RV13VdmKZpqqrrui5sW1VV1XVlGbatqqrqurIMXNd1ZdmWgSy7ruzasgAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiDkEIIIWUQQgohhJRSCAkAABhwAAAIMKEMFBqyEgBIBQAAjLHWWmuttdZAZ6211lprrYDMWmuttdZaa6211lprrbXWUmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaay2llFJKKaWUUkoppZRSSimllFJKBQD6VTgA+D/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhcashIACAkAIBBSijHGGHPOOeekUow55pxzDkIIoVSKMcaccw5CCCGUjDHmnHMQQgghhFJKxpxz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";
// src/Timer.ts
var DEFAULT_TASK = {
actual: 0,
expected: 0,
path: "",
fileName: "",
text: "",
name: "",
status: "",
blockLink: "",
checked: false,
done: "",
due: "",
created: "",
cancelled: "",
scheduled: "",
start: "",
description: "",
priority: "",
recurrence: "",
tags: [],
line: -1
};
var _Timer = class {
constructor(plugin) {
this.unsubscribers = [];
this.plugin = plugin;
this.logger = new Logger(plugin);
let count = this.toMillis(plugin.getSettings().workLen);
this.state = {
autostart: plugin.getSettings().autostart,
workLen: plugin.getSettings().workLen,
breakLen: plugin.getSettings().breakLen,
running: false,
lastTick: 0,
mode: "WORK",
elapsed: 0,
startTime: null,
inSession: false,
duration: plugin.getSettings().workLen,
count
};
let store = writable(this.state);
this.update = store.update;
this.store = derived(store, ($state) => ({
...$state,
remained: this.remain($state.count, $state.elapsed),
finished: $state.count == $state.elapsed
}));
this.subscribe = this.store.subscribe;
this.unsubscribers.push(
this.store.subscribe((state) => {
this.state = state;
})
);
this.clock = inlineWorker();
this.clock.onmessage = ({ data }) => {
this.tick(data);
};
}
remain(count, elapsed) {
let remained = count - elapsed;
let min = Math.floor(remained / 6e4);
let sec = Math.floor(remained % 6e4 / 1e3);
let minStr = min < 10 ? `0${min}` : min.toString();
let secStr = sec < 10 ? `0${sec}` : sec.toString();
return {
millis: remained,
human: `${minStr} : ${secStr}`
};
}
toMillis(minutes) {
return minutes * 60 * 1e3;
}
tick(t) {
let timeup = false;
let pause = false;
this.update((s) => {
if (s.running && s.lastTick) {
let diff = t - s.lastTick;
s.lastTick = t;
s.elapsed += diff;
if (s.elapsed >= s.count) {
s.elapsed = s.count;
}
timeup = s.elapsed >= s.count;
} else {
pause = true;
}
return s;
});
if (!pause && timeup) {
this.timeup();
}
}
timeup() {
let autostart = false;
this.update((state) => {
const ctx = this.createLogContext(state);
this.processLog(ctx);
autostart = state.autostart;
return this.endSession(state);
});
if (autostart) {
this.start();
}
}
createLogContext(s) {
var _a, _b, _c, _d, _e, _f, _g;
let state = { ...s };
let task = ((_a = this.plugin.tracker) == null ? void 0 : _a.task) ? { ...this.plugin.tracker.task } : { ...DEFAULT_TASK };
if (!task.path) {
task.path = (_d = (_c = (_b = this.plugin.tracker) == null ? void 0 : _b.file) == null ? void 0 : _c.path) != null ? _d : "";
task.fileName = (_g = (_f = (_e = this.plugin.tracker) == null ? void 0 : _e.file) == null ? void 0 : _f.name) != null ? _g : "";
}
return { ...state, task };
}
async processLog(ctx) {
var _a;
if (ctx.mode == "WORK") {
await ((_a = this.plugin.tracker) == null ? void 0 : _a.updateActual());
}
const logFile = await this.logger.log(ctx);
this.notify(ctx, logFile);
}
start() {
this.update((s) => {
let now2 = new Date().getTime();
if (!s.inSession) {
s.elapsed = 0;
s.duration = s.mode === "WORK" ? s.workLen : s.breakLen;
s.count = s.duration * 60 * 1e3;
s.startTime = now2;
}
s.lastTick = now2;
s.inSession = true;
s.running = true;
this.clock.postMessage(true);
return s;
});
}
endSession(state) {
if (state.breakLen == 0) {
state.mode = "WORK";
} else {
state.mode = state.mode == "WORK" ? "BREAK" : "WORK";
}
state.duration = state.mode == "WORK" ? state.workLen : state.breakLen;
state.count = state.duration * 60 * 1e3;
state.inSession = false;
state.running = false;
this.clock.postMessage(false);
state.startTime = null;
state.elapsed = 0;
return state;
}
notify(state, logFile) {
const emoji = state.mode == "WORK" ? "\u{1F345}" : "\u{1F964}";
const text2 = `${emoji} You have been ${state.mode === "WORK" ? "working" : "breaking"} for ${state.duration} minutes.`;
if (this.plugin.getSettings().useSystemNotification) {
const Notification = require("electron").remote.Notification;
const sysNotification = new Notification({
title: "Pomodoro Timer",
body: text2,
silent: true
});
sysNotification.on("click", () => {
if (logFile) {
this.plugin.app.workspace.getLeaf("split").openFile(logFile);
}
sysNotification.close();
});
sysNotification.show();
} else {
let fragment = new DocumentFragment();
let span = fragment.createEl("span");
span.setText(`${text2}`);
fragment.addEventListener("click", () => {
if (logFile) {
this.plugin.app.workspace.getLeaf("split").openFile(logFile);
}
});
new import_obsidian7.Notice(fragment);
}
if (this.plugin.getSettings().notificationSound) {
this.playAudio();
}
}
pause() {
this.update((state) => {
state.running = false;
this.clock.postMessage(false);
return state;
});
}
reset() {
this.update((state) => {
if (state.elapsed > 0) {
this.logger.log(this.createLogContext(state));
}
state.duration = state.mode == "WORK" ? state.workLen : state.breakLen;
state.count = state.duration * 60 * 1e3;
state.inSession = false;
state.running = false;
if (!this.plugin.tracker.pinned) {
this.plugin.tracker.clear();
}
this.clock.postMessage(false);
state.startTime = null;
state.elapsed = 0;
return state;
});
}
toggleMode(callback) {
this.update((s) => {
let updated = this.endSession(s);
if (callback) {
callback(updated);
}
return updated;
});
}
toggleTimer() {
this.state.running ? this.pause() : this.start();
}
playAudio() {
let audio = _Timer.DEFAULT_NOTIFICATION_AUDIO;
let customSound = this.plugin.getSettings().customSound;
if (customSound) {
const soundFile = this.plugin.app.vault.getAbstractFileByPath(customSound);
if (soundFile && soundFile instanceof import_obsidian7.TFile) {
const soundSrc = this.plugin.app.vault.getResourcePath(soundFile);
audio = new Audio(soundSrc);
}
}
audio.play();
}
setupTimer() {
this.update((state) => {
const { workLen, breakLen, autostart } = this.plugin.getSettings();
state.workLen = workLen;
state.breakLen = breakLen;
state.autostart = autostart;
if (!state.running && !state.inSession) {
state.duration = state.mode == "WORK" ? state.workLen : state.breakLen;
state.count = state.duration * 60 * 1e3;
}
return state;
});
}
destroy() {
var _a;
this.pause();
(_a = this.clock) == null ? void 0 : _a.terminate();
for (let unsub of this.unsubscribers) {
unsub();
}
}
};
var Timer = _Timer;
Timer.DEFAULT_NOTIFICATION_AUDIO = new Audio(Notification_default);
// src/StatusBarComponent.svelte
function add_css5(target) {
append_styles(target, "svelte-1azmbrd", ".item-icon.svelte-1azmbrd{padding-top:0}.st-timer.svelte-1azmbrd{display:inline-flex;align-items:center}");
}
function create_if_block3(ctx) {
let span1;
let span0;
let t0;
let t1_value = (
/*$store*/
ctx[2].remained.human + ""
);
let t1;
let mounted;
let dispose;
function select_block_type(ctx2, dirty) {
if (
/*$store*/
ctx2[2].running
)
return create_if_block_13;
return create_else_block3;
}
let current_block_type = select_block_type(ctx, -1);
let if_block = current_block_type(ctx);
return {
c() {
span1 = element("span");
span0 = element("span");
if_block.c();
t0 = space();
t1 = text(t1_value);
set_style(span0, "margin-right", "3px");
attr(span0, "class", "item-icon svelte-1azmbrd");
attr(span1, "class", "st-timer svelte-1azmbrd");
},
m(target, anchor) {
insert(target, span1, anchor);
append(span1, span0);
if_block.m(span0, null);
append(span1, t0);
append(span1, t1);
ctx[7](span1);
if (!mounted) {
dispose = [
listen(
span1,
"click",
/*toggleTimer*/
ctx[4]
),
listen(
span1,
"contextmenu",
/*ctxMenu*/
ctx[5]
)
];
mounted = true;
}
},
p(ctx2, dirty) {
if (current_block_type !== (current_block_type = select_block_type(ctx2, dirty))) {
if_block.d(1);
if_block = current_block_type(ctx2);
if (if_block) {
if_block.c();
if_block.m(span0, null);
}
}
if (dirty & /*$store*/
4 && t1_value !== (t1_value = /*$store*/
ctx2[2].remained.human + ""))
set_data(t1, t1_value);
},
d(detaching) {
if (detaching) {
detach(span1);
}
if_block.d();
ctx[7](null);
mounted = false;
run_all(dispose);
}
};
}
function create_else_block3(ctx) {
let svg;
let path0;
let path1;
let path2;
let path3;
let path4;
return {
c() {
svg = svg_element("svg");
path0 = svg_element("path");
path1 = svg_element("path");
path2 = svg_element("path");
path3 = svg_element("path");
path4 = svg_element("path");
attr(path0, "d", "M10 2h4");
attr(path1, "d", "M4.6 11a8 8 0 0 0 1.7 8.7 8 8 0 0 0 8.7 1.7");
attr(path2, "d", "M7.4 7.4a8 8 0 0 1 10.3 1 8 8 0 0 1 .9 10.2");
attr(path3, "d", "m2 2 20 20");
attr(path4, "d", "M12 12v-2");
attr(svg, "xmlns", "http://www.w3.org/2000/svg");
attr(svg, "width", "16");
attr(svg, "height", "16");
attr(svg, "viewBox", "0 0 24 24");
attr(svg, "fill", "none");
attr(svg, "stroke", "currentColor");
attr(svg, "stroke-width", "2");
attr(svg, "stroke-linecap", "round");
attr(svg, "stroke-linejoin", "round");
attr(svg, "class", "lucide lucide-timer-off");
},
m(target, anchor) {
insert(target, svg, anchor);
append(svg, path0);
append(svg, path1);
append(svg, path2);
append(svg, path3);
append(svg, path4);
},
d(detaching) {
if (detaching) {
detach(svg);
}
}
};
}
function create_if_block_13(ctx) {
let svg;
let line0;
let line1;
let circle;
return {
c() {
svg = svg_element("svg");
line0 = svg_element("line");
line1 = svg_element("line");
circle = svg_element("circle");
attr(line0, "x1", "10");
attr(line0, "x2", "14");
attr(line0, "y1", "2");
attr(line0, "y2", "2");
attr(line1, "x1", "12");
attr(line1, "x2", "15");
attr(line1, "y1", "14");
attr(line1, "y2", "11");
attr(circle, "cx", "12");
attr(circle, "cy", "14");
attr(circle, "r", "8");
attr(svg, "xmlns", "http://www.w3.org/2000/svg");
attr(svg, "width", "16");
attr(svg, "height", "16");
attr(svg, "viewBox", "0 0 24 24");
attr(svg, "fill", "none");
attr(svg, "stroke", "currentColor");
attr(svg, "stroke-width", "2");
attr(svg, "stroke-linecap", "round");
attr(svg, "stroke-linejoin", "round");
attr(svg, "class", "lucide lucide-timer");
},
m(target, anchor) {
insert(target, svg, anchor);
append(svg, line0);
append(svg, line1);
append(svg, circle);
},
d(detaching) {
if (detaching) {
detach(svg);
}
}
};
}
function create_fragment5(ctx) {
let if_block_anchor;
let if_block = (
/*$settings*/
ctx[3].useStatusBarTimer && create_if_block3(ctx)
);
return {
c() {
if (if_block)
if_block.c();
if_block_anchor = empty();
},
m(target, anchor) {
if (if_block)
if_block.m(target, anchor);
insert(target, if_block_anchor, anchor);
},
p(ctx2, [dirty]) {
if (
/*$settings*/
ctx2[3].useStatusBarTimer
) {
if (if_block) {
if_block.p(ctx2, dirty);
} else {
if_block = create_if_block3(ctx2);
if_block.c();
if_block.m(if_block_anchor.parentNode, if_block_anchor);
}
} else if (if_block) {
if_block.d(1);
if_block = null;
}
},
i: noop,
o: noop,
d(detaching) {
if (detaching) {
detach(if_block_anchor);
}
if (if_block)
if_block.d(detaching);
}
};
}
function instance5($$self, $$props, $$invalidate) {
let $settings;
let $store, $$unsubscribe_store = noop, $$subscribe_store = () => ($$unsubscribe_store(), $$unsubscribe_store = subscribe(store, ($$value) => $$invalidate(2, $store = $$value)), store);
component_subscribe($$self, settings, ($$value) => $$invalidate(3, $settings = $$value));
$$self.$$.on_destroy.push(() => $$unsubscribe_store());
let { store } = $$props;
$$subscribe_store();
let statusbar;
let mode;
const toggleTimer = () => {
store.toggleTimer();
};
const ctxMenu = (e) => {
const menu = new import_obsidian8.Menu();
menu.addItem((item) => {
const p = $store.running ? "Pause" : $store.inSession ? "Resume" : "Start";
item.setTitle(p).onClick(() => {
store.toggleTimer();
});
});
menu.addItem((item) => {
item.setTitle("Reset").onClick(() => {
store.reset();
});
});
menu.addItem((item) => {
const mode2 = `Switch ${$store.mode === "WORK" ? "Break" : "Work"} `;
item.setTitle(mode2);
item.onClick(() => {
store.toggleMode();
});
});
menu.addSeparator();
menu.addItem((item) => {
item.setTitle("Auto-start");
item.setChecked($settings.autostart);
item.onClick(() => {
settings.update((s) => {
s.autostart = !s.autostart;
return s;
});
});
});
menu.addItem((item) => {
item.setTitle("Sound");
item.setChecked($settings.notificationSound);
item.onClick(() => {
settings.update((s) => {
s.notificationSound = !s.notificationSound;
return s;
});
});
});
menu.showAtMouseEvent(e);
};
import_obsidian8.setTooltip;
function span1_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
statusbar = $$value;
$$invalidate(1, statusbar);
});
}
$$self.$$set = ($$props2) => {
if ("store" in $$props2)
$$subscribe_store($$invalidate(0, store = $$props2.store));
};
$$self.$$.update = () => {
if ($$self.$$.dirty & /*statusbar, mode, $store*/
70) {
$: {
if (statusbar && mode !== $store.mode) {
$$invalidate(6, mode = $store.mode);
const tooltip = mode === "WORK" ? "Work" : "Break";
(0, import_obsidian8.setTooltip)(statusbar, tooltip, { delay: 300, placement: "top" });
}
}
}
};
return [store, statusbar, $store, $settings, toggleTimer, ctxMenu, mode, span1_binding];
}
var StatusBarComponent = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance5, create_fragment5, safe_not_equal, { store: 0 }, add_css5);
}
};
var StatusBarComponent_default = StatusBarComponent;
// src/TaskTracker.ts
var import_obsidian9 = require("obsidian");
var DEFAULT_TRACKER_STATE = {
pinned: false
};
var TaskTracker = class {
constructor(plugin) {
this.unsubscribers = [];
this.openTask = (event, task) => {
let file = this.plugin.app.vault.getAbstractFileByPath(task.path);
if (file && file instanceof import_obsidian9.TFile && task.line >= 0) {
const leaf = this.plugin.app.workspace.getLeaf(
import_obsidian9.Keymap.isModEvent(event)
);
leaf.openFile(file, { eState: { line: task.line } });
}
};
this.plugin = plugin;
this.state = DEFAULT_TRACKER_STATE;
this.store = writable(this.state);
this.subscribe = this.store.subscribe;
this.unsubscribers.push(
this.store.subscribe((state) => {
this.state = state;
})
);
plugin.registerEvent(
//loadtasks on file change
plugin.app.workspace.on("active-leaf-change", () => {
let file = this.plugin.app.workspace.getActiveFile();
if (!this.state.pinned) {
this.store.update((state) => {
var _a;
if (((_a = state.file) == null ? void 0 : _a.path) !== (file == null ? void 0 : file.path)) {
state.task = void 0;
}
state.file = file != null ? file : state.file;
return state;
});
}
})
);
plugin.app.workspace.onLayoutReady(() => {
let file = this.plugin.app.workspace.getActiveFile();
this.store.update((state) => {
state.file = file != null ? file : state.file;
return state;
});
});
}
get task() {
return this.state.task;
}
get file() {
return this.state.file;
}
togglePinned() {
this.store.update((state) => {
state.pinned = !state.pinned;
return state;
});
}
async active(task) {
await this.ensureBlockId(task);
this.store.update((state) => {
state.task = task;
return state;
});
}
setTaskName(name) {
this.store.update((state) => {
if (state.task) {
state.task.name = name;
}
return state;
});
}
async ensureBlockId(task) {
let file = this.plugin.app.vault.getAbstractFileByPath(task.path);
if (file && file instanceof import_obsidian9.TFile) {
const f = file;
if (f.extension === "md") {
let content = await this.plugin.app.vault.read(f);
let lines = content.split("\n");
if (lines.length > task.line) {
let line = lines[task.line];
if (task.blockLink) {
if (!line.endsWith(task.blockLink)) {
lines[task.line] += `${task.blockLink}`;
this.plugin.app.vault.modify(f, lines.join("\n"));
return;
}
} else {
let blockId = this.createBlockId();
task.blockLink = blockId;
lines[task.line] += `${blockId}`;
this.plugin.app.vault.modify(f, lines.join("\n"));
}
}
}
}
}
createBlockId() {
return ` ^${Math.random().toString(36).substring(2, 6)}`;
}
clear() {
this.store.update((state) => {
state.task = void 0;
return state;
});
}
openFile(event) {
if (this.state.file) {
const leaf = this.plugin.app.workspace.getLeaf(
import_obsidian9.Keymap.isModEvent(event)
);
leaf.openFile(this.state.file);
}
}
get pinned() {
return this.state.pinned;
}
finish() {
}
destory() {
for (let unsub of this.unsubscribers) {
unsub();
}
}
sync(task) {
var _a;
if (((_a = this.state.task) == null ? void 0 : _a.blockLink) && this.state.task.blockLink === task.blockLink) {
this.store.update((state) => {
if (state.task) {
let name = state.task.name;
state.task = { ...task, name };
}
return state;
});
}
}
async updateActual() {
if (this.plugin.getSettings().enableTaskTracking && this.task && this.task.blockLink) {
let file = this.plugin.app.vault.getAbstractFileByPath(
this.task.path
);
if (file && file instanceof import_obsidian9.TFile) {
let f = file;
this.store.update((state) => {
if (state.task) {
if (state.task.actual >= 0) {
state.task.actual += 1;
} else {
state.task.actual = 1;
}
}
return state;
});
await this.incrTaskActual(this.task.blockLink, f);
}
}
}
async incrTaskActual(blockLink, file) {
var _a;
const format = this.plugin.getSettings().taskFormat;
if (file.extension !== "md") {
return;
}
let metadata = this.plugin.app.metadataCache.getFileCache(file);
let content = await this.plugin.app.vault.read(file);
if (!content || !metadata) {
return;
}
const lines = content.split("\n");
for (let rawElement of metadata.listItems || []) {
if (rawElement.task) {
let lineNr = rawElement.position.start.line;
let line = lines[lineNr];
const components = extractTaskComponents(line);
if (!components) {
continue;
}
if (components.blockLink === blockLink) {
const match = components.body.match(POMODORO_REGEX);
if (match !== null) {
let pomodoros = match[1];
let [actual, expected] = pomodoros.split("/");
actual = actual || "0";
let text2 = `\u{1F345}:: ${parseInt(actual) + 1}`;
if (expected !== void 0) {
text2 += `/${expected.trim()}`;
}
line = line.replace(/🍅:: *(\d* *\/? *\d* *)/, text2).trim();
} else {
let detail = DESERIALIZERS[format].deserialize(
components.body
);
line = line.replace(
detail.description,
`${detail.description} [\u{1F345}:: 1]`
);
}
lines[lineNr] = line;
await this.plugin.app.vault.modify(file, lines.join("\n"));
this.plugin.app.metadataCache.trigger(
"changed",
file,
content,
metadata
);
(_a = this.plugin.app.workspace.getActiveViewOfType(import_obsidian9.MarkdownView)) == null ? void 0 : _a.load();
break;
}
}
}
}
};
// src/main.ts
var PomodoroTimerPlugin = class extends import_obsidian10.Plugin {
async onload() {
const settings2 = await this.loadData();
this.settingTab = new PomodoroSettings(this, settings2);
this.addSettingTab(this.settingTab);
this.tracker = new TaskTracker(this);
this.timer = new Timer(this);
this.tasks = new Tasks(this);
this.registerView(VIEW_TYPE_TIMER, (leaf) => new TimerView(this, leaf));
this.addRibbonIcon("timer", "Toggle timer panel", () => {
let { workspace } = this.app;
let leaves = workspace.getLeavesOfType(VIEW_TYPE_TIMER);
if (leaves.length > 0) {
workspace.detachLeavesOfType(VIEW_TYPE_TIMER);
} else {
this.activateView();
}
});
const status = this.addStatusBarItem();
status.className = `${status.className} mod-clickable`;
new StatusBarComponent_default({ target: status, props: { store: this.timer } });
this.addCommand({
id: "toggle-timer",
name: "Toggle timer",
callback: () => {
var _a;
(_a = this.timer) == null ? void 0 : _a.toggleTimer();
}
});
this.addCommand({
id: "toggle-timer-panel",
name: "Toggle timer panel",
callback: () => {
let { workspace } = this.app;
let leaves = workspace.getLeavesOfType(VIEW_TYPE_TIMER);
if (leaves.length > 0) {
workspace.detachLeavesOfType(VIEW_TYPE_TIMER);
} else {
this.activateView();
}
}
});
this.addCommand({
id: "reset-timer",
name: "Reset timer",
callback: () => {
var _a;
(_a = this.timer) == null ? void 0 : _a.reset();
new import_obsidian10.Notice("Timer reset");
}
});
this.addCommand({
id: "toggle-mode",
name: "Toggle timer mode",
callback: () => {
var _a;
(_a = this.timer) == null ? void 0 : _a.toggleMode((t) => {
new import_obsidian10.Notice(`Timer mode: ${t.mode}`);
});
}
});
}
getSettings() {
var _a;
return ((_a = this.settingTab) == null ? void 0 : _a.getSettings()) || PomodoroSettings.DEFAULT_SETTINGS;
}
onunload() {
var _a, _b, _c, _d;
(_a = this.settingTab) == null ? void 0 : _a.unload();
(_b = this.timer) == null ? void 0 : _b.destroy();
(_c = this.tasks) == null ? void 0 : _c.destroy();
(_d = this.tracker) == null ? void 0 : _d.destory();
}
async activateView() {
let { workspace } = this.app;
let leaf = null;
let leaves = workspace.getLeavesOfType(VIEW_TYPE_TIMER);
if (leaves.length > 0) {
leaf = leaves[0];
} else {
leaf = workspace.getRightLeaf(false);
await leaf.setViewState({
type: VIEW_TYPE_TIMER,
active: true
});
}
workspace.revealLeaf(leaf);
}
};