/* THIS IS A GENERATED/BUNDLED FILE BY ROLLUP if you want to view the source visit the plugins github repository */ 'use strict'; var obsidian = require('obsidian'); /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } const DEFAULT_SETTINGS = { startOfWeek: '0', monthFormat: 'YYYY-MM', displayHead: true, enableHTML: false, enableMarkdown: true, Sunday: 'SUN', Monday: 'MON', Tuesday: 'TUE', Wednesday: 'WED', Thursday: 'THU', Friday: 'FRI', Saturday: 'SAT' }; class HabitTrackerPlugin extends obsidian.Plugin { onload() { return __awaiter(this, void 0, void 0, function* () { yield this.loadSettings(); this.addSettingTab(new HabitTrackerSettingTab(this.app, this)); //@ts-ignore window.renderHabitCalendar = (el, dv, calendarParam) => { dv.current().file.path; let calendarData = param2CalendarData(dv, calendarParam); let ctx = fromCalendarData(calendarData, this.settings); const styles = ctx.tableWidth ? `width: ${ctx.tableWidth};` : ''; const table = createEl('table', { cls: 'habitt', attr: { style: styles } }); table.appendChild(renderHead(ctx)); table.appendChild(renderBody(ctx)); el.appendChild(table); }; }); } loadSettings() { return __awaiter(this, void 0, void 0, function* () { this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); }); } saveSettings() { return __awaiter(this, void 0, void 0, function* () { yield this.saveData(this.settings); }); } } function createContext(calendarData, settings) { return { startOfWeek: parseInt(settings.startOfWeek, 10), startDay: 0, monthDays: 0, displayMonth: '', tableWidth: '', marks: new Map(), settings, error: '', calendarData, filepath: calendarData.filepath }; } function isTableData(data) { return data.successful && data.value && data.value.type == 'table'; } function param2CalendarData(dv, params) { const calendarData = { year: params.year, month: params.month, filepath: dv.current().file.path, width: params.width || "100%", entries: params.data, format: params.format || 'text', date_pattern: params.date_pattern || params.note_pattern || 'YYYY-MM-DD' }; if (isTableData(params.data)) { const headers = params.data.value.headers; const values = params.data.value.values; const dataDict = {}; for (let ri = 0; ri < values.length; ri += 1) { // fill calendar day const value = values[ri]; const link = value[0]; const date = obsidian.moment(link.fileName(), calendarData.date_pattern); if (!date.isValid()) { continue; } const dateString = link.fileName(); let entry = dataDict[dateString]; if (!entry) { entry = { 'date': dateString, 'content': '', 'link': link.path }; dataDict[dateString] = entry; } // fill content for (let ci = 1; ci < value.length; ci++) { if (value[ci]) { // if the header contains a "|", use the string after "|" as label const splited = headers[ci].split("|"); const label = splited[splited.length - 1]; entry.content += `${label} ${value[ci]}\n`; } } } calendarData.entries = Object.values(dataDict); calendarData.format = 'text'; } return calendarData; } function fromCalendarData(calendarData, settings) { const ctx = createContext(calendarData, settings); const mon = obsidian.moment(`${calendarData.year}-${calendarData.month}`, 'YYYY-M'); if (!mon.isValid()) { ctx.error = `Fail: Invalid Date ${calendarData.year}-${calendarData.month}`; return ctx; } ctx.displayMonth = mon.format(settings.monthFormat); ctx.startDay = mon.startOf('month').day(); ctx.monthDays = mon.endOf('month').date(); // table width (optional) if (calendarData.width) { ctx.tableWidth = calendarData.width; } // punch in calendarData.entries.forEach(entry => { const d = obsidian.moment(entry.date, calendarData.date_pattern); if (d.year() == calendarData.year && d.month() + 1 == calendarData.month) { ctx.marks.set(d.date(), entry); } }); return ctx; } function renderHead(ctx) { const { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } = ctx.settings; const WEEK = [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]; const thead = createEl('thead'); if (ctx.settings.displayHead) { const tr = thead.createEl('tr'); tr.createEl('th', { cls: 'habitt-head', attr: { colspan: 7 }, text: ctx.displayMonth }); } const tr = thead.createEl('tr'); for (let i = 0; i < 7; i++) { tr.createEl('th', { cls: `habitt-th habitt-th-${i}`, text: WEEK[(i + ctx.startOfWeek) % 7] }); } return thead; } function renderBody(ctx) { const startHolds = ctx.startDay >= ctx.startOfWeek ? ctx.startDay - ctx.startOfWeek : 7 - ctx.startOfWeek + ctx.startDay; let days = (new Array(ctx.monthDays)).fill(0).map((v, i) => i + 1); const weeks = []; if (startHolds) { const startWeekDays = 7 - startHolds; const firstWeek = (new Array(startHolds)).fill(0); weeks.push(firstWeek.concat(days.slice(0, startWeekDays))); days = days.slice(startWeekDays); } let i = 0; while (i < days.length) { weeks.push(days.slice(i, i + 7)); i = i + 7; } const lastWeek = weeks[weeks.length - 1]; if (lastWeek.length < 7) { const pad = 7 - lastWeek.length; for (let i = 0; i < pad; i++) { lastWeek.push(0); } } const tbody = createEl('tbody'); const { enableHTML } = ctx.settings; for (let i = 0; i < weeks.length; i++) { const tr = tbody.createEl('tr'); for (let j = 0; j < weeks[i].length; j++) { const d = weeks[i][j]; const hasOwn = ctx.marks.has(d); const td = tr.createEl('td', { cls: `habitt-td habitt-td--${d || 'disabled'} ${hasOwn ? 'habitt-td--checked' : ''}` }); const div = td.createDiv({ cls: 'habitt-c' }); // create link to file if (hasOwn) { const day_div = div.createDiv({ cls: 'habitt-date' }); const link = ctx.marks.get(d).link ? ctx.marks.get(d).link : ctx.marks.get(d).date; day_div.createEl('a', { text: `${d || ''}`, cls: "internal-link", href: link, attr: { "data-href": link, "target": "_blank", "rel": "noopener" } }); } else { div.createDiv({ cls: 'habitt-date', text: `${d || ''}` }); } const dots = div.createDiv({ cls: 'habitt-dots' }); if (hasOwn) { const input = ctx.marks.get(d).content; // treat as HTML if (enableHTML && ctx.calendarData.format == 'html') { dots.innerHTML = `