From a590f20799bc0ef6006cae5347abab1ac1fa3406 Mon Sep 17 00:00:00 2001 From: baalajimaestro Date: Sun, 26 Mar 2023 21:55:42 +0530 Subject: [PATCH] Add plugin for page preview locks Signed-off-by: baalajimaestro --- .obsidian/community-plugins.json | 3 +- .obsidian/page-preview.json | 1 + .obsidian/plugins/chatgpt-md/data.json | 11 + .obsidian/plugins/chatgpt-md/main.js | 262 +++++++++++++----- .obsidian/plugins/chatgpt-md/manifest.json | 2 +- .../obsidian-excalidraw-plugin/data.json | 2 +- .../obsidian-view-mode-by-frontmatter/main.js | 185 +++++++++++++ .../manifest.json | 10 + .obsidian/workspace.json | 21 +- 9 files changed, 415 insertions(+), 82 deletions(-) create mode 100644 .obsidian/page-preview.json create mode 100644 .obsidian/plugins/chatgpt-md/data.json create mode 100644 .obsidian/plugins/obsidian-view-mode-by-frontmatter/main.js create mode 100644 .obsidian/plugins/obsidian-view-mode-by-frontmatter/manifest.json diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 8711a6b..01cdba1 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -15,5 +15,6 @@ "obsidian-outliner", "url-into-selection", "settings-search", - "waypoint" + "waypoint", + "obsidian-view-mode-by-frontmatter" ] \ No newline at end of file diff --git a/.obsidian/page-preview.json b/.obsidian/page-preview.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.obsidian/page-preview.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.obsidian/plugins/chatgpt-md/data.json b/.obsidian/plugins/chatgpt-md/data.json new file mode 100644 index 0000000..d53533f --- /dev/null +++ b/.obsidian/plugins/chatgpt-md/data.json @@ -0,0 +1,11 @@ +{ + "apiKey": "default", + "defaultChatFrontmatter": "---\nsystem_commands: ['I am a helpful assistant.']\ntemperature: 0\ntop_p: 1\nmax_tokens: 512\npresence_penalty: 1\nfrequency_penalty: 1\nstream: true\nstop: null\nn: 1\nmodel: gpt-3.5-turbo\n---", + "stream": true, + "chatTemplateFolder": "ChatGPT_MD/templates", + "chatFolder": "ChatGPT_MD/chats", + "generateAtCursor": false, + "autoInferTitle": false, + "dateFormat": "YYYYMMDDhhmmss", + "headingLevel": 0 +} \ No newline at end of file diff --git a/.obsidian/plugins/chatgpt-md/main.js b/.obsidian/plugins/chatgpt-md/main.js index 582f912..3ce966f 100644 --- a/.obsidian/plugins/chatgpt-md/main.js +++ b/.obsidian/plugins/chatgpt-md/main.js @@ -217,13 +217,14 @@ __export(main_exports, { default: () => ChatGPT_MD }); module.exports = __toCommonJS(main_exports); -var import_obsidian2 = require("obsidian"); +var import_obsidian3 = require("obsidian"); // stream.ts -var import_obsidian = require("obsidian"); +var import_obsidian2 = require("obsidian"); var import_sse = __toESM(require_sse()); // helpers.ts +var import_obsidian = require("obsidian"); var unfinishedCodeBlock = (txt) => { const matcher = txt.match(/```/g); if (!matcher) { @@ -233,6 +234,80 @@ var unfinishedCodeBlock = (txt) => { console.log("[ChatGPT MD] unclosed code block detected"); return matcher.length % 2 !== 0; }; +var writeInferredTitleToEditor = async (vault, view, fileManager, chatFolder, title) => { + try { + const file = view.file; + const folder = chatFolder.replace(/\/$/, ""); + let newFileName = `${folder}/${title}.md`; + let i = 1; + while (await vault.adapter.exists(newFileName)) { + newFileName = `${folder}/${title} (${i}).md`; + i++; + } + fileManager.renameFile(file, newFileName); + } catch (err) { + new import_obsidian.Notice("[ChatGPT MD] Error writing inferred title to editor"); + console.log("[ChatGPT MD] Error writing inferred title to editor", err); + throw err; + } +}; +var createFolderModal = async (app2, vault, folderName, folderPath) => { + const folderCreationModal = new FolderCreationModal( + app2, + folderName, + folderPath + ); + folderCreationModal.open(); + const result = await folderCreationModal.waitForModalValue(); + if (result) { + console.log("[ChatGPT MD] Creating folder"); + await vault.createFolder(folderPath); + } else { + console.log("[ChatGPT MD] Not creating folder"); + } + return result; +}; +var FolderCreationModal = class extends import_obsidian.Modal { + constructor(app2, folderName, folderPath) { + super(app2); + this.folderName = folderName; + this.folderPath = folderPath; + this.result = false; + this.modalPromise = new Promise((resolve) => { + this.resolveModalPromise = resolve; + }); + } + onOpen() { + const { contentEl } = this; + contentEl.createEl("h2", { + text: `[ChatGPT MD] No ${this.folderName} folder found.` + }); + contentEl.createEl("p", { + text: `If you choose "Yes, Create", the plugin will automatically create a folder at: ${this.folderPath}. You can change this path in the plugin settings.` + }); + new import_obsidian.Setting(contentEl).addButton( + (btn) => btn.setButtonText("Yes, Create Folder").setTooltip("Create folder").setCta().onClick(() => { + this.result = true; + this.resolveModalPromise(this.result); + this.close(); + }) + ); + new import_obsidian.Setting(contentEl).addButton( + (btn) => btn.setButtonText("No, I'll create it myself").setTooltip("Cancel").setCta().onClick(() => { + this.result = false; + this.resolveModalPromise(this.result); + this.close(); + }) + ); + } + waitForModalValue() { + return this.modalPromise; + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; // stream.ts var StreamManager = class { @@ -240,8 +315,8 @@ var StreamManager = class { this.sse = null; this.manualClose = false; this.stopStreaming = () => { - if (import_obsidian.Platform.isMobile) { - new import_obsidian.Notice("[ChatGPT MD] Mobile not supported."); + if (import_obsidian2.Platform.isMobile) { + new import_obsidian2.Notice("[ChatGPT MD] Mobile not supported."); return; } if (this.sse) { @@ -336,7 +411,7 @@ ${headingPrefix}role::assistant ch: Infinity }); } else { - new import_obsidian.Notice( + new import_obsidian2.Notice( "[ChatGPT MD] Text pasted at cursor may leave artifacts. Please remove them manually. ChatGPT MD cannot safely remove text when pasting at cursor." ); } @@ -388,7 +463,7 @@ var DEFAULT_SETTINGS = { headingLevel: 0 }; var DEFAULT_URL = `https://api.openai.com/v1/chat/completions`; -var ChatGPT_MD = class extends import_obsidian2.Plugin { +var ChatGPT_MD = class extends import_obsidian3.Plugin { async callOpenAIAPI(streamManager, editor, messages, model = "gpt-3.5-turbo", max_tokens = 250, temperature = 0.3, top_p = 1, presence_penalty = 0.5, frequency_penalty = 0.5, stream = true, stop = null, n = 1, logit_bias = null, user = null, url = DEFAULT_URL) { try { console.log("calling openai api"); @@ -418,7 +493,7 @@ var ChatGPT_MD = class extends import_obsidian2.Plugin { console.log("response from stream", response); return { fullstr: response, mode: "streaming" }; } else { - const responseUrl = await (0, import_obsidian2.requestUrl)({ + const responseUrl = await (0, import_obsidian3.requestUrl)({ url, method: "POST", headers: { @@ -445,7 +520,7 @@ var ChatGPT_MD = class extends import_obsidian2.Plugin { try { const json = responseUrl.json; if (json && json.error) { - new import_obsidian2.Notice( + new import_obsidian3.Notice( `[ChatGPT MD] Stream = False Error :: ${json.error.message}` ); throw new Error(JSON.stringify(json.error)); @@ -463,19 +538,25 @@ var ChatGPT_MD = class extends import_obsidian2.Plugin { } catch (err) { if (err instanceof Object) { if (err.error) { - new import_obsidian2.Notice(`[ChatGPT MD] Error :: ${err.error.message}`); + new import_obsidian3.Notice(`[ChatGPT MD] Error :: ${err.error.message}`); throw new Error(JSON.stringify(err.error)); } else { if (url !== DEFAULT_URL) { - new import_obsidian2.Notice("[ChatGPT MD] Issue calling specified url: " + url); - throw new Error("[ChatGPT MD] Issue calling specified url: " + url); + new import_obsidian3.Notice( + "[ChatGPT MD] Issue calling specified url: " + url + ); + throw new Error( + "[ChatGPT MD] Issue calling specified url: " + url + ); } else { - new import_obsidian2.Notice(`[ChatGPT MD] Error :: ${JSON.stringify(err)}`); + new import_obsidian3.Notice( + `[ChatGPT MD] Error :: ${JSON.stringify(err)}` + ); throw new Error(JSON.stringify(err)); } } } - new import_obsidian2.Notice( + new import_obsidian3.Notice( "issue calling OpenAI API, see console for more details" ); throw new Error( @@ -601,14 +682,15 @@ ${this.getHeadingPrefix()}role::user } async inferTitleFromMessages(messages) { console.log("[ChtGPT MD] Inferring Title"); + new import_obsidian3.Notice("[ChatGPT] Inferring title from messages..."); try { if (messages.length < 2) { - new import_obsidian2.Notice( + new import_obsidian3.Notice( "Not enough messages to infer title. Minimum 2 messages." ); return; } - const prompt = `Infer title from the summary of the content of these messages. The title **cannot** contain any of the following characters: colon, back slash or forwad slash. Just return the title. + const prompt = `Infer title from the summary of the content of these messages. The title **cannot** contain any of the following characters: colon, back slash or forward slash. Just return the title. Messages: ${JSON.stringify( @@ -620,10 +702,7 @@ ${JSON.stringify( content: prompt } ]; - if (import_obsidian2.Platform.isMobile) { - new import_obsidian2.Notice("[ChatGPT] Inferring title from messages..."); - } - const responseUrl = await (0, import_obsidian2.requestUrl)({ + const responseUrl = await (0, import_obsidian3.requestUrl)({ url: `https://api.openai.com/v1/chat/completions`, method: "POST", headers: { @@ -641,10 +720,12 @@ ${JSON.stringify( }); const response = responseUrl.text; const responseJSON = JSON.parse(response); - return responseJSON.choices[0].message.content.trim().replace(/[:/\\]/g, ""); + return responseJSON.choices[0].message.content.replace(/[:/\\]/g, "").replace("Title", "").replace("title", "").trim(); } catch (err) { - new import_obsidian2.Notice("[ChatGPT MD] Error inferring title from messages"); - throw new Error("[ChatGPT MD] Error inferring title from messages" + err); + new import_obsidian3.Notice("[ChatGPT MD] Error inferring title from messages"); + throw new Error( + "[ChatGPT MD] Error inferring title from messages" + err + ); } } // only proceed to infer title if the title is in timestamp format @@ -710,8 +791,8 @@ ${JSON.stringify( if (!this.settings.generateAtCursor) { this.moveCursorToEndOfFile(editor); } - if (import_obsidian2.Platform.isMobile) { - new import_obsidian2.Notice("[ChatGPT MD] Calling API"); + if (import_obsidian3.Platform.isMobile) { + new import_obsidian3.Notice("[ChatGPT MD] Calling API"); } this.callOpenAIAPI( streamManager, @@ -764,41 +845,46 @@ ${this.getHeadingPrefix()}role::user console.log( "[ChatGPT MD] auto inferring title from messages" ); + statusBarItemEl.setText( + "[ChatGPT MD] Calling API..." + ); this.inferTitleFromMessages( messagesWithResponse - ).then((title2) => { + ).then(async (title2) => { if (title2) { console.log( - `[ChatGPT MD] inferred title: ${title2}. Changing file name...` + `[ChatGPT MD] automatically inferred title: ${title2}. Changing file name...` ); - const file = view.file; - const folder = this.settings.chatFolder.replace( - /\/$/, - "" - ); - this.app.fileManager.renameFile( - file, - `${folder}/${title2}.md` + statusBarItemEl.setText(""); + await writeInferredTitleToEditor( + this.app.vault, + view, + this.app.fileManager, + this.settings.chatFolder, + title2 ); } else { - new import_obsidian2.Notice( + new import_obsidian3.Notice( "[ChatGPT MD] Could not infer title", 5e3 ); } }).catch((err) => { console.log(err); - new import_obsidian2.Notice( - "[ChatGPT MD] Error inferring title. " + err, - 5e3 - ); + statusBarItemEl.setText(""); + if (import_obsidian3.Platform.isMobile) { + new import_obsidian3.Notice( + "[ChatGPT MD] Error inferring title. " + err, + 5e3 + ); + } }); } } statusBarItemEl.setText(""); }).catch((err) => { - if (import_obsidian2.Platform.isMobile) { - new import_obsidian2.Notice( + if (import_obsidian3.Platform.isMobile) { + new import_obsidian3.Notice( "[ChatGPT MD Mobile] Full Error calling API. " + err, 9e3 ); @@ -833,13 +919,16 @@ ${this.getHeadingPrefix()}role::user editor.getValue() ); const messages = this.splitMessages(bodyWithoutYML); + statusBarItemEl.setText("[ChatGPT MD] Calling API..."); const title = await this.inferTitleFromMessages(messages); + statusBarItemEl.setText(""); if (title) { - const file = view.file; - const folder = this.settings.chatFolder.replace(/\/$/, ""); - this.app.fileManager.renameFile( - file, - `${folder}/${title}.md` + await writeInferredTitleToEditor( + this.app.vault, + view, + this.app.fileManager, + this.settings.chatFolder, + title ); } } @@ -851,14 +940,21 @@ ${this.getHeadingPrefix()}role::user editorCallback: async (editor, view) => { try { const selectedText = editor.getSelection(); - if (!this.settings.chatFolder || !this.app.vault.getAbstractFileByPath( - this.settings.chatFolder - )) { - new import_obsidian2.Notice( - `[ChatGPT MD] No chat folder found. Please set one in settings and make sure it exists.` + if (!this.settings.chatFolder || this.settings.chatFolder.trim() === "") { + new import_obsidian3.Notice( + `[ChatGPT MD] No chat folder value found. Please set one in settings.` ); return; } + if (!await this.app.vault.adapter.exists(this.settings.chatFolder)) { + const result = await createFolderModal(this.app, this.app.vault, "chatFolder", this.settings.chatFolder); + if (!result) { + new import_obsidian3.Notice( + `[ChatGPT MD] No chat folder found. One must be created to use plugin. Set one in settings and make sure it exists.` + ); + return; + } + } const newFile = await this.app.vault.create( `${this.settings.chatFolder}/${this.getDate( new Date(), @@ -874,7 +970,7 @@ ${selectedText}` `[ChatGPT MD] Error in Create new chat with highlighted text`, err ); - new import_obsidian2.Notice( + new import_obsidian3.Notice( `[ChatGPT MD] Error in Create new chat with highlighted text, check console` ); } @@ -884,23 +980,37 @@ ${selectedText}` id: "choose-chat-template", name: "Create new chat from template", icon: "layout-template", - editorCallback: (editor, view) => { - if (!this.settings.chatFolder || !this.app.vault.getAbstractFileByPath( - this.settings.chatFolder - )) { - new import_obsidian2.Notice( - `[ChatGPT MD] No chat folder found. Please set one in settings and make sure it exists.` + editorCallback: async (editor, view) => { + if (!this.settings.chatFolder || this.settings.chatFolder.trim() === "") { + new import_obsidian3.Notice( + `[ChatGPT MD] No chat folder value found. Please set one in settings.` ); return; } - if (!this.settings.chatTemplateFolder || !this.app.vault.getAbstractFileByPath( - this.settings.chatTemplateFolder - )) { - new import_obsidian2.Notice( - `[ChatGPT MD] No templates folder found. Please set one in settings and make sure it exists.` + if (!await this.app.vault.adapter.exists(this.settings.chatFolder)) { + const result = await createFolderModal(this.app, this.app.vault, "chatFolder", this.settings.chatFolder); + if (!result) { + new import_obsidian3.Notice( + `[ChatGPT MD] No chat folder found. One must be created to use plugin. Set one in settings and make sure it exists.` + ); + return; + } + } + if (!this.settings.chatTemplateFolder || this.settings.chatTemplateFolder.trim() === "") { + new import_obsidian3.Notice( + `[ChatGPT MD] No chat template folder value found. Please set one in settings.` ); return; } + if (!await this.app.vault.adapter.exists(this.settings.chatTemplateFolder)) { + const result = await createFolderModal(this.app, this.app.vault, "chatTemplateFolder", this.settings.chatTemplateFolder); + if (!result) { + new import_obsidian3.Notice( + `[ChatGPT MD] No chat template folder found. One must be created to use plugin. Set one in settings and make sure it exists.` + ); + return; + } + } new ChatTemplates( this.app, this.settings, @@ -923,7 +1033,7 @@ ${selectedText}` await this.saveData(this.settings); } }; -var ChatTemplates = class extends import_obsidian2.SuggestModal { +var ChatTemplates = class extends import_obsidian3.SuggestModal { constructor(app2, settings, titleDate) { super(app2); this.settings = settings; @@ -936,7 +1046,7 @@ var ChatTemplates = class extends import_obsidian2.SuggestModal { if (folder != null) { return folder.children; } else { - new import_obsidian2.Notice( + new import_obsidian3.Notice( `Error getting folder: ${this.settings.chatTemplateFolder}` ); throw new Error( @@ -970,7 +1080,7 @@ var ChatTemplates = class extends import_obsidian2.SuggestModal { } // Perform action on the selected suggestion. async onChooseSuggestion(template, evt) { - new import_obsidian2.Notice(`Selected ${template.title}`); + new import_obsidian3.Notice(`Selected ${template.title}`); const templateText = await this.app.vault.read(template.file); const file = await this.app.vault.create( `${this.settings.chatFolder}/${this.titleDate}.md`, @@ -979,7 +1089,7 @@ var ChatTemplates = class extends import_obsidian2.SuggestModal { this.app.workspace.openLinkText(file.basename, "", true); } }; -var ChatGPT_MDSettingsTab = class extends import_obsidian2.PluginSettingTab { +var ChatGPT_MDSettingsTab = class extends import_obsidian3.PluginSettingTab { constructor(app2, plugin) { super(app2, plugin); this.plugin = plugin; @@ -994,13 +1104,13 @@ var ChatGPT_MDSettingsTab = class extends import_obsidian2.PluginSettingTab { text: "https://platform.openai.com/tokenizer", href: "https://platform.openai.com/tokenizer" }); - new import_obsidian2.Setting(containerEl).setName("OpenAI API Key").setDesc("API Key for OpenAI").addText( + new import_obsidian3.Setting(containerEl).setName("OpenAI API Key").setDesc("API Key for OpenAI").addText( (text) => text.setPlaceholder("some-api-key").setValue(this.plugin.settings.apiKey).onChange(async (value) => { this.plugin.settings.apiKey = value; await this.plugin.saveSettings(); }) ); - new import_obsidian2.Setting(containerEl).setName("Default Chat Frontmatter").setDesc( + new import_obsidian3.Setting(containerEl).setName("Default Chat Frontmatter").setDesc( "Default frontmatter for new chat files. You can change/use all of the settings exposed by the OpenAI API here: https://platform.openai.com/docs/api-reference/chat/create" ).addTextArea( (text) => text.setPlaceholder( @@ -1022,31 +1132,31 @@ model: gpt-3.5-turbo await this.plugin.saveSettings(); }) ); - new import_obsidian2.Setting(containerEl).setName("Stream").setDesc("Stream responses from OpenAI").addToggle( + new import_obsidian3.Setting(containerEl).setName("Stream").setDesc("Stream responses from OpenAI").addToggle( (toggle) => toggle.setValue(this.plugin.settings.stream).onChange(async (value) => { this.plugin.settings.stream = value; await this.plugin.saveSettings(); }) ); - new import_obsidian2.Setting(containerEl).setName("Chat Folder").setDesc("Path to folder for chat files").addText( + new import_obsidian3.Setting(containerEl).setName("Chat Folder").setDesc("Path to folder for chat files").addText( (text) => text.setValue(this.plugin.settings.chatFolder).onChange(async (value) => { this.plugin.settings.chatFolder = value; await this.plugin.saveSettings(); }) ); - new import_obsidian2.Setting(containerEl).setName("Chat Template Folder").setDesc("Path to folder for chat file templates").addText( + new import_obsidian3.Setting(containerEl).setName("Chat Template Folder").setDesc("Path to folder for chat file templates").addText( (text) => text.setPlaceholder("chat-templates").setValue(this.plugin.settings.chatTemplateFolder).onChange(async (value) => { this.plugin.settings.chatTemplateFolder = value; await this.plugin.saveSettings(); }) ); - new import_obsidian2.Setting(containerEl).setName("Generate at Cursor").setDesc("Generate text at cursor instead of end of file").addToggle( + new import_obsidian3.Setting(containerEl).setName("Generate at Cursor").setDesc("Generate text at cursor instead of end of file").addToggle( (toggle) => toggle.setValue(this.plugin.settings.generateAtCursor).onChange(async (value) => { this.plugin.settings.generateAtCursor = value; await this.plugin.saveSettings(); }) ); - new import_obsidian2.Setting(containerEl).setName("Automatically Infer Title").setDesc( + new import_obsidian3.Setting(containerEl).setName("Automatically Infer Title").setDesc( "Automatically infer title after 4 messages have been exchanged" ).addToggle( (toggle) => toggle.setValue(this.plugin.settings.autoInferTitle).onChange(async (value) => { @@ -1054,7 +1164,7 @@ model: gpt-3.5-turbo await this.plugin.saveSettings(); }) ); - new import_obsidian2.Setting(containerEl).setName("Date Format").setDesc( + new import_obsidian3.Setting(containerEl).setName("Date Format").setDesc( "Date format for chat files. Valid date blocks are: YYYY, MM, DD, hh, mm, ss" ).addText( (text) => text.setPlaceholder("YYYYMMDDhhmmss").setValue(this.plugin.settings.dateFormat).onChange(async (value) => { @@ -1062,7 +1172,7 @@ model: gpt-3.5-turbo await this.plugin.saveSettings(); }) ); - new import_obsidian2.Setting(containerEl).setName("Heading Level").setDesc( + new import_obsidian3.Setting(containerEl).setName("Heading Level").setDesc( "Heading level for messages (example for heading level 2: '## role::user'). Valid heading levels are 0, 1, 2, 3, 4, 5, 6" ).addText( (text) => text.setValue(this.plugin.settings.headingLevel.toString()).onChange(async (value) => { diff --git a/.obsidian/plugins/chatgpt-md/manifest.json b/.obsidian/plugins/chatgpt-md/manifest.json index 7937878..19b339f 100644 --- a/.obsidian/plugins/chatgpt-md/manifest.json +++ b/.obsidian/plugins/chatgpt-md/manifest.json @@ -1,7 +1,7 @@ { "id": "chatgpt-md", "name": "ChatGPT MD", - "version": "1.4.2", + "version": "1.4.3", "minAppVersion": "0.15.0", "description": "A (nearly) seamless integration of ChatGPT into Obsidian.", "author": "Bram Adams", diff --git a/.obsidian/plugins/obsidian-excalidraw-plugin/data.json b/.obsidian/plugins/obsidian-excalidraw-plugin/data.json index 62cd099..8386486 100644 --- a/.obsidian/plugins/obsidian-excalidraw-plugin/data.json +++ b/.obsidian/plugins/obsidian-excalidraw-plugin/data.json @@ -81,7 +81,7 @@ "scriptEngineSettings": {}, "defaultTrayMode": true, "previousRelease": "1.8.20", - "showReleaseNotes": true, + "showReleaseNotes": false, "showNewVersionNotification": true, "mathjaxSourceURL": "https://cdn.jsdelivr.net/npm/mathjax@3.2.1/es5/tex-svg.js", "taskboneEnabled": false, diff --git a/.obsidian/plugins/obsidian-view-mode-by-frontmatter/main.js b/.obsidian/plugins/obsidian-view-mode-by-frontmatter/main.js new file mode 100644 index 0000000..108b7a3 --- /dev/null +++ b/.obsidian/plugins/obsidian-view-mode-by-frontmatter/main.js @@ -0,0 +1,185 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ROLLUP +if you want to view the source visit the plugins github repository +*/ + +'use strict'; + +var obsidian = require('obsidian'); + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +const DEFAULT_SETTINGS = { + ignoreOpenFiles: false, + ignoreForceViewAll: false, +}; +class ViewModeByFrontmatterPlugin extends obsidian.Plugin { + constructor() { + super(...arguments); + this.OBSIDIAN_UI_MODE_KEY = "obsidianUIMode"; + this.OBSIDIAN_EDITING_MODE_KEY = "obsidianEditingMode"; + } + onload() { + return __awaiter(this, void 0, void 0, function* () { + yield this.loadSettings(); + this.addSettingTab(new ViewModeByFrontmatterSettingTab(this.app, this)); + this.openedFiles = resetOpenedNotes(this.app); + const readViewModeFromFrontmatterAndToggle = (leaf) => __awaiter(this, void 0, void 0, function* () { + let view = leaf.view instanceof obsidian.MarkdownView ? leaf.view : null; + if (null === view) { + if (true == this.settings.ignoreOpenFiles) { + this.openedFiles = resetOpenedNotes(this.app); + } + return; + } + // if setting is true, nothing to do if this was an open note + if (true == this.settings.ignoreOpenFiles && + alreadyOpen(view.file, this.openedFiles)) { + this.openedFiles = resetOpenedNotes(this.app); + return; + } + // ... get frontmatter data and search for a key indicating the desired view mode + // and when the given key is present ... set it to the declared mode + const fileCache = this.app.metadataCache.getFileCache(view.file); + const fileDeclaredUIMode = fileCache !== null && fileCache.frontmatter + ? fileCache.frontmatter[this.OBSIDIAN_UI_MODE_KEY] + : null; + const fileDeclaredEditingMode = fileCache !== null && fileCache.frontmatter + ? fileCache.frontmatter[this.OBSIDIAN_EDITING_MODE_KEY] + : null; + let state = leaf.getViewState(); + if (fileDeclaredUIMode) { + if (["source", "preview", "live"].includes(fileDeclaredUIMode) && + view.getMode() !== fileDeclaredUIMode) { + state.state.mode = fileDeclaredUIMode; + } + } + if (fileDeclaredEditingMode) { + const shouldBeSourceMode = fileDeclaredEditingMode == 'source'; + if (["source", "live"].includes(fileDeclaredEditingMode)) { + state.state.source = shouldBeSourceMode; + } + } + if (fileDeclaredUIMode || fileDeclaredEditingMode) { + leaf.setViewState(state); + if (true == this.settings.ignoreOpenFiles) { + this.openedFiles = resetOpenedNotes(this.app); + } + return; + } + const defaultViewMode = this.app.vault.config.defaultViewMode + ? this.app.vault.config.defaultViewMode + : "source"; + const defaultEditingModeIsLivePreview = this.app.vault.config.livePreview; + if (!this.settings.ignoreForceViewAll) { + let state = leaf.getViewState(); + if (view.getMode() !== defaultViewMode) { + state.state.mode = defaultViewMode; + } + state.state.source = defaultEditingModeIsLivePreview ? false : true; + leaf.setViewState(state); + this.openedFiles = resetOpenedNotes(this.app); + } + return; + }); + // "active-leaf-change": open note, navigate to note -> will check whether + // the view mode needs to be set; default view mode setting is ignored. + this.registerEvent(this.app.workspace.on("active-leaf-change", obsidian.debounce(readViewModeFromFrontmatterAndToggle, 300))); + }); + } + loadSettings() { + return __awaiter(this, void 0, void 0, function* () { + this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); + }); + } + saveSettings() { + return __awaiter(this, void 0, void 0, function* () { + yield this.saveData(this.settings); + }); + } + onunload() { + return __awaiter(this, void 0, void 0, function* () { + this.openedFiles = []; + }); + } +} +function alreadyOpen(currFile, openedFiles) { + const leavesWithSameNote = []; + if (currFile == null) { + return false; + } + openedFiles.forEach((openedFile) => { + if (openedFile == currFile.basename) { + leavesWithSameNote.push(openedFile); + } + }); + return leavesWithSameNote.length != 0; +} +function resetOpenedNotes(app) { + let openedFiles = []; + app.workspace.iterateAllLeaves((leaf) => { + var _a, _b; + let view = leaf.view instanceof obsidian.MarkdownView ? leaf.view : null; + if (null === view) { + return; + } + openedFiles.push((_b = (_a = leaf.view) === null || _a === void 0 ? void 0 : _a.file) === null || _b === void 0 ? void 0 : _b.basename); + }); + return openedFiles; +} +class ViewModeByFrontmatterSettingTab extends obsidian.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + let { containerEl } = this; + containerEl.empty(); + new obsidian.Setting(containerEl) + .setName("Ignore opened files") + .setDesc("Never change the view mode on a note which was already open.") + .addToggle((checkbox) => checkbox + .setValue(this.plugin.settings.ignoreOpenFiles) + .onChange((value) => __awaiter(this, void 0, void 0, function* () { + this.plugin.settings.ignoreOpenFiles = value; + yield this.plugin.saveSettings(); + }))); + new obsidian.Setting(containerEl) + .setName("Ignore force view when not in frontmatter") + .setDesc("Never change the view mode on a note that was opened from another one in a certain view mode") + .addToggle((checkbox) => { + checkbox + .setValue(this.plugin.settings.ignoreForceViewAll) + .onChange((value) => __awaiter(this, void 0, void 0, function* () { + this.plugin.settings.ignoreForceViewAll = value; + yield this.plugin.saveSettings(); + })); + }); + } +} + +module.exports = ViewModeByFrontmatterPlugin; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbIlBsdWdpbiIsIk1hcmtkb3duVmlldyIsImRlYm91bmNlIiwiUGx1Z2luU2V0dGluZ1RhYiIsIlNldHRpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF1REE7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENB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 diff --git a/.obsidian/plugins/obsidian-view-mode-by-frontmatter/manifest.json b/.obsidian/plugins/obsidian-view-mode-by-frontmatter/manifest.json new file mode 100644 index 0000000..6e15781 --- /dev/null +++ b/.obsidian/plugins/obsidian-view-mode-by-frontmatter/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "obsidian-view-mode-by-frontmatter", + "name": "Force note view mode", + "version": "1.1.1", + "minAppVersion": "0.9.12", + "description": "This plugin allows to force the view mode and editing mode for a note by using front matter", + "author": "Benny Wydooghe", + "authorUrl": "https://i-net.be", + "isDesktopOnly": false +} diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 0935d54..abf56b1 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -128,8 +128,17 @@ "type": "calendar", "state": {} } + }, + { + "id": "341a78a223598f4b", + "type": "leaf", + "state": { + "type": "advanced-tables-toolbar", + "state": {} + } } - ] + ], + "currentTab": 4 } ], "direction": "horizontal", @@ -144,11 +153,17 @@ "daily-notes:Open today's daily note": false, "templates:Insert template": false, "command-palette:Open command palette": false, - "table-editor-obsidian:Advanced Tables Toolbar": false + "table-editor-obsidian:Advanced Tables Toolbar": false, + "omnisearch:Omnisearch": false, + "obsidian-excalidraw-plugin:Create new drawing": false } }, - "active": "d3ce90df51bd874b", + "active": "94b9da5ee5db27a6", "lastOpenFiles": [ + "2023-03-26.md", + "Excalidraw/Drawing 2023-03-25 23.56.35.excalidraw.md", + "Excalidraw", + "Untitled.md", "snippets/theme-custom.css", "snippets" ]