annotate src/main.ts @ 19:2a9e941c96ee

Bring new build tools from the sample plugin project
author Ludovic Chabant <ludovic@chabant.com>
date Fri, 18 Mar 2022 19:19:18 -0700
parents a50ef39473b6
children 815b93d13e0f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 Editor,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 MarkdownView,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 OpenViewState,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 Plugin,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 View
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 } from 'obsidian';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 import {
2
f3297d90329d Various fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
10 EditorState,
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 EditorSelection
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 } from '@codemirror/state';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 import {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 around
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 } from 'monkey-around';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 import {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 DEFAULT_SETTINGS,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 RememberFileStatePluginSettings,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 RememberFileStatePluginSettingTab
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 } from './settings';
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 // Interface for a file state.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 interface RememberedFileState {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 path: string;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 lastSavedTime: number;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 stateData: Object;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 // Interface for all currently remembered file states.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 interface RememberFileStatePluginData {
11
6f7f35af6335 Better type information for the plugin data
Ludovic Chabant <ludovic@chabant.com>
parents: 8
diff changeset
33 rememberedFiles: Record<string, RememberedFileState>;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 // Default empty list of remembered file states.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 const DEFAULT_DATA: RememberFileStatePluginData = {
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
38 rememberedFiles: {}
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 export default class RememberFileStatePlugin extends Plugin {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 settings: RememberFileStatePluginSettings;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 data: RememberFileStatePluginData;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
45 // Don't restore state on the next file being opened.
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 private _suppressNextFileOpen: boolean = false;
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
47 // Next unique ID to identify views without keeping references to them.
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
48 private _nextUniqueViewId: number = 0;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
50 // Functions to unregister any monkey-patched view hooks on plugin unload.
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 private _viewUninstallers = {};
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
52 // Functions to unregister any global callbacks on plugin unload.
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 private _globalUninstallers = [];
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 async onload() {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 console.log("Loading RememberFileState plugin");
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 await this.loadSettings();
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 this.data = Object.assign({}, DEFAULT_DATA);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 this.registerEvent(this.app.workspace.on('file-open', this.onFileOpen));
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 this.registerEvent(this.app.vault.on('rename', this.onFileRename));
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64 this.registerEvent(this.app.vault.on('delete', this.onFileDelete));
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 this.app.workspace.getLeavesOfType("markdown").forEach(
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 (leaf) => { this.registerOnUnloadFile(leaf.view); });
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 const _this = this;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 var uninstall = around(this.app.workspace, {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 openLinkText: function(next) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 return async function(
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 linktext: string, sourcePath: string,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 newLeaf?: boolean, openViewState?: OpenViewState) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 // When opening a link, we don't want to restore the
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 // scroll position/selection/etc because there's a
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 // good chance we want to show the file back at the
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 // top, or we're going straight to a specific block.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 _this._suppressNextFileOpen = true;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 return await next.call(
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 this, linktext, sourcePath, newLeaf, openViewState);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 });
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 this._globalUninstallers.push(uninstall);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 this.addSettingTab(new RememberFileStatePluginSettingTab(this.app, this));
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 onunload() {
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
91 // Run view uninstallers on all current views.
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
92 var numViews: number = 0;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
93 this.app.workspace.getLeavesOfType("markdown").forEach(
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
94 (leaf) => {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
95 const filePath = leaf.view.file.path;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
96 const viewId = this.getUniqueViewId(leaf.view);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
97 if (viewId != undefined) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
98 var uninstaller = this._viewUninstallers[viewId];
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
99 if (uninstaller) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
100 console.debug(`Uninstalling hooks for view ${viewId}`, filePath);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
101 uninstaller(leaf.view);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
102 ++numViews;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
103 } else {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
104 console.debug("Found markdown view without an uninstaller!", filePath);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
105 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
106 // Clear the ID so we don't get confused if the plugin
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
107 // is re-enabled later.
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
108 this.clearUniqueViewId(leaf.view);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
109 } else {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
110 console.debug("Found markdown view without an ID!", filePath);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
111 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
112 });
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
113 console.debug(`Unregistered ${numViews} view callbacks`);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 this._viewUninstallers = {};
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
116 // Run global unhooks.
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 this._globalUninstallers.forEach((cb) => cb());
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 async loadSettings() {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 async saveSettings() {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 await this.saveData(this.settings);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 private readonly registerOnUnloadFile = function(view) {
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
129 var filePath = view.file.path;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
130 var viewId = this.getUniqueViewId(view, true);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
131 if (viewId in this._viewUninstallers) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
132 console.debug(`View ${viewId} is already registered`, filePath);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 return;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
136 console.debug(`Registering callback on view ${viewId}`, filePath);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 const _this = this;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138 var uninstall = around(view, {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 onUnloadFile: function(next) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 return async function (unloaded: TFile) {
12
42396b88c64d Don't unnecessarily capture the view reference in injected callbacks
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
141 _this.rememberFileState(unloaded, this);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
142 return await next.call(this, unloaded);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
143 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 });
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
146 this._viewUninstallers[viewId] = uninstall;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148 view.register(() => {
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
149 // Don't hold a reference to this plugin here because this callback
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
150 // will outlive it if it gets deactivated. So let's find it, and
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
151 // do nothing if we don't find it.
16
a50ef39473b6 Fix plugin ID, bump version to 1.0.4
Ludovic Chabant <ludovic@chabant.com>
parents: 13
diff changeset
152 var plugin = app.plugins.getPlugin("obsidian-remember-file-state");
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
153 if (plugin) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
154 console.debug(`Unregistering view ${viewId} callback`, filePath);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
155 delete plugin._viewUninstallers[viewId];
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
156 uninstall();
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
157 } else {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
158 console.debug(
16
a50ef39473b6 Fix plugin ID, bump version to 1.0.4
Ludovic Chabant <ludovic@chabant.com>
parents: 13
diff changeset
159 "Plugin obsidian-remember-file-state has been unloaded, ignoring unregister");
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
160 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
161 });
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
162 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
164 private readonly onFileOpen = async (
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
165 openedFile: TFile
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
166 ): Promise<void> => {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
167 // If `openedFile` is null, it's because the last pane was closed
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168 // and there is now an empty pane.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
169 if (openedFile) {
2
f3297d90329d Various fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
170 var activeView = this.app.workspace.getActiveViewOfType(MarkdownView);
7
b1cb0474bb18 Fix possible crash when an opened file isn't a markdown file
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
171 if (activeView) {
b1cb0474bb18 Fix possible crash when an opened file isn't a markdown file
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
172 this.registerOnUnloadFile(activeView);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
173
7
b1cb0474bb18 Fix possible crash when an opened file isn't a markdown file
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
174 if (!this._suppressNextFileOpen) {
b1cb0474bb18 Fix possible crash when an opened file isn't a markdown file
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
175 this.restoreFileState(openedFile, activeView);
b1cb0474bb18 Fix possible crash when an opened file isn't a markdown file
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
176 }
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177 }
7
b1cb0474bb18 Fix possible crash when an opened file isn't a markdown file
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
178 // else: the file isn't handled by a markdown editor.
b1cb0474bb18 Fix possible crash when an opened file isn't a markdown file
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
179
b1cb0474bb18 Fix possible crash when an opened file isn't a markdown file
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
180 this._suppressNextFileOpen = false;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
182 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184 private readonly rememberFileState = async (file: TFile, view: View): Promise<void> => {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185 const scrollInfo = view.editor.getScrollInfo();
13
7da0dec2dc8d Simple bail out when legacy editors are enabled
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
186 const stateSelection = view.editor.cm.state.selection;
7da0dec2dc8d Simple bail out when legacy editors are enabled
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
187 if (stateSelection == undefined) {
7da0dec2dc8d Simple bail out when legacy editors are enabled
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
188 // Legacy editor is in use, let's ignore
7da0dec2dc8d Simple bail out when legacy editors are enabled
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
189 return;
7da0dec2dc8d Simple bail out when legacy editors are enabled
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
190 }
7da0dec2dc8d Simple bail out when legacy editors are enabled
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
191 const stateSelectionJSON = stateSelection.toJSON();
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
192 const stateData = {'scrollInfo': scrollInfo, 'selection': stateSelectionJSON};
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
193
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
194 var existingFile = this.data.rememberedFiles[file.path];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
195 if (existingFile) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196 existingFile.lastSavedTime = Date.now();
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
197 existingFile.stateData = stateData;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198 } else {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
199 let newFileState = {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
200 path: file.path,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
201 lastSavedTime: Date.now(),
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
202 stateData: stateData
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
203 };
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
204 this.data.rememberedFiles[file.path] = newFileState;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
205
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
206 // If we need to keep the number remembered files under a maximum,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
207 // do it now.
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
208 this.forgetExcessFiles();
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
209 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
210 console.debug("Remember file state for:", file.path);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
211 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
212
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
213 private readonly restoreFileState = function(file: TFile, view: View) {
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
214 const existingFile = this.data.rememberedFiles[file.path];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
215 if (existingFile) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
216 console.debug("Restoring file state for:", file.path);
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
217 const stateData = existingFile.stateData;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
218 view.editor.scrollTo(stateData.scrollInfo.left, stateData.scrollInfo.top);
2
f3297d90329d Various fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
219 var transaction = view.editor.cm.state.update({
f3297d90329d Various fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
220 selection: EditorSelection.fromJSON(stateData.selection)})
f3297d90329d Various fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
221 view.editor.cm.dispatch(transaction);
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
225 private readonly forgetExcessFiles = function() {
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 const keepMax = this.settings.rememberMaxFiles;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 if (keepMax <= 0) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228 return;
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
231 // Sort newer files first, older files last.
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
232 var filesData = Object.values(this.data.rememberedFiles);
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
233 filesData.sort((a, b) => {
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
234 if (a.lastSavedTime > b.lastSavedTime) return -1; // a before b
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
235 if (a.lastSavedTime < b.lastSavedTime) return 1; // b before a
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
236 return 0;
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
237 });
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
239 // Remove older files past the limit.
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
240 for (var i = keepMax; i < filesData.length; ++i) {
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
241 var fileData = filesData[i];
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
242 delete this.data.rememberedFiles[fileData.path];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
243 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
245
6
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
246 private readonly getUniqueViewId = function(view: View, autocreateId: boolean = false) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
247 if (view.__uniqueId == undefined) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
248 if (!autocreateId) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
249 return -1;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
250 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
251 view.__uniqueId = (this._nextUniqueViewId++);
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
252 return view.__uniqueId;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
253 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
254 return view.__uniqueId;
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
255 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
256
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
257 private readonly clearUniqueViewId = function(view: View) {
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
258 delete view["__uniqueId"];
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
259 }
114d7e6d2633 Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents: 2
diff changeset
260
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 private readonly onFileRename = async (
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262 file: TAbstractFile,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 oldPath: string,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 ): Promise<void> => {
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
265 const existingFile = this.data.rememberedFiles[oldPath];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 if (existingFile) {
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 existingFile.path = file.path;
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
268 delete this.data.rememberedFiles[oldPath];
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
269 this.data.rememberedFiles[file.path] = existingFile;
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
272
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273 private readonly onFileDelete = async (
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274 file: TAbstractFile,
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
275 ): Promise<void> => {
8
ec6c48a07b03 Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
276 delete this.data.rememberedFiles[file.path];
0
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 };
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278 }
7975d7c73f8a Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279