added first true commit

This commit is contained in:
liph committed 2026-05-07 14:39:10 +02:00
1 parent d8ce45f44a
commit c5605678f0
463 files changed
+175645

No files matched your search

Vendored Executable
+7
View File
@@ -0,0 +1,7 @@
{
"attachmentFolderPath": "Attachments",
"alwaysUpdateLinks": true,
"livePreview": true,
"defaultViewMode": "source",
"promptDelete": false
}
+1
View File
@@ -0,0 +1 @@
{}
+3
View File
@@ -0,0 +1,3 @@
[
"templater-obsidian"
]
+33
View File
@@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"outgoing-link": false,
"tag-pane": true,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"markdown-importer": true,
"zk-prefixer": true,
"random-note": true,
"outline": true,
"word-count": false,
"slides": false,
"audio-recorder": false,
"workspaces": true,
"file-recovery": true,
"publish": false,
"sync": false,
"canvas": true,
"properties": false,
"bookmarks": true,
"footnotes": false,
"bases": true,
"webviewer": false
}
+4
View File
@@ -0,0 +1,4 @@
{
"folder": "Daily",
"template": "Templates/Daily Note Template"
}
+38
View File
@@ -0,0 +1,38 @@
{
"editor:insert-wikilink": [
{
"modifiers": [
"Alt",
"Shift"
],
"key": "L"
}
],
"zk-prefixer": [
{
"modifiers": [
"Alt",
"Shift"
],
"key": "N"
}
],
"templater-obsidian:insert-templater": [
{
"modifiers": [
"Alt",
"Shift"
],
"key": "T"
}
],
"daily-notes": [
{
"modifiers": [
"Alt",
"Shift"
],
"key": "D"
}
]
}
+38
View File
@@ -0,0 +1,38 @@
{
"command_timeout": 5,
"templates_folder": "Templates",
"templates_pairs": [
[
"",
""
]
],
"trigger_on_file_creation": false,
"auto_jump_to_cursor": false,
"enable_system_commands": false,
"shell_path": "",
"user_scripts_folder": "",
"enable_folder_templates": true,
"folder_templates": [
{
"folder": "",
"template": ""
}
],
"enable_file_templates": false,
"file_templates": [
{
"regex": ".*",
"template": ""
}
],
"syntax_highlighting": true,
"syntax_highlighting_mobile": false,
"enabled_templates_hotkeys": [
""
],
"startup_templates": [
""
],
"intellisense_render": 1
}
+45
View File
@@ -0,0 +1,45 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var va=Object.create;var Rn=Object.defineProperty;var wa=Object.getOwnPropertyDescriptor;var ba=Object.getOwnPropertyNames;var Ea=Object.getPrototypeOf,Ta=Object.prototype.hasOwnProperty;var Vi=n=>Rn(n,"__esModule",{value:!0});var ka=(n,e)=>{Vi(n);for(var t in e)Rn(n,t,{get:e[t],enumerable:!0})},Sa=(n,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ba(e))!Ta.call(n,r)&&r!=="default"&&Rn(n,r,{get:()=>e[r],enumerable:!(t=wa(e,r))||t.enumerable});return n},X=n=>Sa(Vi(Rn(n!=null?va(Ea(n)):{},"default",n&&n.__esModule&&"default"in n?{get:()=>n.default,enumerable:!0}:{value:n,enumerable:!0})),n);var zi=(()=>{for(var n=new Uint8Array(128),e=0;e<64;e++)n[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return t=>{for(var r=t.length,i=new Uint8Array((r-(t[r-1]=="=")-(t[r-2]=="="))*3/4|0),o=0,a=0;o<r;){var l=n[t.charCodeAt(o++)],c=n[t.charCodeAt(o++)],d=n[t.charCodeAt(o++)],m=n[t.charCodeAt(o++)];i[a++]=l<<2|c>>4,i[a++]=c<<4|d>>2,i[a++]=d<<6|m}return i}})();ka(exports,{default:()=>Fi});var Er=X(require("obsidian"));var L=X(require("obsidian"));var Ji=X(require("obsidian"));function oe(n){let e=new Ji.Notice("",8e3),t=createFragment(r=>{r.createEl("b",{text:"Templater Error"}),r.createEl("span",{text:":"}),r.createEl("br"),r.createEl("span",{text:n.message}),n instanceof P&&n.console_msg&&(r.createEl("br"),r.createEl("span",{text:"Check console for more information"}),console.error("Templater Error:",n.message,`
`,n.console_msg))});e.noticeEl.appendChild(t)}var P=class extends Error{constructor(e,t){super(e);this.console_msg=t;this.name=this.constructor.name,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}};async function Se(n,e){try{return await n()}catch(t){return t instanceof P?oe(t):oe(new P(e,t.message)),null}}function Ce(n,e){try{return n()}catch(t){return oe(new P(e,t.message)),null}}var re=function(){function n(){}return n.explainIfInvalidTSDocTagName=function(e){if(e[0]!=="@")return'A TSDoc tag name must start with an "@" symbol';if(!n._tsdocTagNameRegExp.test(e))return"A TSDoc tag name must start with a letter and contain only letters and numbers"},n.validateTSDocTagName=function(e){var t=n.explainIfInvalidTSDocTagName(e);if(t)throw new Error(t)},n.explainIfInvalidLinkUrl=function(e){if(e.length===0)return"The URL cannot be empty";if(!n._urlSchemeRegExp.test(e))return'An @link URL must begin with a scheme comprised only of letters and numbers followed by "://". (For general URLs, use an HTML "<a>" tag instead.)';if(!n._urlSchemeAfterRegExp.test(e))return'An @link URL must have at least one character after "://"'},n.explainIfInvalidHtmlName=function(e){if(!n._htmlNameRegExp.test(e))return"An HTML name must be an ASCII letter followed by zero or more letters, digits, or hyphens"},n.validateHtmlName=function(e){var t=n.explainIfInvalidHtmlName(e);if(t)throw new Error(t)},n.explainIfInvalidPackageName=function(e){if(e.length===0)return"The package name cannot be an empty string";if(!n._validPackageNameRegExp.test(e))return"The package name ".concat(JSON.stringify(e)," is not a valid package name")},n.explainIfInvalidImportPath=function(e,t){if(e.length>0){if(e.indexOf("//")>=0)return'An import path must not contain "//"';if(e[e.length-1]==="/")return'An import path must not end with "/"';if(!t&&e[0]==="/")return'An import path must not start with "/" unless prefixed by a package name'}},n.isSystemSelector=function(e){return n._systemSelectors.has(e)},n.explainIfInvalidUnquotedIdentifier=function(e){if(e.length===0)return"The identifier cannot be an empty string";if(n._identifierBadCharRegExp.test(e))return"The identifier cannot non-word characters";if(n._identifierNumberStartRegExp.test(e))return"The identifier must not start with a number"},n.explainIfInvalidUnquotedMemberIdentifier=function(e){var t=n.explainIfInvalidUnquotedIdentifier(e);if(t!==void 0)return t;if(n.isSystemSelector(e))return'The identifier "'.concat(e,'" must be quoted because it is a TSDoc system selector name')},n._tsdocTagNameRegExp=/^@[a-z][a-z0-9]*$/i,n._urlSchemeRegExp=/^[a-z][a-z0-9]*\:\/\//i,n._urlSchemeAfterRegExp=/^[a-z][a-z0-9]*\:\/\/./i,n._htmlNameRegExp=/^[a-z]+[a-z0-9\-]*$/i,n._identifierBadCharRegExp=/[^a-z0-9_$]/i,n._identifierNumberStartRegExp=/^[0-9]/,n._validPackageNameRegExp=/^(?:@[a-z0-9\-_\.]+\/)?[a-z0-9\-_\.]+$/i,n._systemSelectors=new Set(["instance","static","constructor","class","enum","function","interface","namespace","type","variable"]),n}();var Pr=function(){function n(){this._docNodeDefinitionsByKind=new Map,this._docNodeDefinitionsByConstructor=new Map}return n.prototype.registerDocNodes=function(e,t){var r=re.explainIfInvalidPackageName(e);if(r)throw new Error("Invalid NPM package name: "+r);for(var i=0,o=t;i<o.length;i++){var a=o[i];if(!n._nodeKindRegExp.test(a.docNodeKind))throw new Error("The DocNode kind ".concat(JSON.stringify(a.docNodeKind)," is not a valid identifier.")+" It must start with an underscore or letter, and be comprised of letters, numbers, and underscores");var l=this._docNodeDefinitionsByKind.get(a.docNodeKind);if(l!==void 0)throw new Error('The DocNode kind "'.concat(a.docNodeKind,'" was already registered')+" by ".concat(l.packageName));if(l=this._docNodeDefinitionsByConstructor.get(a.constructor),l!==void 0)throw new Error("This DocNode constructor was already registered by ".concat(l.packageName)+" as ".concat(l.docNodeKind));var c={docNodeKind:a.docNodeKind,constructor:a.constructor,packageName:e,allowedChildKinds:new Set};this._docNodeDefinitionsByKind.set(a.docNodeKind,c),this._docNodeDefinitionsByConstructor.set(a.constructor,c)}},n.prototype.throwIfNotRegisteredKind=function(e){if(!this._docNodeDefinitionsByKind.has(e))throw new Error('The DocNode kind "'.concat(e,'" was not registered with this TSDocConfiguration'))},n.prototype.registerAllowableChildren=function(e,t){for(var r=this._getDefinition(e),i=0,o=t;i<o.length;i++){var a=o[i];this._getDefinition(a),r.allowedChildKinds.add(a)}},n.prototype.isAllowedChild=function(e,t){var r=this._getDefinition(e);return r.allowedChildKinds.has(t)},n.prototype._getDefinition=function(e){var t=this._docNodeDefinitionsByKind.get(e);if(t===void 0)throw new Error('The DocNode kind "'.concat(e,'" was not registered with this TSDocConfiguration'));return t},n._nodeKindRegExp=/^[_a-z][_a-z0-9]*$/i,n}();var U;(function(n){n.Core="Core",n.Extended="Extended",n.Discretionary="Discretionary",n.None="None"})(U||(U={}));var Line truncated
`:this.range.toString()},n}();var Oa=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),y;(function(n){n.Spacing="Spacing",n.BlockTag="BlockTag",n.CodeSpan_OpeningDelimiter="CodeSpan_OpeningDelimiter",n.CodeSpan_Code="CodeSpan_Code",n.CodeSpan_ClosingDelimiter="CodeSpan_ClosingDelimiter",n.DeclarationReference_PackageName="DeclarationReference_PackageName",n.DeclarationReference_ImportPath="DeclarationReference_ImportPath",n.DeclarationReference_ImportHash="DeclarationReference_ImportHash",n.ErrorText="ErrorText",n.NonstandardText="NonstandardText",n.EscapedText="EscapedText",n.FencedCode_OpeningFence="FencedCode_OpeningFence",n.FencedCode_Language="FencedCode_Language",n.FencedCode_Code="FencedCode_Code",n.FencedCode_ClosingFence="FencedCode_ClosingFence",n.HtmlAttribute_Name="HtmlAttribute_Name",n.HtmlAttribute_Equals="HtmlAttribute_Equals",n.HtmlAttribute_Value="HtmlAttribute_Value",n.HtmlEndTag_OpeningDelimiter="HtmlEndTag_OpeningDelimiter",n.HtmlEndTag_Name="HtmlEndTag_Name",n.HtmlEndTag_ClosingDelimiter="HtmlEndTag_ClosingDelimiter",n.HtmlStartTag_OpeningDelimiter="HtmlStartTag_OpeningDelimiter",n.HtmlStartTag_Name="HtmlStartTag_Name",n.HtmlStartTag_ClosingDelimiter="HtmlStartTag_ClosingDelimiter",n.InlineTag_OpeningDelimiter="InlineTag_OpeningDelimiter",n.InlineTag_TagName="InlineTag_TagName",n.InlineTag_TagContent="InlineTag_TagContent",n.InlineTag_ClosingDelimiter="InlineTag_ClosingDelimiter",n.LinkTag_UrlDestination="LinkTag_UrlDestination",n.LinkTag_Pipe="LinkTag_Pipe",n.LinkTag_LinkText="LinkTag_LinkText",n.MemberIdentifier_LeftQuote="MemberIdentifier_LeftQuote",n.MemberIdentifier_Identifier="MemberIdentifier_Identifier",n.MemberIdentifier_RightQuote="MemberIdentifier_RightQuote",n.MemberReference_Dot="MemberReference_Dot",n.MemberReference_LeftParenthesis="MemberReference_LeftParenthesis",n.MemberReference_Colon="MemberReference_Colon",n.MemberReference_RightParenthesis="MemberReference_RightParenthesis",n.MemberSelector="MemberSelector",n.DocMemberSymbol_LeftBracket="DocMemberSymbol_LeftBracket",n.DocMemberSymbol_RightBracket="DocMemberSymbol_RightBracket",n.ParamBlock_ParameterName="ParamBlock_ParameterName",n.ParamBlock_Hyphen="ParamBlock_Hyphen",n.PlainText="PlainText",n.SoftBreak="SoftBreak"})(y||(y={}));var j=function(n){Oa(e,n);function e(t){var r=n.call(this,t)||this;if(t.excerptKind===y.Spacing)for(var i=0,o=t.content.tokens;i<o.length;i++){var a=o[i];switch(a.kind){case u.Spacing:case u.Newline:case u.EndOfInput:break;default:throw new Error("The excerptKind=Spacing but the range contains a non-whitespace token")}}return r._excerptKind=t.excerptKind,r._content=t.content,r}return Object.defineProperty(e.prototype,"kind",{get:function(){return g.Excerpt},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"excerptKind",{get:function(){return this._excerptKind},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"content",{get:function(){return this._content},enumerable:!1,configurable:!0}),e}(T);var Ba=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),Yn=function(n){Ba(e,n);function e(t){var r=n.call(this,t)||this;return re.validateTSDocTagName(t.tagName),r._tagName=t.tagName,r._tagNameWithUpperCase=t.tagName.toUpperCase(),T.isParsedParameters(t)&&(r._tagNameExcerpt=new j({configuration:r.configuration,excerptKind:y.BlockTag,content:t.tagNameExcerpt})),r}return Object.defineProperty(e.prototype,"kind",{get:function(){return g.BlockTag},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tagName",{get:function(){return this._tagName},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tagNameWithUpperCase",{get:function(){return this._tagNameWithUpperCase},enumerable:!1,configurable:!0}),e.prototype.onGetChildNodes=function(){return[this._tagNameExcerpt]},e.prototype.getTokenSequence=function(){if(!this._tagNameExcerpt)throw new Error("DocBlockTag.getTokenSequence() failed because this object did not originate from a parsed input");return this._tagNameExcerpt.content},e}(T);var Ia=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}| Line truncated
`,this._emitCommentFraming=!0,this._lineState=he.Closed,this._previousLineHadContent=!1,this._hangingParagraph=!1}return n.prototype.renderComment=function(e,t){this._emitCommentFraming=!0,this._renderCompleteObject(e,t)},n.prototype.renderHtmlTag=function(e,t){this._emitCommentFraming=!1,this._renderCompleteObject(e,t)},n.prototype.renderDeclarationReference=function(e,t){this._emitCommentFraming=!1,this._renderCompleteObject(e,t)},n.prototype._renderCompleteObject=function(e,t){this._output=e,this._lineState=he.Closed,this._previousLineHadContent=!1,this._hangingParagraph=!1,this._renderNode(t),this._writeEnd()},n.prototype._renderNode=function(e){var t=this;if(e!==void 0)switch(e.kind){case g.Block:var r=e;this._ensureLineSkipped(),this._renderNode(r.blockTag),r.blockTag.tagNameWithUpperCase===G.returns.tagNameWithUpperCase&&(this._writeContent(" "),this._hangingParagraph=!0),this._renderNode(r.content);break;case g.BlockTag:var i=e;this._lineState===he.MiddleOfLine&&this._writeContent(" "),this._writeContent(i.tagName);break;case g.CodeSpan:var o=e;this._writeContent("`"),this._writeContent(o.code),this._writeContent("`");break;case g.Comment:var a=e;this._renderNodes(qr(qr(qr([a.summarySection,a.remarksBlock,a.privateRemarks,a.deprecatedBlock,a.params,a.typeParams,a.returnsBlock],a.customBlocks,!0),a.seeBlocks,!0),[a.inheritDocTag],!1)),a.modifierTagSet.nodes.length>0&&(this._ensureLineSkipped(),this._renderNodes(a.modifierTagSet.nodes));break;case g.DeclarationReference:var l=e;this._writeContent(l.packageName),this._writeContent(l.importPath),(l.packageName!==void 0||l.importPath!==void 0)&&this._writeContent("#"),this._renderNodes(l.memberReferences);break;case g.ErrorText:var c=e;this._writeContent(c.text);break;case g.EscapedText:var d=e;this._writeContent(d.encodedText);break;case g.FencedCode:var m=e;this._ensureAtStartOfLine(),this._writeContent("```"),this._writeContent(m.language),this._writeNewline(),this._writeContent(m.code),this._writeContent("```"),this._writeNewline(),this._writeNewline();break;case g.HtmlAttribute:var _=e;this._writeContent(_.name),this._writeContent(_.spacingAfterName),this._writeContent("="),this._writeContent(_.spacingAfterEquals),this._writeContent(_.value),this._writeContent(_.spacingAfterValue);break;case g.HtmlEndTag:var w=e;this._writeContent("</"),this._writeContent(w.name),this._writeContent(">");break;case g.HtmlStartTag:var b=e;this._writeContent("<"),this._writeContent(b.name),this._writeContent(b.spacingAfterName);for(var S=b.spacingAfterName===void 0||b.spacingAfterName.length===0,k=0,E=b.htmlAttributes;k<E.length;k++){var O=E[k];S&&this._writeContent(" "),this._renderNode(O),S=O.spacingAfterValue===void 0||O.spacingAfterValue.length===0}this._writeContent(b.selfClosingTag?"/>":">");break;case g.InheritDocTag:var $=e;this._renderInlineTag($,function(){$.declarationReference&&(t._writeContent(" "),t._renderNode($.declarationReference))});break;case g.InlineTag:var K=e;this._renderInlineTag(K,function(){K.tagContent.length>0&&(t._writeContent(" "),t._writeContent(K.tagContent))});break;case g.LinkTag:var D=e;this._renderInlineTag(D,function(){(D.urlDestination!==void 0||D.codeDestination!==void 0)&&(D.urlDestination!==void 0?(t._writeContent(" "),t._writeContent(D.urlDestination)):D.codeDestination!==void 0&&(t._writeContent(" "),t._renderNode(D.codeDestination))),D.linkText!==void 0&&(t._writeContent(" "),t._writeContent("|"),t._writeContent(" "),t._writeContent(D.linkText))});break;case g.MemberIdentifier:var H=e;H.hasQuotes?(this._writeContent('"'),this._writeContent(H.identifier),this._writeContent('"')):this._writeContent(H.identifier);break;case g.MemberReference:var F=e;F.hasDot&&this._writeContent("."),F.selector&&this._writeContent("("),F.memberSymbol?this._renderNode(F.memberSymbol):this._renderNode(F.memberIdentifier),F.selector&&(this._writeContent(":"),this._renderNode(F.selector),this._writeContent(")"));break;case g.MemberSelector:var J=e;this._writeContent(J.selector);break;case g.MemberSymbol:var te=e;this._writeContent("["),this._renderNode(te.symbolReference),this._writeContent("]");break;case g.Section:var ne=e;this._renderNodes(ne.nodes);break;case g.Paragraph:var Q=Fr.trimSpacesInParagraph(e);Q.nodes.length>0&&(this._hangingParagraph?this._hangingParagraph=!1:this._ensureLineSkipped(),this._renderNodes(Q.nodes),this._writeNewline());break;case g.ParamBlock:var h=e;this._ensureLineSkipped(),this._renderNode(h.blockTag),this._writeContent(" "),this._writeContent(h.parameterName),this._writeContent(" - "),this._hangingParagraph=!0,this._renderNode(h.content),this._hangingParagraph=!1;break;case g.ParamCollection:var C=e;this._renderNodes(C.blocks);break;case g.PlainText:var f=e;this._writeContent(f.text);break}},n.prototype._renderInlineTag=function(e,t){this._writeContent("{"),this._writeContent(e.tagName),t(),this._writeContent("}")},n.prototype._renderNodes=function(e){for(var t=0,r=e;t<r.length;t++){var i=r[t];this._renderNode(i)}}, Line truncated
`?(++t,r=1):++r)}return{line:t,column:r}},n.prototype._validateBounds=function(){if(this.pos<0)throw new Error("TextRange.pos cannot be negative");if(this.end<0)throw new Error("TextRange.end cannot be negative");if(this.end<this.pos)throw new Error("TextRange.end cannot be smaller than TextRange.pos");if(this.pos>this.buffer.length)throw new Error("TextRange.pos cannot exceed the associated text buffer length");if(this.end>this.buffer.length)throw new Error("TextRange.end cannot exceed the associated text buffer length")},n.empty=new n("",0,0),n}();var hn=function(){function n(e){this.messageId=e.messageId,this.unformattedText=e.messageText,this.textRange=e.textRange,this.tokenSequence=e.tokenSequence,this.docNode=e.docNode,this._text=void 0}return n._formatMessageText=function(e,t){if(e||(e="An unknown error occurred"),t.pos!==0||t.end!==0){var r=t.getLocation(t.pos);if(r.line)return"(".concat(r.line,",").concat(r.column,"): ")+e}return e},Object.defineProperty(n.prototype,"text",{get:function(){return this._text===void 0&&(this._text=n._formatMessageText(this.unformattedText,this.textRange)),this._text},enumerable:!1,configurable:!0}),n.prototype.toString=function(){return this.text},n}();var Lr=function(){function n(){this._messages=[]}return Object.defineProperty(n.prototype,"messages",{get:function(){return this._messages},enumerable:!1,configurable:!0}),n.prototype.addMessage=function(e){this._messages.push(e)},n.prototype.addMessageForTextRange=function(e,t,r){this.addMessage(new hn({messageId:e,messageText:t,textRange:r}))},n.prototype.addMessageForTokenSequence=function(e,t,r,i){this.addMessage(new hn({messageId:e,messageText:t,textRange:r.getContainingTextRange(),tokenSequence:r,docNode:i}))},n.prototype.addMessageForDocErrorText=function(e){var t;e.textExcerpt?t=e.textExcerpt:t=e.errorLocation,this.addMessage(new hn({messageId:e.messageId,messageText:e.errorMessage,textRange:t.getContainingTextRange(),tokenSequence:t,docNode:e}))},n}();var Hr=function(){function n(e,t){this.commentRange=ze.empty,this.lines=[],this.tokens=[],this.configuration=e,this.sourceRange=t,this.docComment=new Gn({configuration:this.configuration}),this.log=new Lr}return n}();var yt=function(){function n(e){this.parserContext=e.parserContext,this._startIndex=e.startIndex,this._endIndex=e.endIndex,this._validateBounds()}return n.createEmpty=function(e){return new n({parserContext:e,startIndex:0,endIndex:0})},Object.defineProperty(n.prototype,"startIndex",{get:function(){return this._startIndex},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"endIndex",{get:function(){return this._endIndex},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"tokens",{get:function(){return this.parserContext.tokens.slice(this._startIndex,this._endIndex)},enumerable:!1,configurable:!0}),n.prototype.getNewSequence=function(e,t){return new n({parserContext:this.parserContext,startIndex:e,endIndex:t})},n.prototype.getContainingTextRange=function(){return this.isEmpty()?ze.empty:this.parserContext.sourceRange.getNewRange(this.parserContext.tokens[this._startIndex].range.pos,this.parserContext.tokens[this._endIndex-1].range.end)},n.prototype.isEmpty=function(){return this._startIndex===this._endIndex},n.prototype.toString=function(){return this.tokens.map(function(e){return e.toString()}).join("")},n.prototype._validateBounds=function(){if(this.startIndex<0)throw new Error("TokenSequence.startIndex cannot be negative");if(this.endIndex<0)throw new Error("TokenSequence.endIndex cannot be negative");if(this.endIndex<this.startIndex)throw new Error("TokenSequence.endIndex cannot be smaller than TokenSequence.startIndex");if(this.startIndex>this.parserContext.tokens.length)throw new Error("TokenSequence.startIndex cannot exceed the associated token array");if(this.endIndex>this.parserContext.tokens.length)throw new Error("TokenSequence.endIndex cannot exceed the associated token array")},n}();var pe;(function(n){n[n.BeginComment1=0]="BeginComment1",n[n.BeginComment2=1]="BeginComment2",n[n.CollectingFirstLine=2]="CollectingFirstLine",n[n.CollectingLine=3]="CollectingLine",n[n.AdvancingLine=4]="AdvancingLine",n[n.Done=5]="Done"})(pe||(pe={}));var no=function(){function n(){}return n.extract=function(e){for(var t=e.sourceRange,r=t.buffer,i=0,o=0,a=0,l=0,c=t.pos,d=pe.BeginComment1,m=[];d!==pe.Done;){if(c>=t.end)switch(d){case pe.BeginComment1:case pe.BeginComment2:return e.log.addMessageForTextRange(v.CommentNotFound,'Expecting a "/**" comment',t),!1;default:return e.log.addMessageForTextRange(v.CommentMissingClosingDelimiter,"Unexpected end of input",t),!1}var _=r[c],w=c;++c;var b=c<t.end?r[c]:"";switch(d){case pe.BeginComment1:if(_==="/"&&b==="*")i=w,++c,d=pe.BeginComment2;else if(!n._whitespaceCharacterRegExp.test(_))return e.log.addMessageForTextRange(v.CommentOpeningDelimiterSyntax,'Expecting a leading "/**"',t.getNewRange(w,w+1)),!1;break;case pe.BeginComment2:if(_==="*")b===" "&&++c,a=c,l=c,d=pe.CollectingFirstLine Line truncated
`?((d!==pe.CollectingFirstLine||l>a)&&m.push(t.getNewRange(a,l)),a=c,l=c,d=pe.AdvancingLine):_==="*"&&b==="/"?(l>a&&m.push(t.getNewRange(a,l)),a=0,l=0,++c,o=c,d=pe.Done):n._whitespaceCharacterRegExp.test(_)||(l=c);break;case pe.AdvancingLine:_==="*"?b==="/"?(a=0,l=0,++c,o=c,d=pe.Done):(b===" "&&++c,a=c,l=c,d=pe.CollectingLine):_===`
`?(m.push(t.getNewRange(w,w)),a=c):n._whitespaceCharacterRegExp.test(_)||(l=c,d=pe.CollectingLine);break}}return e.commentRange=t.getNewRange(i,o),e.lines=m,!0},n._whitespaceCharacterRegExp=/^\s$/,n}();var An=function(){function n(){}return n.readTokens=function(e){n._ensureInitialized();for(var t=[],r=void 0,i=0,o=e;i<o.length;i++){var a=o[i];n._pushTokensForLine(t,a),r=a}return r?t.push(new Pt(u.EndOfInput,r.getNewRange(r.end,r.end),r)):t.push(new Pt(u.EndOfInput,ze.empty,ze.empty)),t},n.isPunctuation=function(e){return n._ensureInitialized(),n._punctuationTokens[e]||!1},n._pushTokensForLine=function(e,t){for(var r=t.buffer,i=t.end,o=t.pos,a=void 0,l=o;o<i;){var c=r.charCodeAt(o),d=n._charCodeMap[c];d===void 0&&(d=u.Other),a!==void 0&&d===a&&n._isMultiCharacterToken(a)||(a!==void 0&&e.push(new Pt(a,t.getNewRange(l,o),t)),l=o,a=d),++o}a!==void 0&&e.push(new Pt(a,t.getNewRange(l,o),t)),e.push(new Pt(u.Newline,t.getNewRange(t.end,t.end),t))},n._isMultiCharacterToken=function(e){switch(e){case u.Spacing:case u.AsciiWord:case u.Other:return!0}return!1},n._ensureInitialized=function(){if(!n._charCodeMap){n._charCodeMap={},n._punctuationTokens={};for(var e=n._commonMarkPunctuationCharacters,t=0;t<e.length;++t){var r=e.charCodeAt(t);n._charCodeMap[r]=u.OtherPunctuation}for(var i={"\\":u.Backslash,"<":u.LessThan,">":u.GreaterThan,"=":u.Equals,"'":u.SingleQuote,'"':u.DoubleQuote,"/":u.Slash,"-":u.Hyphen,"@":u.AtSign,"{":u.LeftCurlyBracket,"}":u.RightCurlyBracket,"`":u.Backtick,".":u.Period,":":u.Colon,",":u.Comma,"[":u.LeftSquareBracket,"]":u.RightSquareBracket,"|":u.Pipe,"(":u.LeftParenthesis,")":u.RightParenthesis,"#":u.PoundSymbol,"+":u.Plus,$:u.DollarSign},o=0,a=Object.getOwnPropertyNames(i);o<a.length;o++){var l=a[o];n._charCodeMap[l.charCodeAt(0)]=i[l],n._punctuationTokens[i[l]]=!0}n._punctuationTokens[u.OtherPunctuation]=!0;for(var c=n._wordCharacters,t=0;t<c.length;++t){var r=c.charCodeAt(t);n._charCodeMap[r]=u.AsciiWord}n._charCodeMap[" ".charCodeAt(0)]=u.Spacing,n._charCodeMap[" ".charCodeAt(0)]=u.Spacing}},n._commonMarkPunctuationCharacters="!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~",n._wordCharacters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_",n}();var $r=function(){function n(e,t){if(this._parserContext=e,this.tokens=e.tokens,t){if(t.parserContext!==this._parserContext)throw new Error("The embeddedTokenSequence must use the same parser context");this._readerStartIndex=t.startIndex,this._readerEndIndex=t.endIndex}else this._readerStartIndex=0,this._readerEndIndex=this.tokens.length;this._currentIndex=this._readerStartIndex,this._accumulatedStartIndex=this._readerStartIndex}return n.prototype.extractAccumulatedSequence=function(){if(this._accumulatedStartIndex===this._currentIndex)throw new Error("Parser assertion failed: The queue should not be empty when extractAccumulatedSequence() is called");var e=new yt({parserContext:this._parserContext,startIndex:this._accumulatedStartIndex,endIndex:this._currentIndex});return this._accumulatedStartIndex=this._currentIndex,e},n.prototype.isAccumulatedSequenceEmpty=function(){return this._accumulatedStartIndex===this._currentIndex},n.prototype.tryExtractAccumulatedSequence=function(){if(!this.isAccumulatedSequenceEmpty())return this.extractAccumulatedSequence()},n.prototype.assertAccumulatedSequenceIsEmpty=function(){if(!this.isAccumulatedSequenceEmpty()){var e=new yt({parserContext:this._parserContext,startIndex:this._accumulatedStartIndex,endIndex:this._currentIndex}),t=e.tokens.map(function(r){return r.toString()});throw new Error(`Parser assertion failed: The queue should be empty, but it contains:
`+JSON.stringify(t))}},n.prototype.peekToken=function(){return this.tokens[this._currentIndex]},n.prototype.peekTokenKind=function(){return this._currentIndex>=this._readerEndIndex?u.EndOfInput:this.tokens[this._currentIndex].kind},n.prototype.peekTokenAfterKind=function(){return this._currentIndex+1>=this._readerEndIndex?u.EndOfInput:this.tokens[this._currentIndex+1].kind},n.prototype.peekTokenAfterAfterKind=function(){return this._currentIndex+2>=this._readerEndIndex?u.EndOfInput:this.tokens[this._currentIndex+2].kind},n.prototype.readToken=function(){if(this._currentIndex>=this._readerEndIndex)throw new Error("Cannot read past end of stream");var e=this.tokens[this._currentIndex];if(e.kind===u.EndOfInput)throw new Error("The EndOfInput token cannot be read");return this._currentIndex++,e},n.prototype.peekPreviousTokenKind=function(){return this._currentIndex===0?u.EndOfInput:this.tokens[this._currentIndex-1].kind},n.prototype.createMarker=function(){return this._currentIndex},n.prototype.backtrackToMarker=function(e){if(e>this._currentIndex)throw new Error("The marker has expired");this._currentIndex=e,e<this._accumulatedStartIndex&&(this._accumulatedStartIndex=e)},n}();var lr=function(){return lr=Object.assign||function(n){for(var e,t=1,r=arguments.length;t<r;t++){e=arguments[t];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(n[i]=e[i])}return n},lr.apply(this,arguments)};function _n(n){return n!==void 0&&Object.hasOwnProperty.call(n,"failureMessage")}var ro=function(){function n(e){this._parserContext=e,this._configuration=e.configuration,this._currentSection=e.docComment.summarySection}return n.prototype.parse=function(){for(var e=new $r(this._parserContext),t=!1;!t;)switch(e.peekTokenKind()){case u.EndOfInput:t=!0;break;case u.Newline:this._pushAccumulatedPlainText(e),e.readToken(),this._pushNode(new rr({parsed:!0,configuration:this._configuration,softBreakExcerpt:e.extractAccumulatedSequence()}));break;case u.Backslash:this._pushAccumulatedPlainText(e),this._pushNode(this._parseBackslashEscape(e));break;case u.AtSign:this._pushAccumulatedPlainText(e),this._parseAndPushBlock(e);break;case u.LeftCurlyBracket:{this._pushAccumulatedPlainText(e);var r=e.createMarker(),i=this._parseInlineTag(e),o=this._parserContext.docComment;if(i instanceof dn){var a=e.createMarker()-1;o.inheritDocTag===void 0?this._parserContext.docComment.inheritDocTag=i:this._pushNode(this._backtrackAndCreateErrorRange(e,r,a,v.ExtraInheritDocTag,"A doc comment cannot have more than one @inheritDoc tag"))}else this._pushNode(i);break}case u.RightCurlyBracket:this._pushAccumulatedPlainText(e),this._pushNode(this._createError(e,v.EscapeRightBrace,'The "}" character should be escaped using a backslash to avoid confusion with a TSDoc inline tag'));break;case u.LessThan:this._pushAccumulatedPlainText(e),e.peekTokenAfterKind()===u.Slash?this._pushNode(this._parseHtmlEndTag(e)):this._pushNode(this._parseHtmlStartTag(e));break;case u.GreaterThan:this._pushAccumulatedPlainText(e),this._pushNode(this._createError(e,v.EscapeGreaterThan,'The ">" character should be escaped using a backslash to avoid confusion with an HTML tag'));break;case u.Backtick:this._pushAccumulatedPlainText(e),e.peekTokenAfterKind()===u.Backtick&&e.peekTokenAfterAfterKind()===u.Backtick?this._pushNode(this._parseFencedCode(e)):this._pushNode(this._parseCodeSpan(e));break;default:e.readToken();break}this._pushAccumulatedPlainText(e),this._performValidationChecks()},n.prototype._performValidationChecks=function(){var e=this._parserContext.docComment;e.deprecatedBlock&&(cr.hasAnyTextContent(e.deprecatedBlock)||this._parserContext.log.addMessageForTokenSequence(v.MissingDeprecationMessage,"The ".concat(e.deprecatedBlock.blockTag.tagName," block must include a deprecation message,")+" e.g. describing the recommended alternative",e.deprecatedBlock.blockTag.getTokenSequence(),e.deprecatedBlock)),e.inheritDocTag&&(e.remarksBlock&&this._parserContext.log.addMessageForTokenSequence(v.InheritDocIncompatibleTag,'A "'.concat(e.remarksBlock.blockTag.tagName,'" block must not be used, because that')+" content is provided by the @inheritDoc tag",e.remarksBlock.blockTag.getTokenSequence(),e.remarksBlock.blockTag),cr.hasAnyTextContent(e.summarySection)&&this._parserContext.log.addMessageForTextRange(v.InheritDocIncompatibleSummary,"The summary section must not have any content, because that content is provided by the @inheritDoc tag",this._parserContext.commentRange))},n.prototype._validateTagDefinition=function(e,t,r,i,o){if(e){var a=e.syntaxKind===R.InlineTag;a!==r?r?this._parserContext.log.addMessageForTokenSequence(v.TagShouldNotHaveBraces,'The TSDoc tag "'.concat(t,'" is not an inline tag; it must not be enclosed in "{ }" braces'),i,o):this._parserContext.log.addMessageForTokenSequence(v.InlineTagMissingBraces,'The TSDoc tag "'.concat(t,'" is an inline tag; it must be enclosed in "{ }" braces'),i,o):this._parserContext.configuration.validation.reportUnsupportedTags&&(this._ Line truncated
`)).join(`
`)}catch{console.error("Failed to parse summary section")}}function ss(n){if(!n)return"";try{return n.content.nodes[0].getChildNodes()[0].text.trim()}catch{return""}}function cs(n){try{return n.blocks.map(r=>{let i=r.parameterName,o=r.content.getChildNodes()[0].getChildNodes().filter(a=>a instanceof Ve).map(a=>a.text).join(" ");return new Yr(i,o)})}catch{return[]}}function Mt(n,e,t){if(t<0||t===n.length)return;let r=n[e];n[e]=n[t],n[t]=r}function Xt(n){return n.workspace.activeEditor?.file??n.workspace.getActiveFile()}function lo(n){let e=n.lastIndexOf("/");return e!==-1?n.slice(0,e):""}function xn(n){return n!==null&&typeof n=="object"}function po(n){let e=n.toString(),t=e.indexOf("(");return e.substring(t+1,e.indexOf(")")).replace(/ /g,"").split(",")}function Ur(n,e,t){let r=n instanceof HTMLOListElement?"li":"p",i=n.createEl(r),o=n.createEl("b",{text:e});return i.appendChild(o),i.appendChild(document.createTextNode(`: ${t}`)),i}function pr(n,e){if(Object.keys(e).length!==0){for(let t in e)if(e.hasOwnProperty(t))if(n.hasOwnProperty(t)){let r=n[t],i=e[t];if(Array.isArray(r)||Array.isArray(i)){let o=Array.isArray(r)?r:[r],a=Array.isArray(i)?i:[i];n[t]=o.concat(a).unique()}else xn(r)&&xn(i)?pr(r,i):i!=null&&i!==""&&(n[t]=i)}else n[t]=e[t]}}function yn(n){let e={},t=(0,Te.getFrontMatterInfo)(n);return t.frontmatter&&(e=(0,Te.parseYaml)(t.frontmatter)),{frontmatter:e,content:n.slice(t.contentStart)}}var Bo=X(require("obsidian"));var Mo=X(require("obsidian"));var ie="top",ue="bottom",ce="right",ae="left",ur="auto",vt=[ie,ue,ce,ae],pt="start",Ot="end",uo="clippingParents",fr="viewport",Zt="popper",fo="reference",Gr=vt.reduce(function(n,e){return n.concat([e+"-"+pt,e+"-"+Ot])},[]),dr=[].concat(vt,[ur]).reduce(function(n,e){return n.concat([e,e+"-"+pt,e+"-"+Ot])},[]),ls="beforeRead",ps="read",us="afterRead",fs="beforeMain",ds="main",ms="afterMain",gs="beforeWrite",hs="write",As="afterWrite",mo=[ls,ps,us,fs,ds,ms,gs,hs,As];function me(n){return n?(n.nodeName||"").toLowerCase():null}function Z(n){if(n==null)return window;if(n.toString()!=="[object Window]"){var e=n.ownerDocument;return e&&e.defaultView||window}return n}function Me(n){var e=Z(n).Element;return n instanceof e||n instanceof Element}function fe(n){var e=Z(n).HTMLElement;return n instanceof e||n instanceof HTMLElement}function en(n){if(typeof ShadowRoot=="undefined")return!1;var e=Z(n).ShadowRoot;return n instanceof e||n instanceof ShadowRoot}function _s(n){var e=n.state;Object.keys(e.elements).forEach(function(t){var r=e.styles[t]||{},i=e.attributes[t]||{},o=e.elements[t];!fe(o)||!me(o)||(Object.assign(o.style,r),Object.keys(i).forEach(function(a){var l=i[a];l===!1?o.removeAttribute(a):o.setAttribute(a,l===!0?"":l)}))})}function xs(n){var e=n.state,t={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,t.popper),e.styles=t,e.elements.arrow&&Object.assign(e.elements.arrow.style,t.arrow),function(){Object.keys(e.elements).forEach(function(r){var i=e.elements[r],o=e.attributes[r]||{},a=Object.keys(e.styles.hasOwnProperty(r)?e.styles[r]:t[r]),l=a.reduce(function(c,d){return c[d]="",c},{});!fe(i)||!me(i)||(Object.assign(i.style,l),Object.keys(o).forEach(function(c){i.removeAttribute(c)}))})}}var go={name:"applyStyles",enabled:!0,phase:"write",fn:_s,effect:xs,requires:["computeStyles"]};function ge(n){return n.split("-")[0]}var qe=Math.max,Bt=Math.min,ut=Math.round;function tn(){var n=navigator.userAgentData;return n!=null&&n.brands&&Array.isArray(n.brands)?n.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function jn(){return!/^((?!chrome|android).)*safari/i.test(tn())}function Oe(n,e,t){e===void 0&&(e=!1),t===void 0&&(t=!1);var r=n.getBoundingClientRect(),i=1,o=1;e&&fe(n)&&(i=n.offsetWidth>0&&ut(r.width)/n.offsetWidth||1,o=n.offsetHeight>0&&ut(r.height)/n.offsetHeight||1);var a=Me(n)?Z(n):window,l=a.visualViewport,c=!jn()&&t,d=(r.left+(c&&l?l.offsetLeft:0))/i,m=(r.top+(c&&l?l.offsetTop:0))/o,_=r.width/i,w=r.height/o;return{width:_,height:w,top:m,right:d+_,bottom:m+w,left:d,x:d,y:m}}function It(n){var e=Oe(n),t=n.offsetWidth,r=n.offsetHeight;return Math.abs(e.width-t)<=1&&(t=e.width),Math.abs(e.height-r)<=1&&(r=e.height),{x:n.offsetLeft,y:n.offsetTop,width:t,height:r}}function vn(n,e){var t=e.getRootNode&&e.getRootNode();if(n.contains(e))return!0;if(t&&en(t)){var r=e;do{if(r&&n.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function we(n){return Z(n).getComputedStyle(n)}function Wr(n){return["table","td","th"].indexOf(me(n))>=0}function Ae(n){return((Me(n)?n.ownerDocument:n.document)||window.document).documentElement}function ft(n){return me(n)==="html"?n:n.assignedSlot||n.parentNode||(en(n)?n.host:null)||Ae(n)}function ho(n){return!fe(n)||we(n).position==="fixed"?null:n.offsetParent}function ys(n){var e=/firefox/i.test(tn()),t=/Trident/i.test(tn());if(t&&fe(n)){var r=we(n);if(r.position==="fixed")return nu Line truncated
> \u2014 ${o}`}catch{return new P("Error generating daily quote"),"Error generating daily quote"}}}generate_random_picture(){return async(e,t,r=!1)=>{try{let i=await this.getRequest(`https://templater-unsplash-2.fly.dev/${t?"?q="+t:""}`).then(a=>a.json),o=i.full;if(e&&!r)if(e.includes("x")){let[a,l]=e.split("x");o=o.concat(`&w=${a}&h=${l}`)}else o=o.concat(`&w=${e}`);return r?`![photo by ${i.photog}(${i.photogUrl}) on Unsplash|${e}](${o})`:`![photo by ${i.photog}(${i.photogUrl}) on Unsplash](${o})`}catch{return new P("Error generating random picture"),"Error generating random picture"}}}generate_request(){return async(e,t)=>{try{let i=await(await this.getRequest(e)).json;return t&&i?t.split(".").reduce((o,a)=>{if(o&&o.hasOwnProperty(a))return o[a];throw new Error(`Path ${t} not found in the JSON response`)},i):i}catch(r){throw console.error(r),new P("Error fetching and extracting value")}}}};var ui=class extends be{constructor(){super(...arguments);this.name="hooks";this.event_refs=[]}async create_static_templates(){this.static_functions.set("on_all_templates_executed",this.generate_on_all_templates_executed())}async create_dynamic_templates(){}async teardown(){this.event_refs.forEach(e=>{e.e.offref(e)}),this.event_refs=[]}generate_on_all_templates_executed(){return e=>{let t=this.plugin.app.workspace.on("templater:all-templates-executed",async()=>{await jt(1),e()});t&&this.event_refs.push(t)}}};var fi=class extends be{constructor(){super(...arguments);this.name="frontmatter"}async create_static_templates(){}async create_dynamic_templates(){let e=this.plugin.app.metadataCache.getFileCache(this.config.target_file);this.dynamic_functions=new Map(Object.entries(e?.frontmatter||{}))}async teardown(){}};var Qe=X(require("obsidian"));var di=class extends Qe.Modal{constructor(e,t,r,i){super(e);this.prompt_text=t;this.default_value=r;this.multi_line=i;this.submitted=!1}onOpen(){this.titleEl.setText(this.prompt_text),this.createForm()}onClose(){this.contentEl.empty(),this.submitted||this.reject(new P("Cancelled prompt"))}createForm(){let e=this.contentEl.createDiv();e.addClass("templater-prompt-div");let t;if(this.multi_line){t=new Qe.TextAreaComponent(e);let r=this.contentEl.createDiv();r.addClass("templater-button-div");let i=new Qe.ButtonComponent(r);i.buttonEl.addClass("mod-cta"),i.setButtonText("Submit").onClick(o=>{this.resolveAndClose(o)})}else t=new Qe.TextComponent(e);this.value=this.default_value??"",t.inputEl.addClass("templater-prompt-input"),t.setPlaceholder("Type text here"),t.setValue(this.value),t.onChange(r=>this.value=r),t.inputEl.focus(),t.inputEl.addEventListener("keydown",r=>this.enterCallback(r))}enterCallback(e){e.isComposing||e.keyCode===229||(this.multi_line?Qe.Platform.isDesktop&&e.key==="Enter"&&!e.shiftKey&&this.resolveAndClose(e):e.key==="Enter"&&this.resolveAndClose(e))}resolveAndClose(e){this.submitted=!0,e.preventDefault(),this.resolve(this.value),this.close()}async openAndGetValue(e,t){this.resolve=e,this.reject=t,this.open()}};var Uo=X(require("obsidian")),mi=class extends Uo.FuzzySuggestModal{constructor(e,t,r,i,o){super(e);this.text_items=t;this.items=r;this.submitted=!1;this.setPlaceholder(i),o&&(this.limit=o)}getItems(){return this.items}onClose(){this.submitted||this.reject(new P("Cancelled prompt"))}selectSuggestion(e,t){this.submitted=!0,this.close(),this.onChooseSuggestion(e,t)}getItemText(e){return this.text_items instanceof Function?this.text_items(e):this.text_items[this.items.indexOf(e)]||"Undefined Text Item"}onChooseItem(e){this.resolve(e)}async openAndGetValue(e,t){this.resolve=e,this.reject=t,this.open()}};var De=X(require("obsidian")),gi=class extends De.Modal{constructor(e,t,r,i,o){super(e);this.text_items=t;this.items=r;this.submitted=!1;this.selectedItems=[];this.setTitle(i),this.listEl=this.contentEl.createDiv("templater-multisuggester-list");let a=this.contentEl.createDiv("templater-multisuggester-div"),l=new De.TextComponent(a);l.inputEl.addClass("templater-multisuggester-input"),this.suggester=new Go(e,l.inputEl,this.getItemText.bind(this),r,o).onSelect(this.onChooseItem.bind(this));let c=this.contentEl.createDiv("modal-button-container");new De.ButtonComponent(c).setButtonText("Save").setCta().onClick(()=>this.save()),new De.ButtonComponent(c).setButtonText("Cancel").onClick(()=>this.close())}onOpen(){this.display()}display(){this.listEl.empty(),this.selectedItems.forEach(e=>{let t=this.listEl.createDiv("mobile-option-setting-item");t.createSpan("mobile-option-setting-item-name").setText(this.getItemText(e)),t.createDiv("clickable-icon mobile-option-setting-item-option-icon",r=>{(0,De.setIcon)(r,"lucide-x"),r.addEventListener("click",()=>{this.onRemoveItem(e)})})})}getItemText(e){return this.text_items instanceof Function?this.text_items(e):this.text_items[this.items.indexOf(e)]||"Undefined Text Item"}onChooseItem(e){this.selectedItems.push(e);let t=this.items.filter(r=>!this.selectedItems.some(i=>i===r));this.suggester.setItems(t),this.display()}onRemoveIt Line truncated
})`)(r,o,i)}catch(c){throw new P(`Failed to load user script at "${e.path}".`,c.message)}let l=i.default??o.exports;if(!l)throw new P(`Failed to load user script at "${e.path}". No exports detected.`);if(typeof l=="function")t.set(e.basename,l);else if(typeof l=="object"&&l!==null){if(!Object.values(l).every(d=>typeof d=="function"))throw new P(`Exported object in "${e.path}" must contain only functions.`);t.set(e.basename,l)}else throw new P(`Invalid export in "${e.path}". Must be a function or object of functions.`)}async generate_object(){let e=await this.generate_user_script_functions();return Object.fromEntries(e)}};var ji=class{constructor(e){this.plugin=e;this.user_system_functions=new xi(e),this.user_script_functions=new yi(e)}async generate_object(e){let t={},r={};return this.plugin.settings.enable_system_commands&&(t=await this.user_system_functions.generate_object(e)),this.plugin.settings.user_scripts_folder&&(r=await this.user_script_functions.generate_object()),{...t,...r}}};var Rs=X(require("obsidian")),Xe;(function(t){t[t.INTERNAL=0]="INTERNAL",t[t.USER_INTERNAL=1]="USER_INTERNAL"})(Xe||(Xe={}));var vi=class{constructor(e){this.plugin=e;this.internal_functions=new _i(this.plugin),this.user_functions=new ji(this.plugin)}async init(){await this.internal_functions.init()}async teardown(){await this.internal_functions.teardown()}additional_functions(){return{app:this.plugin.app,obsidian:Rs}}async generate_object(e,t=1){let r={},i=this.additional_functions(),o=await this.internal_functions.generate_object(e),a={};switch(Object.assign(r,i),t){case 0:Object.assign(r,o);break;case 1:a=await this.user_functions.generate_object(e),Object.assign(r,{...o,user:a});break}return r}};var Zs={},M,Ke=new Array(32).fill(void 0);Ke.push(void 0,null,!0,!1);function Pe(n){return Ke[n]}var Dn=Ke.length;function Ys(n){n<36||(Ke[n]=Dn,Dn=n)}function wi(n){let e=Pe(n);return Ys(n),e}var Wo=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});Wo.decode();var _r=new Uint8Array;function xr(){return _r.byteLength===0&&(_r=new Uint8Array(M.memory.buffer)),_r}function bt(n,e){return Wo.decode(xr().subarray(n,n+e))}function Et(n){Dn===Ke.length&&Ke.push(Ke.length+1);let e=Dn;return Dn=Ke[e],Ke[e]=n,e}var Re=0,yr=new TextEncoder("utf-8"),Us=typeof yr.encodeInto=="function"?function(n,e){return yr.encodeInto(n,e)}:function(n,e){let t=yr.encode(n);return e.set(t),{read:n.length,written:t.length}};function gt(n,e,t){if(t===void 0){let l=yr.encode(n),c=e(l.length);return xr().subarray(c,c+l.length).set(l),Re=l.length,c}let r=n.length,i=e(r),o=xr(),a=0;for(;a<r;a++){let l=n.charCodeAt(a);if(l>127)break;o[i+a]=l}if(a!==r){a!==0&&(n=n.slice(a)),i=t(i,r,r=a+n.length*3);let l=xr().subarray(i+a,i+r);a+=Us(n,l).written}return Re=a,i}function Gs(n){return n==null}var jr=new Int32Array;function Ne(){return jr.byteLength===0&&(jr=new Int32Array(M.memory.buffer)),jr}function bi(n){let e=typeof n;if(e=="number"||e=="boolean"||n==null)return`${n}`;if(e=="string")return`"${n}"`;if(e=="symbol"){let i=n.description;return i==null?"Symbol":`Symbol(${i})`}if(e=="function"){let i=n.name;return typeof i=="string"&&i.length>0?`Function(${i})`:"Function"}if(Array.isArray(n)){let i=n.length,o="[";i>0&&(o+=bi(n[0]));for(let a=1;a<i;a++)o+=", "+bi(n[a]);return o+="]",o}let t=/\[object ([^\]]+)\]/.exec(toString.call(n)),r;if(t.length>1)r=t[1];else return toString.call(n);if(r=="Object")try{return"Object("+JSON.stringify(n)+")"}catch{return"Object"}return n instanceof Error?`${n.name}: ${n.message}
${n.stack}`:r}function Ws(n,e){if(!(n instanceof e))throw new Error(`expected instance of ${e.name}`);return n.ptr}var vr=32;function Vs(n){if(vr==1)throw new Error("out of js stack");return Ke[--vr]=n,vr}function Ei(n,e){try{return n.apply(this,e)}catch(t){M.__wbindgen_exn_store(Et(t))}}var Kt=class{static __wrap(e){let t=Object.create(Kt.prototype);return t.ptr=e,t}__destroy_into_raw(){let e=this.ptr;return this.ptr=0,e}free(){let e=this.__destroy_into_raw();M.__wbg_parserconfig_free(e)}get interpolate(){let e=M.__wbg_get_parserconfig_interpolate(this.ptr);return String.fromCodePoint(e)}set interpolate(e){M.__wbg_set_parserconfig_interpolate(this.ptr,e.codePointAt(0))}get execution(){let e=M.__wbg_get_parserconfig_execution(this.ptr);return String.fromCodePoint(e)}set execution(e){M.__wbg_set_parserconfig_execution(this.ptr,e.codePointAt(0))}get single_whitespace(){let e=M.__wbg_get_parserconfig_single_whitespace(this.ptr);return String.fromCodePoint(e)}set single_whitespace(e){M.__wbg_set_parserconfig_single_whitespace(this.ptr,e.codePointAt(0))}get multiple_whitespace(){let e=M.__wbg_get_parserconfig_multiple_whitespace(this.ptr);return String.fromCodePoint(e)}set multiple_whitespace(e){M.__wbg_set_parserconfig_multiple_whitespace(this.ptr,e.codePointAt(0))}constructor(e,t,r,i,o,a,l){let c=gt(e,M.__wbindgen_malloc,M.__wbindgen_realloc),d=Re,m=gt(t,M.__wbindgen_malloc,M.__wbindgen_realloc),_=Re,w=gt(l,M.__wbindgen_malloc,M.__wbindgen_realloc),b=Re,S=M.parserconfig_new(c,d,m,_,r.codePointAt(0),i.codePointAt(0),o.codePointAt(0),a.codePointAt(0),w,b);return Kt.__wrap(S)}get opening_tag(){try{let r=M.__wbindgen_add_to_stack_pointer(-16);M.parserconfig_opening_tag(r,this.ptr);var e=Ne()[r/4+0],t=Ne()[r/4+1];return bt(e,t)}finally{M.__wbindgen_add_to_stack_pointer(16),M.__wbindgen_free(e,t)}}set opening_tag(e){let t=gt(e,M.__wbindgen_malloc,M.__wbindgen_realloc),r=Re;M.parserconfig_set_opening_tag(this.ptr,t,r)}get closing_tag(){try{let r=M.__wbindgen_add_to_stack_pointer(-16);M.parserconfig_closing_tag(r,this.ptr);var e=Ne()[r/4+0],t=Ne()[r/4+1];return bt(e,t)}finally{M.__wbindgen_add_to_stack_pointer(16),M.__wbindgen_free(e,t)}}set closing_tag(e){let t=gt(e,M.__wbindgen_malloc,M.__wbindgen_realloc),r=Re;M.parserconfig_set_closing_tag(this.ptr,t,r)}get global_var(){try{let r=M.__wbindgen_add_to_stack_pointer(-16);M.parserconfig_global_var(r,this.ptr);var e=Ne()[r/4+0],t=Ne()[r/4+1];return bt(e,t)}finally{M.__wbindgen_add_to_stack_pointer(16),M.__wbindgen_free(e,t)}}set global_var(e){let t=gt(e,M.__wbindgen_malloc,M.__wbindgen_realloc),r=Re;M.parserconfig_set_global_var(this.ptr,t,r)}},sn=class{static __wrap(e){let t=Object.create(sn.prototype);return t.ptr=e,t}__destroy_into_raw(){let e=this.ptr;return this.ptr=0,e}free(){let e=this.__destroy_into_raw();M.__wbg_renderer_free(e)}constructor(e){Ws(e,Kt);var t=e.ptr;e.ptr=0;let r=M.renderer_new(t);return sn.__wrap(r)}render_content(e,t){try{let a=M.__wbindgen_add_to_stack_pointer(-16),l=gt(e,M.__wbindgen_malloc,M.__wbindgen_realloc),c=Re;M.renderer_render_content(a,this.ptr,l,c,Vs(t));var r=Ne()[a/4+0],i=Ne()[a/4+1],o=Ne()[a/4+2];if(o)throw wi(i);return wi(r)}finally{M.__wbindgen_add_to_stack_pointer(16),Ke[vr++]=void 0}}};async function zs(n,e){if(typeof Response=="function"&&n instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(n,e)}catch(r){if(n.headers.get("Content-Type")!="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}let t=await n.arrayBuffer();return await WebAssembly.instantiate(t,e)}else{let t=await WebAssembly.instantiate(n,e);return t instanceof WebAssembly.Instance?{instance:t,module:n}:t}}function Js(){let n={};return n.wbg={},n.wbg.__wbindgen_object_drop_ref=function(e){wi(e)},n.wbg.__wbindgen_string_new=function(e,t){let r=bt(e,t);return Et(r)},n.wbg.__wbindgen_string_get=function(e,t){let r=Pe(t),i=typeof r=="string"?r:void 0;var o=Gs(i)?0:gt(i,M.__wbindgen_malloc,M.__wbindgen_realloc),a=Re;Ne()[e/4+1]=a,Ne()[e/4+0]=o},n.wbg.__wbg_call_97ae9d8645dc388b=function(){return Ei(function(e,t){let r=Pe(e).call(Pe(t));return Et(r)},arguments)},n.wbg.__wbg_new_8d2af00bc1e329ee=function(e,t){let r=new Error(bt(e,t));return Et(r)},n.wbg.__wbg_message_fe2af63ccc8985bc=function(e){let t=Pe(e).message;return Et(t)},n.wbg.__wbg_newwithargs_8fe23e3842840c8e=function(e,t,r,i){let o=new Function(bt(e,t),bt(r,i));return Et(o)},n.wbg.__wbg_call_168da88779e35f61=function(){return Ei(function(e,t,r){let i=Pe(e).call(Pe(t),Pe(r));return Et(i)},arguments)},n.wbg.__wbg_call_3999bee59e9f7719=function(){return Ei(function(e,t,r,i){let o=Pe(e).call(Pe(t),Pe(r),Pe(i));return Et(o)},arguments)},n.wbg.__wbindgen_debug_string=function(e,t){let r=bi(Pe(t)),i=gt(r,M.__wbindgen_malloc,M.__wbindgen_realloc),o=Re;Ne Line truncated
${(0,de.stringifyYaml)(b)}---
`),_+=w+d,o.editor.setValue(_),o.editor.setSelection({line:0,ch:0},{line:0,ch:0}),await jt(100),await i.save()}else await this.plugin.app.vault.process(t,_=>{let w="",{content:b,frontmatter:S}=yn(_);return pr(S,m),Object.keys(S).length>0&&(w+=`---
${(0,de.stringifyYaml)(S)}---
`),w+=b+d,c=w,w});this.plugin.app.workspace.trigger("templater:new-note-from-template",{file:t,content:c}),await this.plugin.editor_handler.jump_to_next_cursor_location(t,!0),await this.end_templater_task(r)}overwrite_active_file_commands(){let e=this.plugin.app.workspace.activeEditor;if(!e||!e.file){oe(new P("Active editor is null, can't overwrite content"));return}this.overwrite_file_commands(e.file,!0)}async overwrite_file_commands(e,t=!1){let{path:r}=e;this.start_templater_task(r);let i=this.create_running_config(e,e,t?3:2),o=await Se(async()=>this.read_and_parse_template(i),"Template parsing error, aborting.");if(o==null){await this.end_templater_task(r);return}await this.plugin.app.vault.modify(e,o),this.plugin.app.workspace.trigger("templater:overwrite-file",{file:e,content:o}),await this.plugin.editor_handler.jump_to_next_cursor_location(e,!0),await this.end_templater_task(r)}async process_dynamic_templates(e,t){let r=so(),i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT),o,a=!1,l;for(;o=i.nextNode();){let c=o.nodeValue;if(c!==null){let d=r.exec(c);if(d!==null){let m=this.plugin.app.metadataCache.getFirstLinkpathDest("",t.sourcePath);if(!m||!(m instanceof de.TFile))return;if(!a){a=!0;let _=this.create_running_config(m,m,4);l=await this.functions_generator.generate_object(_,Xe.USER_INTERNAL),this.current_functions_object=l}}for(;d!=null;){let m=d[1]+d[2],_=await Se(async()=>await this.parser.parse_commands(m,l),`Command Parsing error in dynamic command '${m}'`);if(_==null)return;let w=r.lastIndex-d[0].length,b=r.lastIndex;c=c.substring(0,w)+_+c.substring(b),r.lastIndex+=_.length-d[0].length,d=r.exec(c)}o.nodeValue=c}}}get_new_file_template_for_folder(e){do{let t=this.plugin.settings.folder_templates.find(r=>r.folder==e.path);if(t&&t.template)return t.template;e=e.parent}while(e)}get_new_file_template_for_file(e){let t=this.plugin.settings.file_templates.find(r=>new RegExp(r.regex).test(e.path));if(t&&t.template)return t.template}static async on_file_creation(e,t,r){if(!(r instanceof de.TFile)||r.extension!=="md")return;let i=(0,de.normalizePath)(e.plugin.settings.templates_folder);if(r.path.includes(i)&&i!=="/"||(await jt(300),e.files_with_pending_templates.has(r.path)))return;let o=await t.vault.read(r),a=(0,de.getFrontMatterInfo)(o),l=o.length-a.contentStart;if(l==0&&e.plugin.settings.enable_folder_templates){let c=e.get_new_file_template_for_folder(r.parent);if(!c)return;let d=await Se(async()=>Nt(t,c),`Couldn't find template ${c}`);if(d==null)return;await e.write_template_to_file(d,r)}else if(l==0&&e.plugin.settings.enable_file_templates){let c=e.get_new_file_template_for_file(r);if(!c)return;let d=await Se(async()=>Nt(t,c),`Couldn't find template ${c}`);if(d==null)return;await e.write_template_to_file(d,r)}else{let c=1e5;r.stat.size<=c?await e.overwrite_file_commands(r):console.log(`Templater skipped parsing ${r.path} because file size exceeds ${c}`)}}async execute_startup_scripts(){for(let e of this.plugin.settings.startup_templates){if(!e)continue;let t=Ce(()=>Nt(this.plugin.app,e),`Couldn't find startup template "${e}"`);if(!t)continue;let{path:r}=t;this.start_templater_task(r);let i=this.create_running_config(t,t,5);await Se(async()=>this.read_and_parse_template(i),"Startup Template parsing error, aborting."),await this.end_templater_task(r)}}};var Qo=X(require("obsidian")),wr=class{constructor(e,t,r){this.plugin=e;this.templater=t;this.settings=r}setup(){Array.isArray(this.plugin.app.workspace.onLayoutReadyCallbacks)?this.plugin.app.workspace.onLayoutReadyCallbacks.unshift({pluginId:this.plugin.manifest.id,callback:()=>{this.update_trigger_file_on_creation()}}):this.plugin.app.workspace.onLayoutReady(()=>{this.update_trigger_file_on_creation()}),this.update_syntax_highlighting(),this.update_file_menu()}update_syntax_highlighting(){let e=this.plugin.editor_handler.desktopShouldHighlight(),t=this.plugin.editor_handler.mobileShouldHighlight();e||t?this.plugin.editor_handler.enable_highlighter():this.plugin.editor_handler.disable_highlighter()}update_trigger_file_on_creation(){this.settings.trigger_on_file_creation?(this.trigger_on_file_creation_event=this.plugin.app.vault.on("create",e=>Pn.on_file_creation(this.templater,this.plugin.app,e)),this.plugin.registerEvent(this.trigger_on_file_creation_event)):this.trigger_on_file_creation_event&&(this.plugin.app.vault.offref(this.trigger_on_file_creation_event),this.trigger_on_file_creation_event=void 0)}update_file_menu(){this.plugin.registerEvent(this.plugin.app.workspace.on("file-menu",(e,t)=>{t instanceof Qo.TFolder&&e.addItem(r=>{r.setTitle("Create new note from template").setIcon("templater-icon").onClick(()=>{this.plugin.fuzzy_suggester.create_new_note_from_template(t)})})}))}};var br=X(require("obsidian"));var ki=class{constructor(e){this.plugin=e}setup(){this.plugin.addCommand({id:"insert-templater",name:"Open insert template modal",icon:"templater-icon",hotkeys:br.Platform.isMacOS?void 0:[{modifiers:["Alt"],key:"e"}],callback:()=>{thi Line truncated
`,a+1))!==-1;i++,o=a);o+=1;let l=e.slice(o,t).length;return{line:i,ch:l}}replace_and_get_cursor_positions(e){let t=[],r,i=new RegExp("<%\\s*tp.file.cursor\\((?<order>[0-9]*)\\)\\s*%>","g");for(;(r=i.exec(e))!=null;)t.push(r);if(t.length===0)return{};t.sort((c,d)=>Number(c.groups&&c.groups.order)-Number(d.groups&&d.groups.order));let o=t[0][0];t=t.filter(c=>c[0]===o);let a=[],l=0;for(let c of t){let d=c.index-l;if(a.push(this.get_editor_position_from_index(e,d)),e=e.replace(new RegExp(ao(c[0])),""),l+=c[0].length,c[1]==="")break}return{new_content:e,positions:a}}set_cursor_location(e){let t=this.app.workspace.activeEditor;if(!t||!t.editor)return;let r=t.editor,i=[];for(let a of e)i.push({from:a});let o={selections:i};r.transaction(o)}};var ta=X(require("obsidian"));var tc={app:{name:"app",description:"This module exposes the app instance. Prefer to use this over the global app instance."},user:{name:"user",description:"This module exposes custom made scripts, written by yourself within the script file folder location"},config:{name:"config",description:`This module exposes Templater's running configuration.
This is mostly useful when writing scripts requiring some context information.
`,functions:{template_file:{name:"template_file",description:"The `TFile` object representing the template file.",definition:"tp.config.template_file"},target_file:{name:"target_file",description:"The `TFile` object representing the target file where the template will be inserted.",definition:"tp.config.target_file"},run_mode:{name:"run_mode",description:"The `RunMode`, representing the way Templater was launched (Create new from template, Append to active file, ...).",definition:"tp.config.run_mode"},active_file:{name:"active_file",description:"The active file (if existing) when launching Templater.",definition:"tp.config.active_file?"}}},date:{name:"date",description:"This module contains every internal function related to dates.",functions:{now:{name:"now",description:"Retrieves the date.",definition:'tp.date.now(format: string = "YYYY-MM-DD", offset?: number\u23AEstring, reference?: string, reference_format?: string)',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'},{name:"offset",description:"Duration to offset the date from. If a number is provided, duration will be added to the date in days. You can also specify the offset as a string using the ISO 8601 format."},{name:"reference",description:"The date referential, e.g. set this to the note's title."},{name:"reference_format",description:"The format for the reference date. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/)."}],examples:[{name:"Date now",example:"<% tp.date.now() %>"},{name:"Date now with format",example:'<% tp.date.now("Do MMMM YYYY") %>'},{name:"Last week",example:'<% tp.date.now("YYYY-MM-DD", -7) %>'},{name:"Next week",example:'<% tp.date.now("YYYY-MM-DD", 7) %>'},{name:"Last month",example:'<% tp.date.now("YYYY-MM-DD", "P-1M") %>'},{name:"Next year",example:'<% tp.date.now("YYYY-MM-DD", "P1Y") %>'},{name:"File's title date + 1 day (tomorrow)",example:'<% tp.date.now("YYYY-MM-DD", 1, tp.file.title, "YYYY-MM-DD") %>'},{name:"File's title date - 1 day (yesterday)",example:'<% tp.date.now("YYYY-MM-DD", -1, tp.file.title, "YYYY-MM-DD") %>'}]},tomorrow:{name:"tomorrow",description:"Retrieves tomorrow's date.",definition:'tp.date.tomorrow(format: string = "YYYY-MM-DD")',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'}],examples:[{name:"Date tomorrow",example:"<% tp.date.tomorrow() %>"},{name:"Date tomorrow with format",example:'<% tp.date.tomorrow("Do MMMM YYYY") %>'}]},yesterday:{name:"yesterday",description:"Retrieves yesterday's date.",definition:'tp.date.yesterday(format: string = "YYYY-MM-DD")',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'}],examples:[{name:"Date yesterday",example:"<% tp.date.yesterday() %>"},{name:"Date yesterday with format",example:'<% tp.date.yesterday("Do MMMM YYYY") %>'}]},weekday:{name:"weekday",description:"",definition:'tp.date.weekday(format: string = "YYYY-MM-DD", weekday: number, reference?: string, reference_format?: string)',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'},{name:"weekday",description:"Week day number. If the locale assigns Monday as the first day of the week, `0` will be Monday, `-7` will be last week's day."},{name:"reference",description:"The date referential, e.g. set this to the note's title."},{name:"reference_format",description:"The format for the reference date. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/)."}],examples:[{name:"This week's Monday",example:'<% tp.date.weekday("YYYY-MM-DD", 0) %>'},{name:"Next Monday",example:'<% tp.date.weekday("YYYY-MM-DD", 7) %>'},{name:"File's title Monday",example:'<% tp.date.weekday("YYYY-MM-DD", 0, tp.file.title, "YYYY-MM-DD") %>'},{name:"File's title previous Monday",example:'<% tp.date.weekday("YYYY-MM-DD", -7, tp.file.title, "YYYY-MM-DD") %>'}]}},momentjs:{examples:[{name:"Date now",example:'<% moment(tp.file.title, "YYYY-MM-DD").format("YYYY-MM-DD") %>'},{name:"Get start of month from note title",example:'<% moment(tp.file.title, "YYYY-MM-DD").startOf("month").format("YYYY-MM-DD") %>'},{name:"Get end of month from note title",example:'<% moment(tp.file.title, "YYYY-MM-DD").endOf("month").format("YYYY-MM-DD") %>'}]}},file:{name:"file",description:"This module contains every internal function related to files.",functions:{content:{name:"content",description:"The string contents of the file at the time that Templater was executed. Manipulating this string will *not* update the current file.",definition:"tp.file.content",examples:[{name:"Retrieve file content",example:"<% tp.file.content %>"}]},create_new:{name:"create_new Line truncated
You can navigate between the different cursors using the configured hotkey in Obsidian settings.
`,definition:"tp.file.cursor(order?: number)",args:[{name:"order",description:`The order of the different cursors jump, e.g. it will jump from 1 to 2 to 3, and so on.
If you specify multiple tp.file.cursor with the same order, the editor will switch to multi-cursor.
`}],examples:[{name:"File cursor",example:"<% tp.file.cursor() %>"},{name:"File multi-cursor",example:"<% tp.file.cursor(1) %>Content<% tp.file.cursor(1) %>"}]},cursor_append:{name:"cursor_append",description:"Appends some content after the active cursor in the file.",definition:"tp.file.cursor_append(content: string)",args:[{name:"content",description:"The content to append after the active cursor."}],examples:[{name:"File cursor append",example:'<% tp.file.cursor_append("Some text") %>'}]},exists:{name:"exists",description:"Check to see if a file exists by it's file path. The full path to the file, relative to the Vault and containing the extension, must be provided.",definition:"tp.file.exists(filepath: string)",args:[{name:"filepath",description:"The full file path of the file we want to check existence for."}],examples:[{name:"File existence",example:'<% await tp.file.exists("MyFolder/MyFile.md") %>'},{name:"File existence of current file",example:'<% await tp.file.exists(tp.file.folder(true) + "/" + tp.file.title + ".md") %>'}]},find_tfile:{name:"find_tfile",description:"Search for a file and returns its `TFile` instance.",definition:"tp.file.find_tfile(filename: string)",args:[{name:"filename",description:"The filename we want to search and resolve as a `TFile`."}],examples:[{name:"File find TFile",example:'<% tp.file.find_tfile("MyFile").basename %>'}]},folder:{name:"folder",description:"Retrieves the file's folder name.",definition:"tp.file.folder(absolute: boolean = false)",args:[{name:"absolute",description:"If set to `true`, returns the vault-absolute path of the folder. If `false`, only returns the basename of the folder (the last part). Defaults to `false`."}],examples:[{name:"File folder (Folder)",example:"<% tp.file.folder() %>"},{name:"File folder with vault-absolute path (Path/To/Folder)",example:"<% tp.file.folder(true) %>"}]},include:{name:"include",description:"Includes the file's link content. Templates in the included content will be resolved.",definition:"tp.file.include(include_link: string \u23AE TFile)",args:[{name:"include_link",description:'The link to the file to include, e.g. `"[[MyFile]]"`, or a TFile object. Also supports sections or blocks inclusions.'}],examples:[{name:"File include",example:'<% await tp.file.include("[[Template1]]") %>'},{name:"File include TFile",example:'<% await tp.file.include(tp.file.find_tfile("MyFile")) %>'},{name:"File include section",example:'<% await tp.file.include("[[MyFile#Section1]]") %>'},{name:"File include block",example:'<% await tp.file.include("[[MyFile#^block1]]") %>'}]},last_modified_date:{name:"last_modified_date",description:"Retrieves the file's last modification date.",definition:'tp.file.last_modified_date(format: string = "YYYY-MM-DD HH:mm")',args:[{name:"format",description:'The format for the date. Defaults to `"YYYY-MM-DD HH:mm"`. Refer to [format reference](https://momentjs.com/docs/#/displaying/format/).'}],examples:[{name:"File last modified date",example:"<% tp.file.last_modified_date() %>"},{name:"File last modified date with format",example:'<% tp.file.last_modified_date("dddd Do MMMM YYYY HH:mm") %>'}]},move:{name:"move",description:"Moves the file to the desired vault location.",definition:"tp.file.move(new_path: string, file_to_move?: TFile)",args:[{name:"new_path",description:'The new vault relative path of the file, without the file extension. Note: the new path needs to include the folder and the filename, e.g. `"/Notes/MyNote"`.'},{name:"file_to_move",description:"The file to move, defaults to the current file."}],examples:[{name:"File move",example:'<%* await tp.file.move("/A/B/" + tp.file.title) %>'},{name:"File move and rename",example:'<%* await tp.file.move("/A/B/NewTitle") %>'}]},path:{name:"path",description:"Retrieves the file's absolute path on the system.",definition:"tp.file.path(relative: boolean = false)",args:[{name:"relative",description:"If set to `true`, only retrieves the vault's relative path."}],examples:[{name:"File path",example:"<% tp.file.path() %>"},{name:"File relative path (relative to vault root)",example:"<% tp.file.path(true) %>"}]},rename:{name:"rename",description:"Renames the file (keeps the same file extension).",definition:"tp.file.rename(new_title: string)",args:[{name:"new_title",description:"The new file title."}],examples:[{name:"File rename",example:'<%* await tp.file.rename("MyNewName") %>'},{name:"File append a 2 to the file name",example:'<%* await tp.file.rename(tp.file.title + "2") %>'}]},selection:{name:"selection",description:"Retrieves the active file's text selection.",definition:"tp.file.selection()",examples:[{name:"File selection",example:"<% tp.file.selection() %>"}]},tags:{name:"tags",description:"Retrieves the file's tags (array of string).",definition:"tp.file.tags",examples:[{name:"File tags",example:"<% tp.file.tags %>"}]},title:{name:"title",definition:"tp.file.title",description:"Retrieves the file's title.",examples:[{name:"File title",example:"<% tp Line truncated
let value = await tp.system.prompt("Please enter a value");
%>
# <% value %>
selected value: <% value %>`}]},suggester:{name:"suggester",description:"Spawns a suggester prompt and returns the user's chosen item.",definition:'tp.system.suggester(text_items: string[] \u23AE ((item: T) => string), items: T[], throw_on_cancel: boolean = false, placeholder: string = "", limit?: number = undefined)',args:[{name:"text_items",description:"Array of strings representing the text that will be displayed for each item in the suggester prompt. This can also be a function that maps an item to its text representation."},{name:"items",description:"Array containing the values of each item in the correct order."},{name:"throw_on_cancel",description:"Throws an error if the prompt is canceled, instead of returning a `null` value."},{name:"placeholder",description:"Placeholder string of the prompt."},{name:"limit",description:"Limit the number of items rendered at once (useful to improve performance when displaying large lists)."}],examples:[{name:"Suggester",example:'<% await tp.system.suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"]) %>'},{name:"Suggester with mapping function (same as above example)",example:'<% await tp.system.suggester((item) => item, ["Happy", "Sad", "Confused"]) %>'},{name:"Suggester for files",example:"[[<% (await tp.system.suggester((item) => item.basename, tp.app.vault.getMarkdownFiles())).basename %>]]"},{name:"Suggester for tags",example:'<% await tp.system.suggester(item => item, Object.keys(tp.app.metadataCache.getTags()).map(x => x.replace("#", ""))) %>'},{name:"Reuse value from suggester",example:`<%*
let selectedValue = await tp.system.suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"]);
%>
# <% selectedValue %>
selected value: <% selectedValue %>`}]},multi_suggester:{name:"multi_suggester",description:"Spawns a suggester prompt that supports selecting multiple items and returns the user's chosen items.",definition:'tp.system.multi_suggester(text_items: string[] \u23AE ((item: T) => string), items: T[], throw_on_cancel: boolean = false, title: string = "", limit?: number = undefined)',args:[{name:"text_items",description:"Array of strings representing the text that will be displayed for each item in the suggester prompt. This can also be a function that maps an item to its text representation."},{name:"items",description:"Array containing the values of each item in the correct order."},{name:"throw_on_cancel",description:"Throws an error if the prompt is canceled, instead of returning a `null` value."},{name:"title",description:"Text placed at the top of the modal."},{name:"limit",description:"Limit the number of items rendered at once (useful to improve performance when displaying large lists)."}],examples:[{name:"Multi-suggester",example:'<% await tp.system.multi_suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"]) %>'},{name:"Multi-suggester with mapping function (same as above example)",example:'<% await tp.system.multi_suggester((item) => item, ["Happy", "Sad", "Confused"]) %>'},{name:"Multi-suggester for files",example:"<% (await tp.system.multi_suggester((item) => item.basename, tp.app.vault.getMarkdownFiles())).map(f => `[[${f.basename}]]`) %>"},{name:"Multi-suggester for tags",example:'<% await tp.system.multi_suggester(item => item, Object.keys(tp.app.metadataCache.getTags()).map(x => x.replace("#", ""))) %>'},{name:"Reuse value from multi-suggester",example:`<%*
let selectedValues = await tp.system.multi_suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"]);
%>
# <% selectedValues %>
selected values: <% selectedValues %>`}]}}},web:{name:"web",description:"This modules contains every internal function related to the web (making web requests).",functions:{daily_quote:{name:"daily_quote",description:"Retrieves and parses the daily quote from `https://github.com/Zachatoo/quotes-database` as a callout.",definition:"tp.web.daily_quote()",examples:[{name:"Daily quote",example:"<% await tp.web.daily_quote() %>"}]},random_picture:{name:"random_picture",description:"Gets a random image from `https://unsplash.com/`.",definition:"tp.web.random_picture(size?: string, query?: string, include_size?: boolean)",args:[{name:"size",description:"Image size in the format `<width>x<height>`."},{name:"query",description:"Limits selection to photos matching a search term. Multiple search terms can be passed separated by a comma."},{name:"include_size",description:"Optional argument to include the specified size in the image link markdown. Defaults to false."}],examples:[{name:"Random picture",example:"<% await tp.web.random_picture() %>"},{name:"Random picture with size",example:'<% await tp.web.random_picture("200x200") %>'},{name:"Random picture with size and query",example:'<% await tp.web.random_picture("200x200", "landscape,water") %>'}]},request:{name:"request",description:"Makes a HTTP request to the specified URL. Optionally, you can specify a path to extract specific data from the response.",definition:"tp.web.request(url: string, path?: string)",args:[{name:"url",description:"The URL to which the HTTP request will be made."},{name:"path",description:"A path within the response JSON to extract specific data."}],examples:[{name:"Simple request",example:'<% await tp.web.request("https://jsonplaceholder.typicode.com/todos/1") %>'},{name:"Request with path",example:'<% await tp.web.request("https://jsonplaceholder.typicode.com/todos", "0.title") %>'}]}}}},Zo={tp:tc};var nc=["app","config","date","file","frontmatter","hooks","obsidian","system","user","web"],rc=new Set(nc);function ea(n){return typeof n=="string"&&rc.has(n)}function Di(n){return!!(n.definition||n.returns||n.args)}var Pi=class{constructor(e){this.plugin=e;this.documentation=Zo}get_all_modules_documentation(){let e=this.documentation.tp;return(!this.plugin.settings||!this.plugin.settings.user_scripts_folder)&&(e=Object.values(e).filter(t=>t.name!=="user")),Object.values(e).map(t=>(t.queryKey=t.name,t))}async get_all_functions_documentation(e,t){if(e==="app")return this.get_app_functions_documentation(this.plugin.app,t);if(e==="user"){if(!this.plugin.settings||!this.plugin.settings.user_scripts_folder)return;let r=await Se(async()=>{let i=Je(this.plugin.app,this.plugin.settings.user_scripts_folder).filter(a=>a.extension=="js");return await co(this.plugin.app,i)},"User Scripts folder doesn't exist");return!r||r.length===0?void 0:r.reduce((i,o)=>o.extension!=="js"?i:[...i,{name:o.basename,queryKey:o.basename,definition:"",description:o.description,returns:o.returns,args:o.arguments.reduce((l,c)=>(l[c.name]={name:c.name,description:c.description},l),{}),example:""}],[])}if(!!this.documentation.tp[e].functions)return Object.values(this.documentation.tp[e].functions).map(r=>(r.queryKey=r.name,r))}get_app_functions_documentation(e,t){if(!xn(e))return[];let r=t.split(".");if(r.length===0)return[];let i=e;for(let c=0;c<r.length-1;c++){let d=r[c];if(d in i){if(!xn(i[d]))return[];i=i[d]}}let o=["tp","app",...r.slice(0,r.length-1)].join("."),a=r.slice(0,r.length-1).join("."),l=[];for(let c in i){let d=`${o}.${c}`,m=a?`${a}.${c}`:c;l.push({name:c,queryKey:m,definition:typeof i[c]=="function"?`${d}(${po(i[c])})`:d,description:"",returns:"",example:""})}return l}get_module_documentation(e){return this.documentation.tp[e]}get_function_documentation(e,t){return this.documentation.tp[e].functions[t]}get_argument_documentation(e,t,r){let i=this.get_function_documentation(e,t);return!i||!i.args?null:i.args[r]}};var Ni=class extends ta.EditorSuggest{constructor(e){super(e.app);this.tp_keyword_regex=/tp\.(?<module>[a-z]*)?(?<fn_trigger>\.(?<fn>[a-zA-Z_.]*)?)?$/;this.documentation=new Pi(e),this.intellisense_render_setting=e.settings.intellisense_render}onTrigger(e,t,r){let i=t.getRange({line:e.line,ch:0},{line:e.line,ch:e.ch}),o=this.tp_keyword_regex.exec(i);if(!o)return null;let a,l=o.groups&&o.groups.module||"";if(this.module_name=l,o.groups&&o.groups.fn_trigger){if(l==""||!ea(l))return null;this.function_trigger=!0,this.function_name=o.groups.fn||"",a=this.function_name}else this.function_trigger=!1,a=this.module_name;let c={start:{line:e.line,ch:e.ch-a.length},end:{line:e.line,ch:e.ch},query:a};return this.latest_trigger_info=c,c}async getSuggestions(e){let t;return this.module_name&&this.function_trigger?t=await this.documentation.get_all_functions_documentation(this.module_name,this.function_name):t=this.documentation.get_all_modules_documentation(),t?t.filter(r=>r.queryKey.toLowerCase().startsWith(e.query.toLowerCase())):[]}renderSuggestion(e,t){if(t.crea Line truncated
/* nosourcemap */
+11
View File
@@ -0,0 +1,11 @@
{
"id": "templater-obsidian",
"name": "Templater",
"version": "2.16.2",
"description": "Create and use templates",
"minAppVersion": "1.5.0",
"author": "SilentVoid",
"authorUrl": "https://github.com/SilentVoid13",
"helpUrl": "https://silentvoid13.github.io/Templater/",
"isDesktopOnly": false
}
+226
View File
@@ -0,0 +1,226 @@
.templater_search {
width: calc(100% - 20px);
}
.templater_div {
border-top: 1px solid var(--background-modifier-border);
}
.templater_div > .setting-item {
border-top: none !important;
align-self: center;
}
.templater_div > .setting-item > .setting-item-control {
justify-content: space-around;
padding: 0;
width: 100%;
}
.templater_div
> .setting-item
> .setting-item-control
> .setting-editor-extra-setting-button {
align-self: center;
}
.templater_donating {
margin: 10px;
}
.templater_title {
margin: 0;
padding: 0;
margin-top: 5px;
text-align: center;
}
.templater_template {
align-self: center;
margin-left: 5px;
margin-right: 5px;
width: 70%;
}
.templater_cmd {
margin-left: 5px;
margin-right: 5px;
font-size: 14px;
width: 100%;
}
.templater_div2 > .setting-item {
align-content: center;
justify-content: center;
}
.templater-prompt-div,
.templater-multisuggester-div {
display: flex;
}
.templater-prompt-form {
display: flex;
flex-grow: 1;
}
.templater-prompt-input,
.templater-multisuggester-input {
flex-grow: 1;
}
.templater-button-div {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 1rem;
}
textarea.templater-prompt-input {
height: 10rem;
}
textarea.templater-prompt-input:focus {
border-color: var(--interactive-accent);
}
.templater-multisuggester-list {
margin: 1.5em 0;
}
.cm-s-obsidian .templater-command-bg {
left: 0px;
right: 0px;
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command {
font-size: 0.85em;
font-family: var(--font-monospace);
line-height: 1.3;
}
.cm-s-obsidian .templater-inline .cm-templater-command {
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag {
color: var(--code-property, #008bff);
}
.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag {
color: var(--code-function, #c0d700);
}
.cm-s-obsidian .cm-templater-command.cm-keyword {
color: var(--code-keyword, #00a7aa);
font-weight: normal;
}
.cm-s-obsidian .cm-templater-command.cm-atom {
color: var(--code-normal, #f39b35);
}
.cm-s-obsidian .cm-templater-command.cm-value,
.cm-s-obsidian .cm-templater-command.cm-number,
.cm-s-obsidian .cm-templater-command.cm-type {
color: var(--code-value, #a06fca);
}
.cm-s-obsidian .cm-templater-command.cm-def,
.cm-s-obsidian .cm-templater-command.cm-type.cm-def {
color: var(--code-normal, var(--text-normal));
}
.cm-s-obsidian .cm-templater-command.cm-property,
.cm-s-obsidian .cm-templater-command.cm-property.cm-def,
.cm-s-obsidian .cm-templater-command.cm-attribute {
color: var(--code-function, #98e342);
}
.cm-s-obsidian .cm-templater-command.cm-variable,
.cm-s-obsidian .cm-templater-command.cm-variable-2,
.cm-s-obsidian .cm-templater-command.cm-variable-3,
.cm-s-obsidian .cm-templater-command.cm-meta {
color: var(--code-property, #d4d4d4);
}
.cm-s-obsidian .cm-templater-command.cm-callee,
.cm-s-obsidian .cm-templater-command.cm-operator,
.cm-s-obsidian .cm-templater-command.cm-qualifier,
.cm-s-obsidian .cm-templater-command.cm-builtin {
color: var(--code-operator, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-tag {
color: var(--code-tag, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-comment,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute {
color: var(--code-comment, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-string,
.cm-s-obsidian .cm-templater-command.cm-string-2 {
color: var(--code-string, #e6db74);
}
.cm-s-obsidian .cm-templater-command.cm-header,
.cm-s-obsidian .cm-templater-command.cm-hr {
color: var(--code-keyword, #da7dae);
}
.cm-s-obsidian .cm-templater-command.cm-link {
color: var(--code-normal, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-error {
border-bottom: 1px solid #c42412;
}
.CodeMirror-hints {
position: absolute;
z-index: 10;
overflow: hidden;
list-style: none;
margin: 0;
padding: 2px;
-webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
border-radius: 3px;
border: 1px solid silver;
background: white;
font-size: 90%;
font-family: monospace;
max-height: 20em;
overflow-y: auto;
}
.CodeMirror-hint {
margin: 0;
padding: 0 4px;
border-radius: 2px;
white-space: pre;
color: black;
cursor: pointer;
}
li.CodeMirror-hint-active {
background: #08f;
color: white;
}
+3
View File
@@ -0,0 +1,3 @@
{
"folder": "Templates"
}
Vendored Executable
+55
View File
@@ -0,0 +1,55 @@
{
"types": {
"aliases": "aliases",
"cssclasses": "multitext",
"tags": "tags",
"categories": "multitext",
"created": "date",
"genre": "multitext",
"director": "multitext",
"last": "date",
"date": "date",
"topics": "multitext",
"rating": "number",
"year": "number",
"coordinates": "multitext",
"model": "text",
"lotsqft": "number",
"isbn13": "number",
"isbn": "number",
"ingredients": "multitext",
"imdbId": "text",
"system": "text",
"sqft": "number",
"speaker": "multitext",
"season": "number",
"series": "multitext",
"source": "text",
"status": "multitext",
"twitter": "text",
"trade": "text",
"purchased": "date",
"producer": "multitext",
"process": "text",
"phone": "text",
"role": "text",
"birthday": "date",
"guests": "multitext",
"cuisine": "multitext",
"conference": "text",
"end": "date",
"address": "text",
"start": "date",
"shares": "number",
"variety": "text",
"price": "number",
"author": "multitext",
"published": "date",
"where": "multitext",
"loc": "multitext",
"monthly-uses": "number",
"runtime": "number",
"pages": "number",
"acquired": "date"
}
}
+202
View File
@@ -0,0 +1,202 @@
{
"main": {
"id": "c535fcbd66ff15f1",
"type": "split",
"children": [
{
"id": "4f62eb42528d84e2",
"type": "tabs",
"children": [
{
"id": "b8a1d6a7b9f31a0a",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Templates/Meditation Template.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Meditation Template"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "f9356b3161224c4b",
"type": "split",
"children": [
{
"id": "c5cc35386beaa9f9",
"type": "tabs",
"children": [
{
"id": "9ef441043be4d5ca",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "bce3ddf1ba148620",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "2aa417dffa146c84",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "ed8f3bfcfcab5820",
"type": "split",
"children": [
{
"id": "c8b1776937708de4",
"type": "tabs",
"children": [
{
"id": "f2ef3dc240ab922f",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks"
}
},
{
"id": "bb9ad16ae46f7b0a",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "a8ef48791b671ad0",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "2025-12-04 1307.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of 2025-12-04 1307"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"markdown-importer:Open format converter": false,
"zk-prefixer:Create new unique note": false,
"random-note:Open random note": false,
"workspaces:Manage workspace layouts": false,
"bases:Create new base": false,
"templater-obsidian:Templater": false
}
},
"active": "9ef441043be4d5ca",
"lastOpenFiles": [
"Templates/People Template.md",
"Templates/Podcast Episode Template.md",
"Templates/Show Template.md",
"Templates/Product Template.md",
"Templates/Post Template.md",
"Templates/Bases/Games.base",
"Templates/Bases/Everything.base",
"Templates/Bases/Evergreen.base",
"Templates/Bases/Companies.base",
"Templates/Bases/Board games.base",
"Templates/Bases/Attachments.base",
"Templates/Bases/Albums.base",
"Categories/Podcast episodes.md",
"Categories/Companies.md",
"Categories/Clippings.md",
"Categories/Books.md",
"Categories/Board games.md",
"Categories/Albums.md",
"Categories/Posts.md",
"Categories/Podcasts.md",
"Categories/People.md",
"Categories/Movies.md",
"Categories/Meetings.md",
"Templates/Bases/Ratings.base",
"Templates/Daily Note Template.md",
"Templates/Bases/Map.base",
"References/Fushimi Inari.md",
"Templates/Bases/Places.base",
"Notes/2023-09-12 Meeting with Steph.md",
"References/Out of Control.md",
"Notes/Minimal Theme.md",
"Notes/Product usage analysis.md",
"Notes/Evergreen notes turn ideas into objects that you can manipulate.md",
"Clippings/Buy wisely.md",
"Untitled 1.md",
"Untitled 2.md",
"Attachments/out-of-control.jpg"
]
}
+5
View File
@@ -0,0 +1,5 @@
{
"format": "YYYY-MM-DD HHmm",
"folder": "/",
"template": "Templates/Journal Template"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Albums.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Board games.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Books.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Clippings.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Companies.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Events.base]]
+7
View File
@@ -0,0 +1,7 @@
---
tags:
- categories
---
An evergreen note is an idea. It doesn't have to be something that I agree with, but something is [[Composability|composable]]. In a way, every idiom is a kind of evergreen idea.
![[Evergreen.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Games.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Journal.base]]
+5
View File
@@ -0,0 +1,5 @@
---
tags:
- categories
---
![[Meetings.base]]
+14
View File
@@ -0,0 +1,14 @@
---
tags:
- categories
---
## Favorites
![[Movies.base#Favorites]]
## Last seen
![[Movies.base#Last seen]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[People.base]]
+7
View File
@@ -0,0 +1,7 @@
---
tags:
- categories
---
![[Map.base]]
![[Places.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Podcast episodes.base]]
+7
View File
@@ -0,0 +1,7 @@
---
tags:
- categories
related: "[[Podcast episodes]]"
---
![[Podcasts.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Posts.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Products.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Projects.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Recipes.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Shows.base]]
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- categories
---
![[Trips.base]]
+3
View File
@@ -0,0 +1,3 @@
## Notes
![[Daily.base]]
+80
View File
@@ -0,0 +1,80 @@
---
categories:
- "[[Clippings]]"
author:
- "[[Kevin Kelly]]"
url: https://kk.org/thetechnium/68-bits-of-unsolicited-advice/
created: 2023-09-12
published: 2020-04-28
topics: []
---
It’s my birthday. I’m 68. I feel like pulling up a rocking chair and dispensing advice to the young ‘uns. Here are 68 pithy bits of unsolicited advice which I offer as my birthday present to all of you.
- Learn how to learn from those you disagree with, or even offend you. See if you can find the truth in what they believe.
- Being enthusiastic is worth 25 IQ points.
- Always demand a deadline. A deadline weeds out the extraneous and the ordinary. It prevents you from trying to make it perfect, so you have to make it different. Different is better.
- Don’t be afraid to ask a question that may sound stupid because 99% of the time everyone else is thinking of the same question and is too embarrassed to ask it.
- Being able to listen well is a superpower. While listening to someone you love keep asking them “Is there more?”, until there is no more.
- A worthy goal for a year is to learn enough about a subject so that you can’t believe how ignorant you were a year earlier.
- Gratitude will unlock all other virtues and is something you can get better at.
- Treating a person to a meal never fails, and is so easy to do. It’s powerful with old friends and a great way to make new friends.
- Don’t trust all-purpose glue.
- Reading to your children regularly will bond you together and kickstart their imaginations.
- Never use a credit card for credit. The only kind of credit, or debt, that is acceptable is debt to acquire something whose exchange value is extremely likely to increase, like in a home. The exchange value of most things diminishes or vanishes the moment you purchase them. Don’t be in debt to losers.
- Pros are just amateurs who know how to gracefully recover from their mistakes.
- Extraordinary claims should require extraordinary evidence to be believed.
- Don’t be the smartest person in the room. Hangout with, and learn from, people smarter than yourself. Even better, find smart people who will disagree with you.
- Rule of 3 in conversation. To get to the real reason, ask a person to go deeper than what they just said. Then again, and once more. The third time’s answer is close to the truth.
- Don’t be the best. Be the only.
- Everyone is shy. Other people are waiting for you to introduce yourself to them, they are waiting for you to send them an email, they are waiting for you to ask them on a date. Go ahead.
- Don’t take it personally when someone turns you down. Assume they are like you: busy, occupied, distracted. Try again later. It’s amazing how often a second try works.
- The purpose of a habit is to remove that action from self-negotiation. You no longer expend energy deciding whether to do it. You just do it. Good habits can range from telling the truth, to flossing.
- Promptness is a sign of respect.
- When you are young spend at least 6 months to one year living as poor as you can, owning as little as you possibly can, eating beans and rice in a tiny room or tent, to experience what your “worst” lifestyle might be. That way any time you have to risk something in the future you won’t be afraid of the worst case scenario.
- Trust me: There is no “them”.
- The more you are interested in others, the more interesting they find you. To be interesting, be interested.
- Optimize your generosity. No one on their deathbed has ever regretted giving too much away.
- To make something good, just do it. To make something great, just re-do it, re-do it, re-do it. The secret to making fine things is in remaking them.
- The Golden Rule will never fail you. It is the foundation of all other virtues.
- If you are looking for something in your house, and you finally find it, when you’re done with it, don’t put it back where you found it. Put it back where you first looked for it.
- Saving money and investing money are both good habits. Small amounts of money invested regularly for many decades without deliberation is one path to wealth.
- To make mistakes is human. To own your mistakes is divine. Nothing elevates a person higher than quickly admitting and taking personal responsibility for the mistakes you make and then fixing them fairly. If you mess up, fess up. It’s astounding how powerful this ownership is.
- Never get involved in a land war in Asia.
- You can obsess about serving your customers/audience/clients, or you can obsess about beating the competition. Both work, but of the two, obsessing about your customers will take you further.
- Show up. Keep showing up. Somebody successful said: 99% of success is just showing up.
- Separate the processes of creation from improving. You can’t write and edit, or sculpt and polish, or make and analyze at the same time. If you do, the editor stops the creator. While you invent, don’t select. While you sketch, don’t inspect. While you write the first draft, don’t reflect. At the start, the creator mind must be unleashed from judgement.
- If you are not falling down occasionally, you are just coasting.
- Perhaps the most counter-intuitive truth of the universe is that the more you give to others, the more you’ll get. Understanding this is the beginning of wisdom.
- Friends are better than money. Almost anything money can do, friends can do better. In so many ways a friend with a boat is better than owning a boat.
- This is true: It’s hard to cheat an honest man.
- When an object is lost, 95% of the time it is hiding within arm’s reach of where it was last seen. Search in all possible locations in that radius and you’ll find it.
- You are what you do. Not what you say, not what you believe, not how you vote, but what you spend your time on.
- If you lose or forget to bring a cable, adapter or charger, check with your hotel. Most hotels now have a drawer full of cables, adapters and chargers others have left behind, and probably have the one you are missing. You can often claim it after borrowing it.
- Hatred is a curse that does not affect the hated. It only poisons the hater. Release a grudge as if it was a poison.
- There is no limit on better. Talent is distributed unfairly, but there is no limit on how much we can improve what we start with.
- Be prepared: When you are 90% done any large project (a house, a film, an event, an app) the rest of the myriad details will take a second 90% to complete.
- When you die you take absolutely nothing with you except your reputation.
- Before you are old, attend as many funerals as you can bear, and listen. Nobody talks about the departed’s achievements. The only thing people will remember is what kind of person you were while you were achieving.
- For every dollar you spend purchasing something substantial, expect to pay a dollar in repairs, maintenance, or disposal by the end of its life.
- Anything real begins with the fiction of what could be. Imagination is therefore the most potent force in the universe, and a skill you can get better at. It’s the one skill in life that benefits from ignoring what everyone else knows.
- When crisis and disaster strike, don’t waste them. No problems, no progress.
- On vacation go to the most remote place on your itinerary first, bypassing the cities. You’ll maximize the shock of otherness in the remote, and then later you’ll welcome the familiar comforts of a city on the way back.
- When you get an invitation to do something in the future, ask yourself: would you accept this if it was scheduled for tomorrow? Not too many promises will pass that immediacy filter.
- Don’t say anything about someone in email you would not be comfortable saying to them directly, because eventually they will read it.
- If you desperately need a job, you are just another problem for a boss; if you can solve many of the problems the boss has right now, you are hired. To be hired, think like your boss.
- Art is in what you leave out.
- Acquiring things will rarely bring you deep satisfaction. But acquiring experiences will.
- Rule of 7 in research. You can find out anything if you are willing to go seven levels. If the first source you ask doesn’t know, ask them who you should ask next, and so on down the line. If you are willing to go to the 7th source, you’ll almost always get your answer.
- How to apologize: Quickly, specifically, sincerely.
- Don’t ever respond to a solicitation or a proposal on the phone. The urgency is a disguise.
- When someone is nasty, rude, hateful, or mean with you, pretend they have a disease. That makes it easier to have empathy toward them which can soften the conflict.
- Eliminating clutter makes room for your true treasures.
- You really don’t want to be famous. Read the biography of any famous person.
- Experience is overrated. When hiring, hire for aptitude, train for skills. Most really amazing or great things are done by people doing them for the first time.
- A vacation + a disaster = an adventure.
- Buying tools: Start by buying the absolute cheapest tools you can find. Upgrade the ones you use a lot. If you wind up using some tool for a job, buy the very best you can afford.
- Learn how to take a 20-minute power nap without embarrassment.
- Following your bliss is a recipe for paralysis if you don’t know what you are passionate about. A better motto for most youth is “master something, anything”. Through mastery of one thing, you can drift towards extensions of that mastery that bring you more joy, and eventually discover where your bliss is.
- I’m positive that in 100 years much of what I take to be true today will be proved to be wrong, maybe even embarrassingly wrong, and I try really hard to identify what it is that I am wrong about today.
- Over the long term, the future is decided by optimists. To be an optimist you don’t have to ignore all the many problems we create; you just have to imagine improving our capacity to solve problems.
+134
View File
@@ -0,0 +1,134 @@
---
categories:
- "[[Clippings]]"
- "[[Posts]]"
author:
- "[[Steph Ango]]"
source: https://stephango.com/buy-wisely
clipped: 2023-11-18
published: 2023-09-29
status:
- "[[Published]]"
topics:
- "[[Products]]"
- "[[Product usage analysis]]"
---
Whenever I buy things I try to prioritize *cost per use*. Sometimes I consider other priorities such as *cost per smile*, *cost per thrill*, *cost per externality*, and *cost per lesson*.
## Cost per use
*Cost per use* is a heuristic that helps me make decisions about most non-perishable purchases such as clothes, vehicles, tools, devices, and even services. How much will it cost me if I divide the price by its expected number of uses?
*Cost per use* accounts for longevity. Durable and repairable things may cost more upfront, but over time they cost less than things that break and need to be replaced.
For example, I buy wool socks from a brand called [Darn Tough](https://darntough.com/). They cost about four times as much as cheap socks, but they’re durable, comfortable, and have a lifetime guarantee.
How many times do you wear a pair of socks before they develop holes? It may sound silly, but if you amortize the price of each pair of socks over their expected number of uses, a good pair of socks is a worthwhile investment.
Quality
Price
Uses
Cost per use
Poor
$5
10
$0.50
Good
$10
50
$0.20
Best
$20
200
$0.10
Not only will durable socks save you money, they also save you the hassle of throwing out old socks and buying new ones. Your time has value.
The best things asymptote to *zero dollars per use* over their lifetime. Not all products that have a low *cost per use* are expensive. Some things are both affordable and durable.
*Cost per use* can also be used to measure the value you expect to get out of services like gym memberships, healthcare, or *all-you-can-eat* subscriptions like streaming services.
## How to assess durability
My aim is to have fewer but better things. These are some of the questions I ask of the things that I incorporate into my life:
- Will it be as useful to me in the future as it is now?
- Is it made of durable and maintainable materials?
- Does it have a timeless [style](https://stephango.com/style) and aesthetic?
- Does it age well, wear well, build a [wabi-sabi](https://stephango.com/scars) patina?
- Does it retain its resale value? Would someone else want to own it?
- Can it be disassembled and repaired?
- Does it have replaceable, non-proprietary parts that are easy to acquire?
- Can it be powered with a standard plug or replaceable batteries?
- Can it be modified and upgraded?
- Has the maker existed for at least as long as I hope to keep the product?
- Can it perform many jobs, or only one?
- Does it have a guarantee?
- Does it rely on other products or technologies that aren’t durable?
Not all questions are relevant to all things. Not all things need to satisfy every requirement. However, I feel better about buying things that check many of these boxes. A movement called “buy it for life” has sprung up around similar priorities.
## How to estimate uses
To make purchasing decisions based on *cost per use*, you should try to guess how many times you will use the product. This sounds obvious, but it can be hard to determine, especially if it’s something you’ve never bought before.
If you are new to a hobby, like cooking or skiing, you may not yet know how many times you will use a piece of gear. It’s easy to significantly overestimate or underestimate how many times you will use something.
You should, however, be able to guess the frequency of use. Is this something you might use once per hour, day, week, month, year? This will help you determine your budget. How many dollars per month do you want to spend on this?
If you don’t know the frequency yet consider borrowing, renting, or otherwise trialing. Remember the ideal *cost per use* trends to $0. The most cost-effective choice is to not buy something you don’t need.
There is an opportunity cost to every dollar. A dollar you spend on a something that won’t get much use is a dollar you can’t save for something that will.
If you’re only going to use something once, then *cost per use* may not be the right heuristic for this decision. If you have disposable income, then the *cost per use* lens should nonetheless guide you towards something with good resale value.
The best things to splurge on are the things you use the most. If you sit on a chair eight hours a day, then a nice chair is probably a good investment.
## Reducing the cost side
Durable things reduce *cost per use* by giving you more uses before they break. But you can also reduce *cost per use* by acquiring products at a discount. You may be able to buy second-hand, inherit, or barter.
Durable things can often be great second-hand purchases *because* they are durable, and may not be the current fashion.
## Alternative heuristics
*Cost per use* is not the only way to make buying decisions. For things like consumables and experiences, you may need to approach the decision differently.
### Cost per smile
How much joy can you get out of each dollar? Some things bring lots of joy for a small amount of money: ice cream, sunsets, nature walks. A cheap date can bring many smiles per dollar.
Some things have excellent *cost per use* but few *smiles per use*. I don’t smile every time I put my nice socks on. A few years ago I bought a fairly expensive electric road bike. It probably didn’t have the best *cost per use*, but it gives me the most *joy per use* of any product I purchased in recent memory. It’s worth it to me.
### Cost per thrill
Some experiences have high *intensity per dollar*. A potency, concentration, or strength of experience. For example, foods can have high *flavor per dollar* — like hot sauce, pickles, curry, garlic, or mustard. Roller coasters, bungee jumping, or skydiving may give you a *thrill per dollar* that you can’t beat.
### Cost per externality
Some purchases may have externalities that are incompatible with your values. For example, you may wish to buy organic produce, pasture-raised eggs, or fair trade coffee. You may wish to buy products that preserve privacy, reduce environmental impact, or support a cause you believe in.
You can choose to incorporate externalities into the cost that you are paying instead of letting that cost be borne by others, or by society at large. This may increase your personal *cost per use*, but it might help change how society values things, or simply make you feel good.
### Cost per lesson
Knowledge has a cost. Sometimes that cost is monetary, sometimes that cost is time, sometimes that cost is pain. Sometimes it’s all three.
You might learn more about investing by purchasing a handful of shares in public companies than going to graduate school. You might learn more about making movies by trying to film one on your phone than going to film school.
Acquiring new ideas and perspectives can have a worthwhile cost. Being an early adopter of a product often has a poor *cost per use*, but its value is in the learning and experience per dollar.
+27
View File
@@ -0,0 +1,27 @@
---
categories:
- "[[Clippings]]"
- "[[Posts]]"
author:
- "[[Steph Ango]]"
url: https://stephango.com/in-good-hands
created: 2023-09-12
published: 2023-08-06
status:
- "[[Published]]"
topics:
---
There is a feeling I search for: *being in good hands*. It is the feeling I look to give and the feeling I look to receive.
I know I am in good hands when I sense a cohesive point of view expressed with attention to detail.
I can feel it almost instantly. In any medium. Music, film, fashion, architecture, writing, software. At a Japanese restaurant it’s what *omakase* aims to be. I leave it up to you, chef.
When I am in good hands I open myself to a state of curiosity and appreciation. I allow myself to suspend preconceived notions. I give you freedom to take me where you want to go. I immerse myself in your worldview and pause judgement.
I want to be convinced of something new. I want my mind to be changed. Later I may disagree, but for now I am letting the experience soak in.
That trust doesn’t come easily. As an audience member it’s about feeling cared for from the moment I interact with your work. It’s about feeling a well-defined point of view permeate what you make.
If my mind was changed, I must have been in good hands.
+3
View File
@@ -0,0 +1,3 @@
## Notes
![[Daily.base]]
+10
View File
@@ -0,0 +1,10 @@
---
categories:
- "[[Trips]]"
start: 2023-09-12
end: 2023-09-30
loc:
- "[[Kyoto]]"
- "[[Japan]]"
---
+15
View File
@@ -0,0 +1,15 @@
---
categories:
- "[[Meetings]]"
type: []
date: 2023-09-14
org:
- "[[Obsidian]]"
loc:
- Remote
people:
- "[[Steph Ango]]"
topics:
- "[[Emergence]]"
---
- Discussed the book [[Out of Control]] on the topic of [[Emergence]]
@@ -0,0 +1,38 @@
---
categories:
- "[[Posts]]"
- "[[Clippings]]"
created: 2023-09-14
url: https://stephango.com/evergreen-notes
author:
- "[[Steph Ango]]"
published: 2022-09-16
topics:
- "[[Evergreen]]"
tags:
- 0🌲
status:
- "[[Published]]"
---
Using [[evergreen]] notes in Obsidian has been the most impactful change to how I think.
Evergreen notes allow you to think about complex ideas by building them up from smaller composable ideas.
My evergreen notes have titles that distill each idea in a succinct and memorable way, that I can use in a sentence. For example:
- [[A company is a superorganism]]
- [[All input is error]]
- [[Calmness is a superpower]]
- [[Cross the chasm]]
- [[Everything is a remix]]
- [[Writing is telepathy]]
- [[You have no obligation to your former self]]
- etc
You don’t need to agree with the idea for it to become an evergreen note. Evergreen notes can be very short.
I have an evergreen note called [[Creativity is combinatory uniqueness]] that is built on top of another evergreen note:
> If you believe [[Everything is a remix]], then creativity is defined by the uniqueness and appeal of the combination of elements.
Evergreen notes turn ideas into objects. By turning ideas into objects you can manipulate them, combine them, stack them. You don’t need to hold them all in your head at the same time.
+17
View File
@@ -0,0 +1,17 @@
---
categories:
- "[[Projects]]"
type:
- "[[UI]]"
org:
- "[[Obsidian]]"
year: 2020
url: https://minimal.guide
status:
- "[[Active]]"
---
## To-do
- [x] Color schemes
- [x] E-ink mode
- [x] Mobile support
+3
View File
@@ -0,0 +1,3 @@
Analysis of cost per use, see [[Buy wisely]]
![[Products.base#Cost per use]]
+11
View File
@@ -0,0 +1,11 @@
---
categories:
- "[[Albums]]"
genre:
- "[[Jazz]]"
artist: "[[Paul Chambers]]"
year: 1957
rating: 7
created: 2023-09-12
---
+17
View File
@@ -0,0 +1,17 @@
---
categories:
- "[[Movies]]"
cover: https://m.media-amazon.com/images/M/MV5BNzQzMzJhZTEtOWM4NS00MTdhLTg0YjgtMjM4MDRkZjUwZDBlXkEyXkFqcGdeQXVyNjU0OTQ0OTY@._V1_SX300.jpg
genre:
- "[[Sci-fi]]"
director:
- "[[Ridley Scott]]"
cast:
- "[[Harrison Ford]]"
rating: 7
year: 1982
last: 2023-09-14
imdbId: tt0083658
---
+81
View File
@@ -0,0 +1,81 @@
---
categories:
- "[[Recipes]]"
- "[[Clippings]]"
cuisine:
- "[[American]]"
type:
- "[[Dessert]]"
ingredients:
- "[[Nectarine]]"
author:
- "[[Steph Ango]]"
url: https://stephango.com/brown-butter-nectarine-tart
servings: 8 slices (11 inch tart)
rating: 7
published: 2023-07-30
created: 2023-09-12
last: 2023-09-12
---
It seems like every summer I have the impromptu and magical experience of suddenly smelling the delicate aroma of ripe nectarines wafting through the air. At that moment, whether it's at a farmer's market or grocery store, I know it's time to make this recipe.
This is my favorite summer dessert. It is another of my mother's recipes, but this one has almost no changes aside from conversion to grams. I asked my mom to make this tart so many times when I was growing up that I am unable to tell how much of my appreciation for it is the pure nostalgia of every slice.
The filling is fluffy and light, not too sweet. It develops a wonderful almost meringue-like crispy shell that adds beautiful texture.
This recipe is scaled for an 11 inch tart pan. I highly recommend a tart pan with a removable bottom. I like to double the recipe for the crust and keep one ball of dough in the freezer in case of emergency.
## Ingredients
### Pastry
- 170g (1 ⅓ cups) all-purpose flour
- 1 tbsp sugar
- ½ tsp salt
- 113g (1 stick or 8 tbsp) cold butter
- 3-4 tbsp ice water
### Filling
- 1 large egg
- 90g (7 tbsp) sugar
- 15g (2 tbsp) flour
- 75g (5 tbsp) butter
- 1 tsp vanilla extract
- 4 nectarines or peaches cut into eights
## Directions
Making and blind-baking the crust
1. Preheat oven to 425F/220C (use convection if you have it).
2. Combine flour, sugar and salt in bowl.
3. Using your finger tips combine the in butter until mixture resembles crumbs, work quickly so that it stays cool.
4. Add ice water, tossing with a fork or lightly with fingers until pastry holds together.
5. Shape into a ball and flatten.
6. On lightly floured surface, roll out into an 13 inch circle.
7. Fit into 11 inch tart pan.
8. Fold in pastry overhang against sides.
9. Use a fork to poke holes throughout the bottom of the dough. This will allow steam to escape and prevent the bottom from lifting up.
10. Line with parchment paper or foil and fill with dried beans or rice.
11. Blind bake 12 minutes. Remove parchment paper and beans carefully and bake.
12. Bake 10 minutes more until light golden, don't overdo it.
13. Cool on a wire rack.
Lower oven to 350F/180C (use convection if you have it)
1. Melt butter in a small saucepan over medium heat until lightly browned, the milk solids should become a vibrant rusty red color. Watch it closely because it can burn easily.
2. Remove from heat and pour into a bowl to cool.
3. In a separate bowl, beat egg and sugar until pale and fluffy.
4. Stir in flour, then cooled browned butter and vanilla extract.
5. Spread filling in tart shell; arrange nectarine slices on top.
6. Bake on a cookie sheet 30 minutes until a deep gold. May need more or less time depending on your oven.
## Tips
- If your oven doesn't have a convection fan, the baking times will take a little longer.
- This tart goes very well with homemade whipped cream.
- Keep the pastry shell in the tart pan throughout the whole recipe. Once the tart has been baked, do not try to remove tart from pan right away. Let it cool 10-15 minutes before trying to remove it from the tart pan as the crust is very tender.
- I prefer nectarines to peaches in this recipe because the texture of the skin is less noticeable, but either works perfectly. I have also made this recipe with pears, and I am sure it would work with many stone fruits as long as they are not overly juicy.
- If it's a hot day, place the butter in the freezer for a few minutes before making the pastry to give yourself more working time.
- To make extra pastry crust, I double the pastry recipe. I split the finished dough ball in half and wrap it cling wrap. Then place it in a zip top bag. When it's time to back it only need 15 minutes to thaw at which point you can start beating it down to shape with a rolling pin. The fact that it's cold makes it easier to work with.
+8
View File
@@ -0,0 +1,8 @@
---
categories:
- "[[Board games]]"
type: []
maker:
rating: 7
last: 2023-09-01
---
+15
View File
@@ -0,0 +1,15 @@
---
categories:
- "[[Places]]"
type:
- "[[Parks]]"
- "[[Shrines]]"
loc:
- "[[Kyoto]]"
- "[[Japan]]"
rating: 7
created: 2023-09-12
coordinates:
- "34.9689499"
- "135.7692576"
---
+9
View File
@@ -0,0 +1,9 @@
---
categories:
- "[[Shows]]"
genre:
- "[[Sci-fi]]"
rating: 7
created: 2023-09-12
last: 2023-09-12
---
+6
View File
@@ -0,0 +1,6 @@
---
tags:
- music/genres
---
![[Albums.base#Genre]]
+18
View File
@@ -0,0 +1,18 @@
---
categories:
- "[[People]]"
type:
- "[[Authors]]"
created: 2023-09-12
---
## Books
![[Books.base#Author]]
# Clippings
![[Clippings.base#Author]]
# Podcast episodes
![[Podcast episodes.base#Guest]]
+21
View File
@@ -0,0 +1,21 @@
---
categories:
- "[[Places]]"
type:
- "[[Cities]]"
loc:
- "[[Japan]]"
coordinates:
- "35.021041"
- "135.7556075"
rating: 7
created: 2023-09-12
---
## Trips
![[Trips.base#Location]]
## Places
![[Map.base#Location]]
![[Places.base#Location]]
+8
View File
@@ -0,0 +1,8 @@
---
categories:
- "[[Companies]]"
- "[[Apps]]"
type:
- "[[Apps]]"
url: https://obsidian.md/
---
+19
View File
@@ -0,0 +1,19 @@
---
categories:
- "[[Books]]"
cover: "[[out-of-control.jpg]]"
isbn: 201483408
isbn13: 9780201483406
pages: 528
year: 1992
author:
- "[[Kevin Kelly]]"
genre:
- "[[Futurism]]"
- "[[Nonfiction]]"
topics:
- "[[Emergence]]"
created: 2023-09-12
last: 2023-09-12
rating: 7
---
+11
View File
@@ -0,0 +1,11 @@
---
tags:
- places/types
icon: trees
color: green
---
## Places
![[Map.base#Type]]
![[Places.base#Type]]
+10
View File
@@ -0,0 +1,10 @@
---
categories:
- "[[People]]"
type:
- "[[Musicians]]"
created: 2023-09-13
---
## Albums
![[Albums.base#Artist]]
+5
View File
@@ -0,0 +1,5 @@
---
tags:
- genres
---
![[Genre.base]]
+18
View File
@@ -0,0 +1,18 @@
---
categories:
- "[[People]]"
type:
- "[[Authors]]"
org:
- "[[Obsidian]]"
created: 2023-09-12
twitter: kepano
url: https://stephango.com/
---
## Clippings
![[Clippings.base#Author]]
## Meetings
![[Meetings.base#Person]]
@@ -0,0 +1,13 @@
---
categories:
- "[[Games]]"
system: "[[Nintendo Switch]]"
maker: "[[Nintendo]]"
genre:
- "[[Open world]]"
aliases:
- BOTW
last: "[[2022-04]]"
rating: 7
year: 2017
---
+27
View File
@@ -0,0 +1,27 @@
---
categories:
- "[[Books]]"
author:
- "[[E. M. Forster]]"
cover:
genre:
- "[[Sci-fi]]"
year: 1909
rating: 7
topics:
- "[[Humanism]]"
created: 2023-09-12
last: 2023-09-12
tags:
- to-read
---
## Quotes
Replace "accumulations" with "notifications"
> There were buttons and switches everywhere — buttons to call for food for music, for clothing. There was the hot-bath button, by pressure of which a basin of (imitation) marble rose out of the floor, filled to the brim with a warm deodorized liquid. There was the cold-bath button. There was the button that produced literature. And there were of course the buttons by which she communicated with her friends. The room, though it contained nothing, was in touch with all that she cared for in the world
>
> Vashti’s next move was to turn off the isolation switch, and all the accumulations of the last three minutes burst upon her. The room was filled with the noise of bells, and speaking-tubes. What was the new food like? Could she recommend it? Has she had any ideas lately? Might one tell her one’s own ideas? Would she make an engagement to visit the public nurseries at an early date? — say this day month.
>
> To most of these questions she replied with irritation — a growing quality in that accelerated age. She said that the new food was horrible. That she could not visit the public nurseries through press of engagements. That she had no ideas of her own but had just been told one-that four stars and three in the middle were like a man: she doubted there was much in it. Then she switched off her correspondents, for it was time to deliver her lecture on Australian music
+12
View File
@@ -0,0 +1,12 @@
---
categories:
- "[[Podcast episodes]]"
show: "[[Well Made]]"
guests:
- "[[Kevin Kelly]]"
topics: []
episode: "145"
rating: 7
published: 2021-04-15
last: 2023-09-12
---
+10
View File
@@ -0,0 +1,10 @@
---
categories:
- "[[Podcasts]]"
host:
- "[[Steph Ango]]"
rating:
---
## Episodes
![[Podcast episodes.base#Show]]
+8
View File
@@ -0,0 +1,8 @@
---
categories: "[[People]]"
type:
- "[[Actors]]"
---
## Movies
![[Movies.base#Actor]]
+10
View File
@@ -0,0 +1,10 @@
---
categories:
- "[[Albums]]"
genre: []
artist: ""
year:
created: <% tp.date.now() %>
rating:
---
+5
View File
@@ -0,0 +1,5 @@
---
categories: "[[Apps]]"
maker: ""
rating:
---
+8
View File
@@ -0,0 +1,8 @@
---
categories: "[[People]]"
type:
- "[[Authors]]"
---
## Books
![[Books.base#Author]]
+48
View File
@@ -0,0 +1,48 @@
filters:
and:
- note.categories.contains(link("Albums"))
- '!file.name.contains("Template")'
properties:
file.name:
displayName: Album
note.year:
displayName: Year
note.artist:
displayName: Artist
note.created:
displayName: Added
note.rating:
displayName: Rating
note.genre:
displayName: Genre
views:
- type: table
name: Albums
order:
- file.name
- artist
- rating
- year
- genre
- type: table
name: Artist
filters:
and:
- list(artist).contains(this)
order:
- file.name
- artist
- rating
- year
- genre
- type: table
name: Genre
filters:
and:
- list(genre).contains(this)
order:
- file.name
- artist
- rating
- year
- genre
+32
View File
@@ -0,0 +1,32 @@
formulas:
Embeds: if(file.embeds[0].containsAny("jpg","gif","webp","jpeg","avif"), file.embeds[0])
Date: if(created,created,if(start,start))
links: file.
views:
- type: cards
name: Images
filters:
and:
- this.file.hasLink(file)
- '!file.ext.containsAny("base", "canvas", "pdf", "md")'
- file == ""
order: []
sort:
- property: file.name
direction: ASC
image: file.file
cardSize: 70
- type: table
name: Images 2
filters:
and:
- '!file.ext.containsAny("base", "canvas", "pdf", "md")'
order:
- file.name
- file.links
- formula.links
sort:
- property: file.name
direction: ASC
image: file.file
cardSize: 90
+31
View File
@@ -0,0 +1,31 @@
filters:
and:
- file.hasLink(this)
formulas:
Path: file.path
properties:
note.created:
displayName: Date
file.name:
displayName: Title
note.categories:
displayName: Categories
views:
- type: table
name: Backlinks
order:
- file.name
- categories
- created
sort:
- property: created
direction: DESC
- type: table
name: Recent entries
order:
- file.name
- created
sort:
- property: created
direction: DESC
limit: 20
+18
View File
@@ -0,0 +1,18 @@
filters:
and:
- categories.contains(link("Board games"))
- '!file.name.contains("Template")'
properties:
file.name:
displayName: Game
note.rating:
displayName: Rating
note.last:
displayName: Last
views:
- type: table
name: Table
order:
- file.name
- rating
- last
+57
View File
@@ -0,0 +1,57 @@
filters:
and:
- categories.contains(link("Books"))
- '!file.name.contains("Template")'
properties:
note.author:
displayName: Author
file.name:
displayName: Name
note.year:
displayName: Year
note.genre:
displayName: Genre
views:
- type: table
name: Books
order:
- file.name
- author
- length
- year
- rating
- topics
- last
sort:
- property: file.name
direction: ASC
- type: table
name: Top rated
order:
- file.name
- rating
- last
sort:
- property: last
direction: DESC
- type: table
name: Author
filters:
and:
- list(author).contains(this)
order:
- file.name
- year
- genre
sort:
- property: genre
direction: ASC
- type: table
name: Genre
filters:
and:
- list(genre).contains(this)
order:
- file.name
- year
- genre
+39
View File
@@ -0,0 +1,39 @@
filters:
and:
- note.categories.contains(link("Clippings"))
- '!file.name.contains("Template")'
properties:
file.name:
displayName: Title
note.author:
displayName: Author
note.created:
displayName: Clipped
note.published:
displayName: Published
views:
- type: table
name: Clippings
order:
- file.name
- author
- created
- published
sort:
- property: created
direction: DESC
columnSize:
note.author: 140
- type: table
name: Author
filters:
and:
- list(author).contains(this)
order:
- file.name
- author
- created
- published
sort:
- property: clipped
direction: DESC
+22
View File
@@ -0,0 +1,22 @@
filters:
and:
- categories.contains(link("Companies"))
- '!file.name.contains("Template")'
properties:
file.name:
displayName: Company
property.url:
displayName: Link
note.url:
displayName: URL
note.people:
displayName: People
views:
- type: table
name: Companies
order:
- file.name
- url
- people
columnSize:
note.url: 239
+69
View File
@@ -0,0 +1,69 @@
filters:
or:
- file.name.contains(this.file.name)
- created.toString().contains(this.file.name)
- start.toString().contains(this.file.name)
- end.toString().contains(this.file.name)
- file.links.contains(this.file)
properties:
file.name:
displayName: Entry
note.categories:
displayName: Categories
note.created:
displayName: Created
note.tags:
displayName: Tags
views:
- type: table
name: Daily notes
filters:
and:
- '!tags.contains("daily")'
- '!tags.contains("monthly")'
order:
- file.name
- created
- categories
- tags
sort:
- property: tags
direction: ASC
- property: created
direction: DESC
- property: file.name
direction: ASC
- property: categories
direction: ASC
columnSize:
file.name: 287
note.created: 128
note.categories: 119
- type: table
name: Monthly
filters:
and:
- '!tags.contains("daily")'
- '!tags.contains("monthly")'
order:
- file.name
- categories
- created
sort:
- property: file.name
direction: ASC
- property: created
direction: DESC
- type: table
name: Yearly
filters:
and:
- '!tags.contains("daily")'
- '!tags.contains("monthly")'
order:
- file.name
- categories
- created
sort:
- property: created
direction: ASC
+46
View File
@@ -0,0 +1,46 @@
filters:
and:
- categories.contains(link("Events"))
- '!file.name.contains("Template")'
properties:
note.end:
displayName: End
note.loc:
displayName: Location
note.start:
displayName: Start
views:
- type: table
name: Events
order:
- file.name
- start
- end
- loc
sort:
- property: start
direction: DESC
- type: table
name: Type
filters:
and:
- list(type).contains(this)
order:
- file.name
- start
- loc
sort:
- property: start
direction: DESC
- type: table
name: Location
filters:
and:
- list(loc).contains(this)
order:
- file.name
- start
- loc
sort:
- property: start
direction: DESC
+18
View File
@@ -0,0 +1,18 @@
filters:
and:
- tags.contains("0🌲")
- '!file.name.contains("Template")'
properties:
file.name:
displayName: Name
note.created:
displayName: Created
views:
- type: table
name: Evergreen
order:
- file.name
- created
sort:
- property: created
direction: DESC
+36
View File
@@ -0,0 +1,36 @@
formulas:
Embeds: if(file.embeds[0].containsAny("jpg","gif","webp","jpeg","avif"), file.embeds[0])
Date: if(created,created,if(start,start))
views:
- type: table
name: All files
order:
- file.name
- file.mtime
- file.path
- file.ext
- type: cards
name: Images
filters:
and:
- '!file.ext.containsAny("base", "canvas", "pdf", "md")'
order:
- file.name
sort:
- property: file.name
direction: ASC
image: file.file
- type: cards
name: Images in posts
filters:
and:
- "!formula.Embeds.isEmpty()"
order:
- file.name
- formula.Date
sort:
- property: file.name
direction: ASC
- property: date
direction: DESC
image: formula.Embeds
+51
View File
@@ -0,0 +1,51 @@
filters:
and:
- note.categories.contains(link("Games"))
- '!file.name.contains("Template")'
properties:
file.name:
displayName: Games
note.year:
displayName: Year
note.maker:
displayName: Maker
note.rating:
displayName: Rating
note.genre:
displayName: Genre
note.last:
displayName: Last played
views:
- type: table
name: Games
order:
- file.name
- maker
- genre
- year
- rating
- last
- type: table
name: Studio
filters:
and:
- list(maker).contains(this)
order:
- file.name
- maker
- genre
- year
- rating
- last
- type: table
name: Genre
filters:
and:
- list(genre).contains(this)
order:
- file.name
- maker
- genre
- year
- rating
- last
+24
View File
@@ -0,0 +1,24 @@
filters:
and:
- list(genre).contains(this)
display:
note.rating: Rating
note.categories: Category
note.last: Last
file.name: Name
views:
- type: table
name: Genre
order:
- file.name
- rating
- categories
- last
sort:
- column: note.rating
direction: DESC
- column: note.last
direction: DESC
columnSize:
file.name: 248
note.categories: 170
+15
View File
@@ -0,0 +1,15 @@
filters:
and:
- '!file.name.contains("Template")'
- tags.contains("journal")
properties:
file.name:
displayName: Entry
note.created:
displayName: Created
views:
- type: table
name: Table
order:
- file.name
- created
+89
View File
@@ -0,0 +1,89 @@
filters:
and:
- categories.contains(link("Places"))
- '!file.name.contains("Template")'
formulas:
Icon: list(type)[0].asFile().properties.icon
Color: list(type)[0].asFile().properties.color
properties:
note.type:
displayName: Type
note.rating:
displayName: Rating
note.loc:
displayName: Location
file.name:
displayName: Name
note.last:
displayName: Last
views:
- type: map
name: Map
order:
- file.name
- rating
- loc
- type
- last
- formula.Icon
sort:
- property: last
direction: DESC
- property: type
direction: ASC
- property: loc
direction: ASC
defaultZoom: 2
coordinates: note.coordinates
markerIcon: formula.Icon
markerColor: formula.Color
- type: map
name: Location
filters:
or:
- list(loc).contains(this)
- list(loc).containsAny(this.related)
order:
- file.name
sort:
- property: last
direction: DESC
- property: type
direction: ASC
- property: loc
direction: ASC
columnSize:
file.name: 162
note.rating: 84
note.loc: 145
note.type: 199
coordinates: note.coordinates
defaultZoom: 10.6
markerIcon: formula.Icon
markerColor: formula.Color
- type: map
name: Type
filters:
and:
- list(type).contains(this)
order:
- file.name
- rating
- type
- formula.Color
sort:
- property: last
direction: DESC
- property: type
direction: ASC
- property: loc
direction: ASC
columnSize:
file.name: 162
note.rating: 84
note.loc: 145
note.type: 199
coordinates: note.coordinates
defaultZoom: 3.1
markerIcon: formula.Icon
markerColor: formula.Color
+52
View File
@@ -0,0 +1,52 @@
filters:
and:
- categories.contains(link("Meetings"))
- '!file.name.contains("Template")'
properties:
note.date:
displayName: Date
note.people:
displayName: People
note.type:
displayName: Type
file.name:
displayName: Meeting
note.org:
displayName: Org
views:
- type: table
name: Meetings
order:
- file.name
- date
- type
- people
sort:
- property: date
direction: ASC
- type: table
name: Person
filters:
and:
- list(people).contains(this)
order:
- file.name
- date
- type
- people
sort:
- property: date
direction: ASC
- type: table
name: Type
filters:
and:
- list(type).contains(this)
order:
- file.name
- date
- people
- org
sort:
- property: date
direction: DESC
+239
View File
@@ -0,0 +1,239 @@
filters:
and:
- categories.contains(link("Movies"))
- '!file.name.contains("Template")'
properties:
file.name:
displayName: Name
note.last:
displayName: Last
note.rating:
displayName: Rating
note.year:
displayName: Year
note.director:
displayName: Director
note.genre:
displayName: Genre
note.cast:
displayName: Cast
note.scoreImdb:
displayName: IMDB
note.scoreRT:
displayName: RT
note.runtime:
displayName: Runtime
note.watchlist:
displayName: Added
views:
- type: table
name: All
order:
- file.name
- year
- director
- rating
- last
- plot
- genre
sort:
- property: director
direction: ASC
- property: plot
direction: ASC
columnSize:
file.name: 193
note.director: 205
note.plot: 233
note.genre: 261
- type: table
name: To-watch
filters:
and:
- last.isEmpty()
- rating.isEmpty()
order:
- file.name
- year
- scoreImdb
- scoreRT
- runtime
- watchlist
- director
- genre
sort:
- property: scoreImdb
direction: DESC
- property: scoreRT
direction: DESC
- property: watchlist
direction: DESC
- property: file.name
direction: ASC
- property: director
direction: ASC
columnSize:
file.name: 283
note.year: 68
note.scoreRT: 67
note.director: 238
- type: table
name: Favorites
filters:
and:
- note.rating > 6
order:
- file.name
- director
- year
- genre
- rating
- ratingImdb
- last
sort:
- property: file.name
direction: ASC
- property: ratingImdb
direction: DESC
columnSize:
file.name: 283
note.director: 221
note.year: 68
- type: table
name: Last seen
filters:
and:
- "!last.isEmpty()"
order:
- file.name
- year
- rating
- last
- director
- genre
sort:
- property: last
direction: DESC
- property: file.name
direction: ASC
limit: 20
- type: table
name: Actor
filters:
and:
- list(cast).contains(this)
order:
- file.name
- year
- director
- genre
- ratingImdb
sort:
- property: ratingImdb
direction: DESC
- type: table
name: Genre
filters:
and:
- list(genre).contains(this)
order:
- file.name
- rating
- year
- director
- last
- genre
sort:
- property: last
direction: DESC
- property: genre
direction: ASC
- property: rating
direction: DESC
columnSize:
note.director: 166
note.last: 115
- type: table
name: Director
filters:
and:
- list(director).contains(this)
order:
- file.name
- year
- rating
- last
- cast
- genre
sort:
- property: last
direction: DESC
- property: rating
direction: ASC
- property: year
direction: DESC
columnSize:
file.name: 186
note.year: 79
note.rating: 96
note.genre: 243
- type: table
name: Soundtrack
filters:
and:
- list(music).contains(this)
order:
- file.name
- year
- rating
- last
- cast
- genre
sort:
- property: last
direction: DESC
- property: rating
direction: ASC
- property: year
direction: DESC
columnSize:
file.name: 186
note.year: 79
note.rating: 96
note.genre: 243
- type: table
name: Theater
filters:
and:
- file.links.contains(this.file)
order:
- file.name
- rating
- last
- year
- scoreImdb
- runtime
- scoreRT
- watchlist
- director
- genre
sort:
- property: last
direction: DESC
- property: scoreImdb
direction: DESC
- property: scoreRT
direction: DESC
- property: watchlist
direction: DESC
- property: file.name
direction: ASC
- property: director
direction: ASC
columnSize:
file.name: 283
note.rating: 94
note.year: 68
note.scoreRT: 67
note.director: 238
note.genre: 243
+33
View File
@@ -0,0 +1,33 @@
filters:
and:
- '!file.name.contains("Template")'
- note.tags.contains("people")
formulas:
Age: (now() - birthday).years.floor()
properties:
file.name:
displayName: Name
note.tags:
displayName: Tags
note.birthday:
displayName: Birthday
views:
- type: table
name: All people
order:
- file.name
- tags
- birthday
- formula.Age
sort:
- property: file.name
direction: ASC
- property: tags
direction: ASC
- property: formula.Age
direction: DESC
- property: birthday
direction: DESC
columnSize:
note.tags: 209
formula.Age: 99
+115
View File
@@ -0,0 +1,115 @@
filters:
and:
- note.categories.contains(link("Places"))
- '!file.name.contains("Template")'
properties:
note.type:
displayName: Type
note.rating:
displayName: Rating
note.loc:
displayName: Location
file.name:
displayName: Name
note.last:
displayName: Last
views:
- type: table
name: Places
order:
- file.name
- rating
- loc
- type
- last
sort:
- property: last
direction: DESC
- property: type
direction: ASC
- property: loc
direction: ASC
columnSize:
file.name: 162
note.loc: 145
note.type: 199
- type: table
name: Location
filters:
and:
- list(loc).contains(this)
order:
- file.name
- type
- rating
- last
sort:
- property: rating
direction: DESC
- property: last
direction: DESC
- property: loc
direction: ASC
columnSize:
note.type: 197
- type: table
name: Type
filters:
and:
- list(type).contains(this)
order:
- file.name
- type
- rating
- last
sort:
- property: last
direction: DESC
- property: loc
direction: ASC
columnSize:
note.type: 153
- type: table
name: Related
filters:
and:
- file.hasLink(this)
- '!tags.containsAny("cities", "countries")'
order:
- file.name
- rating
- loc
- type
- last
sort:
- property: rating
direction: DESC
- property: last
direction: DESC
- property: type
direction: ASC
- property: loc
direction: ASC
columnSize:
file.name: 162
note.rating: 65
note.loc: 145
note.type: 199
- type: table
name: Metatype
filters:
or:
- list(type).contains(this)
- list(type).containsAny(this.topics)
order:
- file.name
- type
- rating
- last
sort:
- property: last
direction: DESC
- property: loc
direction: ASC
columnSize:
note.type: 153
+56
View File
@@ -0,0 +1,56 @@
filters:
and:
- note.categories.contains(link("Podcast episodes"))
- '!file.name.contains("Template")'
properties:
file.name:
displayName: Podcast
note.show:
displayName: Show
note.guests:
displayName: Guests
note.episode:
displayName: Episode
note.rating:
displayName: Rating
note.published:
displayName: Published
note.guest:
displayName: Guest
views:
- type: table
name: All episodes
order:
- file.name
- show
- guests
- episode
- rating
- published
sort:
- property: published
direction: DESC
- type: table
name: Show
filters:
and:
- list(show).contains(this)
order:
- file.name
- show
- episode
- rating
- published
- guest
- type: table
name: Guest
filters:
and:
- list(guest).contains(this)
order:
- file.name
- show
- guests
- episode
- rating
- published
+15
View File
@@ -0,0 +1,15 @@
filters:
and:
- note.categories.contains(link("Podcasts"))
- '!file.name.contains("Template")'
properties:
file.name:
displayName: Podcast
note.host:
displayName: Host
views:
- type: table
name: Table
order:
- file.name
- host
+21
View File
@@ -0,0 +1,21 @@
properties:
file.name:
displayName: Title
note.status:
displayName: Status
note.published:
displayName: Published
views:
- type: table
name: All
filters:
and:
- list(categories).contains(link("Posts"))
- '!file.name.contains("Template")'
order:
- file.name
- status
- published
sort:
- column: note.published
direction: DESC
+149
View File
@@ -0,0 +1,149 @@
filters:
and:
- note.categories.contains(link("Products"))
- '!file.name.contains("Template")'
formulas:
Owned: ((now() - acquired).months).round()
totalUses: monthlyUses * formula.Owned.round()
perUse: (price / formula.totalUses).toFixed(2)
properties:
note.monthlyUses:
displayName: Uses/month
formula.Owned:
displayName: Months
formula.totalUses:
displayName: Total uses
formula.perUse:
displayName: Per use
note.price:
displayName: Price
note.rating:
displayName: Rating
note.acquired:
displayName: Acquired
note.type:
displayName: Type
file.name:
displayName: Product
views:
- type: table
name: Products
order:
- file.name
- acquired
- rating
- price
- monthlyUses
- formula.perUse
- formula.Owned
- formula.totalUses
- type
sort:
- property: formula.perUse
direction: ASC
- property: formula.totalUses
direction: ASC
- property: acquired
direction: DESC
- property: file.name
direction: DESC
- property: rating
direction: DESC
- property: formula.Owned
direction: ASC
columnSize:
file.name: 209
note.acquired: 112
note.price: 78
note.monthlyUses: 123
formula.perUse: 102
formula.Owned: 113
formula.totalUses: 115
- type: table
name: Cost per use
filters:
and:
- note.monthlyUses > 0
order:
- file.name
- acquired
- monthlyUses
- price
- formula.Owned
- formula.totalUses
- formula.perUse
- type
- rating
sort:
- property: acquired
direction: ASC
- property: monthlyUses
direction: DESC
- property: rating
direction: DESC
columnSize:
file.name: 207
note.acquired: 112
note.monthlyUses: 131
note.price: 78
formula.Owned: 99
formula.totalUses: 100
formula.perUse: 93
- type: table
name: Maker
filters:
and:
- list(maker).contains(this)
order:
- file.name
- rating
- formula.perUse
- monthlyUses
- price
- formula.totalUses
- formula.Owned
- acquired
- type
sort:
- property: file.name
direction: ASC
- property: formula.totalUses
direction: DESC
- property: acquired
direction: DESC
- property: monthlyUses
direction: DESC
columnSize:
file.name: 209
note.monthlyUses: 82
formula.totalUses: 115
- type: table
name: Type
filters:
and:
- list(type).contains(this)
order:
- file.name
- rating
- formula.perUse
- monthlyUses
- price
- formula.totalUses
- formula.Owned
- acquired
- type
sort:
- property: rating
direction: DESC
- property: file.name
direction: ASC
- property: formula.totalUses
direction: DESC
- property: acquired
direction: DESC
- property: monthlyUses
direction: DESC
columnSize:
file.name: 209
note.monthlyUses: 82
formula.totalUses: 115
+32
View File
@@ -0,0 +1,32 @@
filters:
and:
- '!file.name.contains("Template")'
- note.categories.contains(link("Projects"))
properties:
note.status:
displayName: Status
note.url:
displayName: URL
file.name:
displayName: Name
note.type:
displayName: Type
note.year:
displayName: Year
views:
- type: table
name: Table
order:
- file.name
- type
- year
- status
- url
sort:
- column: note.status
direction: ASC
- column: note.year
direction: DESC
columnSize:
file.name: 209
note.type: 199
+39
View File
@@ -0,0 +1,39 @@
filters:
and:
- rating > 0
properties:
note.rating:
displayName: Rating
note.last:
displayName: Last
file.name:
displayName: Name
note.categories:
displayName: Categories
views:
- type: table
name: Ratings
order:
- file.name
- rating
- last
- categories
sort:
- property: last
direction: DESC
columnSize:
file.name: 238
- type: table
name: Recent
filters:
and:
- last > now() - "60d"
order:
- file.name
- rating
- last
- categories
sort:
- property: last
direction: DESC
limit: 100
+30
View File
@@ -0,0 +1,30 @@
filters:
and:
- note.categories.contains(link("Recipes"))
- '!file.name.contains("Template")'
properties:
file.name:
displayName: Name
note.author:
displayName: Author
note.type:
displayName: Type
note.ingredients:
displayName: Ingredients
note.cuisine:
displayName: Cuisine
note.rating:
displayName: Rating
views:
- type: table
name: Recipes
order:
- file.name
- type
- cuisine
- author
- ingredients
- rating
columnSize:
note.type: 201
note.cuisine: 174
+40
View File
@@ -0,0 +1,40 @@
filters:
and:
- file.path != this.file.path
formulas:
LinksOverlap: formula.Related.length
Related: list(this.file.links).filter(list(file.links).containsAny(value)).unique()
BacklinksCount: file.backlinks.length
TagsOverlap: list(this.file.tags).filter(list(file.tags).containsAny(value)).unique().length
properties:
formula.LinksOverlap:
displayName: Links overlap
file.name:
displayName: Name
formula.BacklinksCount:
displayName: Backlinks count
formula.TagsOverlap:
displayName: Tags overlap
formula.Related:
displayName: Links
views:
- type: table
name: Related
filters:
or:
- formula.LinksOverlap > 2
- file.hasLink(this)
- this.file.hasLink(file)
order:
- file.name
- formula.Related
sort:
- property: formula.LinksOverlap
direction: DESC
- property: formula.TagsOverlap
direction: DESC
- property: formula.BacklinksCount
direction: DESC
limit: 20
columnSize:
file.name: 220
+94
View File
@@ -0,0 +1,94 @@
filters:
and:
- '!file.name.contains("Template")'
- note.categories.contains(link("Shows"))
properties:
file.name:
displayName: Name
note.last:
displayName: Last
note.rating:
displayName: Rating
note.year:
displayName: Year
note.director:
displayName: Director
note.genre:
displayName: Genre
note.cast:
displayName: Cast
views:
- type: table
name: All
order:
- file.name
- year
- rating
- last
- director
- genre
sort:
- column: note.rating
direction: DESC
- column: file.name
direction: ASC
- column: note.director
direction: ASC
- type: table
name: Favorites
filters:
and:
- note.rating > 6
order:
- file.name
- year
- rating
- last
- director
- genre
- type: table
name: Last seen
filters:
and:
- not(empty(note.last))
order:
- file.name
- year
- rating
- last
- director
- genre
sort:
- column: note.last
direction: DESC
limit: 20
- type: table
name: Actor
filters:
and:
- list(cast).contains(this)
order:
- file.name
- year
- director
- genre
- type: table
name: Genre
filters:
and:
- list(genre).contains(this)
order:
- file.name
- year
- director
- genre
- type: table
name: Director
filters:
and:
- list(director).contains(this)
order:
- file.name
- year
- cast
- genre
+12
View File
@@ -0,0 +1,12 @@
filters:
and:
- file.path.contains("/Templates")
views:
- type: table
name: Table
order:
- file.name
- categories
sort: []
columnSize:
file.name: 234
+38
View File
@@ -0,0 +1,38 @@
filters:
and:
- note.categories.contains(link("Trips"))
- '!file.name.contains("Template")'
properties:
note.start:
displayName: Start
note.end:
displayName: End
file.name:
displayName: Trip
note.loc:
displayName: Location
views:
- type: table
name: All trips
filters:
and:
- '!file.name.contains("Planning")'
order:
- file.name
- start
- end
- loc
sort:
- property: end
direction: DESC
columnSize:
file.name: 255
- type: table
name: Location
filters:
and:
- list(loc).contains(this)
order:
- file.name
- start
- end
+9
View File
@@ -0,0 +1,9 @@
---
categories:
- "[[Board games]]"
type: []
maker:
year:
rating:
last: <% tp.date.now() %>
---
Loaded 100 of 463 files, more files were not shown because too many files have changed in this diff. Show more