diff --git a/.vscode/snipsnap.code-snippets b/.vscode/snipsnap.code-snippets new file mode 100644 index 0000000..06ea71b --- /dev/null +++ b/.vscode/snipsnap.code-snippets @@ -0,0 +1 @@ +{"var-assignment-411b622":{"prefix":["base var"],"body":["var ${1:name} = ${2:value};"],"description":"var assignment","scope":"javascript,javascriptreact,typescript,typescriptreact"},"let-assignment-5ec2f75":{"prefix":["base let"],"body":["let ${1:name} = ${2:value};"],"description":"let assignment","scope":"javascript,javascriptreact,typescript,typescriptreact"},"destructuring-let-assignment-cb4b3f2":{"prefix":["base let destruct object"],"body":["let {${1:name}} = ${2:value};"],"description":"Object destructing","scope":"javascript,javascriptreact,typescript,typescriptreact"},"destructuring-let-array-d693a16":{"prefix":["base let destruct array"],"body":["let [${1:name}] = ${2:value};"],"description":"Array destructing","scope":"javascript,javascriptreact,typescript,typescriptreact"},"const-assignment-3882230":{"prefix":["base const"],"body":["const ${1:name} = ${2:value};"],"description":"const assignment","scope":"javascript,javascriptreact,typescript,typescriptreact"},"destructuring-const-assignment-3bedb18":{"prefix":["base const destruct object"],"body":["const {${1:name}} = ${2:value};"],"description":"Object destructing","scope":"javascript,javascriptreact,typescript,typescriptreact"},"destructingarray-ff5c0be":{"prefix":["base const destruct array"],"body":["const [${2:propertyName}] = ${1:arrayToDestruct};"],"description":"Array destructing","scope":"javascript,javascriptreact,typescript,typescriptreact"},"if-statement-4f7664a":{"prefix":["base if"],"body":["if (${1:condition}) {\n\t${0}\n}"],"description":"if statement","scope":"javascript,javascriptreact,typescript,typescriptreact"},"else-statement-8019679":{"prefix":["base else"],"body":["else {\n\t${0}\n}"],"description":"else statement","scope":"javascript,javascriptreact,typescript,typescriptreact"},"if-else-statement-0da01e0":{"prefix":["base if else"],"body":["if (${1:condition}) {\n\t${0}\n} else {\n\t\n}"],"description":"if/else statement","scope":"javascript,javascriptreact,typescript,typescriptreact"},"else-if-statement-3bf0944":{"prefix":["base else if"],"body":["else if (${1:condition}) {\n\t${0}\n}"],"description":"else if statement","scope":"javascript,javascriptreact,typescript,typescriptreact"},"ternary-operator-d577c8d":{"prefix":["base ternary operator"],"body":["${1:condition} ? ${2:expression} : ${3:expression};"],"description":"ternary operator","scope":"javascript,javascriptreact,typescript,typescriptreact"},"for-loop-45777a2":{"prefix":["base for"],"body":["for (let ${1:i} = 0, ${2:len} = ${3:iterable}.length; ${1:i} < ${2:len}; ${1:i}++) {\n\t${0}\n}"],"description":"for loop","scope":"javascript,javascriptreact,typescript,typescriptreact"},"reverse-for-loop-5a7dc59":{"prefix":["base for reverse"],"body":["for (let ${1:i} = ${2:iterable}.length - 1; ${1:i} >= 0; ${1:i}--) {\n\t${0}\n}"],"description":"reverse for loop","scope":"javascript,javascriptreact,typescript,typescriptreact"},"for-in-loop-f4b42c5":{"prefix":["base for in"],"body":["for (let ${1:key} in ${2:array}) {\n\tif (${2:array}.hasOwnProperty(${1:key})) {\n\t\t${0}\n\t}\n}"],"description":"for in loop","scope":"javascript,javascriptreact,typescript,typescriptreact"},"for-of-loop-es6--7d51361":{"prefix":["base for of"],"body":["for (let ${1:key} of ${2:array}) {\n\t${0}\n}"],"description":"for of loop (ES6)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"while-loop-a72bb64":{"prefix":["base while"],"body":["while (${1:condition}) {\n\t${0}\n}"],"description":"while loop","scope":"javascript,javascriptreact,typescript,typescriptreact"},"try-catch-2f4efee":{"prefix":["base try catch"],"body":["try {\n\t${0}\n} catch (${1:err}) {\n\t\n}"],"description":"try/catch","scope":"javascript,javascriptreact,typescript,typescriptreact"},"try-finally-9ba26a6":{"prefix":["base try finally"],"body":["try {\n\t${0}\n} finally {\n\t\n}"],"description":"try/finally","scope":"javascript,javascriptreact,typescript,typescriptreact"},"try-catch-finally-f6535e6":{"prefix":["base try catch finally"],"body":["try {\n\t${0}\n} catch (${1:err}) {\n\t\n} finally {\n\t\n}"],"description":"try/catch/finally","scope":"javascript,javascriptreact,typescript,typescriptreact"},"switch-case-5f707c3":{"prefix":["base switch case"],"body":["switch (${1:expr}) {\n\tcase ${2:value}:\n\t\treturn $0;\n\tdefault:\n\t\treturn;\n}"],"description":"switch case","scope":"javascript,javascriptreact,typescript,typescriptreact"},"anonymous-function-8b88a03":{"prefix":["base function anonymous"],"body":["function (${1:arguments}) {\n\t${0}\n}"],"description":"anonymous function","scope":"javascript,javascriptreact,typescript,typescriptreact"},"named-function-d25eaf4":{"prefix":["base function named"],"body":["function ${1:name}(${2:arguments}) {\n\t${0}\n}"],"description":"named function","scope":"javascript,javascriptreact,typescript,typescriptreact"},"immediately-invoked-function-expression-iife--0c9a12f":{"prefix":["base function immediate"],"body":["((${1:arguments}) => {\n\t${0}\n})(${2});"],"description":"immediately-invoked function expression (IIFE)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"function-apply-0e4ee66":{"prefix":["base function apply"],"body":["${1:fn}.apply(${2:this}, ${3:arguments})"],"description":"function apply","scope":"javascript,javascriptreact,typescript,typescriptreact"},"function-call-4c8e482":{"prefix":["base function call"],"body":["${1:fn}.call(${2:this}, ${3:arguments})"],"description":"function call","scope":"javascript,javascriptreact,typescript,typescriptreact"},"function-bind-07ab16e":{"prefix":["base function bind"],"body":["${1:fn}.bind(${2:this}, ${3:arguments})"],"description":"function bind","scope":"javascript,javascriptreact,typescript,typescriptreact"},"arrow-function-es6--82bc5b9":{"prefix":["base function arrow"],"body":["(${1:arguments}) => ${2:statement}"],"description":"arrow function (ES6)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"arrow-function-with-body-es6--1419255":{"prefix":["base function arrow body"],"body":["(${1:arguments}) => {\n\t${0}\n}"],"description":"arrow function with body (ES6)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"generator-function-es6--0663b6b":{"prefix":["base function generator"],"body":["function* (${1:arguments}) {\n\t${0}\n}"],"description":"generator function (ES6)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"named-generator-function-es6--1410553":{"prefix":["base function generator named"],"body":["function* ${1:name}(${2:arguments}) {\n\t${0}\n}"],"description":"named generator function (ES6)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"sequence-of-0-n-4e0409d":{"prefix":["base sequence of"],"body":["[...Array(${1:length}).keys()]${0}"],"description":"sequence of 0..n","scope":"javascript,javascriptreact,typescript,typescriptreact"},"foreach-loop-481be63":{"prefix":["base foreach"],"body":["${1}.forEach((${2:item}) => {\n\t${0}\n});"],"description":"forEach loop","scope":"javascript,javascriptreact,typescript,typescriptreact"},"map-a1ee187":{"prefix":["base map"],"body":["${1}.map((${2:item}) => {\n\t${0}\n});"],"description":"map","scope":"javascript,javascriptreact,typescript,typescriptreact"},"reduce-5c10859":{"prefix":["base reduce"],"body":["${1}.reduce((${2:previous}, ${3:current}) => {\n\t${0}\n}${4:, initial});"],"description":"reduce","scope":"javascript,javascriptreact,typescript,typescriptreact"},"filter-4496b0f":{"prefix":["base filter"],"body":["${1}.filter(${2:item} => {\n\t${0}\n});"],"description":"filter","scope":"javascript,javascriptreact,typescript,typescriptreact"},"find-8795af4":{"prefix":["base find"],"body":["${1}.find(${2:item} => {\n\t${0}\n});"],"description":"find","scope":"javascript,javascriptreact,typescript,typescriptreact"},"class-es6--231af3c":{"prefix":["base class"],"body":["class ${1:name} {\n\tconstructor(${2:arguments}) {\n\t\t${0}\n\t}\n}"],"description":"class (ES6)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"child-class-es6--49cfcee":{"prefix":["base child class"],"body":["class ${1:name} extends ${2:base} {\n\tconstructor(${3:arguments}) {\n\t\tsuper(${3:arguments});\n\t\t${0}\n\t}\n}"],"description":"child class (ES6)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"class-constructor-es6--e84a3e1":{"prefix":["base class constructor"],"body":["constructor(${1:arguments}) {\n\tsuper(${1:arguments});${0}\n}"],"description":"class constructor (ES6)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"method-es6-syntax--2967249":{"prefix":["base method"],"body":["${1:method}(${2:arguments}) {\n\t${0}\n}"],"description":"method (ES6 syntax)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"getter-es6-syntax--90c9824":{"prefix":["base getter"],"body":["get ${1:property}() {\n\t${0}\n}"],"description":"getter (ES6 syntax)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"setter-es6-syntax--447e460":{"prefix":["base setter"],"body":["set ${1:property}(${2:value}) {\n\t${0}\n}"],"description":"setter (ES6 syntax)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"getter-and-setter-es6-syntax--c12be7d":{"prefix":["base getter setter"],"body":["get ${1:property}() {\n\t${0}\n}\nset ${1:property}(${2:value}) {\n\t\n}"],"description":"getter and setter (ES6 syntax)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"prototype-method-dcec465":{"prefix":["base prototype method"],"body":["${1:Class}.prototype.${2:method} = function(${3:arguments}) {\n\t${0}\n};"],"description":"prototype method","scope":"javascript,javascriptreact,typescript,typescriptreact"},"object-assign-10c91f2":{"prefix":["base object assign"],"body":["Object.assign(${1:dest}, ${2:source})"],"description":"Object.assign","scope":"javascript,javascriptreact,typescript,typescriptreact"},"object-assign-copy-shallow-clone--72fede8":{"prefix":["base object assign copy"],"body":["Object.assign({}, ${1:original}, ${2:source})"],"description":"Object.assign copy (shallow clone)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"return-0c23964":{"prefix":["base return"],"body":["return ${0};"],"description":"return","scope":"javascript,javascriptreact,typescript,typescriptreact"},"return-promise-es6--fd35485":{"prefix":["base return promise"],"body":["return new Promise((resolve, reject) => {\n\t${0}\n});"],"description":"return Promise (ES6)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"return-complex-value-such-as-jsx-components--782bfcc":{"prefix":["base return complex value"],"body":["return (\n\t${0}\n);"],"description":"return complex value (such as JSX components)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"typeof-19ce7c6":{"prefix":["base typeof"],"body":["typeof ${1:source} === '${2:undefined}'"],"description":"typeof","scope":"javascript,javascriptreact,typescript,typescriptreact"},"instanceof-8bb3070":{"prefix":["base instanceof"],"body":["${1:source} instanceof ${2:Object}"],"description":"instanceof","scope":"javascript,javascriptreact,typescript,typescriptreact"},"promise-es6--f34bc97":{"prefix":["base promise"],"body":["new Promise((resolve, reject) => {\n\t${0}\n})"],"description":"Promise (ES6)","scope":"javascript,javascriptreact,typescript,typescriptreact"},"promise-then-e996760":{"prefix":["base promise then"],"body":["${1:promise}.then((${2:value}) => {\n\t${0}\n})"],"description":"Promise.then","scope":"javascript,javascriptreact,typescript,typescriptreact"},"promise-catch-f342220":{"prefix":["base promise catch"],"body":["${1:promise}.catch((${2:err}) => {\n\t${0}\n})"],"description":"Promise.catch","scope":"javascript,javascriptreact,typescript,typescriptreact"},"exportnamedvariable-78bb381":{"prefix":["base export named variable"],"body":["export const ${1:exportVariable} = ${2:localVariable};\n"],"description":"Export named variable in ES6 syntax","scope":"javascript,javascriptreact,typescript,typescriptreact"},"exportnamedfunction-181a9c8":{"prefix":["base export named function"],"body":["export const ${1:functionName} = (${2:params}) => {\n\t$0\n};\n"],"description":"Export named function in ES6 syntax","scope":"javascript,javascriptreact,typescript,typescriptreact"},"exportdefaultfunction-30a2855":{"prefix":["base export default function"],"body":["export default function ${1:${TM_FILENAME_BASE}}(${2:params}) {\n\t$0\n};\n"],"description":"Export default function in ES6 syntax","scope":"javascript,javascriptreact,typescript,typescriptreact"},"exportclass-b3bf75f":{"prefix":["base export class"],"body":["export default class ${1:className} {\n\t$0\n};\n"],"description":"Export default class in ES6 syntax","scope":"javascript,javascriptreact,typescript,typescriptreact"},"exportclassextends-97fc7f4":{"prefix":["base export class extends"],"body":["export default class ${1:className} extends ${2:baseclassName} {\n\t$0\n};\n"],"description":"Export default class which extends a base one in ES6 syntax","scope":"javascript,javascriptreact,typescript,typescriptreact"},"import-a1eb24c":{"prefix":["base import"],"body":["import ${2:moduleName} from '${1:module}';$0"],"description":"Imports entire module statement in ES6 syntax","scope":"javascript,javascriptreact,typescript,typescriptreact"},"importnomodulename-ef6ff1d":{"prefix":["base import no module name"],"body":["import '${1:module}';$0"],"description":"Imports entire module in ES6 syntax without module name","scope":"javascript,javascriptreact,typescript,typescriptreact"},"importdestructing-d98cd10":{"prefix":["base import destructing"],"body":["import { $2 } from '${1:module}';$0"],"description":"Imports only a portion of the module in ES6 syntax","scope":"javascript,javascriptreact,typescript,typescriptreact"},"importeverything-254070b":{"prefix":["base import everything"],"body":["import * as ${2:alias} from '${1:module}';$0"],"description":"Imports everything as alias from the module in ES6 syntax","scope":"javascript,javascriptreact,typescript,typescriptreact"},"importas-9e11ffa":{"prefix":["base import as"],"body":["import { ${2:originalName} as ${3:alias} } from '${1:module}';$0"],"description":"Imports a specific portion of the module by assigning a local alias in ES6 syntax","scope":"javascript,javascriptreact,typescript,typescriptreact"},"require-542391c":{"prefix":["base require"],"body":["require('${1:module}');"],"description":"require","scope":"javascript,javascriptreact,typescript,typescriptreact"},"require-local-8efd416":{"prefix":["base require local"],"body":["require('./${1:module}');"],"description":"require local","scope":"javascript,javascriptreact,typescript,typescriptreact"},"require-assignment-b360ddf":{"prefix":["base require assignment"],"body":["const ${1:module} = require('${1:module}');"],"description":"require assignment","scope":"javascript,javascriptreact,typescript,typescriptreact"},"require-assignment-local-1f4f925":{"prefix":["base require assignment local"],"body":["const ${1:module} = require('./${1:module}');"],"description":"require assignment local","scope":"javascript,javascriptreact,typescript,typescriptreact"},"destructuring-require-assignment-3246472":{"prefix":["base require assignment"],"body":["const {${1:module}} = require('${1:module}');"],"description":"destructuring require assignment","scope":"javascript,javascriptreact,typescript,typescriptreact"},"destructuring-require-assignment-local-6e9014c":{"prefix":["base require assignment local destruct"],"body":["const {${1:module}} = require('./${1:module}');"],"description":"destructuring require assignment local","scope":"javascript,javascriptreact,typescript,typescriptreact"},"exports-member-c1002a1":{"prefix":["base exports member"],"body":["exports.${1:member} = ${2:value};"],"description":"exports.member","scope":"javascript,javascriptreact,typescript,typescriptreact"},"module-exports-7a7a786":{"prefix":["base module exports"],"body":["module.exports = ${1:name};"],"description":"module.exports","scope":"javascript,javascriptreact,typescript,typescriptreact"},"module-exports-object-943f52d":{"prefix":["base module exports object"],"body":["module.exports = {\n\t${1:member}\n};"],"description":"module exports object","scope":"javascript,javascriptreact,typescript,typescriptreact"},"event-handler-37f565f":{"prefix":["base event handler"],"body":["${1:emitter}.on('${2:event}', (${3:arguments}) => {\n\t${0}\n});"],"description":"event handler","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consoleassert-a5f4e69":{"prefix":["base console assert"],"body":["console.assert(${1:expression}, ${2:object});"],"description":"If the specified expression is false, the message is written to the console along with a stack trace","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consoleclear-d9e0118":{"prefix":["base console clear"],"body":["console.clear();"],"description":"Clears the console","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consolecount-9c5f7ea":{"prefix":["base console count"],"body":["console.count(${1:label});"],"description":"Writes the the number of times that count() has been invoked at the same line and with the same label","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consoledebug-edf85f8":{"prefix":["base console debug"],"body":["console.debug(${1:object});"],"description":"Displays a message in the console. Also display a blue right arrow icon along with the logged message in Safari","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consoledir-faf0292":{"prefix":["base console dir"],"body":["console.dir(${1:object});"],"description":"Prints a JavaScript representation of the specified object","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consoleerror-1c4c6bc":{"prefix":["base console error"],"body":["console.error(${1:object});"],"description":"Displays a message in the console and also includes a stack trace from where the method was called","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consolegroup-7ad240a":{"prefix":["base console group"],"body":["console.group('${1:label}');"],"description":"Groups and indents all following output by an additional level, until console.groupEnd() is called.","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consolegroupend-fe2f5e4":{"prefix":["base console group end"],"body":["console.groupEnd();"],"description":"Closes out the corresponding console.group().","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consolelog-a7a4472":{"prefix":["base console log"],"body":["console.log(${1:object});"],"description":"Displays a message in the console","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consolelogobject-2197f96":{"prefix":["base console log object"],"body":["console.log('${1:object} :>> ', ${1:object});"],"description":"Displays an object in the console with its name","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consoletrace-33e4543":{"prefix":["base console trace"],"body":["console.trace(${1:object});"],"description":"Prints a stack trace from the point where the method was called","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consolewarn-1ddec9c":{"prefix":["base console warn"],"body":["console.warn(${1:object});"],"description":"Displays a message in the console but also displays a yellow warning icon along with the logged message","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consoleinfo-9aaf424":{"prefix":["base console info"],"body":["console.info(${1:object});"],"description":"Displays a message in the console but also displays a blue information icon along with the logged message","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consoletable-35c244f":{"prefix":["base console table"],"body":["console.table(${1:object});"],"description":"Displays tabular data as a table.","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consoletime-c352d2d":{"prefix":["base console time"],"body":["console.time(${1:object});"],"description":"Sets starting point for execution time measurement","scope":"javascript,javascriptreact,typescript,typescriptreact"},"consoletimeend-edc0765":{"prefix":["base console time end"],"body":["console.timeEnd(${1:object});"],"description":"Sets end point for execution time measurement","scope":"javascript,javascriptreact,typescript,typescriptreact"},"settimeout-1eb369f":{"prefix":["base set timeout"],"body":["setTimeout(() => {\n\t${0}\n}, ${1:delay});"],"description":"setTimeout","scope":"javascript,javascriptreact,typescript,typescriptreact"},"setinterval-25bbd90":{"prefix":["base set interval"],"body":["setInterval(() => {\n\t${0}\n}, ${1:delay});"],"description":"setInterval","scope":"javascript,javascriptreact,typescript,typescriptreact"},"setimmediate-44177fa":{"prefix":["base set immediate"],"body":["setImmediate(() => {\n\t${0}\n});"],"description":"setImmediate","scope":"javascript,javascriptreact,typescript,typescriptreact"},"process-nexttick-9043b4d":{"prefix":["base process next tick"],"body":["process.nextTick(() => {\n\t${0}\n});"],"description":"process nextTick","scope":"javascript,javascriptreact,typescript,typescriptreact"},"insert-use-strict-statement-dbe202c":{"prefix":["base use strict"],"body":["'use strict';"],"description":"insert 'use strict' statement","scope":"javascript,javascriptreact,typescript,typescriptreact"}} \ No newline at end of file diff --git a/lib/transformer.js b/lib/transformer.js index 0a955b4..4ff1020 100644 --- a/lib/transformer.js +++ b/lib/transformer.js @@ -55,7 +55,7 @@ export const Transformer = { unified() .use(markdown, { gfm: true }) .use(highlight) - .use(externalLinks, {target: "_blank", rel: ['nofollow']}) + .use(externalLinks, {target: "_blank", rel: ['noopener']}) .use(frontmatter, ['yaml', 'toml']) .use(wikiLinkPlugin, { permalinks:fileNames, diff --git a/posts/.obsidian/config b/posts/.obsidian/config index fa0c0f6..79f9620 100644 --- a/posts/.obsidian/config +++ b/posts/.obsidian/config @@ -1 +1 @@ -{"theme":"moonstone","pluginEnabledStatus":{"file-explorer":true,"global-search":true,"switcher":true,"graph":true,"backlink":true,"command-palette":true,"markdown-importer":true,"word-count":false,"open-with-default-app":true,"tag-pane":true,"page-preview":false,"daily-notes":true,"publish":true},"promptDelete":false,"showFrontmatter":true,"alwaysUpdateLinks":true,"strictLineBreaks":true,"foldHeading":true,"foldIndent":true,"defaultViewMode":"preview","obsidianCss":true} \ No newline at end of file +{"theme":"moonstone","pluginEnabledStatus":{"file-explorer":true,"global-search":true,"switcher":true,"graph":true,"backlink":true,"command-palette":true,"markdown-importer":true,"word-count":false,"open-with-default-app":true,"tag-pane":true,"page-preview":true,"daily-notes":true,"publish":true,"outline":true,"workspaces":true,"sync":false,"templates":false,"starred":false,"translucency":true},"promptDelete":false,"showFrontmatter":true,"alwaysUpdateLinks":true,"strictLineBreaks":true,"foldHeading":true,"foldIndent":true,"defaultViewMode":"preview","obsidianCss":false,"enabledPlugins":[],"cssTheme":"Amethyst"} \ No newline at end of file diff --git a/posts/.obsidian/global-search.json b/posts/.obsidian/global-search.json new file mode 100644 index 0000000..7564325 --- /dev/null +++ b/posts/.obsidian/global-search.json @@ -0,0 +1 @@ +{"showFullPath":false,"linkStyle":"none","listStyle":"none"} \ No newline at end of file diff --git a/posts/.obsidian/graph.json b/posts/.obsidian/graph.json index 66012ba..234589e 100644 --- a/posts/.obsidian/graph.json +++ b/posts/.obsidian/graph.json @@ -1 +1 @@ -{"search":"","showTags":false,"showAttachments":false,"hideUnresolved":false,"showOrphans":true,"showArrow":false,"textFadeMultiplier":0,"nodeSizeMultiplier":1,"lineSizeMultiplier":1,"centerStrength":0.518713248970312,"repelStrength":10,"linkStrength":1,"linkDistance":250,"scale":0.6989606412938232} \ No newline at end of file +{"search":"","showTags":false,"showAttachments":false,"hideUnresolved":false,"showOrphans":true,"showArrow":false,"textFadeMultiplier":0,"nodeSizeMultiplier":1,"lineSizeMultiplier":1,"centerStrength":0.518713248970312,"repelStrength":10,"linkStrength":1,"linkDistance":250,"scale":0.28548580833378134} \ No newline at end of file diff --git a/posts/.obsidian/plugins/calendar/main.js b/posts/.obsidian/plugins/calendar/main.js new file mode 100644 index 0000000..47c1b21 --- /dev/null +++ b/posts/.obsidian/plugins/calendar/main.js @@ -0,0 +1,2877 @@ +'use strict'; + +var obsidian = require('obsidian'); +var path = require('path'); +var os = require('os'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +var obsidian__default = /*#__PURE__*/_interopDefaultLegacy(obsidian); +var path__default = /*#__PURE__*/_interopDefaultLegacy(path); + +const langToMomentLocale = { + en: "en-gb", + zh: "zh-cn", + "zh-TW": "zh-tw", + ru: "ru", + ko: "ko", + it: "it", + id: "id", + ro: "ro", + "pt-BR": "pt-br", + cz: "cs", + de: "de", + es: "es", + fr: "fr", + no: "nn", + pl: "pl", + pt: "pt", + tr: "tr", + hi: "hi", + nl: "nl", + ar: "ar", + ja: "ja", +}; +async function configureMomentLocale() { + var _a; + const obsidianLang = localStorage.getItem("language"); + const systemLang = (_a = navigator.language) === null || _a === void 0 ? void 0 : _a.toLowerCase(); + let momentLocale = langToMomentLocale[obsidianLang]; + if (systemLang.startsWith(obsidianLang)) { + momentLocale = systemLang; + } + const currentLocale = window.moment.locale(momentLocale); + console.info(`Calendar initialization: Trying to switch Moment.js global locale to ${momentLocale}, got ${currentLocale}`); +} + +const DEFAULT_WEEK_FORMAT = "YYYY-[W]ww"; +const DEFAULT_WORDS_PER_DOT = 250; +const VIEW_TYPE_CALENDAR = "calendar"; + +function noop() { } +function assign(tar, src) { + // @ts-ignore + for (const k in src) + tar[k] = src[k]; + return tar; +} +function is_promise(value) { + return value && typeof value === 'object' && typeof value.then === 'function'; +} +function run(fn) { + return fn(); +} +function blank_object() { + return 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 append(target, node) { + target.appendChild(node); +} +function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); +} +function detach(node) { + 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(element) { + return Array.from(element.childNodes); +} +function set_data(text, data) { + data = '' + data; + if (text.wholeText !== data) + text.data = data; +} +function toggle_class(element, name, toggle) { + element.classList[toggle ? 'add' : 'remove'](name); +} + +let 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 onDestroy(fn) { + get_current_component().$$.on_destroy.push(fn); +} + +const dirty_components = []; +const binding_callbacks = []; +const render_callbacks = []; +const flush_callbacks = []; +const resolved_promise = Promise.resolve(); +let 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); +} +let flushing = false; +const seen_callbacks = new Set(); +function flush() { + if (flushing) + return; + flushing = true; + do { + // first, call beforeUpdate functions + // and update components + for (let i = 0; i < dirty_components.length; i += 1) { + const component = dirty_components[i]; + set_current_component(component); + update(component.$$); + } + set_current_component(null); + dirty_components.length = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + // then, once components are updated, call + // afterUpdate functions. This may cause + // subsequent updates... + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + // ...so guard against infinite loops + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + flushing = false; + seen_callbacks.clear(); +} +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); + } +} +const outroing = new Set(); +let 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, detach, callback) { + if (block && block.o) { + if (outroing.has(block)) + return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach) + block.d(1); + callback(); + } + }); + block.o(local); + } +} + +function handle_promise(promise, info) { + const token = info.token = {}; + function update(type, index, key, value) { + if (info.token !== token) + return; + info.resolved = value; + let child_ctx = info.ctx; + if (key !== undefined) { + child_ctx = child_ctx.slice(); + child_ctx[key] = value; + } + const block = type && (info.current = type)(child_ctx); + let needs_flush = false; + if (info.block) { + if (info.blocks) { + info.blocks.forEach((block, i) => { + if (i !== index && block) { + group_outros(); + transition_out(block, 1, 1, () => { + info.blocks[i] = null; + }); + check_outros(); + } + }); + } + else { + info.block.d(1); + } + block.c(); + transition_in(block, 1); + block.m(info.mount(), info.anchor); + needs_flush = true; + } + info.block = block; + if (info.blocks) + info.blocks[index] = block; + if (needs_flush) { + flush(); + } + } + if (is_promise(promise)) { + const current_component = get_current_component(); + promise.then(value => { + set_current_component(current_component); + update(info.then, 1, info.value, value); + set_current_component(null); + }, error => { + set_current_component(current_component); + update(info.catch, 2, info.error, error); + set_current_component(null); + if (!info.hasCatch) { + throw error; + } + }); + // if we previously had a then/catch block, destroy it + if (info.current !== info.pending) { + update(info.pending, 0); + return true; + } + } + else { + if (info.current !== info.then) { + update(info.then, 1, info.value, promise); + return true; + } + info.resolved = promise; + } +} + +function get_spread_update(levels, updates) { + const update = {}; + const to_null_out = {}; + const accounted_for = { $$scope: 1 }; + let i = levels.length; + while (i--) { + const o = levels[i]; + const n = updates[i]; + if (n) { + for (const key in o) { + if (!(key in n)) + to_null_out[key] = 1; + } + for (const key in n) { + if (!accounted_for[key]) { + update[key] = n[key]; + accounted_for[key] = 1; + } + } + levels[i] = n; + } + else { + for (const key in o) { + accounted_for[key] = 1; + } + } + } + for (const key in to_null_out) { + if (!(key in update)) + update[key] = undefined; + } + return update; +} +function get_spread_object(spread_props) { + return typeof spread_props === 'object' && spread_props !== null ? spread_props : {}; +} +function create_component(block) { + block && block.c(); +} +function mount_component(component, target, anchor) { + const { fragment, on_mount, on_destroy, after_update } = component.$$; + fragment && fragment.m(target, anchor); + // onMount happens before the initial afterUpdate + add_render_callback(() => { + const new_on_destroy = on_mount.map(run).filter(is_function); + if (on_destroy) { + on_destroy.push(...new_on_destroy); + } + else { + // Edge case - component was destroyed immediately, + // most likely as a result of a binding initialising + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + after_update.forEach(add_render_callback); +} +function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + // TODO null out other refs, including component.$$ (but need to + // preserve final state?) + $$.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, instance, create_fragment, not_equal, props, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const prop_values = options.props || {}; + const $$ = component.$$ = { + fragment: null, + ctx: null, + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + before_update: [], + after_update: [], + context: new Map(parent_component ? parent_component.$$.context : []), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false + }; + let ready = false; + $$.ctx = instance + ? instance(component, prop_values, (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); + // `false` as a special case of no DOM component + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + const nodes = children(options.target); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } + else { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in(component.$$.fragment); + mount_component(component, options.target, options.anchor); + flush(); + } + set_current_component(parent_component); +} +/** + * Base class for Svelte components. Used when dev=false. + */ +class SvelteComponent { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } +} + +const subscriber_queue = []; +/** + * Create a `Writable` store that allows both updating and reading by subscription. + * @param {*=}value initial value + * @param {StartStopNotifier=}start start and stop notifications for subscriptions + */ +function writable(value, start = noop) { + let stop; + const subscribers = []; + function set(new_value) { + if (safe_not_equal(value, new_value)) { + value = new_value; + if (stop) { // store is ready + const run_queue = !subscriber_queue.length; + for (let i = 0; i < subscribers.length; i += 1) { + const s = subscribers[i]; + s[1](); + subscriber_queue.push(s, 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 update(fn) { + set(fn(value)); + } + function subscribe(run, invalidate = noop) { + const subscriber = [run, invalidate]; + subscribers.push(subscriber); + if (subscribers.length === 1) { + stop = start(set) || noop; + } + run(value); + return () => { + const index = subscribers.indexOf(subscriber); + if (index !== -1) { + subscribers.splice(index, 1); + } + if (subscribers.length === 0) { + stop(); + stop = null; + } + }; + } + return { set, update, subscribe }; +} + +/*! ***************************************************************************** +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. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +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()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +var DEFAULT_DATE_FORMAT = "YYYY-MM-DD"; +var DailyNotesFolderMissingError = /** @class */ (function (_super) { + __extends(DailyNotesFolderMissingError, _super); + function DailyNotesFolderMissingError() { + return _super !== null && _super.apply(this, arguments) || this; + } + return DailyNotesFolderMissingError; +}(Error)); +function getNotePath(directory, filename) { + if (!filename.endsWith(".md")) { + filename += ".md"; + } + return obsidian__default['default'].normalizePath(path__default['default'].join(directory, filename)); +} +/** + * Read the user settings for the `daily-notes` plugin + * to keep behavior of creating a new note in-sync. + */ +function getDailyNoteSettings() { + var _a, _b; + try { + // XXX: Access private API for internal plugins + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var settings = window.app.internalPlugins.plugins["daily-notes"] + .instance.options; + return { + format: settings.format || DEFAULT_DATE_FORMAT, + folder: ((_a = settings.folder) === null || _a === void 0 ? void 0 : _a.trim()) || "", + template: ((_b = settings.template) === null || _b === void 0 ? void 0 : _b.trim()) || "", + }; + } + catch (err) { + console.info("No custom daily note settings found!", err); + } +} +function appHasDailyNotesPluginLoaded() { + var app = window.app; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var dailyNotesPlugin = app.internalPlugins.plugins["daily-notes"]; + return dailyNotesPlugin && dailyNotesPlugin.enabled; +} +function getTemplateContents(template) { + return __awaiter(this, void 0, void 0, function () { + var app, metadataCache, vault, templatePath, templateFile, contents, err_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + app = window.app; + metadataCache = app.metadataCache, vault = app.vault; + templatePath = obsidian__default['default'].normalizePath(template); + if (templatePath === "/") { + return [2 /*return*/, Promise.resolve("")]; + } + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + templateFile = metadataCache.getFirstLinkpathDest(templatePath, ""); + return [4 /*yield*/, vault.cachedRead(templateFile)]; + case 2: + contents = _a.sent(); + return [2 /*return*/, contents]; + case 3: + err_1 = _a.sent(); + console.error("Failed to read the daily note template '" + templatePath + "'", err_1); + new obsidian__default['default'].Notice("Failed to read the daily note template"); + return [2 /*return*/, ""]; + case 4: return [2 /*return*/]; + } + }); + }); +} +/** + * This function mimics the behavior of the daily-notes plugin + * so it will replace {{date}}, {{title}}, and {{time}} with the + * formatted timestamp. + * + * Note: it has an added bonus that it's not 'today' specific. + */ +function createDailyNote(date) { + return __awaiter(this, void 0, void 0, function () { + var app, vault, moment, _a, template, format, folder, templateContents, filename, normalizedPath, createdFile, err_2; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + app = window.app; + vault = app.vault; + moment = window.moment; + _a = getDailyNoteSettings(), template = _a.template, format = _a.format, folder = _a.folder; + return [4 /*yield*/, getTemplateContents(template)]; + case 1: + templateContents = _b.sent(); + filename = date.format(format); + normalizedPath = getNotePath(folder, filename); + _b.label = 2; + case 2: + _b.trys.push([2, 4, , 5]); + return [4 /*yield*/, vault.create(normalizedPath, templateContents + .replace(/{{\s*(date|time)\s*:(.*?)}}/gi, function (_, _timeOrDate, momentFormat) { + return date.format(momentFormat.trim()); + }) + .replace(/{{\s*date\s*}}/gi, filename) + .replace(/{{\s*time\s*}}/gi, moment().format("HH:mm")) + .replace(/{{\s*title\s*}}/gi, filename))]; + case 3: + createdFile = _b.sent(); + return [2 /*return*/, createdFile]; + case 4: + err_2 = _b.sent(); + console.error("Failed to create file: '" + normalizedPath + "'", err_2); + new obsidian__default['default'].Notice("Unable to create new file."); + return [3 /*break*/, 5]; + case 5: return [2 /*return*/]; + } + }); + }); +} +function getDailyNote(date, dailyNotes) { + /** + * Look for an exact match filename first, if one doesn't + * exist, walk through all the daily notes and find any files + * on the same day. + */ + var vault = window.app.vault; + var _a = getDailyNoteSettings(), format = _a.format, folder = _a.folder; + var formattedDate = date.format(format); + var dailyNotePath = getNotePath(folder, formattedDate); + var exactMatch = vault.getAbstractFileByPath(dailyNotePath); + if (exactMatch) { + return exactMatch; + } + for (var _i = 0, dailyNotes_1 = dailyNotes; _i < dailyNotes_1.length; _i++) { + var dailyNote = dailyNotes_1[_i]; + if (dailyNote.date.isSame(date, "day")) { + return dailyNote.file; + } + } + return null; +} +function getAllDailyNotes() { + /** + * Find all daily notes in the daily note folder + */ + var moment = window.moment; + var vault = window.app.vault; + var _a = getDailyNoteSettings(), format = _a.format, folder = _a.folder; + var dailyNotesFolder = vault.getAbstractFileByPath(obsidian__default['default'].normalizePath(folder)); + if (!dailyNotesFolder) { + throw new DailyNotesFolderMissingError("Failed to find daily notes folder"); + } + var dailyNotes = []; + obsidian__default['default'].Vault.recurseChildren(dailyNotesFolder, function (note) { + if (note instanceof obsidian__default['default'].TFile) { + var noteDate = moment(note.basename, format, true); + if (noteDate.isValid()) { + dailyNotes.push({ + date: noteDate, + file: note, + }); + } + } + }); + return dailyNotes; +} +var appHasDailyNotesPluginLoaded_1 = appHasDailyNotesPluginLoaded; +var createDailyNote_1 = createDailyNote; +var getAllDailyNotes_1 = getAllDailyNotes; +var getDailyNote_1 = getDailyNote; +var getDailyNoteSettings_1 = getDailyNoteSettings; +var getTemplateContents_1 = getTemplateContents; + +function getWeeklyNoteSettings(settings) { + return { + format: settings.weeklyNoteFormat || DEFAULT_WEEK_FORMAT, + folder: settings.weeklyNoteFolder ? settings.weeklyNoteFolder.trim() : "", + template: settings.weeklyNoteTemplate + ? settings.weeklyNoteTemplate.trim() + : "", + }; +} +const SettingsInstance = writable({ + shouldConfirmBeforeCreate: true, + weekStart: "locale", + wordsPerDot: DEFAULT_WORDS_PER_DOT, + showWeeklyNote: false, + weeklyNoteFormat: "", + weeklyNoteTemplate: "", + weeklyNoteFolder: "", +}); +function syncMomentLocaleWithSettings(settings) { + const { moment } = window; + const currentLocale = moment.locale(); + // Save the initial locale weekspec so that we can restore + // it when toggling between the different options in settings. + if (!window._bundledLocaleWeekSpec) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + window._bundledLocaleWeekSpec = moment.localeData()._week; + } + if (settings.weekStart === "locale") { + moment.updateLocale(currentLocale, { + week: window._bundledLocaleWeekSpec, + }); + } + else { + moment.updateLocale(currentLocale, { + week: { + dow: settings.weekStart === "monday" ? 1 : 0, + }, + }); + } +} +class CalendarSettingsTab extends obsidian.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + this.containerEl.empty(); + this.containerEl.createEl("h3", { + text: "General Settings", + }); + this.addDotThresholdSetting(); + this.addStartWeekOnMondaySetting(); + this.addConfirmCreateSetting(); + this.addShowWeeklyNoteSetting(); + if (this.plugin.options.showWeeklyNote) { + this.containerEl.createEl("h3", { + text: "Weekly Note Settings", + }); + this.addWeeklyNoteFormatSetting(); + this.addWeeklyNoteTemplateSetting(); + this.addWeeklyNoteFolderSetting(); + } + if (!appHasDailyNotesPluginLoaded_1()) { + this.containerEl.createEl("h3", { + text: "⚠️ Daily Notes plugin not enabled", + }); + this.containerEl.createEl("p", { + text: "The calendar is best used in conjunction with the Daily Notes plugin. Enable it in your plugin settings for a more optimal experience.", + }); + } + } + addDotThresholdSetting() { + new obsidian.Setting(this.containerEl) + .setName("Words per dot") + .setDesc("How many words should be represented by a single dot?") + .addText((textfield) => { + textfield.setPlaceholder(String(DEFAULT_WORDS_PER_DOT)); + textfield.inputEl.type = "number"; + textfield.setValue(String(this.plugin.options.wordsPerDot)); + textfield.onChange(async (value) => { + this.plugin.writeOptions((old) => (old.wordsPerDot = Number(value))); + }); + }); + } + addStartWeekOnMondaySetting() { + const { moment } = window; + const [sunday, monday] = moment.weekdays(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const localeWeekStartNum = moment.localeData()._week.dow; + const localeWeekStart = moment.weekdays()[localeWeekStartNum]; + new obsidian.Setting(this.containerEl) + .setName("Start week on:") + .setDesc("Choose what day of the week to start. Select 'Locale default' to use the default specified by moment.js") + .addDropdown((dropdown) => { + dropdown.addOption("locale", `Locale default (${localeWeekStart})`); + dropdown.addOption("sunday", sunday); + dropdown.addOption("monday", monday); + dropdown.setValue(this.plugin.options.weekStart); + dropdown.onChange(async (value) => { + this.plugin.writeOptions((old) => (old.weekStart = value)); + }); + }); + } + addConfirmCreateSetting() { + new obsidian.Setting(this.containerEl) + .setName("Confirm before creating new note") + .setDesc("Show a confirmation modal before creating a new note") + .addToggle((toggle) => { + toggle.setValue(this.plugin.options.shouldConfirmBeforeCreate); + toggle.onChange(async (value) => { + this.plugin.writeOptions((old) => (old.shouldConfirmBeforeCreate = value)); + }); + }); + } + addShowWeeklyNoteSetting() { + new obsidian.Setting(this.containerEl) + .setName("Show week number") + .setDesc("Enable this to add a column with the week number") + .addToggle((toggle) => { + toggle.setValue(this.plugin.options.showWeeklyNote); + toggle.onChange(async (value) => { + this.plugin.writeOptions((old) => (old.showWeeklyNote = value)); + this.display(); // show/hide weekly settings + }); + }); + } + addWeeklyNoteFormatSetting() { + new obsidian.Setting(this.containerEl) + .setName("Weekly note format") + .setDesc("For more syntax help, refer to format reference") + .addText((textfield) => { + textfield.setValue(this.plugin.options.weeklyNoteFormat); + textfield.setPlaceholder(DEFAULT_WEEK_FORMAT); + textfield.onChange(async (value) => { + this.plugin.writeOptions((old) => (old.weeklyNoteFormat = value)); + }); + }); + } + addWeeklyNoteTemplateSetting() { + new obsidian.Setting(this.containerEl) + .setName("Weekly note template") + .setDesc("Choose the file you want to use as the template for your weekly notes") + .addText((textfield) => { + textfield.setValue(this.plugin.options.weeklyNoteTemplate); + textfield.onChange(async (value) => { + this.plugin.writeOptions((old) => (old.weeklyNoteTemplate = value)); + }); + }); + } + addWeeklyNoteFolderSetting() { + new obsidian.Setting(this.containerEl) + .setName("Weekly note folder") + .setDesc("New weekly notes will be placed here") + .addText((textfield) => { + textfield.setValue(this.plugin.options.weeklyNoteFolder); + textfield.onChange(async (value) => { + this.plugin.writeOptions((old) => (old.weeklyNoteFolder = value)); + }); + }); + } +} + +class ConfirmationModal extends obsidian.Modal { + constructor(app, config) { + super(app); + const { cta, onAccept, text, title } = config; + this.contentEl.createEl("h2", { text: title }); + this.contentEl.createEl("p", { text }); + this.contentEl + .createEl("button", { text: "Never mind" }) + .addEventListener("click", () => this.close()); + this.contentEl + .createEl("button", { + cls: "mod-cta", + text: cta, + }) + .addEventListener("click", async (e) => { + await onAccept(e); + this.close(); + }); + } +} +function createConfirmationDialog({ cta, onAccept, text, title, }) { + new ConfirmationModal(window.app, { cta, onAccept, text, title }).open(); +} + +/** + * Create a Daily Note for a given date. + */ +async function tryToCreateDailyNote(date, inNewSplit, settings, cb) { + const { workspace } = window.app; + const { format } = getDailyNoteSettings_1(); + const filename = date.format(format); + const createFile = async () => { + const dailyNote = await createDailyNote_1(date); + const leaf = inNewSplit + ? workspace.splitActiveLeaf() + : workspace.getUnpinnedLeaf(); + await leaf.openFile(dailyNote); + cb === null || cb === void 0 ? void 0 : cb(dailyNote); + }; + if (settings.shouldConfirmBeforeCreate) { + createConfirmationDialog({ + cta: "Create", + onAccept: createFile, + text: `File ${filename} does not exist. Would you like to create it?`, + title: "New Daily Note", + }); + } + else { + await createFile(); + } +} + +function getNotePath$1(directory, filename) { + if (!filename.endsWith(".md")) { + filename += ".md"; + } + return obsidian.normalizePath(path.join(directory, filename)); +} + +function getDayOfWeekNumericalValue(dayOfWeekName) { + const { moment } = window; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const weekStart = moment.localeData()._week.dow; + const daysOfWeek = [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + "sunday", + ]; + return (daysOfWeek.indexOf(dayOfWeekName.toLowerCase()) + weekStart) % 7; +} +async function createWeeklyNote(date, settings) { + const { vault } = window.app; + const { template, format, folder } = getWeeklyNoteSettings(settings); + const templateContents = await getTemplateContents_1(template); + const filename = date.format(format); + const normalizedPath = getNotePath$1(folder, filename); + try { + const createdFile = await vault.create(normalizedPath, templateContents + .replace(/{{\s*(date|time)\s*:(.*?)}}/gi, (_, _timeOrDate, momentFormat) => { + return date.format(momentFormat.trim()); + }) + .replace(/{{\s*title\s*}}/gi, filename) + .replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi, (_, dayOfWeek, momentFormat) => { + const day = getDayOfWeekNumericalValue(dayOfWeek); + return date.weekday(day).format(momentFormat.trim()); + })); + return createdFile; + } + catch (err) { + console.error(`Failed to create file: '${normalizedPath}'`, err); + new obsidian.Notice("Unable to create new file."); + } +} +function getWeeklyNote(date, settings) { + const { vault } = window.app; + const startOfWeek = date.clone().weekday(0); + const { format, folder } = getWeeklyNoteSettings(settings); + const baseFilename = startOfWeek.format(format); + const fullPath = getNotePath$1(folder, baseFilename); + return vault.getAbstractFileByPath(fullPath); +} +/** + * Create a Weekly Note for a given date. + */ +async function tryToCreateWeeklyNote(date, inNewSplit, settings, cb) { + const { workspace } = window.app; + const { format } = getWeeklyNoteSettings(settings); + const filename = date.format(format); + const createFile = async () => { + const dailyNote = await createWeeklyNote(date, settings); + const leaf = inNewSplit + ? workspace.splitActiveLeaf() + : workspace.getUnpinnedLeaf(); + await leaf.openFile(dailyNote); + cb === null || cb === void 0 ? void 0 : cb(); + }; + if (settings.shouldConfirmBeforeCreate) { + createConfirmationDialog({ + cta: "Create", + onAccept: createFile, + text: `File ${filename} does not exist. Would you like to create it?`, + title: "New Daily Note", + }); + } + else { + await createFile(); + } +} + +const NUM_MAX_DOTS = 5; +function clamp(num, lowerBound, upperBound) { + return Math.min(Math.max(lowerBound, num), upperBound); +} +function getWordCount(text) { + const wordChars = /(?:[',.0-9;A-Z_a-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0589\u05D0-\u05EA\u05EF-\u05F2\u060C\u060D\u0620-\u064A\u0660-\u0669\u066C\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07F8\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2018\u2019\u2024\u203F\u2040\u2044\u2054\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BA\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7B9\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE10\uFE14\uFE33\uFE34\uFE4D-\uFE50\uFE52\uFE54\uFE70-\uFE74\uFE76-\uFEFC\uFF07\uFF0C\uFF0E\uFF10-\uFF19\uFF1B\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFF1]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|[\u00AD\u2010\u2011]|\u002D(?!\u002D))+/g; + return (text.match(wordChars) || []).length; +} +async function getNumberOfDots(note, settings) { + if (!note || settings.wordsPerDot <= 0) { + return 0; + } + const fileContents = await window.app.vault.cachedRead(note); + const numDots = getWordCount(fileContents) / settings.wordsPerDot; + return clamp(Math.floor(numDots), 1, NUM_MAX_DOTS); +} +function getNoteTags(note) { + var _a; + if (!note) { + return []; + } + const { metadataCache } = window.app; + const frontmatter = (_a = metadataCache.getFileCache(note)) === null || _a === void 0 ? void 0 : _a.frontmatter; + const tags = []; + if (frontmatter) { + const frontmatterTags = obsidian.parseFrontMatterTags(frontmatter) || []; + tags.push(...frontmatterTags); + } + return tags.map((tag) => tag.substring(1)); +} +async function getNumberOfRemainingTasks(note) { + if (!note) { + return 0; + } + const { vault } = window.app; + const fileContents = await vault.cachedRead(note); + return (fileContents.match(/(-|\*) \[ \]/g) || []).length; +} +function isMacOS() { + return os.platform() === "darwin"; +} +function isMetaPressed(e) { + return isMacOS() ? e.metaKey : e.ctrlKey; +} +function getDaysOfWeek(_settings) { + return window.moment.weekdaysShort(true); +} +function isWeekend(date) { + return date.isoWeekday() === 6 || date.isoWeekday() === 7; +} +function getStartOfWeek(days, _weekNum) { + return days[0].date.weekday(0); +} +/** + * Generate a 2D array of daily information to power + * the calendar view. + */ +function getMonthData(activeFile, displayedMonth, settings) { + const month = []; + let week; + let dailyNotes = []; + try { + dailyNotes = getAllDailyNotes_1(); + console.log("dailynotes", dailyNotes); + } + catch (err) { + new obsidian.Notice(err); + } + const startOfMonth = displayedMonth.clone().date(1); + const startOffset = startOfMonth.weekday(); + let date = startOfMonth.clone().subtract(startOffset, "days"); + for (let _day = 0; _day < 42; _day++) { + if (_day % 7 === 0) { + week = { + days: [], + weekNum: date.week(), + weeklyNote: getWeeklyNote(date, settings), + }; + month.push(week); + } + const note = getDailyNote_1(date, dailyNotes); + week.days.push({ + date, + note, + isActive: activeFile && activeFile === (note === null || note === void 0 ? void 0 : note.basename), + numDots: getNumberOfDots(note, settings), + numTasksRemaining: getNumberOfRemainingTasks(note), + tags: getNoteTags(note), + }); + date = date.clone().add(1, "days"); + } + return month; +} + +/* src/ui/Day.svelte generated by Svelte v3.31.0 */ + +function add_css() { + var style = element("style"); + style.id = "svelte-xik4h1-style"; + style.textContent = ".day.svelte-xik4h1.svelte-xik4h1{background-color:var(--color-background-day);border-radius:4px;color:var(--color-text-day);cursor:pointer;font-size:0.8em;height:100%;padding:4px;position:relative;text-align:center;transition:background-color 0.1s ease-in, color 0.1s ease-in;vertical-align:baseline}.day.svelte-xik4h1.svelte-xik4h1:hover{background-color:var(--interactive-hover)}.day.active.svelte-xik4h1.svelte-xik4h1:hover{background-color:var(--interactive-accent-hover)}.adjacent-month.svelte-xik4h1.svelte-xik4h1{opacity:0.25}.today.svelte-xik4h1.svelte-xik4h1{color:var(--color-text-today)}.active.svelte-xik4h1.svelte-xik4h1,.active.today.svelte-xik4h1.svelte-xik4h1{color:var(--text-on-accent);background-color:var(--interactive-accent)}.dot-container.svelte-xik4h1.svelte-xik4h1{display:flex;flex-wrap:wrap;justify-content:center;line-height:6px;min-height:6px}.dot.svelte-xik4h1.svelte-xik4h1,.task.svelte-xik4h1.svelte-xik4h1{display:inline-block;fill:var(--color-dot);height:6px;width:6px;margin:0 1px}.active.svelte-xik4h1 .dot.svelte-xik4h1{fill:var(--text-on-accent)}.task.svelte-xik4h1.svelte-xik4h1{fill:none;stroke:var(--color-dot)}.active.svelte-xik4h1 .task.svelte-xik4h1{stroke:var(--text-on-accent)}"; + append(document.head, style); +} + +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[15] = list[i]; + return child_ctx; +} + +// (1:0)