From d1d2667156db9cb05ac226a5ce7364c6f57b498c Mon Sep 17 00:00:00 2001 From: VectorKappa Date: Tue, 3 Oct 2023 08:17:00 +0200 Subject: [PATCH] vault backup: 2023-10-03 08:17:00 --- .obsidian/plugins/dataview/main.js | 5450 ++++++++++++++++- .obsidian/plugins/dataview/styles.css | 2 +- .../plugins/obsidian-admonition/data.json | 2 +- .obsidian/plugins/obsidian-admonition/main.js | 46 +- .../plugins/obsidian-admonition/manifest.json | 2 +- .../plugins/obsidian-admonition/styles.css | 2 +- .../obsidian-excalidraw-plugin/data.json | 5 +- .../obsidian-excalidraw-plugin/main.js | 72 +- .../obsidian-excalidraw-plugin/manifest.json | 2 +- .../obsidian-excalidraw-plugin/styles.css | 89 +- .../plugins/obsidian-icon-folder/data.json | 2 +- .../plugins/obsidian-icon-folder/main.js | 916 ++- .../obsidian-icon-folder/manifest.json | 20 +- .../plugins/obsidian-icon-folder/styles.css | 2 +- .obsidian/plugins/obsidian-linter/main.js | 435 +- .../plugins/obsidian-linter/manifest.json | 2 +- .obsidian/plugins/obsidian-linter/styles.css | 72 + .obsidian/plugins/obsidian-outliner/main.js | 39 +- .../plugins/obsidian-outliner/manifest.json | 2 +- .obsidian/plugins/obsidian-plantuml/main.js | 2299 ++++++- .../plugins/obsidian-plantuml/manifest.json | 4 +- .../plugins/obsidian-style-settings/main.js | 4118 ++++++------- .../obsidian-style-settings/manifest.json | 20 +- .obsidian/plugins/quick-latex/main.js | 18 +- .obsidian/plugins/quick-latex/manifest.json | 2 +- .obsidian/workspace.json | 8 +- AMiAL/CS/Ćwiczenia/1 SEM/0..md | 4 +- 27 files changed, 11001 insertions(+), 2634 deletions(-) diff --git a/.obsidian/plugins/dataview/main.js b/.obsidian/plugins/dataview/main.js index 3446133..11a47fc 100644 --- a/.obsidian/plugins/dataview/main.js +++ b/.obsidian/plugins/dataview/main.js @@ -14654,4 +14654,5452 @@ async function executeTask(query, origin, index, settings) { core, tasks: extractTaskGroupings(core.idMeaning, core.data.map(r => r.data)), }; - \ No newline at end of file + }); +} +/** Execute a single field inline a file, returning the evaluated result. */ +function executeInline(field, origin, index, settings) { + var _a, _b; + return new Context(defaultLinkHandler(index, origin), settings, { + this: (_b = (_a = index.pages.get(origin)) === null || _a === void 0 ? void 0 : _a.serialize(index)) !== null && _b !== void 0 ? _b : {}, + }).evaluate(field); +} +/** The default link resolver used when creating contexts. */ +function defaultLinkHandler(index, origin) { + return { + resolve: link => { + let realFile = index.metadataCache.getFirstLinkpathDest(link, origin); + if (!realFile) + return null; + let realPage = index.pages.get(realFile.path); + if (!realPage) + return null; + return realPage.serialize(index); + }, + normalize: link => { + var _a; + let realFile = index.metadataCache.getFirstLinkpathDest(link, origin); + return (_a = realFile === null || realFile === void 0 ? void 0 : realFile.path) !== null && _a !== void 0 ? _a : link; + }, + exists: link => { + let realFile = index.metadataCache.getFirstLinkpathDest(link, origin); + return !!realFile; + }, + }; +} +/** Execute a calendar-based query, returning the final results. */ +async function executeCalendar(query, index, origin, settings) { + var _a, _b; + // Start by collecting all of the files that match the 'from' queries. + let fileset = await resolveSource(query.source, index, origin); + if (!fileset.successful) + return Result.failure(fileset.error); + // Extract information about the origin page to add to the root context. + let rootContext = new Context(defaultLinkHandler(index, origin), settings, { + this: (_b = (_a = index.pages.get(origin)) === null || _a === void 0 ? void 0 : _a.serialize(index)) !== null && _b !== void 0 ? _b : {}, + }); + let targetField = query.header.field.field; + let fields = { + target: targetField, + link: Fields.indexVariable("file.link"), + }; + return executeCoreExtract(fileset.value, rootContext, query.operations, fields).map(core => { + let data = core.data.map(p => iden({ + date: p.data["target"], + link: p.data["link"], + })); + return { core, data }; + }); +} + +function compareVersions(v1, v2) { + // validate input and split into segments + const n1 = validateAndParse(v1); + const n2 = validateAndParse(v2); + + // pop off the patch + const p1 = n1.pop(); + const p2 = n2.pop(); + + // validate numbers + const r = compareSegments(n1, n2); + if (r !== 0) return r; + + // validate pre-release + if (p1 && p2) { + return compareSegments(p1.split('.'), p2.split('.')); + } else if (p1 || p2) { + return p1 ? -1 : 1; + } + + return 0; +} + +const validate = (v) => + typeof v === 'string' && /^[v\d]/.test(v) && semver.test(v); + +const compare = (v1, v2, operator) => { + // validate input operator + assertValidOperator(operator); + + // since result of compareVersions can only be -1 or 0 or 1 + // a simple map can be used to replace switch + const res = compareVersions(v1, v2); + + return operatorResMap[operator].includes(res); +}; + +const satisfies = (v, r) => { + // if no range operator then "=" + const m = r.match(/^([<>=~^]+)/); + const op = m ? m[1] : '='; + + // if gt/lt/eq then operator compare + if (op !== '^' && op !== '~') return compare(v, r, op); + + // else range of either "~" or "^" is assumed + const [v1, v2, v3] = validateAndParse(v); + const [r1, r2, r3] = validateAndParse(r); + if (compareStrings(v1, r1) !== 0) return false; + if (op === '^') { + return compareSegments([v2, v3], [r2, r3]) >= 0; + } + if (compareStrings(v2, r2) !== 0) return false; + return compareStrings(v3, r3) >= 0; +}; + +// export CJS style for parity +compareVersions.validate = validate; +compareVersions.compare = compare; +compareVersions.satisfies = satisfies; + +const semver = + /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i; + +const validateAndParse = (v) => { + if (typeof v !== 'string') { + throw new TypeError('Invalid argument expected string'); + } + const match = v.match(semver); + if (!match) { + throw new Error(`Invalid argument not valid semver ('${v}' received)`); + } + match.shift(); + return match; +}; + +const isWildcard = (s) => s === '*' || s === 'x' || s === 'X'; + +const tryParse = (v) => { + const n = parseInt(v, 10); + return isNaN(n) ? v : n; +}; + +const forceType = (a, b) => + typeof a !== typeof b ? [String(a), String(b)] : [a, b]; + +const compareStrings = (a, b) => { + if (isWildcard(a) || isWildcard(b)) return 0; + const [ap, bp] = forceType(tryParse(a), tryParse(b)); + if (ap > bp) return 1; + if (ap < bp) return -1; + return 0; +}; + +const compareSegments = (a, b) => { + for (let i = 0; i < Math.max(a.length, b.length); i++) { + const r = compareStrings(a[i] || 0, b[i] || 0); + if (r !== 0) return r; + } + return 0; +}; + +const operatorResMap = { + '>': [1], + '>=': [0, 1], + '=': [0], + '<=': [-1, 0], + '<': [-1], +}; + +const allowedOperators = Object.keys(operatorResMap); + +const assertValidOperator = (op) => { + if (typeof op !== 'string') { + throw new TypeError( + `Invalid operator type, expected string but got ${typeof op}` + ); + } + if (allowedOperators.indexOf(op) === -1) { + throw new Error( + `Invalid operator, expected one of ${allowedOperators.join('|')}` + ); + } +}; + +var n,l$1,u$1,i$1,o$1,r$1,f$1,e$1,c$1={},s$1=[],a$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,h$1=Array.isArray;function v$1(n,l){for(var u in l)n[u]=l[u];return n}function p$1(n){var l=n.parentNode;l&&l.removeChild(n);}function y$1(l,u,t){var i,o,r,f={};for(r in u)"key"==r?i=u[r]:"ref"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),"function"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return d$1(l,f,i,o,null)}function d$1(n,t,i,o,r){var f={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u$1:r};return null==r&&null!=l$1.vnode&&l$1.vnode(f),f}function _$1(){return {current:null}}function k$2(n){return n.children}function b$1(n,l){this.props=n,this.context=l;}function g$2(n,l){if(null==l)return n.__?g$2(n.__,n.__.__k.indexOf(n)+1):null;for(var u;ll&&i$1.sort(f$1));x$2.__r=0;}function P$1(n,l,u,t,i,o,r,f,e,a,v){var p,y,_,b,m,w,x,P,C,H=0,I=t&&t.__k||s$1,T=I.length,j=T,z=l.length;for(u.__k=[],p=0;p0?d$1(b.type,b.props,b.key,b.ref?b.ref:null,b.__v):b)?(b.__=u,b.__b=u.__b+1,-1===(P=A$2(b,I,x=p+H,j))?_=c$1:(_=I[P]||c$1,I[P]=void 0,j--),L$1(n,b,_,i,o,r,f,e,a,v),m=b.__e,(y=b.ref)&&_.ref!=y&&(_.ref&&O$1(_.ref,null,b),v.push(y,b.__c||m,b)),null!=m&&(null==w&&(w=m),(C=_===c$1||null===_.__v)?-1==P&&H--:P!==x&&(P===x+1?H++:P>x?j>z-x?H+=P-x:H--:H=P(null!=e?1:0))for(;r>=0||f=0){if((e=l[r])&&i==e.key&&o===e.type)return r;r--;}if(f2&&(e.children=arguments.length>3?n.call(arguments,2):t),d$1(l.type,e,i||l.key,o||l.ref,null)}function G$1(n,l){var u={__c:l="__cC"+e$1++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,t;return this.getChildContext||(u=[],(t={})[l]=this,this.getChildContext=function(){return t},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(function(n){n.__e=!0,w$2(n);});},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n);};}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=s$1.slice,l$1={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l;}throw n}},u$1=0,b$1.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=v$1({},this.state),"function"==typeof n&&(n=n(v$1({},u),this.props)),n&&v$1(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),w$2(this));},b$1.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),w$2(this));},b$1.prototype.render=k$2,i$1=[],r$1="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,f$1=function(n,l){return n.__v.__b-l.__v.__b},x$2.__r=0,e$1=0; + +var t,r,u,i,o=0,f=[],c=[],e=l$1.__b,a=l$1.__r,v=l$1.diffed,l=l$1.__c,m=l$1.unmount;function d(t,u){l$1.__h&&l$1.__h(r,t,o||u),o=0;var i=r.__H||(r.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({__V:c}),i.__[t]}function h(n){return o=1,s(B$1,n)}function s(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):B$1(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}));}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return !0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return !n.__N}))return !c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0);}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u;}e&&e.call(this,n,t,r);},r.shouldComponentUpdate=f;}return o.__N||o.__}function p(u,i){var o=d(t++,3);!l$1.__s&&z$1(o.__H,i)&&(o.__=u,o.i=i,r.__H.__h.push(o));}function y(u,i){var o=d(t++,4);!l$1.__s&&z$1(o.__H,i)&&(o.__=u,o.i=i,r.__h.push(o));}function _(n){return o=5,F$1(function(){return {current:n}},[])}function A$1(n,t,r){o=6,y(function(){return "function"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n));}function F$1(n,r){var u=d(t++,7);return z$1(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function T$1(n,t){return o=8,F$1(function(){return n},t)}function q$1(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function x$1(t,r){l$1.useDebugValue&&l$1.useDebugValue(r?r(t):t);}function V$1(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__="P"+i[0]+"-"+i[1]++;}return n.__}function b(){for(var t;t=f.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(k$1),t.__H.__h.forEach(w$1),t.__H.__h=[];}catch(r){t.__H.__h=[],l$1.__e(r,t.__v);}}l$1.__b=function(n){r=null,e&&e(n);},l$1.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c,n.__N=n.i=void 0;})):(i.__h.forEach(k$1),i.__h.forEach(w$1),i.__h=[],t=0)),u=r;},l$1.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==f.push(o)&&i===l$1.requestAnimationFrame||((i=l$1.requestAnimationFrame)||j$1)(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c&&(n.__=n.__V),n.i=void 0,n.__V=c;})),u=r=null;},l$1.__c=function(t,r){r.some(function(t){try{t.__h.forEach(k$1),t.__h=t.__h.filter(function(n){return !n.__||w$1(n)});}catch(u){r.some(function(n){n.__h&&(n.__h=[]);}),r=[],l$1.__e(u,t.__v);}}),l&&l(t,r);},l$1.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{k$1(n);}catch(n){r=n;}}),u.__H=void 0,r&&l$1.__e(r,u.__v));};var g$1="function"==typeof requestAnimationFrame;function j$1(n){var t,r=function(){clearTimeout(u),g$1&&cancelAnimationFrame(t),setTimeout(n);},u=setTimeout(r,100);g$1&&(t=requestAnimationFrame(r));}function k$1(n){var t=r,u=n.__c;"function"==typeof u&&(n.__c=void 0,u()),r=t;}function w$1(n){var t=r;n.__c=n.__(),r=t;}function z$1(n,t){return !n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function B$1(n,t){return "function"==typeof t?t(n):t} + +function g(n,t){for(var e in t)n[e]=t[e];return n}function C(n,t){for(var e in n)if("__source"!==e&&!(e in t))return !0;for(var r in t)if("__source"!==r&&n[r]!==t[r])return !0;return !1}function E(n,t){return n===t&&(0!==n||1/n==1/t)||n!=n&&t!=t}function w(n){this.props=n;}function x(n,e){function r(n){var t=this.props.ref,r=t==n.ref;return !r&&t&&(t.call?t(null):t.current=null),e?!e(this.props,n)||!r:C(this.props,n)}function u(e){return this.shouldComponentUpdate=r,y$1(n,e)}return u.displayName="Memo("+(n.displayName||n.name)+")",u.prototype.isReactComponent=!0,u.__f=!0,u}(w.prototype=new b$1).isPureReactComponent=!0,w.prototype.shouldComponentUpdate=function(n,t){return C(this.props,n)||C(this.state,t)};var R=l$1.__b;l$1.__b=function(n){n.type&&n.type.__f&&n.ref&&(n.props.ref=n.ref,n.ref=null),R&&R(n);};var N="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function k(n){function t(t){var e=g({},t);return delete e.ref,n(e,t.ref||null)}return t.$$typeof=N,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(n.displayName||n.name)+")",t}var A=function(n,t){return null==n?null:C$1(C$1(n).map(t))},O={map:A,forEach:A,count:function(n){return n?C$1(n).length:0},only:function(n){var t=C$1(n);if(1!==t.length)throw "Children.only";return t[0]},toArray:C$1},T=l$1.__e;l$1.__e=function(n,t,e,r){if(n.then)for(var u,o=t;o=o.__;)if((u=o.__c)&&u.__c)return null==t.__e&&(t.__e=e.__e,t.__k=e.__k),u.__c(n,t);T(n,t,e,r);};var F=l$1.unmount;function I(n,t,e){return n&&(n.__c&&n.__c.__H&&(n.__c.__H.__.forEach(function(n){"function"==typeof n.__c&&n.__c();}),n.__c.__H=null),null!=(n=g({},n)).__c&&(n.__c.__P===e&&(n.__c.__P=t),n.__c=null),n.__k=n.__k&&n.__k.map(function(n){return I(n,t,e)})),n}function L(n,t,e){return n&&(n.__v=null,n.__k=n.__k&&n.__k.map(function(n){return L(n,t,e)}),n.__c&&n.__c.__P===t&&(n.__e&&e.insertBefore(n.__e,n.__d),n.__c.__e=!0,n.__c.__P=e)),n}function U(){this.__u=0,this.t=null,this.__b=null;}function D(n){var t=n.__.__c;return t&&t.__a&&t.__a(n)}function M(n){var e,r,u;function o(o){if(e||(e=n()).then(function(n){r=n.default||n;},function(n){u=n;}),u)throw u;if(!r)throw e;return y$1(r,o)}return o.displayName="Lazy",o.__f=!0,o}function V(){this.u=null,this.o=null;}l$1.unmount=function(n){var t=n.__c;t&&t.__R&&t.__R(),t&&!0===n.__h&&(n.type=null),F&&F(n);},(U.prototype=new b$1).__c=function(n,t){var e=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(e);var u=D(r.__v),o=!1,i=function(){o||(o=!0,e.__R=null,u?u(l):l());};e.__R=i;var l=function(){if(!--r.__u){if(r.state.__a){var n=r.state.__a;r.__v.__k[0]=L(n,n.__c.__P,n.__c.__O);}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate();}},c=!0===t.__h;r.__u++||c||r.setState({__a:r.__b=r.__v.__k[0]}),n.then(i,i);},U.prototype.componentWillUnmount=function(){this.t=[];},U.prototype.render=function(n,e){if(this.__b){if(this.__v.__k){var r=document.createElement("div"),o=this.__v.__k[0].__c;this.__v.__k[0]=I(this.__b,r,o.__O=o.__P);}this.__b=null;}var i=e.__a&&y$1(k$2,null,n.fallback);return i&&(i.__h=null),[y$1(k$2,null,e.__a?null:n.children),i]};var W=function(n,t,e){if(++e[1]===e[0]&&n.o.delete(t),n.props.revealOrder&&("t"!==n.props.revealOrder[0]||!n.o.size))for(e=n.u;e;){for(;e.length>3;)e.pop()();if(e[1]>>1,1),e.i.removeChild(n);}}),D$1(y$1(P,{context:e.context},n.__v),e.l);}function z(n,e){var r=y$1(j,{__v:n,i:e});return r.containerInfo=e,r}(V.prototype=new b$1).__a=function(n){var t=this,e=D(t.__v),r=t.o.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),W(t,n,r)):u();};e?e(o):o();}},V.prototype.render=function(n){this.u=null,this.o=new Map;var t=C$1(n.children);n.revealOrder&&"b"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.o.set(t[e],this.u=[1,0,this.u]);return n.children},V.prototype.componentDidUpdate=V.prototype.componentDidMount=function(){var n=this;this.o.forEach(function(t,e){W(n,e,t);});};var B="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,H=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Z=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,Y=/[A-Z0-9]/g,$="undefined"!=typeof document,q=function(n){return ("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/:/fil|che|ra/).test(n)};function G(n,t,e){return null==t.__k&&(t.textContent=""),D$1(n,t),"function"==typeof e&&e(),n?n.__c:null}function J(n,t,e){return E$1(n,t),"function"==typeof e&&e(),n?n.__c:null}b$1.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(b$1.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n});}});});var K=l$1.event;function Q(){}function X(){return this.cancelBubble}function nn(){return this.defaultPrevented}l$1.event=function(n){return K&&(n=K(n)),n.persist=Q,n.isPropagationStopped=X,n.isDefaultPrevented=nn,n.nativeEvent=n};var tn,en={enumerable:!1,configurable:!0,get:function(){return this.class}},rn=l$1.vnode;l$1.vnode=function(n){"string"==typeof n.type&&function(n){var t=n.props,e=n.type,u={};for(var o in t){var i=t[o];if(!("value"===o&&"defaultValue"in t&&null==i||$&&"children"===o&&"noscript"===e||"class"===o||"className"===o)){var l=o.toLowerCase();"defaultValue"===o&&"value"in t&&null==t.value?o="value":"download"===o&&!0===i?i="":"ondoubleclick"===l?o="ondblclick":"onchange"!==l||"input"!==e&&"textarea"!==e||q(t.type)?"onfocus"===l?o="onfocusin":"onblur"===l?o="onfocusout":Z.test(o)?o=l:-1===e.indexOf("-")&&H.test(o)?o=o.replace(Y,"-$&").toLowerCase():null===i&&(i=void 0):l=o="oninput","oninput"===l&&u[o=l]&&(o="oninputCapture"),u[o]=i;}}"select"==e&&u.multiple&&Array.isArray(u.value)&&(u.value=C$1(t.children).forEach(function(n){n.props.selected=-1!=u.value.indexOf(n.props.value);})),"select"==e&&null!=u.defaultValue&&(u.value=C$1(t.children).forEach(function(n){n.props.selected=u.multiple?-1!=u.defaultValue.indexOf(n.props.value):u.defaultValue==n.props.value;})),t.class&&!t.className?(u.class=t.class,Object.defineProperty(u,"className",en)):(t.className&&!t.class||t.class&&t.className)&&(u.class=u.className=t.className),n.props=u;}(n),n.$$typeof=B,rn&&rn(n);};var un=l$1.__r;l$1.__r=function(n){un&&un(n),tn=n.__c;};var on=l$1.diffed;l$1.diffed=function(n){on&&on(n);var t=n.props,e=n.__e;null!=e&&"textarea"===n.type&&"value"in t&&t.value!==e.value&&(e.value=null==t.value?"":t.value),tn=null;};var ln={ReactCurrentDispatcher:{current:{readContext:function(n){return tn.__n[n.__c].props.value}}}};function fn(n){return y$1.bind(null,n)}function an(n){return !!n&&n.$$typeof===B}function sn(n){return an(n)&&n.type===k$2}function hn(n){return an(n)?F$2.apply(null,arguments):n}function vn(n){return !!n.__k&&(D$1(null,n),!0)}function dn(n){return n&&(n.base||1===n.nodeType&&n)||null}var pn=function(n,t){return n(t)},mn=function(n,t){return n(t)},yn=k$2;function _n(n){n();}function bn(n){return n}function Sn(){return [!1,_n]}var gn=y,Cn=an;function En(n,t){var e=t(),r=h({h:{__:e,v:t}}),u=r[0].h,o=r[1];return y(function(){u.__=e,u.v=t,E(u.__,t())||o({h:u});},[n,e,t]),p(function(){return E(u.__,u.v())||o({h:u}),n(function(){E(u.__,u.v())||o({h:u});})},[n]),e}var wn={useState:h,useId:V$1,useReducer:s,useEffect:p,useLayoutEffect:y,useInsertionEffect:gn,useTransition:Sn,useDeferredValue:bn,useSyncExternalStore:En,startTransition:_n,useRef:_,useImperativeHandle:A$1,useMemo:F$1,useCallback:T$1,useContext:q$1,useDebugValue:x$1,version:"17.0.2",Children:O,render:G,hydrate:J,unmountComponentAtNode:vn,createPortal:z,createElement:y$1,createContext:G$1,createFactory:fn,cloneElement:hn,createRef:_$1,Fragment:k$2,isValidElement:an,isElement:Cn,isFragment:sn,findDOMNode:dn,Component:b$1,PureComponent:w,memo:x,forwardRef:k,flushSync:mn,unstable_batchedUpdates:pn,StrictMode:yn,Suspense:U,SuspenseList:V,lazy:M,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:ln}; + +const IMAGE_EXTENSIONS = Object.freeze(new Set([ + ".tif", + ".tiff", + ".gif", + ".png", + ".apng", + ".avif", + ".jpg", + ".jpeg", + ".jfif", + ".pjepg", + ".pjp", + ".svg", + ".webp", + ".bmp", + ".ico", + ".cur", +])); +/** Determines if the given link points to an embedded image. */ +function isImageEmbed(link) { + if (!link.path.contains(".")) + return false; + let extension = link.path.substring(link.path.lastIndexOf(".")); + return link.type == "file" && link.embed && IMAGE_EXTENSIONS.has(extension); +} +/** Extract text of the form 'WxH' or 'W' from the display of a link. */ +function extractImageDimensions(link) { + if (!link.display) + return undefined; + let match = /^(\d+)x(\d+)$/iu.exec(link.display); + if (match) + return [parseInt(match[1]), parseInt(match[2])]; + let match2 = /^(\d+)/.exec(link.display); + if (match2) + return [parseInt(match2[1])]; + // No match. + return undefined; +} + +/** Provides core preact / rendering utilities for all view types. */ +const DataviewContext = G$1(undefined); +/** Hacky preact component which wraps Obsidian's markdown renderer into a neat component. */ +function RawMarkdown({ content, sourcePath, inline = true, style, cls, onClick, }) { + const container = _(null); + const component = q$1(DataviewContext).component; + p(() => { + if (!container.current) + return; + container.current.innerHTML = ""; + obsidian.MarkdownRenderer.renderMarkdown(content, container.current, sourcePath, component).then(() => { + if (!container.current || !inline) + return; + // Unwrap any created paragraph elements if we are inline. + let paragraph = container.current.querySelector("p"); + while (paragraph) { + let children = paragraph.childNodes; + paragraph.replaceWith(...Array.from(children)); + paragraph = container.current.querySelector("p"); + } + }); + }, [content, sourcePath, container.current]); + return y$1("span", { ref: container, style: style, class: cls, onClick: onClick }); +} +/** Hacky preact component which wraps Obsidian's markdown renderer into a neat component. */ +const Markdown = wn.memo(RawMarkdown); +/** Embeds an HTML element in the react DOM. */ +function RawEmbedHtml({ element }) { + const container = _(null); + p(() => { + if (!container.current) + return; + container.current.innerHTML = ""; + container.current.appendChild(element); + }, [container.current, element]); + return y$1("span", { ref: container }); +} +/** Embeds an HTML element in the react DOM. */ +const EmbedHtml = wn.memo(RawEmbedHtml); +/** Intelligently render an arbitrary literal value. */ +function RawLit({ value, sourcePath, inline = false, depth = 0, }) { + var _a, _b, _c; + const context = q$1(DataviewContext); + // Short-circuit if beyond the maximum render depth. + if (depth >= context.settings.maxRecursiveRenderDepth) + return y$1(k$2, null, "..."); + if (Values.isNull(value) || value === undefined) { + return y$1(Markdown, { content: context.settings.renderNullAs, sourcePath: sourcePath }); + } + else if (Values.isString(value)) { + return y$1(Markdown, { content: value, sourcePath: sourcePath }); + } + else if (Values.isNumber(value)) { + return y$1(k$2, null, "" + value); + } + else if (Values.isBoolean(value)) { + return y$1(k$2, null, "" + value); + } + else if (Values.isDate(value)) { + return y$1(k$2, null, renderMinimalDate(value, context.settings, currentLocale())); + } + else if (Values.isDuration(value)) { + return y$1(k$2, null, renderMinimalDuration(value)); + } + else if (Values.isLink(value)) { + // Special case handling of image/video/etc embeddings to bypass the Obsidian API not working. + if (isImageEmbed(value)) { + let realFile = context.app.metadataCache.getFirstLinkpathDest(value.path, sourcePath); + if (!realFile) + return y$1(Markdown, { content: value.markdown(), sourcePath: sourcePath }); + let dimensions = extractImageDimensions(value); + let resourcePath = context.app.vault.getResourcePath(realFile); + if (dimensions && dimensions.length == 2) + return y$1("img", { alt: value.path, src: resourcePath, width: dimensions[0], height: dimensions[1] }); + else if (dimensions && dimensions.length == 1) + return y$1("img", { alt: value.path, src: resourcePath, width: dimensions[0] }); + else + return y$1("img", { alt: value.path, src: resourcePath }); + } + return y$1(Markdown, { content: value.markdown(), sourcePath: sourcePath }); + } + else if (Values.isHtml(value)) { + return y$1(EmbedHtml, { element: value }); + } + else if (Values.isWidget(value)) { + if (Widgets.isListPair(value)) { + return (y$1(k$2, null, + y$1(Lit, { value: value.key, sourcePath: sourcePath }), + ":", + " ", + y$1(Lit, { value: value.value, sourcePath: sourcePath }))); + } + else if (Widgets.isExternalLink(value)) { + return (y$1("a", { href: value.url, rel: "noopener", target: "_blank", class: "external-link" }, (_a = value.display) !== null && _a !== void 0 ? _a : value.url)); + } + else { + return y$1("b", null, + ""); + } + } + else if (Values.isFunction(value)) { + return y$1(k$2, null, ""); + } + else if (Values.isArray(value) || DataArray.isDataArray(value)) { + if (!inline) { + return (y$1("ul", { class: "dataview dataview-ul dataview-result-list-ul" }, value.map(subvalue => (y$1("li", { class: "dataview-result-list-li" }, + y$1(Lit, { value: subvalue, sourcePath: sourcePath, inline: inline, depth: depth + 1 })))))); + } + else { + if (value.length == 0) + return y$1(k$2, null, ""); + return (y$1("span", { class: "dataview dataview-result-list-span" }, value.map((subvalue, index) => (y$1(k$2, null, + index == 0 ? "" : ", ", + y$1(Lit, { value: subvalue, sourcePath: sourcePath, inline: inline, depth: depth + 1 })))))); + } + } + else if (Values.isObject(value)) { + // Don't render classes in case they have recursive references; spoopy. + if (((_b = value === null || value === void 0 ? void 0 : value.constructor) === null || _b === void 0 ? void 0 : _b.name) && ((_c = value === null || value === void 0 ? void 0 : value.constructor) === null || _c === void 0 ? void 0 : _c.name) != "Object") { + return y$1(k$2, null, + "<", + value.constructor.name, + ">"); + } + if (!inline) { + return (y$1("ul", { class: "dataview dataview-ul dataview-result-object-ul" }, Object.entries(value).map(([key, value]) => (y$1("li", { class: "dataview dataview-li dataview-result-object-li" }, + key, + ": ", + y$1(Lit, { value: value, sourcePath: sourcePath, inline: inline, depth: depth + 1 })))))); + } + else { + if (Object.keys(value).length == 0) + return y$1(k$2, null, ""); + return (y$1("span", { class: "dataview dataview-result-object-span" }, Object.entries(value).map(([key, value], index) => (y$1(k$2, null, + index == 0 ? "" : ", ", + key, + ": ", + y$1(Lit, { value: value, sourcePath: sourcePath, inline: inline, depth: depth + 1 })))))); + } + } + return y$1(k$2, null, + ""); +} +/** Intelligently render an arbitrary literal value. */ +const Lit = wn.memo(RawLit); +/** Render a simple nice looking error box in a code style. */ +function ErrorPre(props, {}) { + return y$1("pre", { class: "dataview dataview-error" }, props.children); +} +/** Render a pretty centered error message in a box. */ +function ErrorMessage({ message }) { + return (y$1("div", { class: "dataview dataview-error-box" }, + y$1("p", { class: "dataview dataview-error-message" }, message))); +} +/** + * Complex convienence hook which calls `compute` every time the index updates, updating the current state. + */ +function useIndexBackedState(container, app, settings, index, initial, compute) { + let [initialized, setInitialized] = h(false); + let [state, updateState] = h(initial); + let [lastReload, setLastReload] = h(index.revision); + // Initial setup to queue fetching the correct state. + if (!initialized) { + setLastReload(index.revision); + setInitialized(true); + compute().then(updateState); + } + // Updated on every container re-create; automatically updates state. + p(() => { + const refreshOperation = () => { + if (lastReload != index.revision && container.isShown() && settings.refreshEnabled) { + compute().then(updateState); + setLastReload(index.revision); + } + }; + // Refresh after index changes stop. + let workEvent = app.workspace.on("dataview:refresh-views", refreshOperation); + // ...or when the DOM is shown (sidebar expands, tab selected, nodes scrolled into view). + let nodeEvent = container.onNodeInserted(refreshOperation); + return () => { + app.workspace.offref(workEvent); + nodeEvent(); + }; + }, [container, lastReload]); + return state; +} +/** A trivial wrapper which allows a react component to live for the duration of a `MarkdownRenderChild`. */ +class ReactRenderer extends obsidian.MarkdownRenderChild { + constructor(init, element) { + super(init.container); + this.init = init; + this.element = element; + } + onload() { + const context = Object.assign({}, { component: this }, this.init); + D$1(y$1(DataviewContext.Provider, { value: context }, this.element), this.containerEl); + } + onunload() { + vn(this.containerEl); + } +} + +/** Function used to test if a given event correspond to a pressed link */ +function wasLinkPressed(evt) { + return evt.target != null && evt.target != undefined && evt.target.tagName == "A"; +} +/** JSX component which renders a task element recursively. */ +function TaskItem({ item }) { + var _a; + let context = q$1(DataviewContext); + // Navigate to the given task on click. + const onClicked = (evt) => { + if (wasLinkPressed(evt)) { + return; + } + evt.stopPropagation(); + const selectionState = { + eState: { + cursor: { + from: { line: item.line, ch: item.position.start.col }, + to: { line: item.line + item.lineCount - 1, ch: item.position.end.col }, + }, + line: item.line, + }, + }; + // MacOS interprets the Command key as Meta. + context.app.workspace.openLinkText(item.link.toFile().obsidianLink(), item.path, evt.ctrlKey || (evt.metaKey && obsidian.Platform.isMacOS), selectionState); + }; + // Check/uncheck the task in the original file. + const onChecked = (evt) => { + evt.stopPropagation(); + const completed = evt.currentTarget.checked; + const status = completed ? "x" : " "; + // Update data-task on the parent element (css style) + const parent = evt.currentTarget.parentElement; + parent === null || parent === void 0 ? void 0 : parent.setAttribute("data-task", status); + let flatted = [item]; + if (context.settings.recursiveSubTaskCompletion) { + function flatter(iitem) { + flatted.push(iitem); + iitem.children.forEach(flatter); + } + item.children.forEach(flatter); + flatted = flatted.flat(Infinity); + } + async function effectFn() { + for (let i = 0; i < flatted.length; i++) { + const _item = flatted[i]; + let updatedText = _item.text; + if (context.settings.taskCompletionTracking) { + updatedText = setTaskCompletion(_item.text, context.settings.taskCompletionUseEmojiShorthand, context.settings.taskCompletionText, context.settings.taskCompletionDateFormat, completed); + } + await rewriteTask(context.app.vault, _item, status, updatedText); + } + context.app.workspace.trigger("dataview:refresh-views"); + } + effectFn(); + }; + const checked = item.status !== " "; + return (y$1("li", { class: "dataview task-list-item" + (checked ? " is-checked" : ""), onClick: onClicked, "data-task": item.status }, + y$1("input", { class: "dataview task-list-item-checkbox", type: "checkbox", checked: checked, onClick: onChecked }), + y$1(Markdown, { inline: true, content: (_a = item.visual) !== null && _a !== void 0 ? _a : item.text, sourcePath: item.path }), + item.children.length > 0 && y$1(TaskList, { items: item.children }))); +} +/** JSX component which renders a plain list item recursively. */ +function ListItem({ item }) { + var _a; + let context = q$1(DataviewContext); + // Navigate to the given task on click. + const onClicked = (evt) => { + if (wasLinkPressed(evt)) { + return; + } + evt.stopPropagation(); + const selectionState = { + eState: { + cursor: { + from: { line: item.line, ch: item.position.start.col }, + to: { line: item.line + item.lineCount - 1, ch: item.position.end.col }, + }, + line: item.line, + }, + }; + // MacOS interprets the Command key as Meta. + context.app.workspace.openLinkText(item.link.toFile().obsidianLink(), item.path, evt.ctrlKey || (evt.metaKey && obsidian.Platform.isMacOS), selectionState); + }; + return (y$1("li", { class: "dataview task-list-basic-item", onClick: onClicked }, + y$1(Markdown, { inline: true, content: (_a = item.visual) !== null && _a !== void 0 ? _a : item.text, sourcePath: item.path }), + item.children.length > 0 && y$1(TaskList, { items: item.children }))); +} +/** JSX component which renders a list of task items recursively. */ +function TaskList({ items }) { + const settings = q$1(DataviewContext).settings; + if (items.length == 0 && settings.warnOnEmptyResult) + return y$1(ErrorMessage, { message: "Dataview: No results to show for task query." }); + let [nest, _mask] = nestItems(items); + return (y$1("ul", { class: "contains-task-list" }, nest.map(item => item.task ? y$1(TaskItem, { key: listId(item), item: item }) : y$1(ListItem, { key: listId(item), item: item })))); +} +/** JSX component which returns the result count. */ +function ResultCount$1(props) { + const { settings } = q$1(DataviewContext); + return settings.showResultCount ? (y$1("span", { class: "dataview small-text" }, Groupings.count(props.item.rows))) : (y$1(k$2, null)); +} +/** JSX component which recursively renders grouped tasks. */ +function TaskGrouping({ items, sourcePath }) { + const isGrouping = items.length > 0 && Groupings.isGrouping(items); + return (y$1(k$2, null, + isGrouping && + items.map(item => (y$1(k$2, { key: item.key }, + y$1("h4", null, + y$1(Lit, { value: item.key, sourcePath: sourcePath }), + y$1(ResultCount$1, { item: item })), + y$1("div", { class: "dataview result-group" }, + y$1(TaskGrouping, { items: item.rows, sourcePath: sourcePath }))))), + !isGrouping && y$1(TaskList, { items: items }))); +} +/** + * Pure view over (potentially grouped) tasks and list items which allows for checking/unchecking tasks and manipulating + * the task view. + */ +function TaskView({ query, sourcePath }) { + let context = q$1(DataviewContext); + let items = useIndexBackedState(context.container, context.app, context.settings, context.index, { state: "loading" }, async () => { + let result = await asyncTryOrPropogate(() => executeTask(query, sourcePath, context.index, context.settings)); + if (!result.successful) + return { state: "error", error: result.error, sourcePath }; + else + return { state: "ready", items: result.value.tasks }; + }); + if (items.state == "loading") + return (y$1(k$2, null, + y$1(ErrorPre, null, "Loading"))); + else if (items.state == "error") + return (y$1(k$2, null, + y$1(ErrorPre, null, + "Dataview: ", + items.error))); + return (y$1("div", { class: "dataview dataview-container" }, + y$1(TaskGrouping, { items: items.items, sourcePath: sourcePath }))); +} +function createTaskView(init, query, sourcePath) { + return new ReactRenderer(init, y$1(TaskView, { query: query, sourcePath: sourcePath })); +} +function createFixedTaskView(init, items, sourcePath) { + return new ReactRenderer(init, y$1(TaskGrouping, { items: items, sourcePath: sourcePath })); +} +///////////////////////// +// Task De-Duplication // +///////////////////////// +function listId(item) { + return item.path + ":" + item.line; +} +function parentListId(item) { + return item.path + ":" + item.parent; +} +/** Compute a map of all task IDs -> tasks. */ +function enumerateChildren(item, output) { + if (!output.has(listId(item))) + output.set(listId(item), item); + for (let child of item.children) + enumerateChildren(child, output); + return output; +} +/** Replace basic tasks with tasks from a lookup map. Retains the original order of the list. */ +function replaceChildren(elements, lookup) { + return elements.map(element => { + element.children = replaceChildren(element.children, lookup); + const id = listId(element); + const map = lookup.get(id); + if (map) + return map; + else + return element; + }); +} +/** + * Removes tasks from a list if they are already present by being a child of another task. Fixes child pointers. + * Retains original order of input list. + */ +function nestItems(raw) { + let elements = new Map(); + let mask = new Set(); + for (let elem of raw) { + let id = listId(elem); + elements.set(id, elem); + mask.add(id); + } + // List all elements & their children in the lookup map. + for (let elem of raw) + enumerateChildren(elem, elements); + let roots = raw.filter(elem => elem.parent == undefined || elem.parent == null || !elements.has(parentListId(elem))); + return [replaceChildren(roots, elements), mask]; +} +/** + * Recursively removes tasks from each subgroup if they are already present by being a child of another task. + * Fixes child pointers. Retains original order of input list. + */ +function nestGroups(raw) { + if (Groupings.isGrouping(raw)) { + return raw.map(g => { + return { key: g.key, rows: nestGroups(g.rows) }; + }); + } + else { + return nestItems(raw)[0]; + } +} +/////////////////////// +// Task Manipulation // +/////////////////////// +/** Trim empty ending lines. */ +function trimEndingLines(text) { + let parts = text.split(/\r?\n/u); + let trim = parts.length - 1; + while (trim > 0 && parts[trim].trim() == "") + trim--; + return parts.join("\n"); +} +/** Set the task completion key on check. */ +function setTaskCompletion(originalText, useEmojiShorthand, completionKey, completionDateFormat, complete) { + const blockIdRegex = /\^[a-z0-9\-]+/i; + if (!complete && !useEmojiShorthand) + return trimEndingLines(setInlineField(originalText.trimEnd(), completionKey)).trimEnd(); + let parts = originalText.split(/\r?\n/u); + const matches = blockIdRegex.exec(parts[parts.length - 1]); + console.debug("matchreg", matches); + let processedPart = parts[parts.length - 1].split(blockIdRegex).join(""); // last part without block id + if (useEmojiShorthand) { + processedPart = setEmojiShorthandCompletionField(processedPart, complete ? DateTime.now().toFormat("yyyy-MM-dd") : ""); + } + else { + processedPart = setInlineField(processedPart, completionKey, DateTime.now().toFormat(completionDateFormat)); + } + processedPart = `${processedPart.trimEnd()}${(matches === null || matches === void 0 ? void 0 : matches.length) ? " " + matches[0].trim() : ""}`.trimEnd(); // add back block id + parts[parts.length - 1] = processedPart; + return parts.join("\n"); +} +/** Rewrite a task with the given completion status and new text. */ +async function rewriteTask(vault, task, desiredStatus, desiredText) { + if (desiredStatus == task.status && (desiredText == undefined || desiredText == task.text)) + return; + desiredStatus = desiredStatus == "" ? " " : desiredStatus; + let rawFiletext = await vault.adapter.read(task.path); + let hasRN = rawFiletext.contains("\r"); + let filetext = rawFiletext.split(/\r?\n/u); + if (filetext.length < task.line) + return; + let match = LIST_ITEM_REGEX.exec(filetext[task.line]); + if (!match || match[2].length == 0) + return; + let taskTextParts = task.text.split("\n"); + if (taskTextParts[0].trim() != match[3].trim()) + return; + // We have a positive match here at this point, so go ahead and do the rewrite of the status. + let initialSpacing = /^[\s>]*/u.exec(filetext[task.line])[0]; + if (desiredText) { + let desiredParts = desiredText.split("\n"); + let newTextLines = [`${initialSpacing}${task.symbol} [${desiredStatus}] ${desiredParts[0]}`].concat(desiredParts.slice(1).map(l => initialSpacing + "\t" + l)); + filetext.splice(task.line, task.lineCount, ...newTextLines); + } + else { + filetext[task.line] = `${initialSpacing}${task.symbol} [${desiredStatus}] ${taskTextParts[0].trim()}`; + } + let newText = filetext.join(hasRN ? "\r\n" : "\n"); + await vault.adapter.write(task.path, newText); +} + +function ListGrouping({ items, sourcePath }) { + return (y$1("ul", { class: "dataview list-view-ul" }, items.map(item => (y$1("li", null, + y$1(Lit, { value: item, sourcePath: sourcePath })))))); +} +/** Pure view over list elements. */ +function ListView({ query, sourcePath }) { + let context = q$1(DataviewContext); + let items = useIndexBackedState(context.container, context.app, context.settings, context.index, { state: "loading" }, async () => { + let result = await asyncTryOrPropogate(() => executeList(query, context.index, sourcePath, context.settings)); + if (!result.successful) + return { state: "error", error: result.error, sourcePath }; + return { state: "ready", items: result.value.data }; + }); + if (items.state == "loading") + return (y$1(k$2, null, + y$1(ErrorPre, null, "Loading..."))); + else if (items.state == "error") + return (y$1(k$2, null, + " ", + y$1(ErrorPre, null, + "Dataview: ", + items.error), + " ")); + if (items.items.length == 0 && context.settings.warnOnEmptyResult) + return y$1(ErrorMessage, { message: "Dataview: No results to show for list query." }); + return y$1(ListGrouping, { items: items.items, sourcePath: sourcePath }); +} +function createListView(init, query, sourcePath) { + return new ReactRenderer(init, y$1(ListView, { query: query, sourcePath: sourcePath })); +} +function createFixedListView(init, elements, sourcePath) { + return new ReactRenderer(init, y$1(ListGrouping, { items: elements, sourcePath: sourcePath })); +} + +/** JSX component which returns the result count. */ +function ResultCount(props) { + const { settings } = q$1(DataviewContext); + return settings.showResultCount ? y$1("span", { class: "dataview small-text" }, props.length) : y$1(k$2, null); +} +/** Simple table over headings and corresponding values. */ +function TableGrouping({ headings, values, sourcePath, }) { + let settings = q$1(DataviewContext).settings; + return (y$1(k$2, null, + y$1("table", { class: "dataview table-view-table" }, + y$1("thead", { class: "table-view-thead" }, + y$1("tr", { class: "table-view-tr-header" }, headings.map((heading, index) => (y$1("th", { class: "table-view-th" }, + y$1(Markdown, { sourcePath: sourcePath, content: heading }), + index == 0 && y$1(ResultCount, { length: values.length })))))), + y$1("tbody", { class: "table-view-tbody" }, values.map(row => (y$1("tr", null, row.map(element => (y$1("td", null, + y$1(Lit, { value: element, sourcePath: sourcePath }))))))))), + settings.warnOnEmptyResult && values.length == 0 && (y$1(ErrorMessage, { message: "Dataview: No results to show for table query." })))); +} +/** Pure view over list elements. */ +function TableView({ query, sourcePath }) { + let context = q$1(DataviewContext); + let items = useIndexBackedState(context.container, context.app, context.settings, context.index, { state: "loading" }, async () => { + let result = await asyncTryOrPropogate(() => executeTable(query, context.index, sourcePath, context.settings)); + if (!result.successful) + return { state: "error", error: result.error }; + return { state: "ready", headings: result.value.names, values: result.value.data }; + }); + if (items.state == "loading") + return (y$1(k$2, null, + y$1(ErrorPre, null, "Loading..."))); + else if (items.state == "error") + return (y$1(k$2, null, + " ", + y$1(ErrorPre, null, + "Dataview: ", + items.error), + " ")); + return y$1(TableGrouping, { headings: items.headings, values: items.values, sourcePath: sourcePath }); +} +function createTableView(init, query, sourcePath) { + return new ReactRenderer(init, y$1(TableView, { query: query, sourcePath: sourcePath })); +} +function createFixedTableView(init, headings, values, sourcePath) { + return new ReactRenderer(init, y$1(TableGrouping, { values: values, headings: headings, sourcePath: sourcePath })); +} + +/** Utility functions for quickly creating fields. */ +var QueryFields; +(function (QueryFields) { + function named(name, field) { + return { name, field }; + } + QueryFields.named = named; + function sortBy(field, dir) { + return { field, direction: dir }; + } + QueryFields.sortBy = sortBy; +})(QueryFields || (QueryFields = {})); + +/** Return a new parser which executes the underlying parser and returns it's raw string representation. */ +function captureRaw(base) { + return parsimmon_umd_minExports.custom((success, failure) => { + return (input, i) => { + let result = base._(input, i); + if (!result.status) + return result; + return Object.assign({}, result, { value: [result.value, input.substring(i, result.index)] }); + }; + }); +} +/** Strip newlines and excess whitespace out of text. */ +function stripNewlines(text) { + return text + .split(/[\r\n]+/) + .map(t => t.trim()) + .join(""); +} +/** Given `parser`, return the parser that returns `if_eof()` if EOF is found, + * otherwise `parser` preceded by (non-optional) whitespace */ +function precededByWhitespaceIfNotEof(if_eof, parser) { + return parsimmon_umd_minExports.eof.map(if_eof).or(parsimmon_umd_minExports.whitespace.then(parser)); +} +/** A parsimmon-powered parser-combinator implementation of the query language. */ +const QUERY_LANGUAGE = parsimmon_umd_minExports.createLanguage({ + // Simple atom parsing, like words, identifiers, numbers. + queryType: q => parsimmon_umd_minExports.alt(parsimmon_umd_minExports.regexp(/TABLE|LIST|TASK|CALENDAR/i)) + .map(str => str.toLowerCase()) + .desc("query type ('TABLE', 'LIST', 'TASK', or 'CALENDAR')"), + explicitNamedField: q => parsimmon_umd_minExports.seqMap(EXPRESSION.field.skip(parsimmon_umd_minExports.whitespace), parsimmon_umd_minExports.regexp(/AS/i).skip(parsimmon_umd_minExports.whitespace), EXPRESSION.identifier.or(EXPRESSION.string), (field, _as, ident) => QueryFields.named(ident, field)), + namedField: q => parsimmon_umd_minExports.alt(q.explicitNamedField, captureRaw(EXPRESSION.field).map(([value, text]) => QueryFields.named(stripNewlines(text), value))), + sortField: q => parsimmon_umd_minExports.seqMap(EXPRESSION.field.skip(parsimmon_umd_minExports.optWhitespace), parsimmon_umd_minExports.regexp(/ASCENDING|DESCENDING|ASC|DESC/i).atMost(1), (field, dir) => { + let direction = dir.length == 0 ? "ascending" : dir[0].toLowerCase(); + if (direction == "desc") + direction = "descending"; + if (direction == "asc") + direction = "ascending"; + return { + field: field, + direction: direction, + }; + }), + headerClause: q => q.queryType + .chain(type => { + switch (type) { + case "table": { + return precededByWhitespaceIfNotEof(() => ({ type, fields: [], showId: true }), parsimmon_umd_minExports.seqMap(parsimmon_umd_minExports.regexp(/WITHOUT\s+ID/i) + .skip(parsimmon_umd_minExports.optWhitespace) + .atMost(1), parsimmon_umd_minExports.sepBy(q.namedField, parsimmon_umd_minExports.string(",").trim(parsimmon_umd_minExports.optWhitespace)), (withoutId, fields) => { + return { type, fields, showId: withoutId.length == 0 }; + })); + } + case "list": + return precededByWhitespaceIfNotEof(() => ({ type, format: undefined, showId: true }), parsimmon_umd_minExports.seqMap(parsimmon_umd_minExports.regexp(/WITHOUT\s+ID/i) + .skip(parsimmon_umd_minExports.optWhitespace) + .atMost(1), EXPRESSION.field.atMost(1), (withoutId, format) => { + return { + type, + format: format.length == 1 ? format[0] : undefined, + showId: withoutId.length == 0, + }; + })); + case "task": + return parsimmon_umd_minExports.succeed({ type }); + case "calendar": + return parsimmon_umd_minExports.whitespace.then(parsimmon_umd_minExports.seqMap(q.namedField, field => { + return { + type, + showId: true, + field, + }; + })); + default: + return parsimmon_umd_minExports.fail(`Unrecognized query type '${type}'`); + } + }) + .desc("TABLE or LIST or TASK or CALENDAR"), + fromClause: q => parsimmon_umd_minExports.seqMap(parsimmon_umd_minExports.regexp(/FROM/i), parsimmon_umd_minExports.whitespace, EXPRESSION.source, (_1, _2, source) => source), + whereClause: q => parsimmon_umd_minExports.seqMap(parsimmon_umd_minExports.regexp(/WHERE/i), parsimmon_umd_minExports.whitespace, EXPRESSION.field, (where, _, field) => { + return { type: "where", clause: field }; + }).desc("WHERE "), + sortByClause: q => parsimmon_umd_minExports.seqMap(parsimmon_umd_minExports.regexp(/SORT/i), parsimmon_umd_minExports.whitespace, q.sortField.sepBy1(parsimmon_umd_minExports.string(",").trim(parsimmon_umd_minExports.optWhitespace)), (sort, _1, fields) => { + return { type: "sort", fields }; + }).desc("SORT field [ASC/DESC]"), + limitClause: q => parsimmon_umd_minExports.seqMap(parsimmon_umd_minExports.regexp(/LIMIT/i), parsimmon_umd_minExports.whitespace, EXPRESSION.field, (limit, _1, field) => { + return { type: "limit", amount: field }; + }).desc("LIMIT "), + flattenClause: q => parsimmon_umd_minExports.seqMap(parsimmon_umd_minExports.regexp(/FLATTEN/i).skip(parsimmon_umd_minExports.whitespace), q.namedField, (_, field) => { + return { type: "flatten", field }; + }).desc("FLATTEN [AS ]"), + groupByClause: q => parsimmon_umd_minExports.seqMap(parsimmon_umd_minExports.regexp(/GROUP BY/i).skip(parsimmon_umd_minExports.whitespace), q.namedField, (_, field) => { + return { type: "group", field }; + }).desc("GROUP BY [AS ]"), + // Full query parsing. + clause: q => parsimmon_umd_minExports.alt(q.fromClause, q.whereClause, q.sortByClause, q.limitClause, q.groupByClause, q.flattenClause), + query: q => parsimmon_umd_minExports.seqMap(q.headerClause.trim(parsimmon_umd_minExports.optWhitespace), q.fromClause.trim(parsimmon_umd_minExports.optWhitespace).atMost(1), q.clause.trim(parsimmon_umd_minExports.optWhitespace).many(), (header, from, clauses) => { + return { + header, + source: from.length == 0 ? Sources.folder("") : from[0], + operations: clauses, + settings: DEFAULT_QUERY_SETTINGS, + }; + }), +}); +/** + * Attempt to parse a query from the given query text, returning a string error + * if the parse failed. + */ +function parseQuery(text) { + try { + let query = QUERY_LANGUAGE.query.tryParse(text); + return Result.success(query); + } + catch (error) { + return Result.failure("" + error); + } +} + +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 not_equal(a, b) { + return a != a ? b == b : a !== b; +} +function is_empty(obj) { + return Object.keys(obj).length === 0; +} +function create_slot(definition, ctx, $$scope, fn) { + if (definition) { + const slot_ctx = get_slot_context(definition, ctx, $$scope, fn); + return definition[0](slot_ctx); + } +} +function get_slot_context(definition, ctx, $$scope, fn) { + return definition[1] && fn + ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) + : $$scope.ctx; +} +function get_slot_changes(definition, $$scope, dirty, fn) { + if (definition[2] && fn) { + const lets = definition[2](fn(dirty)); + if ($$scope.dirty === undefined) { + return lets; + } + if (typeof lets === 'object') { + const merged = []; + const len = Math.max($$scope.dirty.length, lets.length); + for (let i = 0; i < len; i += 1) { + merged[i] = $$scope.dirty[i] | lets[i]; + } + return merged; + } + return $$scope.dirty | lets; + } + return $$scope.dirty; +} +function update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) { + const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn); + if (slot_changes) { + const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn); + slot.p(slot_context, slot_changes); + } +} +function null_to_empty(value) { + return value == null ? '' : value; +} + +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 set_attributes(node, attributes) { + // @ts-ignore + const descriptors = Object.getOwnPropertyDescriptors(node.__proto__); + for (const key in attributes) { + if (attributes[key] == null) { + node.removeAttribute(key); + } + else if (key === 'style') { + node.style.cssText = attributes[key]; + } + else if (key === '__value') { + node.value = node[key] = attributes[key]; + } + else if (descriptors[key] && descriptors[key].set) { + node[key] = attributes[key]; + } + else { + attr(node, key, attributes[key]); + } + } +} +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; +} + +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, () => { + if (info.blocks[i] === block) { + 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 outro_and_destroy_block(block, lookup) { + transition_out(block, 1, 1, () => { + lookup.delete(block.key); + }); +} +function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) { + let o = old_blocks.length; + let n = list.length; + let i = o; + const old_indexes = {}; + while (i--) + old_indexes[old_blocks[i].key] = i; + const new_blocks = []; + const new_lookup = new Map(); + const deltas = new Map(); + i = n; + while (i--) { + const child_ctx = get_context(ctx, list, i); + const key = get_key(child_ctx); + let block = lookup.get(key); + if (!block) { + block = create_each_block(key, child_ctx); + block.c(); + } + else if (dynamic) { + block.p(child_ctx, dirty); + } + new_lookup.set(key, new_blocks[i] = block); + if (key in old_indexes) + deltas.set(key, Math.abs(i - old_indexes[key])); + } + const will_move = new Set(); + const did_move = new Set(); + function insert(block) { + transition_in(block, 1); + block.m(node, next); + lookup.set(block.key, block); + next = block.first; + n--; + } + while (o && n) { + const new_block = new_blocks[n - 1]; + const old_block = old_blocks[o - 1]; + const new_key = new_block.key; + const old_key = old_block.key; + if (new_block === old_block) { + // do nothing + next = new_block.first; + o--; + n--; + } + else if (!new_lookup.has(old_key)) { + // remove old block + destroy(old_block, lookup); + o--; + } + else if (!lookup.has(new_key) || will_move.has(new_key)) { + insert(new_block); + } + else if (did_move.has(old_key)) { + o--; + } + else if (deltas.get(new_key) > deltas.get(old_key)) { + did_move.add(new_key); + insert(new_block); + } + else { + will_move.add(old_key); + o--; + } + } + while (o--) { + const old_block = old_blocks[o]; + if (!new_lookup.has(old_block.key)) + destroy(old_block, lookup); + } + while (n) + insert(new_blocks[n - 1]); + return new_blocks; +} + +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, customElement) { + const { fragment, on_mount, on_destroy, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + // 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 $$ = component.$$ = { + fragment: null, + ctx: null, + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + on_disconnect: [], + 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, 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); + // `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, options.customElement); + 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; + } + } +} + +/** + * dateUID is a way of weekly identifying daily/weekly/monthly notes. + * They are prefixed with the granularity to avoid ambiguity. + */ +function getDateUID(date, granularity = "day") { + const ts = date.clone().startOf(granularity).format(); + return `${granularity}-${ts}`; +} +var getDateUID_1 = getDateUID; + +/* src/components/Dot.svelte generated by Svelte v3.35.0 */ + +function add_css$5() { + var style = element("style"); + style.id = "svelte-1widvzq-style"; + style.textContent = ".dot.svelte-1widvzq,.hollow.svelte-1widvzq{display:inline-block;height:6px;width:6px;margin:0 1px}.filled.svelte-1widvzq{fill:var(--color-dot)}.active.filled.svelte-1widvzq{fill:var(--text-on-accent)}.hollow.svelte-1widvzq{fill:none;stroke:var(--color-dot)}.active.hollow.svelte-1widvzq{fill:none;stroke:var(--text-on-accent)}"; + append(document.head, style); +} + +// (14:0) {:else} +function create_else_block$1(ctx) { + let svg; + let circle; + let svg_class_value; + + return { + c() { + svg = svg_element("svg"); + circle = svg_element("circle"); + attr(circle, "cx", "3"); + attr(circle, "cy", "3"); + attr(circle, "r", "2"); + attr(svg, "class", svg_class_value = "" + (null_to_empty(`hollow ${/*className*/ ctx[0]}`) + " svelte-1widvzq")); + attr(svg, "viewBox", "0 0 6 6"); + attr(svg, "xmlns", "http://www.w3.org/2000/svg"); + toggle_class(svg, "active", /*isActive*/ ctx[2]); + }, + m(target, anchor) { + insert(target, svg, anchor); + append(svg, circle); + }, + p(ctx, dirty) { + if (dirty & /*className*/ 1 && svg_class_value !== (svg_class_value = "" + (null_to_empty(`hollow ${/*className*/ ctx[0]}`) + " svelte-1widvzq"))) { + attr(svg, "class", svg_class_value); + } + + if (dirty & /*className, isActive*/ 5) { + toggle_class(svg, "active", /*isActive*/ ctx[2]); + } + }, + d(detaching) { + if (detaching) detach(svg); + } + }; +} + +// (6:0) {#if isFilled} +function create_if_block$2(ctx) { + let svg; + let circle; + let svg_class_value; + + return { + c() { + svg = svg_element("svg"); + circle = svg_element("circle"); + attr(circle, "cx", "3"); + attr(circle, "cy", "3"); + attr(circle, "r", "2"); + attr(svg, "class", svg_class_value = "" + (null_to_empty(`dot filled ${/*className*/ ctx[0]}`) + " svelte-1widvzq")); + attr(svg, "viewBox", "0 0 6 6"); + attr(svg, "xmlns", "http://www.w3.org/2000/svg"); + toggle_class(svg, "active", /*isActive*/ ctx[2]); + }, + m(target, anchor) { + insert(target, svg, anchor); + append(svg, circle); + }, + p(ctx, dirty) { + if (dirty & /*className*/ 1 && svg_class_value !== (svg_class_value = "" + (null_to_empty(`dot filled ${/*className*/ ctx[0]}`) + " svelte-1widvzq"))) { + attr(svg, "class", svg_class_value); + } + + if (dirty & /*className, isActive*/ 5) { + toggle_class(svg, "active", /*isActive*/ ctx[2]); + } + }, + d(detaching) { + if (detaching) detach(svg); + } + }; +} + +function create_fragment$6(ctx) { + let if_block_anchor; + + function select_block_type(ctx, dirty) { + if (/*isFilled*/ ctx[1]) return create_if_block$2; + return create_else_block$1; + } + + let current_block_type = select_block_type(ctx); + let if_block = current_block_type(ctx); + + return { + c() { + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + }, + p(ctx, [dirty]) { + if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } + }, + i: noop, + o: noop, + d(detaching) { + if_block.d(detaching); + if (detaching) detach(if_block_anchor); + } + }; +} + +function instance$6($$self, $$props, $$invalidate) { + let { className = "" } = $$props; + let { isFilled } = $$props; + let { isActive } = $$props; + + $$self.$$set = $$props => { + if ("className" in $$props) $$invalidate(0, className = $$props.className); + if ("isFilled" in $$props) $$invalidate(1, isFilled = $$props.isFilled); + if ("isActive" in $$props) $$invalidate(2, isActive = $$props.isActive); + }; + + return [className, isFilled, isActive]; +} + +class Dot extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-1widvzq-style")) add_css$5(); + init(this, options, instance$6, create_fragment$6, safe_not_equal, { className: 0, isFilled: 1, isActive: 2 }); + } +} + +/* src/components/MetadataResolver.svelte generated by Svelte v3.35.0 */ + +const get_default_slot_changes_1 = dirty => ({}); +const get_default_slot_context_1 = ctx => ({ metadata: null }); +const get_default_slot_changes = dirty => ({ metadata: dirty & /*metadata*/ 1 }); +const get_default_slot_context = ctx => ({ metadata: /*resolvedMeta*/ ctx[3] }); + +// (11:0) {:else} +function create_else_block(ctx) { + let current; + const default_slot_template = /*#slots*/ ctx[2].default; + const default_slot = create_slot(default_slot_template, ctx, /*$$scope*/ ctx[1], get_default_slot_context_1); + + return { + c() { + if (default_slot) default_slot.c(); + }, + m(target, anchor) { + if (default_slot) { + default_slot.m(target, anchor); + } + + current = true; + }, + p(ctx, dirty) { + if (default_slot) { + if (default_slot.p && dirty & /*$$scope*/ 2) { + update_slot(default_slot, default_slot_template, ctx, /*$$scope*/ ctx[1], dirty, get_default_slot_changes_1, get_default_slot_context_1); + } + } + }, + i(local) { + if (current) return; + transition_in(default_slot, local); + current = true; + }, + o(local) { + transition_out(default_slot, local); + current = false; + }, + d(detaching) { + if (default_slot) default_slot.d(detaching); + } + }; +} + +// (7:0) {#if metadata} +function create_if_block$1(ctx) { + let await_block_anchor; + let promise; + let current; + + let info = { + ctx, + current: null, + token: null, + hasCatch: false, + pending: create_pending_block, + then: create_then_block, + catch: create_catch_block, + value: 3, + blocks: [,,,] + }; + + handle_promise(promise = /*metadata*/ ctx[0], info); + + return { + c() { + await_block_anchor = empty(); + info.block.c(); + }, + m(target, anchor) { + insert(target, await_block_anchor, anchor); + info.block.m(target, info.anchor = anchor); + info.mount = () => await_block_anchor.parentNode; + info.anchor = await_block_anchor; + current = true; + }, + p(new_ctx, dirty) { + ctx = new_ctx; + info.ctx = ctx; + + if (dirty & /*metadata*/ 1 && promise !== (promise = /*metadata*/ ctx[0]) && handle_promise(promise, info)) ; else { + const child_ctx = ctx.slice(); + child_ctx[3] = info.resolved; + info.block.p(child_ctx, dirty); + } + }, + i(local) { + if (current) return; + transition_in(info.block); + current = true; + }, + o(local) { + for (let i = 0; i < 3; i += 1) { + const block = info.blocks[i]; + transition_out(block); + } + + current = false; + }, + d(detaching) { + if (detaching) detach(await_block_anchor); + info.block.d(detaching); + info.token = null; + info = null; + } + }; +} + +// (1:0) {#if metadata} +function create_catch_block(ctx) { + return { + c: noop, + m: noop, + p: noop, + i: noop, + o: noop, + d: noop + }; +} + +// (8:37) ; export let metadata; {#if metadata} +function create_pending_block(ctx) { + return { + c: noop, + m: noop, + p: noop, + i: noop, + o: noop, + d: noop + }; +} + +function create_fragment$5(ctx) { + let current_block_type_index; + let if_block; + let if_block_anchor; + let current; + const if_block_creators = [create_if_block$1, create_else_block]; + const if_blocks = []; + + function select_block_type(ctx, dirty) { + if (/*metadata*/ ctx[0]) return 0; + return 1; + } + + current_block_type_index = select_block_type(ctx); + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + + return { + c() { + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if_blocks[current_block_type_index].m(target, anchor); + insert(target, if_block_anchor, anchor); + current = true; + }, + p(ctx, [dirty]) { + let previous_block_index = current_block_type_index; + current_block_type_index = select_block_type(ctx); + + if (current_block_type_index === previous_block_index) { + if_blocks[current_block_type_index].p(ctx, dirty); + } else { + group_outros(); + + transition_out(if_blocks[previous_block_index], 1, 1, () => { + if_blocks[previous_block_index] = null; + }); + + check_outros(); + if_block = if_blocks[current_block_type_index]; + + if (!if_block) { + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + if_block.c(); + } else { + if_block.p(ctx, dirty); + } + + transition_in(if_block, 1); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + }, + i(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o(local) { + transition_out(if_block); + current = false; + }, + d(detaching) { + if_blocks[current_block_type_index].d(detaching); + if (detaching) detach(if_block_anchor); + } + }; +} + +function instance$5($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + + let { metadata } = $$props; + + $$self.$$set = $$props => { + if ("metadata" in $$props) $$invalidate(0, metadata = $$props.metadata); + if ("$$scope" in $$props) $$invalidate(1, $$scope = $$props.$$scope); + }; + + return [metadata, $$scope, slots]; +} + +class MetadataResolver extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$5, create_fragment$5, not_equal, { metadata: 0 }); + } +} + +function isMacOS() { + return navigator.appVersion.indexOf("Mac") !== -1; +} +function isMetaPressed(e) { + return isMacOS() ? e.metaKey : e.ctrlKey; +} +function getDaysOfWeek(..._args) { + return window.moment.weekdaysShort(true); +} +function isWeekend(date) { + return date.isoWeekday() === 6 || date.isoWeekday() === 7; +} +function getStartOfWeek(days) { + return days[0].weekday(0); +} +/** + * Generate a 2D array of daily information to power + * the calendar view. + */ +function getMonth(displayedMonth, ..._args) { + const locale = window.moment().locale(); + const month = []; + let week; + const startOfMonth = displayedMonth.clone().locale(locale).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(), + }; + month.push(week); + } + week.days.push(date); + date = date.clone().add(1, "days"); + } + return month; +} + +/* src/components/Day.svelte generated by Svelte v3.35.0 */ + +function add_css$4() { + var style = element("style"); + style.id = "svelte-q3wqg9-style"; + style.textContent = ".day.svelte-q3wqg9{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-q3wqg9:hover{background-color:var(--interactive-hover)}.day.active.svelte-q3wqg9:hover{background-color:var(--interactive-accent-hover)}.adjacent-month.svelte-q3wqg9{opacity:0.25}.today.svelte-q3wqg9{color:var(--color-text-today)}.day.svelte-q3wqg9:active,.active.svelte-q3wqg9,.active.today.svelte-q3wqg9{color:var(--text-on-accent);background-color:var(--interactive-accent)}.dot-container.svelte-q3wqg9{display:flex;flex-wrap:wrap;justify-content:center;line-height:6px;min-height:6px}"; + append(document.head, style); +} + +function get_each_context$2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[11] = list[i]; + return child_ctx; +} + +// (36:8) {#each metadata.dots as dot} +function create_each_block$2(ctx) { + let dot; + let current; + const dot_spread_levels = [/*dot*/ ctx[11]]; + let dot_props = {}; + + for (let i = 0; i < dot_spread_levels.length; i += 1) { + dot_props = assign(dot_props, dot_spread_levels[i]); + } + + dot = new Dot({ props: dot_props }); + + return { + c() { + create_component(dot.$$.fragment); + }, + m(target, anchor) { + mount_component(dot, target, anchor); + current = true; + }, + p(ctx, dirty) { + const dot_changes = (dirty & /*metadata*/ 128) + ? get_spread_update(dot_spread_levels, [get_spread_object(/*dot*/ ctx[11])]) + : {}; + + dot.$set(dot_changes); + }, + i(local) { + if (current) return; + transition_in(dot.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(dot.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(dot, detaching); + } + }; +} + +// (22:2) +function create_default_slot$1(ctx) { + let div1; + let t0_value = /*date*/ ctx[0].format("D") + ""; + let t0; + let t1; + let div0; + let div1_class_value; + let current; + let mounted; + let dispose; + let each_value = /*metadata*/ ctx[7].dots; + let each_blocks = []; + + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i)); + } + + const out = i => transition_out(each_blocks[i], 1, 1, () => { + each_blocks[i] = null; + }); + + let div1_levels = [ + { + class: div1_class_value = `day ${/*metadata*/ ctx[7].classes.join(" ")}` + }, + /*metadata*/ ctx[7].dataAttributes || {} + ]; + + let div1_data = {}; + + for (let i = 0; i < div1_levels.length; i += 1) { + div1_data = assign(div1_data, div1_levels[i]); + } + + return { + c() { + div1 = element("div"); + t0 = text(t0_value); + t1 = space(); + div0 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(div0, "class", "dot-container svelte-q3wqg9"); + set_attributes(div1, div1_data); + toggle_class(div1, "active", /*selectedId*/ ctx[6] === getDateUID_1(/*date*/ ctx[0], "day")); + toggle_class(div1, "adjacent-month", !/*date*/ ctx[0].isSame(/*displayedMonth*/ ctx[5], "month")); + toggle_class(div1, "today", /*date*/ ctx[0].isSame(/*today*/ ctx[4], "day")); + toggle_class(div1, "svelte-q3wqg9", true); + }, + m(target, anchor) { + insert(target, div1, anchor); + append(div1, t0); + append(div1, t1); + append(div1, div0); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div0, null); + } + + current = true; + + if (!mounted) { + dispose = [ + listen(div1, "click", function () { + if (is_function(/*onClick*/ ctx[2] && /*click_handler*/ ctx[8])) (/*onClick*/ ctx[2] && /*click_handler*/ ctx[8]).apply(this, arguments); + }), + listen(div1, "contextmenu", function () { + if (is_function(/*onContextMenu*/ ctx[3] && /*contextmenu_handler*/ ctx[9])) (/*onContextMenu*/ ctx[3] && /*contextmenu_handler*/ ctx[9]).apply(this, arguments); + }), + listen(div1, "pointerover", function () { + if (is_function(/*onHover*/ ctx[1] && /*pointerover_handler*/ ctx[10])) (/*onHover*/ ctx[1] && /*pointerover_handler*/ ctx[10]).apply(this, arguments); + }) + ]; + + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if ((!current || dirty & /*date*/ 1) && t0_value !== (t0_value = /*date*/ ctx[0].format("D") + "")) set_data(t0, t0_value); + + if (dirty & /*metadata*/ 128) { + each_value = /*metadata*/ ctx[7].dots; + let i; + + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$2(ctx, 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$2(child_ctx); + each_blocks[i].c(); + transition_in(each_blocks[i], 1); + each_blocks[i].m(div0, null); + } + } + + group_outros(); + + for (i = each_value.length; i < each_blocks.length; i += 1) { + out(i); + } + + check_outros(); + } + + set_attributes(div1, div1_data = get_spread_update(div1_levels, [ + (!current || dirty & /*metadata*/ 128 && div1_class_value !== (div1_class_value = `day ${/*metadata*/ ctx[7].classes.join(" ")}`)) && { class: div1_class_value }, + dirty & /*metadata*/ 128 && (/*metadata*/ ctx[7].dataAttributes || {}) + ])); + + toggle_class(div1, "active", /*selectedId*/ ctx[6] === getDateUID_1(/*date*/ ctx[0], "day")); + toggle_class(div1, "adjacent-month", !/*date*/ ctx[0].isSame(/*displayedMonth*/ ctx[5], "month")); + toggle_class(div1, "today", /*date*/ ctx[0].isSame(/*today*/ ctx[4], "day")); + toggle_class(div1, "svelte-q3wqg9", true); + }, + 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(div1); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} + +function create_fragment$4(ctx) { + let td; + let metadataresolver; + let current; + + metadataresolver = new MetadataResolver({ + props: { + metadata: /*metadata*/ ctx[7], + $$slots: { + default: [ + create_default_slot$1, + ({ metadata }) => ({ 7: metadata }), + ({ metadata }) => metadata ? 128 : 0 + ] + }, + $$scope: { ctx } + } + }); + + return { + c() { + td = element("td"); + create_component(metadataresolver.$$.fragment); + }, + m(target, anchor) { + insert(target, td, anchor); + mount_component(metadataresolver, td, null); + current = true; + }, + p(ctx, [dirty]) { + const metadataresolver_changes = {}; + if (dirty & /*metadata*/ 128) metadataresolver_changes.metadata = /*metadata*/ ctx[7]; + + if (dirty & /*$$scope, metadata, selectedId, date, displayedMonth, today, onClick, onContextMenu, onHover*/ 16639) { + metadataresolver_changes.$$scope = { dirty, ctx }; + } + + metadataresolver.$set(metadataresolver_changes); + }, + i(local) { + if (current) return; + transition_in(metadataresolver.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(metadataresolver.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(td); + destroy_component(metadataresolver); + } + }; +} + +function instance$4($$self, $$props, $$invalidate) { + + + let { date } = $$props; + let { metadata } = $$props; + let { onHover } = $$props; + let { onClick } = $$props; + let { onContextMenu } = $$props; + let { today } = $$props; + let { displayedMonth = null } = $$props; + let { selectedId = null } = $$props; + const click_handler = e => onClick(date, isMetaPressed(e)); + const contextmenu_handler = e => onContextMenu(date, e); + const pointerover_handler = e => onHover(date, e.target, isMetaPressed(e)); + + $$self.$$set = $$props => { + if ("date" in $$props) $$invalidate(0, date = $$props.date); + if ("metadata" in $$props) $$invalidate(7, metadata = $$props.metadata); + if ("onHover" in $$props) $$invalidate(1, onHover = $$props.onHover); + if ("onClick" in $$props) $$invalidate(2, onClick = $$props.onClick); + if ("onContextMenu" in $$props) $$invalidate(3, onContextMenu = $$props.onContextMenu); + if ("today" in $$props) $$invalidate(4, today = $$props.today); + if ("displayedMonth" in $$props) $$invalidate(5, displayedMonth = $$props.displayedMonth); + if ("selectedId" in $$props) $$invalidate(6, selectedId = $$props.selectedId); + }; + + return [ + date, + onHover, + onClick, + onContextMenu, + today, + displayedMonth, + selectedId, + metadata, + click_handler, + contextmenu_handler, + pointerover_handler + ]; +} + +class Day extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-q3wqg9-style")) add_css$4(); + + init(this, options, instance$4, create_fragment$4, not_equal, { + date: 0, + metadata: 7, + onHover: 1, + onClick: 2, + onContextMenu: 3, + today: 4, + displayedMonth: 5, + selectedId: 6 + }); + } +} + +/* src/components/Arrow.svelte generated by Svelte v3.35.0 */ + +function add_css$3() { + var style = element("style"); + style.id = "svelte-156w7na-style"; + style.textContent = ".arrow.svelte-156w7na.svelte-156w7na{align-items:center;cursor:pointer;display:flex;justify-content:center;width:24px}.arrow.is-mobile.svelte-156w7na.svelte-156w7na{width:32px}.right.svelte-156w7na.svelte-156w7na{transform:rotate(180deg)}.arrow.svelte-156w7na svg.svelte-156w7na{color:var(--color-arrow);height:16px;width:16px}"; + append(document.head, style); +} + +function create_fragment$3(ctx) { + let div; + let svg; + let path; + let mounted; + let dispose; + + return { + c() { + div = element("div"); + svg = svg_element("svg"); + path = svg_element("path"); + attr(path, "fill", "currentColor"); + attr(path, "d", "M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z"); + attr(svg, "focusable", "false"); + attr(svg, "role", "img"); + attr(svg, "xmlns", "http://www.w3.org/2000/svg"); + attr(svg, "viewBox", "0 0 320 512"); + attr(svg, "class", "svelte-156w7na"); + attr(div, "class", "arrow svelte-156w7na"); + attr(div, "aria-label", /*tooltip*/ ctx[1]); + toggle_class(div, "is-mobile", /*isMobile*/ ctx[3]); + toggle_class(div, "right", /*direction*/ ctx[2] === "right"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, svg); + append(svg, path); + + if (!mounted) { + dispose = listen(div, "click", function () { + if (is_function(/*onClick*/ ctx[0])) /*onClick*/ ctx[0].apply(this, arguments); + }); + + mounted = true; + } + }, + p(new_ctx, [dirty]) { + ctx = new_ctx; + + if (dirty & /*tooltip*/ 2) { + attr(div, "aria-label", /*tooltip*/ ctx[1]); + } + + if (dirty & /*direction*/ 4) { + toggle_class(div, "right", /*direction*/ ctx[2] === "right"); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(div); + mounted = false; + dispose(); + } + }; +} + +function instance$3($$self, $$props, $$invalidate) { + let { onClick } = $$props; + let { tooltip } = $$props; + let { direction } = $$props; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let isMobile = window.app.isMobile; + + $$self.$$set = $$props => { + if ("onClick" in $$props) $$invalidate(0, onClick = $$props.onClick); + if ("tooltip" in $$props) $$invalidate(1, tooltip = $$props.tooltip); + if ("direction" in $$props) $$invalidate(2, direction = $$props.direction); + }; + + return [onClick, tooltip, direction, isMobile]; +} + +class Arrow extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-156w7na-style")) add_css$3(); + init(this, options, instance$3, create_fragment$3, safe_not_equal, { onClick: 0, tooltip: 1, direction: 2 }); + } +} + +/* src/components/Nav.svelte generated by Svelte v3.35.0 */ + +function add_css$2() { + var style = element("style"); + style.id = "svelte-1vwr9dd-style"; + style.textContent = ".nav.svelte-1vwr9dd.svelte-1vwr9dd{align-items:center;display:flex;margin:0.6em 0 1em;padding:0 8px;width:100%}.nav.is-mobile.svelte-1vwr9dd.svelte-1vwr9dd{padding:0}.title.svelte-1vwr9dd.svelte-1vwr9dd{color:var(--color-text-title);font-size:1.5em;margin:0}.is-mobile.svelte-1vwr9dd .title.svelte-1vwr9dd{font-size:1.3em}.month.svelte-1vwr9dd.svelte-1vwr9dd{font-weight:500;text-transform:capitalize}.year.svelte-1vwr9dd.svelte-1vwr9dd{color:var(--interactive-accent)}.right-nav.svelte-1vwr9dd.svelte-1vwr9dd{display:flex;justify-content:center;margin-left:auto}.reset-button.svelte-1vwr9dd.svelte-1vwr9dd{cursor:pointer;border-radius:4px;color:var(--text-muted);font-size:0.7em;font-weight:600;letter-spacing:1px;margin:0 4px;padding:0px 4px;text-transform:uppercase}.is-mobile.svelte-1vwr9dd .reset-button.svelte-1vwr9dd{display:none}"; + append(document.head, style); +} + +function create_fragment$2(ctx) { + let div2; + let h3; + let span0; + let t0_value = /*displayedMonth*/ ctx[0].format("MMM") + ""; + let t0; + let t1; + let span1; + let t2_value = /*displayedMonth*/ ctx[0].format("YYYY") + ""; + let t2; + let t3; + let div1; + let arrow0; + let t4; + let div0; + let t6; + let arrow1; + let current; + let mounted; + let dispose; + + arrow0 = new Arrow({ + props: { + direction: "left", + onClick: /*decrementDisplayedMonth*/ ctx[3], + tooltip: "Previous Month" + } + }); + + arrow1 = new Arrow({ + props: { + direction: "right", + onClick: /*incrementDisplayedMonth*/ ctx[2], + tooltip: "Next Month" + } + }); + + return { + c() { + div2 = element("div"); + h3 = element("h3"); + span0 = element("span"); + t0 = text(t0_value); + t1 = space(); + span1 = element("span"); + t2 = text(t2_value); + t3 = space(); + div1 = element("div"); + create_component(arrow0.$$.fragment); + t4 = space(); + div0 = element("div"); + div0.textContent = `${/*todayDisplayStr*/ ctx[4]}`; + t6 = space(); + create_component(arrow1.$$.fragment); + attr(span0, "class", "month svelte-1vwr9dd"); + attr(span1, "class", "year svelte-1vwr9dd"); + attr(h3, "class", "title svelte-1vwr9dd"); + attr(div0, "class", "reset-button svelte-1vwr9dd"); + attr(div1, "class", "right-nav svelte-1vwr9dd"); + attr(div2, "class", "nav svelte-1vwr9dd"); + toggle_class(div2, "is-mobile", /*isMobile*/ ctx[5]); + }, + m(target, anchor) { + insert(target, div2, anchor); + append(div2, h3); + append(h3, span0); + append(span0, t0); + append(h3, t1); + append(h3, span1); + append(span1, t2); + append(div2, t3); + append(div2, div1); + mount_component(arrow0, div1, null); + append(div1, t4); + append(div1, div0); + append(div1, t6); + mount_component(arrow1, div1, null); + current = true; + + if (!mounted) { + dispose = [ + listen(h3, "click", function () { + if (is_function(/*resetDisplayedMonth*/ ctx[1])) /*resetDisplayedMonth*/ ctx[1].apply(this, arguments); + }), + listen(div0, "click", function () { + if (is_function(/*resetDisplayedMonth*/ ctx[1])) /*resetDisplayedMonth*/ ctx[1].apply(this, arguments); + }) + ]; + + mounted = true; + } + }, + p(new_ctx, [dirty]) { + ctx = new_ctx; + if ((!current || dirty & /*displayedMonth*/ 1) && t0_value !== (t0_value = /*displayedMonth*/ ctx[0].format("MMM") + "")) set_data(t0, t0_value); + if ((!current || dirty & /*displayedMonth*/ 1) && t2_value !== (t2_value = /*displayedMonth*/ ctx[0].format("YYYY") + "")) set_data(t2, t2_value); + const arrow0_changes = {}; + if (dirty & /*decrementDisplayedMonth*/ 8) arrow0_changes.onClick = /*decrementDisplayedMonth*/ ctx[3]; + arrow0.$set(arrow0_changes); + const arrow1_changes = {}; + if (dirty & /*incrementDisplayedMonth*/ 4) arrow1_changes.onClick = /*incrementDisplayedMonth*/ ctx[2]; + arrow1.$set(arrow1_changes); + }, + i(local) { + if (current) return; + transition_in(arrow0.$$.fragment, local); + transition_in(arrow1.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(arrow0.$$.fragment, local); + transition_out(arrow1.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(div2); + destroy_component(arrow0); + destroy_component(arrow1); + mounted = false; + run_all(dispose); + } + }; +} + +function instance$2($$self, $$props, $$invalidate) { + + let { displayedMonth } = $$props; + let { today } = $$props; + let { resetDisplayedMonth } = $$props; + let { incrementDisplayedMonth } = $$props; + let { decrementDisplayedMonth } = $$props; + + // Get the word 'Today' but localized to the current language + const todayDisplayStr = today.calendar().split(/\d|\s/)[0]; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let isMobile = window.app.isMobile; + + $$self.$$set = $$props => { + if ("displayedMonth" in $$props) $$invalidate(0, displayedMonth = $$props.displayedMonth); + if ("today" in $$props) $$invalidate(6, today = $$props.today); + if ("resetDisplayedMonth" in $$props) $$invalidate(1, resetDisplayedMonth = $$props.resetDisplayedMonth); + if ("incrementDisplayedMonth" in $$props) $$invalidate(2, incrementDisplayedMonth = $$props.incrementDisplayedMonth); + if ("decrementDisplayedMonth" in $$props) $$invalidate(3, decrementDisplayedMonth = $$props.decrementDisplayedMonth); + }; + + return [ + displayedMonth, + resetDisplayedMonth, + incrementDisplayedMonth, + decrementDisplayedMonth, + todayDisplayStr, + isMobile, + today + ]; +} + +class Nav extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-1vwr9dd-style")) add_css$2(); + + init(this, options, instance$2, create_fragment$2, safe_not_equal, { + displayedMonth: 0, + today: 6, + resetDisplayedMonth: 1, + incrementDisplayedMonth: 2, + decrementDisplayedMonth: 3 + }); + } +} + +/* src/components/WeekNum.svelte generated by Svelte v3.35.0 */ + +function add_css$1() { + var style = element("style"); + style.id = "svelte-egt0yd-style"; + style.textContent = "td.svelte-egt0yd{border-right:1px solid var(--background-modifier-border)}.week-num.svelte-egt0yd{background-color:var(--color-background-weeknum);border-radius:4px;color:var(--color-text-weeknum);cursor:pointer;font-size:0.65em;height:100%;padding:4px;text-align:center;transition:background-color 0.1s ease-in, color 0.1s ease-in;vertical-align:baseline}.week-num.svelte-egt0yd:hover{background-color:var(--interactive-hover)}.week-num.active.svelte-egt0yd:hover{background-color:var(--interactive-accent-hover)}.active.svelte-egt0yd{color:var(--text-on-accent);background-color:var(--interactive-accent)}.dot-container.svelte-egt0yd{display:flex;flex-wrap:wrap;justify-content:center;line-height:6px;min-height:6px}"; + append(document.head, style); +} + +function get_each_context$1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[11] = list[i]; + return child_ctx; +} + +// (35:8) {#each metadata.dots as dot} +function create_each_block$1(ctx) { + let dot; + let current; + const dot_spread_levels = [/*dot*/ ctx[11]]; + let dot_props = {}; + + for (let i = 0; i < dot_spread_levels.length; i += 1) { + dot_props = assign(dot_props, dot_spread_levels[i]); + } + + dot = new Dot({ props: dot_props }); + + return { + c() { + create_component(dot.$$.fragment); + }, + m(target, anchor) { + mount_component(dot, target, anchor); + current = true; + }, + p(ctx, dirty) { + const dot_changes = (dirty & /*metadata*/ 64) + ? get_spread_update(dot_spread_levels, [get_spread_object(/*dot*/ ctx[11])]) + : {}; + + dot.$set(dot_changes); + }, + i(local) { + if (current) return; + transition_in(dot.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(dot.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(dot, detaching); + } + }; +} + +// (24:2) +function create_default_slot(ctx) { + let div1; + let t0; + let t1; + let div0; + let div1_class_value; + let current; + let mounted; + let dispose; + let each_value = /*metadata*/ ctx[6].dots; + let each_blocks = []; + + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); + } + + const out = i => transition_out(each_blocks[i], 1, 1, () => { + each_blocks[i] = null; + }); + + return { + c() { + div1 = element("div"); + t0 = text(/*weekNum*/ ctx[0]); + t1 = space(); + div0 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(div0, "class", "dot-container svelte-egt0yd"); + attr(div1, "class", div1_class_value = "" + (null_to_empty(`week-num ${/*metadata*/ ctx[6].classes.join(" ")}`) + " svelte-egt0yd")); + toggle_class(div1, "active", /*selectedId*/ ctx[5] === getDateUID_1(/*days*/ ctx[1][0], "week")); + }, + m(target, anchor) { + insert(target, div1, anchor); + append(div1, t0); + append(div1, t1); + append(div1, div0); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div0, null); + } + + current = true; + + if (!mounted) { + dispose = [ + listen(div1, "click", function () { + if (is_function(/*onClick*/ ctx[3] && /*click_handler*/ ctx[8])) (/*onClick*/ ctx[3] && /*click_handler*/ ctx[8]).apply(this, arguments); + }), + listen(div1, "contextmenu", function () { + if (is_function(/*onContextMenu*/ ctx[4] && /*contextmenu_handler*/ ctx[9])) (/*onContextMenu*/ ctx[4] && /*contextmenu_handler*/ ctx[9]).apply(this, arguments); + }), + listen(div1, "pointerover", function () { + if (is_function(/*onHover*/ ctx[2] && /*pointerover_handler*/ ctx[10])) (/*onHover*/ ctx[2] && /*pointerover_handler*/ ctx[10]).apply(this, arguments); + }) + ]; + + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (!current || dirty & /*weekNum*/ 1) set_data(t0, /*weekNum*/ ctx[0]); + + if (dirty & /*metadata*/ 64) { + each_value = /*metadata*/ ctx[6].dots; + let i; + + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$1(ctx, 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$1(child_ctx); + each_blocks[i].c(); + transition_in(each_blocks[i], 1); + each_blocks[i].m(div0, null); + } + } + + group_outros(); + + for (i = each_value.length; i < each_blocks.length; i += 1) { + out(i); + } + + check_outros(); + } + + if (!current || dirty & /*metadata*/ 64 && div1_class_value !== (div1_class_value = "" + (null_to_empty(`week-num ${/*metadata*/ ctx[6].classes.join(" ")}`) + " svelte-egt0yd"))) { + attr(div1, "class", div1_class_value); + } + + if (dirty & /*metadata, selectedId, getDateUID, days*/ 98) { + toggle_class(div1, "active", /*selectedId*/ ctx[5] === getDateUID_1(/*days*/ ctx[1][0], "week")); + } + }, + 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(div1); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} + +function create_fragment$1(ctx) { + let td; + let metadataresolver; + let current; + + metadataresolver = new MetadataResolver({ + props: { + metadata: /*metadata*/ ctx[6], + $$slots: { + default: [ + create_default_slot, + ({ metadata }) => ({ 6: metadata }), + ({ metadata }) => metadata ? 64 : 0 + ] + }, + $$scope: { ctx } + } + }); + + return { + c() { + td = element("td"); + create_component(metadataresolver.$$.fragment); + attr(td, "class", "svelte-egt0yd"); + }, + m(target, anchor) { + insert(target, td, anchor); + mount_component(metadataresolver, td, null); + current = true; + }, + p(ctx, [dirty]) { + const metadataresolver_changes = {}; + if (dirty & /*metadata*/ 64) metadataresolver_changes.metadata = /*metadata*/ ctx[6]; + + if (dirty & /*$$scope, metadata, selectedId, days, onClick, startOfWeek, onContextMenu, onHover, weekNum*/ 16639) { + metadataresolver_changes.$$scope = { dirty, ctx }; + } + + metadataresolver.$set(metadataresolver_changes); + }, + i(local) { + if (current) return; + transition_in(metadataresolver.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(metadataresolver.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(td); + destroy_component(metadataresolver); + } + }; +} + +function instance$1($$self, $$props, $$invalidate) { + + + let { weekNum } = $$props; + let { days } = $$props; + let { metadata } = $$props; + let { onHover } = $$props; + let { onClick } = $$props; + let { onContextMenu } = $$props; + let { selectedId = null } = $$props; + let startOfWeek; + const click_handler = e => onClick(startOfWeek, isMetaPressed(e)); + const contextmenu_handler = e => onContextMenu(days[0], e); + const pointerover_handler = e => onHover(startOfWeek, e.target, isMetaPressed(e)); + + $$self.$$set = $$props => { + if ("weekNum" in $$props) $$invalidate(0, weekNum = $$props.weekNum); + if ("days" in $$props) $$invalidate(1, days = $$props.days); + if ("metadata" in $$props) $$invalidate(6, metadata = $$props.metadata); + if ("onHover" in $$props) $$invalidate(2, onHover = $$props.onHover); + if ("onClick" in $$props) $$invalidate(3, onClick = $$props.onClick); + if ("onContextMenu" in $$props) $$invalidate(4, onContextMenu = $$props.onContextMenu); + if ("selectedId" in $$props) $$invalidate(5, selectedId = $$props.selectedId); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*days*/ 2) { + $$invalidate(7, startOfWeek = getStartOfWeek(days)); + } + }; + + return [ + weekNum, + days, + onHover, + onClick, + onContextMenu, + selectedId, + metadata, + startOfWeek, + click_handler, + contextmenu_handler, + pointerover_handler + ]; +} + +class WeekNum extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-egt0yd-style")) add_css$1(); + + init(this, options, instance$1, create_fragment$1, not_equal, { + weekNum: 0, + days: 1, + metadata: 6, + onHover: 2, + onClick: 3, + onContextMenu: 4, + selectedId: 5 + }); + } +} + +async function metadataReducer(promisedMetadata) { + const meta = { + dots: [], + classes: [], + dataAttributes: {}, + }; + const metas = await Promise.all(promisedMetadata); + return metas.reduce((acc, meta) => ({ + classes: [...acc.classes, ...(meta.classes || [])], + dataAttributes: Object.assign(acc.dataAttributes, meta.dataAttributes), + dots: [...acc.dots, ...(meta.dots || [])], + }), meta); +} +function getDailyMetadata(sources, date, ..._args) { + return metadataReducer(sources.map((source) => source.getDailyMetadata(date))); +} +function getWeeklyMetadata(sources, date, ..._args) { + return metadataReducer(sources.map((source) => source.getWeeklyMetadata(date))); +} + +/* src/components/Calendar.svelte generated by Svelte v3.35.0 */ + +function add_css() { + var style = element("style"); + style.id = "svelte-pcimu8-style"; + style.textContent = ".container.svelte-pcimu8{--color-background-heading:transparent;--color-background-day:transparent;--color-background-weeknum:transparent;--color-background-weekend:transparent;--color-dot:var(--text-muted);--color-arrow:var(--text-muted);--color-button:var(--text-muted);--color-text-title:var(--text-normal);--color-text-heading:var(--text-muted);--color-text-day:var(--text-normal);--color-text-today:var(--interactive-accent);--color-text-weeknum:var(--text-muted)}.container.svelte-pcimu8{padding:0 8px}.container.is-mobile.svelte-pcimu8{padding:0}th.svelte-pcimu8{text-align:center}.weekend.svelte-pcimu8{background-color:var(--color-background-weekend)}.calendar.svelte-pcimu8{border-collapse:collapse;width:100%}th.svelte-pcimu8{background-color:var(--color-background-heading);color:var(--color-text-heading);font-size:0.6em;letter-spacing:1px;padding:4px;text-transform:uppercase}"; + append(document.head, style); +} + +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[18] = list[i]; + return child_ctx; +} + +function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[21] = list[i]; + return child_ctx; +} + +function get_each_context_2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[24] = list[i]; + return child_ctx; +} + +function get_each_context_3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[27] = list[i]; + return child_ctx; +} + +// (55:6) {#if showWeekNums} +function create_if_block_2(ctx) { + let col; + + return { + c() { + col = element("col"); + }, + m(target, anchor) { + insert(target, col, anchor); + }, + d(detaching) { + if (detaching) detach(col); + } + }; +} + +// (58:6) {#each month[1].days as date} +function create_each_block_3(ctx) { + let col; + + return { + c() { + col = element("col"); + attr(col, "class", "svelte-pcimu8"); + toggle_class(col, "weekend", isWeekend(/*date*/ ctx[27])); + }, + m(target, anchor) { + insert(target, col, anchor); + }, + p(ctx, dirty) { + if (dirty & /*isWeekend, month*/ 16384) { + toggle_class(col, "weekend", isWeekend(/*date*/ ctx[27])); + } + }, + d(detaching) { + if (detaching) detach(col); + } + }; +} + +// (64:8) {#if showWeekNums} +function create_if_block_1(ctx) { + let th; + + return { + c() { + th = element("th"); + th.textContent = "W"; + attr(th, "class", "svelte-pcimu8"); + }, + m(target, anchor) { + insert(target, th, anchor); + }, + d(detaching) { + if (detaching) detach(th); + } + }; +} + +// (67:8) {#each daysOfWeek as dayOfWeek} +function create_each_block_2(ctx) { + let th; + let t_value = /*dayOfWeek*/ ctx[24] + ""; + let t; + + return { + c() { + th = element("th"); + t = text(t_value); + attr(th, "class", "svelte-pcimu8"); + }, + m(target, anchor) { + insert(target, th, anchor); + append(th, t); + }, + p(ctx, dirty) { + if (dirty & /*daysOfWeek*/ 32768 && t_value !== (t_value = /*dayOfWeek*/ ctx[24] + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(th); + } + }; +} + +// (75:10) {#if showWeekNums} +function create_if_block(ctx) { + let weeknum; + let current; + + const weeknum_spread_levels = [ + /*week*/ ctx[18], + { + metadata: getWeeklyMetadata(/*sources*/ ctx[8], /*week*/ ctx[18].days[0], /*today*/ ctx[10]) + }, + { onClick: /*onClickWeek*/ ctx[7] }, + { + onContextMenu: /*onContextMenuWeek*/ ctx[5] + }, + { onHover: /*onHoverWeek*/ ctx[3] }, + { selectedId: /*selectedId*/ ctx[9] } + ]; + + let weeknum_props = {}; + + for (let i = 0; i < weeknum_spread_levels.length; i += 1) { + weeknum_props = assign(weeknum_props, weeknum_spread_levels[i]); + } + + weeknum = new WeekNum({ props: weeknum_props }); + + return { + c() { + create_component(weeknum.$$.fragment); + }, + m(target, anchor) { + mount_component(weeknum, target, anchor); + current = true; + }, + p(ctx, dirty) { + const weeknum_changes = (dirty & /*month, getWeeklyMetadata, sources, today, onClickWeek, onContextMenuWeek, onHoverWeek, selectedId*/ 18344) + ? get_spread_update(weeknum_spread_levels, [ + dirty & /*month*/ 16384 && get_spread_object(/*week*/ ctx[18]), + dirty & /*getWeeklyMetadata, sources, month, today*/ 17664 && { + metadata: getWeeklyMetadata(/*sources*/ ctx[8], /*week*/ ctx[18].days[0], /*today*/ ctx[10]) + }, + dirty & /*onClickWeek*/ 128 && { onClick: /*onClickWeek*/ ctx[7] }, + dirty & /*onContextMenuWeek*/ 32 && { + onContextMenu: /*onContextMenuWeek*/ ctx[5] + }, + dirty & /*onHoverWeek*/ 8 && { onHover: /*onHoverWeek*/ ctx[3] }, + dirty & /*selectedId*/ 512 && { selectedId: /*selectedId*/ ctx[9] } + ]) + : {}; + + weeknum.$set(weeknum_changes); + }, + i(local) { + if (current) return; + transition_in(weeknum.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(weeknum.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(weeknum, detaching); + } + }; +} + +// (85:10) {#each week.days as day (day.format())} +function create_each_block_1(key_1, ctx) { + let first; + let day; + let current; + + day = new Day({ + props: { + date: /*day*/ ctx[21], + today: /*today*/ ctx[10], + displayedMonth: /*displayedMonth*/ ctx[0], + onClick: /*onClickDay*/ ctx[6], + onContextMenu: /*onContextMenuDay*/ ctx[4], + onHover: /*onHoverDay*/ ctx[2], + metadata: getDailyMetadata(/*sources*/ ctx[8], /*day*/ ctx[21], /*today*/ ctx[10]), + selectedId: /*selectedId*/ ctx[9] + } + }); + + return { + key: key_1, + first: null, + c() { + first = empty(); + create_component(day.$$.fragment); + this.first = first; + }, + m(target, anchor) { + insert(target, first, anchor); + mount_component(day, target, anchor); + current = true; + }, + p(new_ctx, dirty) { + ctx = new_ctx; + const day_changes = {}; + if (dirty & /*month*/ 16384) day_changes.date = /*day*/ ctx[21]; + if (dirty & /*today*/ 1024) day_changes.today = /*today*/ ctx[10]; + if (dirty & /*displayedMonth*/ 1) day_changes.displayedMonth = /*displayedMonth*/ ctx[0]; + if (dirty & /*onClickDay*/ 64) day_changes.onClick = /*onClickDay*/ ctx[6]; + if (dirty & /*onContextMenuDay*/ 16) day_changes.onContextMenu = /*onContextMenuDay*/ ctx[4]; + if (dirty & /*onHoverDay*/ 4) day_changes.onHover = /*onHoverDay*/ ctx[2]; + if (dirty & /*sources, month, today*/ 17664) day_changes.metadata = getDailyMetadata(/*sources*/ ctx[8], /*day*/ ctx[21], /*today*/ ctx[10]); + if (dirty & /*selectedId*/ 512) day_changes.selectedId = /*selectedId*/ ctx[9]; + day.$set(day_changes); + }, + i(local) { + if (current) return; + transition_in(day.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(day.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(first); + destroy_component(day, detaching); + } + }; +} + +// (73:6) {#each month as week (week.weekNum)} +function create_each_block(key_1, ctx) { + let tr; + let t0; + let each_blocks = []; + let each_1_lookup = new Map(); + let t1; + let current; + let if_block = /*showWeekNums*/ ctx[1] && create_if_block(ctx); + let each_value_1 = /*week*/ ctx[18].days; + const get_key = ctx => /*day*/ ctx[21].format(); + + for (let i = 0; i < each_value_1.length; i += 1) { + let child_ctx = get_each_context_1(ctx, each_value_1, i); + let key = get_key(child_ctx); + each_1_lookup.set(key, each_blocks[i] = create_each_block_1(key, child_ctx)); + } + + return { + key: key_1, + first: null, + c() { + tr = element("tr"); + if (if_block) if_block.c(); + t0 = space(); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + t1 = space(); + this.first = tr; + }, + m(target, anchor) { + insert(target, tr, anchor); + if (if_block) if_block.m(tr, null); + append(tr, t0); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(tr, null); + } + + append(tr, t1); + current = true; + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if (/*showWeekNums*/ ctx[1]) { + if (if_block) { + if_block.p(ctx, dirty); + + if (dirty & /*showWeekNums*/ 2) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block(ctx); + if_block.c(); + transition_in(if_block, 1); + if_block.m(tr, t0); + } + } else if (if_block) { + group_outros(); + + transition_out(if_block, 1, 1, () => { + if_block = null; + }); + + check_outros(); + } + + if (dirty & /*month, today, displayedMonth, onClickDay, onContextMenuDay, onHoverDay, getDailyMetadata, sources, selectedId*/ 18261) { + each_value_1 = /*week*/ ctx[18].days; + group_outros(); + each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value_1, each_1_lookup, tr, outro_and_destroy_block, create_each_block_1, t1, get_each_context_1); + check_outros(); + } + }, + i(local) { + if (current) return; + transition_in(if_block); + + for (let i = 0; i < each_value_1.length; i += 1) { + transition_in(each_blocks[i]); + } + + current = true; + }, + o(local) { + transition_out(if_block); + + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + + current = false; + }, + d(detaching) { + if (detaching) detach(tr); + if (if_block) if_block.d(); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + } + }; +} + +function create_fragment(ctx) { + let div; + let nav; + let t0; + let table; + let colgroup; + let t1; + let t2; + let thead; + let tr; + let t3; + let t4; + let tbody; + let each_blocks = []; + let each2_lookup = new Map(); + let current; + + nav = new Nav({ + props: { + today: /*today*/ ctx[10], + displayedMonth: /*displayedMonth*/ ctx[0], + incrementDisplayedMonth: /*incrementDisplayedMonth*/ ctx[11], + decrementDisplayedMonth: /*decrementDisplayedMonth*/ ctx[12], + resetDisplayedMonth: /*resetDisplayedMonth*/ ctx[13] + } + }); + + let if_block0 = /*showWeekNums*/ ctx[1] && create_if_block_2(); + let each_value_3 = /*month*/ ctx[14][1].days; + let each_blocks_2 = []; + + for (let i = 0; i < each_value_3.length; i += 1) { + each_blocks_2[i] = create_each_block_3(get_each_context_3(ctx, each_value_3, i)); + } + + let if_block1 = /*showWeekNums*/ ctx[1] && create_if_block_1(); + let each_value_2 = /*daysOfWeek*/ ctx[15]; + let each_blocks_1 = []; + + for (let i = 0; i < each_value_2.length; i += 1) { + each_blocks_1[i] = create_each_block_2(get_each_context_2(ctx, each_value_2, i)); + } + + let each_value = /*month*/ ctx[14]; + const get_key = ctx => /*week*/ ctx[18].weekNum; + + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context(ctx, each_value, i); + let key = get_key(child_ctx); + each2_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx)); + } + + return { + c() { + div = element("div"); + create_component(nav.$$.fragment); + t0 = space(); + table = element("table"); + colgroup = element("colgroup"); + if (if_block0) if_block0.c(); + t1 = space(); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].c(); + } + + t2 = space(); + thead = element("thead"); + tr = element("tr"); + if (if_block1) if_block1.c(); + t3 = space(); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } + + t4 = space(); + tbody = element("tbody"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(table, "class", "calendar svelte-pcimu8"); + attr(div, "id", "calendar-container"); + attr(div, "class", "container svelte-pcimu8"); + toggle_class(div, "is-mobile", /*isMobile*/ ctx[16]); + }, + m(target, anchor) { + insert(target, div, anchor); + mount_component(nav, div, null); + append(div, t0); + append(div, table); + append(table, colgroup); + if (if_block0) if_block0.m(colgroup, null); + append(colgroup, t1); + + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].m(colgroup, null); + } + + append(table, t2); + append(table, thead); + append(thead, tr); + if (if_block1) if_block1.m(tr, null); + append(tr, t3); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(tr, null); + } + + append(table, t4); + append(table, tbody); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(tbody, null); + } + + current = true; + }, + p(ctx, [dirty]) { + const nav_changes = {}; + if (dirty & /*today*/ 1024) nav_changes.today = /*today*/ ctx[10]; + if (dirty & /*displayedMonth*/ 1) nav_changes.displayedMonth = /*displayedMonth*/ ctx[0]; + nav.$set(nav_changes); + + if (/*showWeekNums*/ ctx[1]) { + if (if_block0) ; else { + if_block0 = create_if_block_2(); + if_block0.c(); + if_block0.m(colgroup, t1); + } + } else if (if_block0) { + if_block0.d(1); + if_block0 = null; + } + + if (dirty & /*isWeekend, month*/ 16384) { + each_value_3 = /*month*/ ctx[14][1].days; + let i; + + for (i = 0; i < each_value_3.length; i += 1) { + const child_ctx = get_each_context_3(ctx, each_value_3, i); + + if (each_blocks_2[i]) { + each_blocks_2[i].p(child_ctx, dirty); + } else { + each_blocks_2[i] = create_each_block_3(child_ctx); + each_blocks_2[i].c(); + each_blocks_2[i].m(colgroup, null); + } + } + + for (; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].d(1); + } + + each_blocks_2.length = each_value_3.length; + } + + if (/*showWeekNums*/ ctx[1]) { + if (if_block1) ; else { + if_block1 = create_if_block_1(); + if_block1.c(); + if_block1.m(tr, t3); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } + + if (dirty & /*daysOfWeek*/ 32768) { + each_value_2 = /*daysOfWeek*/ ctx[15]; + let i; + + for (i = 0; i < each_value_2.length; i += 1) { + const child_ctx = get_each_context_2(ctx, each_value_2, i); + + if (each_blocks_1[i]) { + each_blocks_1[i].p(child_ctx, dirty); + } else { + each_blocks_1[i] = create_each_block_2(child_ctx); + each_blocks_1[i].c(); + each_blocks_1[i].m(tr, null); + } + } + + for (; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(1); + } + + each_blocks_1.length = each_value_2.length; + } + + if (dirty & /*month, today, displayedMonth, onClickDay, onContextMenuDay, onHoverDay, getDailyMetadata, sources, selectedId, getWeeklyMetadata, onClickWeek, onContextMenuWeek, onHoverWeek, showWeekNums*/ 18431) { + each_value = /*month*/ ctx[14]; + group_outros(); + each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value, each2_lookup, tbody, outro_and_destroy_block, create_each_block, null, get_each_context); + check_outros(); + } + }, + i(local) { + if (current) return; + transition_in(nav.$$.fragment, local); + + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } + + current = true; + }, + o(local) { + transition_out(nav.$$.fragment, local); + + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + + current = false; + }, + d(detaching) { + if (detaching) detach(div); + destroy_component(nav); + if (if_block0) if_block0.d(); + destroy_each(each_blocks_2, detaching); + if (if_block1) if_block1.d(); + destroy_each(each_blocks_1, detaching); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + } + }; +} + +function instance($$self, $$props, $$invalidate) { + + + let { localeData } = $$props; + let { showWeekNums = false } = $$props; + let { onHoverDay } = $$props; + let { onHoverWeek } = $$props; + let { onContextMenuDay } = $$props; + let { onContextMenuWeek } = $$props; + let { onClickDay } = $$props; + let { onClickWeek } = $$props; + let { sources = [] } = $$props; + let { selectedId } = $$props; + let { today = window.moment() } = $$props; + let { displayedMonth = today } = $$props; + let month; + let daysOfWeek; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let isMobile = window.app.isMobile; + + function incrementDisplayedMonth() { + $$invalidate(0, displayedMonth = displayedMonth.clone().add(1, "month")); + } + + function decrementDisplayedMonth() { + $$invalidate(0, displayedMonth = displayedMonth.clone().subtract(1, "month")); + } + + function resetDisplayedMonth() { + $$invalidate(0, displayedMonth = today.clone()); + } + + $$self.$$set = $$props => { + if ("localeData" in $$props) $$invalidate(17, localeData = $$props.localeData); + if ("showWeekNums" in $$props) $$invalidate(1, showWeekNums = $$props.showWeekNums); + if ("onHoverDay" in $$props) $$invalidate(2, onHoverDay = $$props.onHoverDay); + if ("onHoverWeek" in $$props) $$invalidate(3, onHoverWeek = $$props.onHoverWeek); + if ("onContextMenuDay" in $$props) $$invalidate(4, onContextMenuDay = $$props.onContextMenuDay); + if ("onContextMenuWeek" in $$props) $$invalidate(5, onContextMenuWeek = $$props.onContextMenuWeek); + if ("onClickDay" in $$props) $$invalidate(6, onClickDay = $$props.onClickDay); + if ("onClickWeek" in $$props) $$invalidate(7, onClickWeek = $$props.onClickWeek); + if ("sources" in $$props) $$invalidate(8, sources = $$props.sources); + if ("selectedId" in $$props) $$invalidate(9, selectedId = $$props.selectedId); + if ("today" in $$props) $$invalidate(10, today = $$props.today); + if ("displayedMonth" in $$props) $$invalidate(0, displayedMonth = $$props.displayedMonth); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*displayedMonth, localeData*/ 131073) { + $$invalidate(14, month = getMonth(displayedMonth, localeData)); + } + + if ($$self.$$.dirty & /*today, localeData*/ 132096) { + $$invalidate(15, daysOfWeek = getDaysOfWeek(today, localeData)); + } + }; + + return [ + displayedMonth, + showWeekNums, + onHoverDay, + onHoverWeek, + onContextMenuDay, + onContextMenuWeek, + onClickDay, + onClickWeek, + sources, + selectedId, + today, + incrementDisplayedMonth, + decrementDisplayedMonth, + resetDisplayedMonth, + month, + daysOfWeek, + isMobile, + localeData + ]; +} + +class Calendar extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-pcimu8-style")) add_css(); + + init(this, options, instance, create_fragment, not_equal, { + localeData: 17, + showWeekNums: 1, + onHoverDay: 2, + onHoverWeek: 3, + onContextMenuDay: 4, + onContextMenuWeek: 5, + onClickDay: 6, + onClickWeek: 7, + sources: 8, + selectedId: 9, + today: 10, + displayedMonth: 0, + incrementDisplayedMonth: 11, + decrementDisplayedMonth: 12, + resetDisplayedMonth: 13 + }); + } + + get incrementDisplayedMonth() { + return this.$$.ctx[11]; + } + + get decrementDisplayedMonth() { + return this.$$.ctx[12]; + } + + get resetDisplayedMonth() { + return this.$$.ctx[13]; + } +} + +/** Generic code for embedded Dataviews. */ +class DataviewRefreshableRenderer extends obsidian.MarkdownRenderChild { + constructor(container, index, app, settings) { + super(container); + this.container = container; + this.index = index; + this.app = app; + this.settings = settings; + this.maybeRefresh = () => { + // If the index revision has changed recently, then queue a reload. + // But only if we're mounted in the DOM and auto-refreshing is active. + if (this.lastReload != this.index.revision && this.container.isShown() && this.settings.refreshEnabled) { + this.lastReload = this.index.revision; + this.render(); + } + }; + this.lastReload = 0; + } + onload() { + this.render(); + this.lastReload = this.index.revision; + // Refresh after index changes stop. + this.registerEvent(this.app.workspace.on("dataview:refresh-views", this.maybeRefresh)); + // ...or when the DOM is shown (sidebar expands, tab selected, nodes scrolled into view). + this.register(this.container.onNodeInserted(this.maybeRefresh)); + } +} + +class DataviewCalendarRenderer extends DataviewRefreshableRenderer { + constructor(query, container, index, origin, settings, app) { + super(container, index, app, settings); + this.query = query; + this.container = container; + this.index = index; + this.origin = origin; + this.settings = settings; + this.app = app; + } + async render() { + var _a; + this.container.innerHTML = ""; + let maybeResult = await asyncTryOrPropogate(() => executeCalendar(this.query, this.index, this.origin, this.settings)); + if (!maybeResult.successful) { + renderErrorPre(this.container, "Dataview: " + maybeResult.error); + return; + } + else if (maybeResult.value.data.length == 0 && this.settings.warnOnEmptyResult) { + renderErrorPre(this.container, "Dataview: Query returned 0 results."); + return; + } + let dateMap = new Map(); + for (let data of maybeResult.value.data) { + const dot = { + color: "default", + className: "note", + isFilled: true, + link: data.link, + }; + const d = data.date.toFormat("yyyyLLdd"); + if (!dateMap.has(d)) { + dateMap.set(d, [dot]); + } + else { + (_a = dateMap.get(d)) === null || _a === void 0 ? void 0 : _a.push(dot); + } + } + const querySource = { + getDailyMetadata: async (date) => { + return { + dots: dateMap.get(date.format("YYYYMMDD")) || [], + }; + }, + }; + const sources = [querySource]; + const renderer = this; + this.calendar = new Calendar({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + target: this.container, + props: { + onHoverDay(date, targetEl) { + const vals = dateMap.get(date.format("YYYYMMDD")); + if (!vals || vals.length == 0) { + return; + } + if ((vals === null || vals === void 0 ? void 0 : vals.length) == 0) { + return; + } + renderer.app.workspace.trigger("link-hover", {}, targetEl, vals[0].link.path, vals[0].link.path); + }, + onClickDay: async (date) => { + const vals = dateMap.get(date.format("YYYYMMDD")); + if (!vals || vals.length == 0) { + return; + } + if ((vals === null || vals === void 0 ? void 0 : vals.length) == 0) { + return; + } + const file = renderer.app.metadataCache.getFirstLinkpathDest(vals[0].link.path, ""); + if (file == null) { + return; + } + const leaf = renderer.app.workspace.getUnpinnedLeaf(); + await leaf.openFile(file, { active: true }); + }, + showWeekNums: false, + sources, + }, + }); + } + onClose() { + if (this.calendar) { + this.calendar.$destroy(); + } + return Promise.resolve(); + } +} + +/** Fancy wrappers for the JavaScript API, used both by external plugins AND by the dataview javascript view. */ +/** Asynchronous API calls related to file / system IO. */ +class DataviewInlineIOApi { + constructor(api, currentFile) { + this.api = api; + this.currentFile = currentFile; + } + /** Load the contents of a CSV asynchronously, returning a data array of rows (or undefined if it does not exist). */ + async csv(path, originFile) { + return this.api.csv(path, originFile || this.currentFile); + } + /** Asynchronously load the contents of any link or path in an Obsidian vault. */ + async load(path, originFile) { + return this.api.load(path, originFile || this.currentFile); + } + /** Normalize a link or path relative to an optional origin file. Returns a textual fully-qualified-path. */ + normalize(path, originFile) { + return this.api.normalize(path, originFile || this.currentFile); + } +} +class DataviewInlineApi { + constructor(api, component, container, currentFilePath) { + var _a, _b; + /** Value utilities which allow for type-checking and comparisons. */ + this.value = Values; + /** Widget utility functions for creating built-in widgets. */ + this.widget = Widgets; + /** Re-exporting of luxon for people who can't easily require it. Sorry! */ + this.luxon = Luxon; + this.index = api.index; + this.app = api.app; + this.settings = api.settings; + this.component = component; + this.container = container; + this.currentFilePath = currentFilePath; + this.api = api; + this.io = new DataviewInlineIOApi(this.api.io, this.currentFilePath); + // Set up the evaluation context with variables from the current file. + let fileMeta = (_b = (_a = this.index.pages.get(this.currentFilePath)) === null || _a === void 0 ? void 0 : _a.serialize(this.index)) !== null && _b !== void 0 ? _b : {}; + this.evaluationContext = new Context(defaultLinkHandler(this.index, this.currentFilePath), this.settings, { + this: fileMeta, + }); + this.func = Functions.bindAll(DEFAULT_FUNCTIONS, this.evaluationContext); + } + ///////////////////////////// + // Index + Data Collection // + ///////////////////////////// + /** Return an array of paths (as strings) corresponding to pages which match the query. */ + pagePaths(query) { + return this.api.pagePaths(query, this.currentFilePath); + } + /** Map a page path to the actual data contained within that page. */ + page(path) { + return this.api.page(path, this.currentFilePath); + } + /** Return an array of page objects corresponding to pages which match the query. */ + pages(query) { + return this.api.pages(query, this.currentFilePath); + } + /** Return the information about the current page. */ + current() { + return this.page(this.currentFilePath); + } + /////////////////////////////// + // Dataview Query Evaluation // + /////////////////////////////// + /** Execute a Dataview query, returning the results in programmatic form. */ + async query(source, originFile, settings) { + return this.api.query(source, originFile !== null && originFile !== void 0 ? originFile : this.currentFilePath, settings); + } + /** Error-throwing version of {@link query}. */ + async tryQuery(source, originFile, settings) { + return this.api.tryQuery(source, originFile !== null && originFile !== void 0 ? originFile : this.currentFilePath, settings); + } + /** Execute a Dataview query, returning the results in Markdown. */ + async queryMarkdown(source, originFile, settings) { + return this.api.queryMarkdown(source, originFile !== null && originFile !== void 0 ? originFile : this.currentFilePath, settings); + } + /** Error-throwing version of {@link queryMarkdown}. */ + async tryQueryMarkdown(source, originFile, settings) { + return this.api.tryQueryMarkdown(source, originFile !== null && originFile !== void 0 ? originFile : this.currentFilePath, settings); + } + /** + * Evaluate a dataview expression (like '2 + 2' or 'link("hello")'), returning the evaluated result. + * This takes an optional second argument which provides definitions for variables, such as: + * + * ``` + * dv.evaluate("x + 6", { x: 2 }) = 8 + * dv.evaluate('link(target)', { target: "Okay" }) = [[Okay]] + * ``` + * + * Note that `this` is implicitly available and refers to the current file. + * + * This method returns a Result type instead of throwing an error; you can check the result of the + * execution via `result.successful` and obtain `result.value` or `result.error` resultingly. If + * you'd rather this method throw on an error, use `dv.tryEvaluate`. + */ + evaluate(expression, context) { + let field = EXPRESSION.field.parse(expression); + if (!field.status) + return Result.failure(`Failed to parse expression "${expression}"`); + return this.evaluationContext.evaluate(field.value, context); + } + /** Error-throwing version of `dv.evaluate`. */ + tryEvaluate(expression, context) { + return this.evaluate(expression, context).orElseThrow(); + } + /** Execute a Dataview query and embed it into the current view. */ + async execute(source) { + this.api.execute(source, this.container, this.component, this.currentFilePath); + } + /** Execute a DataviewJS query and embed it into the current view. */ + async executeJs(code) { + this.api.executeJs(code, this.container, this.component, this.currentFilePath); + } + ///////////// + // Utility // + ///////////// + /** + * Convert an input element or array into a Dataview data-array. If the input is already a data array, + * it is returned unchanged. + */ + array(raw) { + return this.api.array(raw); + } + /** Return true if theg given value is a javascript array OR a dataview data array. */ + isArray(raw) { + return this.api.isArray(raw); + } + /** Return true if the given value is a dataview data array; this returns FALSE for plain JS arrays. */ + isDataArray(raw) { + return DataArray.isDataArray(raw); + } + /** Create a dataview file link to the given path. */ + fileLink(path, embed = false, display) { + return Link.file(path, embed, display); + } + /** Create a dataview section link to the given path. */ + sectionLink(path, section, embed = false, display) { + return Link.header(path, section, embed, display); + } + /** Create a dataview block link to the given path. */ + blockLink(path, blockId, embed = false, display) { + return Link.block(path, blockId, embed, display); + } + /** Attempt to extract a date from a string, link or date. */ + date(pathlike) { + return this.api.date(pathlike); + } + /** Attempt to extract a duration from a string or duration. */ + duration(dur) { + return this.api.duration(dur); + } + /** Parse a raw textual value into a complex Dataview type, if possible. */ + parse(value) { + return this.api.parse(value); + } + /** Convert a basic JS type into a Dataview type by parsing dates, links, durations, and so on. */ + literal(value) { + return this.api.literal(value); + } + /** Deep clone the given literal, returning a new literal which is independent of the original. */ + clone(value) { + return Values.deepCopy(value); + } + /** + * Compare two arbitrary JavaScript values using Dataview's default comparison rules. Returns a negative value if + * a < b, 0 if a = b, and a positive value if a > b. + */ + compare(a, b) { + return Values.compareValue(a, b); + } + /** Return true if the two given JavaScript values are equal using Dataview's default comparison rules. */ + equal(a, b) { + return this.compare(a, b) == 0; + } + ///////////////////////// + // Rendering Functions // + ///////////////////////// + /** Render an HTML element, containing arbitrary text. */ + el(el, text, { container = this.container, ...options } = {}) { + let wrapped = Values.wrapValue(text); + if (wrapped === null || wrapped === undefined) { + return container.createEl(el, Object.assign({ text }, options)); + } + let _el = container.createEl(el, options); + renderValue(wrapped.value, _el, this.currentFilePath, this.component, this.settings, true); + return _el; + } + /** Render an HTML header; the level can be anything from 1 - 6. */ + header(level, text, options) { + let header = { 1: "h1", 2: "h2", 3: "h3", 4: "h4", 5: "h5", 6: "h6" }[level]; + if (!header) + throw Error(`Unrecognized level '${level}' (expected 1, 2, 3, 4, 5, or 6)`); + return this.el(header, text, options); + } + /** Render an HTML paragraph, containing arbitrary text. */ + paragraph(text, options) { + return this.el("p", text, options); + } + /** Render an inline span, containing arbitrary text. */ + span(text, options) { + return this.el("span", text, options); + } + /** + * Render HTML from the output of a template "view" saved as a file in the vault. + * Takes a filename and arbitrary input data. + */ + async view(viewName, input) { + // Look for `${viewName}.js` first, then for `${viewName}/view.js`. + const simpleViewPath = `${viewName}.js`; + const complexViewPath = `${viewName}/view.js`; + let checkForCss = false; + let viewFile = this.app.metadataCache.getFirstLinkpathDest(simpleViewPath, this.currentFilePath); + if (!viewFile) { + viewFile = this.app.metadataCache.getFirstLinkpathDest(complexViewPath, this.currentFilePath); + checkForCss = true; + } + if (!viewFile) { + renderErrorPre(this.container, `Dataview: custom view not found for '${simpleViewPath}' or '${complexViewPath}'.`); + return; + } + let contents = await this.app.vault.read(viewFile); + if (contents.contains("await")) + contents = "(async () => { " + contents + " })()"; + contents += `\n//# sourceURL=${viewFile.path}`; + let func = new Function("dv", "input", contents); + try { + // This may directly render, in which case it will likely return undefined or null. + let result = await Promise.resolve(func(this, input)); + if (result) + await renderValue(result, this.container, this.currentFilePath, this.component, this.settings, true); + } + catch (ex) { + renderErrorPre(this.container, `Dataview: Failed to execute view '${viewFile.path}'.\n\n${ex}`); + } + if (!checkForCss) { + return; + } + // Check for optional CSS. + let cssFile = this.app.metadataCache.getFirstLinkpathDest(`${viewName}/view.css`, this.currentFilePath); + if (!cssFile) + return; + let cssContents = await this.app.vault.read(cssFile); + cssContents += `\n/*# sourceURL=${location.origin}/${cssFile.path} */`; + this.container.createEl("style", { text: cssContents, attr: { scope: " " } }); + } + /** Render a dataview list of the given values. */ + list(values) { + return this.api.list(values, this.container, this.component, this.currentFilePath); + } + /** Render a dataview table with the given headers, and the 2D array of values. */ + table(headers, values) { + return this.api.table(headers, values, this.container, this.component, this.currentFilePath); + } + /** Render a dataview task view with the given tasks. */ + taskList(tasks, groupByFile = true) { + return this.api.taskList(tasks, groupByFile, this.container, this.component, this.currentFilePath); + } + //////////////////////// + // Markdown Rendering // + //////////////////////// + /** Render a table directly to markdown, returning the markdown. */ + markdownTable(headers, values, settings) { + return this.api.markdownTable(headers, values, settings); + } + /** Render a list directly to markdown, returning the markdown. */ + markdownList(values, settings) { + return this.api.markdownList(values, settings); + } + /** Render at ask list directly to markdown, returning the markdown. */ + markdownTaskList(values, settings) { + return this.api.markdownTaskList(values, settings); + } +} +/** + * Evaluate a script where 'this' for the script is set to the given context. Allows you to define global variables. + */ +function evalInContext(script, context) { + return function () { + return eval(script); + }.call(context); +} +/** + * Evaluate a script possibly asynchronously, if the script contains `async/await` blocks. + */ +async function asyncEvalInContext(script, context) { + if (script.includes("await")) { + return evalInContext("(async () => { " + script + " })()", context); + } + else { + return Promise.resolve(evalInContext(script, context)); + } +} + +class DataviewJSRenderer extends DataviewRefreshableRenderer { + constructor(api, script, container, origin) { + super(container, api.index, api.app, api.settings); + this.api = api; + this.script = script; + this.container = container; + this.origin = origin; + } + async render() { + this.container.innerHTML = ""; + if (!this.settings.enableDataviewJs) { + this.containerEl.innerHTML = ""; + renderErrorPre(this.container, "Dataview JS queries are disabled. You can enable them in the Dataview settings."); + return; + } + // Assume that the code is javascript, and try to eval it. + try { + await asyncEvalInContext(DataviewJSRenderer.PREAMBLE + this.script, new DataviewInlineApi(this.api, this, this.container, this.origin)); + } + catch (e) { + this.containerEl.innerHTML = ""; + renderErrorPre(this.container, "Evaluation Error: " + e.stack); + } + } +} +DataviewJSRenderer.PREAMBLE = "const dataview = this;const dv = this;"; +/** Inline JS renderer accessible using '=$' by default. */ +class DataviewInlineJSRenderer extends DataviewRefreshableRenderer { + constructor(api, script, container, target, origin) { + super(container, api.index, api.app, api.settings); + this.api = api; + this.script = script; + this.container = container; + this.target = target; + this.origin = origin; + } + async render() { + var _a; + (_a = this.errorbox) === null || _a === void 0 ? void 0 : _a.remove(); + if (!this.settings.enableDataviewJs || !this.settings.enableInlineDataviewJs) { + let temp = document.createElement("span"); + temp.innerText = "(disabled; enable in settings)"; + this.target.replaceWith(temp); + this.target = temp; + return; + } + // Assume that the code is javascript, and try to eval it. + try { + let temp = document.createElement("span"); + let result = await asyncEvalInContext(DataviewInlineJSRenderer.PREAMBLE + this.script, new DataviewInlineApi(this.api, this, temp, this.origin)); + this.target.replaceWith(temp); + this.target = temp; + if (result === undefined) + return; + renderValue(result, temp, this.origin, this, this.settings, false); + } + catch (e) { + this.errorbox = this.container.createEl("div"); + renderErrorPre(this.errorbox, "Dataview (for inline JS query '" + this.script + "'): " + e); + } + } +} +DataviewInlineJSRenderer.PREAMBLE = "const dataview = this;const dv=this;"; + +//////////// +// Tables // +//////////// +/** Render a table of literals to Markdown. */ +function markdownTable(headers, values, settings) { + if (values.length > 0 && headers.length != values[0].length) + throw new Error(`The number of headers (${headers.length}) must match the number of columns (${values[0].length})`); + settings = settings !== null && settings !== void 0 ? settings : DEFAULT_SETTINGS; + const mvalues = []; + const maxLengths = Array.from(headers, v => escapeTable(v).length); + // Pre-construct the table in memory so we can size columns. + for (let row = 0; row < values.length; row++) { + const current = []; + for (let col = 0; col < values[row].length; col++) { + const text = tableLiteral(values[row][col], settings.allowHtml, settings); + current.push(text); + maxLengths[col] = Math.max(maxLengths[col], text.length); + } + mvalues.push(current); + } + // Then construct the actual table... + // Append the header fields first. + let table = `| ${headers.map((v, i) => padright(escapeTable(v), " ", maxLengths[i])).join(" | ")} |\n`; + // Then the separating column. + table += `| ${maxLengths.map(i => padright("", "-", i)).join(" | ")} |\n`; + // Then the data colunns. + for (let row = 0; row < values.length; row++) { + table += `| ${mvalues[row].map((v, i) => padright(v, " ", maxLengths[i])).join(" | ")} |\n`; + } + return table; +} +/** Convert a value to a Markdown-friendly string. */ +function tableLiteral(value, allowHtml = true, settings) { + return escapeTable(rawTableLiteral(value, allowHtml, settings)); +} +/** Convert a value to a Markdown-friendly string; does not do escaping. */ +function rawTableLiteral(value, allowHtml = true, settings) { + if (!allowHtml) + return Values.toString(value, settings); + if (Values.isArray(value)) { + return `
    ${value.map(v => "
  • " + tableLiteral(v, allowHtml, settings) + "
  • ").join("")}
`; + } + else if (Values.isObject(value)) { + const inner = Object.entries(value) + .map(([k, v]) => { + return `
  • ${tableLiteral(k, allowHtml, settings)}: ${tableLiteral(v, allowHtml, settings)}
  • `; + }) + .join(""); + return `
      ${inner}
    `; + } + else { + return Values.toString(value, settings); + } +} +/** Don't need to import a library for this one... */ +function padright(text, padding, length) { + if (text.length >= length) + return text; + return text + padding.repeat(length - text.length); +} +/** Escape bars inside table content to prevent it from messing up table rows. */ +function escapeTable(text) { + return text.split(/(?!\\)\|/i).join("\\|"); +} +/////////// +// Lists // +/////////// +/** Render a list of literal elements to a markdown list. */ +function markdownList(values, settings) { + return markdownListRec(values, settings, 0); +} +/** Internal recursive function which renders markdown lists. */ +function markdownListRec(input, settings, depth = 0) { + if (Values.isArray(input)) { + let result = depth == 0 ? "" : "\n"; + for (let value of input) { + result += " ".repeat(depth) + "- "; + result += markdownListRec(value, settings, depth); + result += "\n"; + } + return result; + } + else if (Values.isObject(input)) { + let result = depth == 0 ? "" : "\n"; + for (let [key, value] of Object.entries(input)) { + result += " ".repeat(depth) + "- "; + result += Values.toString(key) + ": "; + result += markdownListRec(value, settings, depth); + result += "\n"; + } + return result; + } + else if (Values.isWidget(input) && Widgets.isListPair(input)) { + return `${Values.toString(input.key)}: ${markdownListRec(input.value, settings, depth + 1)}`; + } + return Values.toString(input); +} +/////////// +// Tasks // +/////////// +/** Render the result of a task query to markdown. */ +function markdownTaskList(tasks, settings, depth = 0) { + var _a, _b; + if (Groupings.isGrouping(tasks)) { + let result = ""; + for (let element of tasks) { + result += "#".repeat(depth + 1) + " " + Values.toString(element.key) + "\n\n"; + result += markdownTaskList(element.rows, settings, depth + 1); + } + return result; + } + else { + // Remove task line duplicates if present to match `taskList()` behavior. + const [dedupTasks, _] = nestItems(tasks); + let result = ""; + for (let element of dedupTasks) { + result += " ".repeat(depth) + "- "; + if (element.task) { + result += `[${element.status}] ${((_a = element.visual) !== null && _a !== void 0 ? _a : element.text).split("\n").join(" ")}\n`; + } + else { + result += `${((_b = element.visual) !== null && _b !== void 0 ? _b : element.text).split("\n").join(" ")}\n`; + } + result += markdownTaskList(element.children, settings, depth + 1); + } + return result; + } +} + +/** The general, externally accessible plugin API (available at `app.plugins.plugins.dataview.api` or as global `DataviewAPI`). */ +/** Asynchronous API calls related to file / system IO. */ +class DataviewIOApi { + constructor(api) { + this.api = api; + } + /** Load the contents of a CSV asynchronously, returning a data array of rows (or undefined if it does not exist). */ + async csv(path, originFile) { + if (!Values.isLink(path) && !Values.isString(path)) { + throw Error(`dv.io.csv only handles string or link paths; was provided type '${typeof path}'.`); + } + let data = await this.api.index.csv.get(this.normalize(path, originFile)); + if (data.successful) + return DataArray.from(data.value, this.api.settings); + else + throw Error(`Could not find CSV for path '${path}' (relative to origin '${originFile !== null && originFile !== void 0 ? originFile : "/"}')`); + } + /** Asynchronously load the contents of any link or path in an Obsidian vault. */ + async load(path, originFile) { + if (!Values.isLink(path) && !Values.isString(path)) { + throw Error(`dv.io.load only handles string or link paths; was provided type '${typeof path}'.`); + } + let existingFile = this.api.index.vault.getAbstractFileByPath(this.normalize(path, originFile)); + if (!existingFile || !(existingFile instanceof obsidian.TFile)) + return undefined; + return this.api.index.vault.cachedRead(existingFile); + } + /** Normalize a link or path relative to an optional origin file. Returns a textual fully-qualified-path. */ + normalize(path, originFile) { + let realPath; + if (Values.isLink(path)) + realPath = path.path; + else + realPath = path; + return this.api.index.prefix.resolveRelative(realPath, originFile); + } +} +/** Global API for accessing the Dataview API, executing dataview queries, and */ +class DataviewApi { + constructor(app, index, settings, verNum) { + this.app = app; + this.index = index; + this.settings = settings; + this.verNum = verNum; + /** Value utility functions for comparisons and type-checking. */ + this.value = Values; + /** Widget utility functions for creating built-in widgets. */ + this.widget = Widgets; + /** Re-exporting of luxon for people who can't easily require it. Sorry! */ + this.luxon = Luxon; + /** Utilities to check the current Dataview version and comapre it to SemVer version ranges. */ + this.version = (() => { + const { verNum: version } = this; + return { + get current() { + return version; + }, + compare: (op, ver) => compare(version, ver, op), + satisfies: (range) => satisfies(version, range), + }; + })(); + this.evaluationContext = new Context(defaultLinkHandler(index, ""), settings); + this.func = Functions.bindAll(DEFAULT_FUNCTIONS, this.evaluationContext); + this.io = new DataviewIOApi(this); + } + ///////////////////////////// + // Index + Data Collection // + ///////////////////////////// + /** Return an array of paths (as strings) corresponding to pages which match the query. */ + pagePaths(query, originFile) { + let source; + try { + if (!query || query.trim() === "") + source = Sources.folder(""); + else + source = EXPRESSION.source.tryParse(query); + } + catch (ex) { + throw new Error(`Failed to parse query in 'pagePaths': ${ex}`); + } + return matchingSourcePaths(source, this.index, originFile) + .map(s => DataArray.from(s, this.settings)) + .orElseThrow(); + } + /** Map a page path to the actual data contained within that page. */ + page(path, originFile) { + if (!(typeof path === "string") && !Values.isLink(path)) { + throw Error("dv.page only handles string and link paths; was provided type '" + typeof path + "'"); + } + let rawPath = path instanceof Link ? path.path : path; + let normPath = this.app.metadataCache.getFirstLinkpathDest(rawPath, originFile !== null && originFile !== void 0 ? originFile : ""); + if (!normPath) + return undefined; + let pageObject = this.index.pages.get(normPath.path); + if (!pageObject) + return undefined; + return this._addDataArrays(pageObject.serialize(this.index)); + } + /** Return an array of page objects corresponding to pages which match the source query. */ + pages(query, originFile) { + return this.pagePaths(query, originFile).flatMap(p => { + let res = this.page(p, originFile); + return res ? [res] : []; + }); + } + /** Remaps important metadata to add data arrays. */ + _addDataArrays(pageObject) { + // Remap the "file" metadata entries to be data arrays. + for (let [key, value] of Object.entries(pageObject.file)) { + if (Array.isArray(value)) + pageObject.file[key] = DataArray.wrap(value, this.settings); + } + return pageObject; + } + ///////////// + // Utility // + ///////////// + /** + * Convert an input element or array into a Dataview data-array. If the input is already a data array, + * it is returned unchanged. + */ + array(raw) { + if (DataArray.isDataArray(raw)) + return raw; + if (Array.isArray(raw)) + return DataArray.wrap(raw, this.settings); + return DataArray.wrap([raw], this.settings); + } + /** Return true if the given value is a javascript array OR a dataview data array. */ + isArray(raw) { + return DataArray.isDataArray(raw) || Array.isArray(raw); + } + /** Return true if the given value is a dataview data array; this returns FALSE for plain JS arrays. */ + isDataArray(raw) { + return DataArray.isDataArray(raw); + } + /** Create a dataview file link to the given path. */ + fileLink(path, embed = false, display) { + return Link.file(path, embed, display); + } + /** Create a dataview section link to the given path. */ + sectionLink(path, section, embed = false, display) { + return Link.header(path, section, embed, display); + } + /** Create a dataview block link to the given path. */ + blockLink(path, blockId, embed = false, display) { + return Link.block(path, blockId, embed, display); + } + /** Attempt to extract a date from a string, link or date. */ + date(pathlike) { + return this.func.date(pathlike); + } + /** Attempt to extract a duration from a string or duration. */ + duration(str) { + return this.func.dur(str); + } + /** Parse a raw textual value into a complex Dataview type, if possible. */ + parse(value) { + let raw = EXPRESSION.inlineField.parse(value); + if (raw.status) + return raw.value; + else + return value; + } + /** Convert a basic JS type into a Dataview type by parsing dates, links, durations, and so on. */ + literal(value) { + return parseFrontmatter(value); + } + /** Deep clone the given literal, returning a new literal which is independent of the original. */ + clone(value) { + return Values.deepCopy(value); + } + /** + * Compare two arbitrary JavaScript values using Dataview's default comparison rules. Returns a negative value if + * a < b, 0 if a = b, and a positive value if a > b. + */ + compare(a, b) { + return Values.compareValue(a, b, this.evaluationContext.linkHandler.normalize); + } + /** Return true if the two given JavaScript values are equal using Dataview's default comparison rules. */ + equal(a, b) { + return this.compare(a, b) == 0; + } + /////////////////////////////// + // Dataview Query Evaluation // + /////////////////////////////// + /** + * Execute an arbitrary Dataview query, returning a query result which: + * + * 1. Indicates the type of query, + * 2. Includes the raw AST of the parsed query. + * 3. Includes the output in the form relevant to that query type. + * + * List queries will return a list of objects ({ id, value }); table queries return a header array + * and a 2D array of values; and task arrays return a Grouping type which allows for recursive + * task nesting. + */ + async query(source, originFile, settings) { + const query = typeof source === "string" ? parseQuery(source) : Result.success(source); + if (!query.successful) + return query.cast(); + const header = query.value.header; + switch (header.type) { + case "calendar": + const cres = await executeCalendar(query.value, this.index, originFile !== null && originFile !== void 0 ? originFile : "", this.settings); + if (!cres.successful) + return cres.cast(); + return Result.success({ type: "calendar", values: cres.value.data }); + case "task": + const tasks = await executeTask(query.value, originFile !== null && originFile !== void 0 ? originFile : "", this.index, this.settings); + if (!tasks.successful) + return tasks.cast(); + return Result.success({ type: "task", values: tasks.value.tasks }); + case "list": + if ((settings === null || settings === void 0 ? void 0 : settings.forceId) !== undefined) + header.showId = settings.forceId; + const lres = await executeList(query.value, this.index, originFile !== null && originFile !== void 0 ? originFile : "", this.settings); + if (!lres.successful) + return lres.cast(); + // TODO: WITHOUT ID probably shouldn't exist, or should be moved to the engine itself. + // For now, until I fix it up in an upcoming refactor, we re-implement the behavior here. + return Result.success({ + type: "list", + values: lres.value.data, + primaryMeaning: lres.value.primaryMeaning, + }); + case "table": + if ((settings === null || settings === void 0 ? void 0 : settings.forceId) !== undefined) + header.showId = settings.forceId; + const tres = await executeTable(query.value, this.index, originFile !== null && originFile !== void 0 ? originFile : "", this.settings); + if (!tres.successful) + return tres.cast(); + return Result.success({ + type: "table", + values: tres.value.data, + headers: tres.value.names, + idMeaning: tres.value.idMeaning, + }); + } + } + /** Error-throwing version of {@link query}. */ + async tryQuery(source, originFile, settings) { + return (await this.query(source, originFile, settings)).orElseThrow(); + } + /** Execute an arbitrary dataview query, returning the results in well-formatted markdown. */ + async queryMarkdown(source, originFile, settings) { + const result = await this.query(source, originFile, settings); + if (!result.successful) + return result.cast(); + switch (result.value.type) { + case "list": + return Result.success(this.markdownList(result.value.values, settings)); + case "table": + return Result.success(this.markdownTable(result.value.headers, result.value.values, settings)); + case "task": + return Result.success(this.markdownTaskList(result.value.values, settings)); + case "calendar": + return Result.failure("Cannot render calendar queries to markdown."); + } + } + /** Error-throwing version of {@link queryMarkdown}. */ + async tryQueryMarkdown(source, originFile, settings) { + return (await this.queryMarkdown(source, originFile, settings)).orElseThrow(); + } + /** + * Evaluate a dataview expression (like '2 + 2' or 'link("hello")'), returning the evaluated result. + * This takes an optional second argument which provides definitions for variables, such as: + * + * ``` + * dv.evaluate("x + 6", { x: 2 }) = 8 + * dv.evaluate('link(target)', { target: "Okay" }) = [[Okay]] + * ``` + * + * This method returns a Result type instead of throwing an error; you can check the result of the + * execution via `result.successful` and obtain `result.value` or `result.error` resultingly. If + * you'd rather this method throw on an error, use `dv.tryEvaluate`. + */ + evaluate(expression, context, originFile) { + let field = EXPRESSION.field.parse(expression); + if (!field.status) + return Result.failure(`Failed to parse expression "${expression}"`); + let evaluationContext = originFile + ? new Context(defaultLinkHandler(this.index, originFile), this.settings) + : this.evaluationContext; + return evaluationContext.evaluate(field.value, context); + } + /** Error-throwing version of `dv.evaluate`. */ + tryEvaluate(expression, context, originFile) { + return this.evaluate(expression, context, originFile).orElseThrow(); + } + /////////////// + // Rendering // + /////////////// + /** + * Execute the given query, rendering results into the given container using the components lifecycle. + * Your component should be a *real* component which calls onload() on it's child components at some point, + * or a MarkdownPostProcessorContext! + * + * Note that views made in this way are live updating and will automatically clean themselves up when + * the component is unloaded or the container is removed. + */ + async execute(source, container, component, filePath) { + if (isDataviewDisabled(filePath)) { + renderCodeBlock(container, source); + return; + } + let maybeQuery = tryOrPropogate(() => parseQuery(source)); + // In case of parse error, just render the error. + if (!maybeQuery.successful) { + renderErrorPre(container, "Dataview: " + maybeQuery.error); + return; + } + let query = maybeQuery.value; + let init = { app: this.app, settings: this.settings, index: this.index, container }; + let childComponent; + switch (query.header.type) { + case "task": + childComponent = createTaskView(init, query, filePath); + component.addChild(childComponent); + break; + case "list": + childComponent = createListView(init, query, filePath); + component.addChild(childComponent); + break; + case "table": + childComponent = createTableView(init, query, filePath); + component.addChild(childComponent); + break; + case "calendar": + childComponent = new DataviewCalendarRenderer(query, container, this.index, filePath, this.settings, this.app); + component.addChild(childComponent); + break; + } + childComponent.load(); + } + /** + * Execute the given DataviewJS query, rendering results into the given container using the components lifecycle. + * See {@link execute} for general rendering semantics. + */ + async executeJs(code, container, component, filePath) { + if (isDataviewDisabled(filePath)) { + renderCodeBlock(container, code, "javascript"); + return; + } + const renderer = new DataviewJSRenderer(this, code, container, filePath); + renderer.load(); + component.addChild(renderer); + } + /** Render a dataview list of the given values. */ + async list(values, container, component, filePath) { + if (!values) + return; + if (values !== undefined && values !== null && !Array.isArray(values) && !DataArray.isDataArray(values)) + values = Array.from(values); + // Append a child div, since React will keep re-rendering otherwise. + let subcontainer = container.createEl("div"); + component.addChild(createFixedListView({ app: this.app, settings: this.settings, index: this.index, container: subcontainer }, values, filePath)); + } + /** Render a dataview table with the given headers, and the 2D array of values. */ + async table(headers, values, container, component, filePath) { + if (!headers) + headers = []; + if (!values) + values = []; + if (!Array.isArray(headers) && !DataArray.isDataArray(headers)) + headers = Array.from(headers); + // Append a child div, since React will keep re-rendering otherwise. + let subcontainer = container.createEl("div"); + component.addChild(createFixedTableView({ app: this.app, settings: this.settings, index: this.index, container: subcontainer }, headers, values, filePath)); + } + /** Render a dataview task view with the given tasks. */ + async taskList(tasks, groupByFile = true, container, component, filePath = "") { + let groupedTasks = !Groupings.isGrouping(tasks) && groupByFile ? this.array(tasks).groupBy(t => Link.file(t.path)) : tasks; + // Append a child div, since React will override several task lists otherwise. + let taskContainer = container.createEl("div"); + component.addChild(createFixedTaskView({ app: this.app, settings: this.settings, index: this.index, container: taskContainer }, groupedTasks, filePath)); + } + /** Render an arbitrary value into a container. */ + async renderValue(value, container, component, filePath, inline = false) { + return renderValue(value, container, filePath, component, this.settings, inline); + } + ///////////////// + // Data Export // + ///////////////// + /** Render data to a markdown table. */ + markdownTable(headers, values, settings) { + if (!headers) + headers = []; + if (!values) + values = []; + const combined = Object.assign({}, this.settings, settings); + return markdownTable(headers, values, combined); + } + /** Render data to a markdown list. */ + markdownList(values, settings) { + if (!values) + values = []; + const combined = Object.assign({}, this.settings, settings); + return markdownList(values, combined); + } + /** Render tasks or list items to a markdown task list. */ + markdownTaskList(values, settings) { + if (!values) + values = []; + const sparse = nestGroups(values); + const combined = Object.assign({}, this.settings, settings); + return markdownTaskList(sparse, combined); + } +} +/** Determines if source-path has a `?no-dataview` annotation that disables dataview. */ +function isDataviewDisabled(sourcePath) { + let questionLocation = sourcePath.lastIndexOf("?"); + if (questionLocation == -1) + return false; + return sourcePath.substring(questionLocation).contains("no-dataview"); +} + +/** Refreshable renderer which renders inline instead of in a div. */ +class DataviewInlineRenderer extends DataviewRefreshableRenderer { + constructor(field, fieldText, container, target, index, origin, settings, app) { + super(container, index, app, settings); + this.field = field; + this.fieldText = fieldText; + this.container = container; + this.target = target; + this.index = index; + this.origin = origin; + this.settings = settings; + this.app = app; + } + async render() { + var _a; + (_a = this.errorbox) === null || _a === void 0 ? void 0 : _a.remove(); + let result = tryOrPropogate(() => executeInline(this.field, this.origin, this.index, this.settings)); + if (!result.successful) { + this.errorbox = this.container.createEl("div"); + renderErrorPre(this.errorbox, "Dataview (for inline query '" + this.fieldText + "'): " + result.error); + } + else { + let temp = document.createElement("span"); + temp.addClasses(["dataview", "dataview-inline-query"]); + await renderValue(result.value, temp, this.origin, this, this.settings, false); + this.target.replaceWith(temp); + } + } +} + +/** Replaces raw textual inline fields in text containers with pretty HTML equivalents. */ +async function replaceInlineFields(ctx, init) { + let inlineFields = extractInlineFields(init.container.innerHTML); + if (inlineFields.length == 0) + return; + let component = new obsidian.MarkdownRenderChild(init.container); + ctx.addChild(component); + // Iterate through the raw HTML and replace inline field matches with corresponding rendered values. + let result = init.container.innerHTML; + for (let x = inlineFields.length - 1; x >= 0; x--) { + let field = inlineFields[x]; + let renderContainer = document.createElement("span"); + renderContainer.addClasses(["dataview", "inline-field"]); + // Block inline fields render the key, parenthesis ones do not. + if (field.wrapping == "[") { + const key = renderContainer.createSpan({ + cls: ["dataview", "inline-field-key"], + attr: { + "data-dv-key": field.key, + "data-dv-norm-key": canonicalizeVarName(field.key), + }, + }); + // Explicitly set the inner HTML to respect any key formatting that we should carry over. + key.innerHTML = field.key; + renderContainer.createSpan({ + cls: ["dataview", "inline-field-value"], + attr: { id: "dataview-inline-field-" + x }, + }); + } + else { + renderContainer.createSpan({ + cls: ["dataview", "inline-field-standalone-value"], + attr: { id: "dataview-inline-field-" + x }, + }); + } + result = result.slice(0, field.start) + renderContainer.outerHTML + result.slice(field.end); + } + // Use a