Mercurial > obsidian-remember-file-state
annotate src/main.ts @ 55:388eb78ef4b7
Typescript compliance.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Mon, 02 Oct 2023 18:12:11 -0700 |
parents | 06504ceb3283 |
children | 4f6cbc0b339c |
rev | line source |
---|---|
50
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
1 import * as fs from 'fs'; |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
2 import * as os from 'os'; |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
3 import * as path from 'path'; |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
4 |
0 | 5 import { |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
6 App, |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
7 Editor, |
0 | 8 MarkdownView, |
27
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
9 Modal, |
0 | 10 OpenViewState, |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
11 Plugin, |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
12 TAbstractFile, |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
13 TFile, |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
14 Tasks, |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
15 View, |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
16 WorkspaceLeaf |
0 | 17 } from 'obsidian'; |
18 | |
19 import { | |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
20 EditorView |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
21 } from '@codemirror/view'; |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
22 |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
23 import { |
2 | 24 EditorState, |
0 | 25 EditorSelection |
26 } from '@codemirror/state'; | |
27 | |
28 import { | |
29 around | |
30 } from 'monkey-around'; | |
31 | |
32 import { | |
33 DEFAULT_SETTINGS, | |
34 RememberFileStatePluginSettings, | |
35 RememberFileStatePluginSettingTab | |
36 } from './settings'; | |
37 | |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
38 declare var app: App; |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
39 |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
40 // Interface for CM6 editor view |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
41 interface EditorWithCM6 extends Editor { |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
42 cm: EditorView |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
43 }; |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
44 |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
45 // View with unique ID |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
46 interface ViewWithID extends View { |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
47 __uniqueId: number |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
48 }; |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
49 |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
50 // Scroll info interface |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
51 interface ScrollInfo { |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
52 top: number, left: number |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
53 }; |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
54 |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
55 interface StateData { |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
56 selection: EditorSelection, |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
57 scrollInfo: ScrollInfo |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
58 }; |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
59 |
0 | 60 // Interface for a file state. |
61 interface RememberedFileState { | |
62 path: string; | |
63 lastSavedTime: number; | |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
64 stateData: StateData; |
0 | 65 } |
66 | |
67 // Interface for all currently remembered file states. | |
68 interface RememberFileStatePluginData { | |
11
6f7f35af6335
Better type information for the plugin data
Ludovic Chabant <ludovic@chabant.com>
parents:
8
diff
changeset
|
69 rememberedFiles: Record<string, RememberedFileState>; |
0 | 70 } |
71 | |
72 // Default empty list of remembered file states. | |
73 const DEFAULT_DATA: RememberFileStatePluginData = { | |
8
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
74 rememberedFiles: {} |
0 | 75 }; |
76 | |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
77 // Where to save the states database. |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
78 const STATE_DB_PATH: string = '.obsidian/plugins/obsidian-remember-file-state/states.json'; |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
79 |
27
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
80 // Simple warning message. |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
81 class WarningModal extends Modal { |
29
66cada11efb8
Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
82 title: string = ""; |
66cada11efb8
Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
83 message: string = ""; |
66cada11efb8
Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
84 |
27
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
85 constructor(app: App, title: string, message: string) { |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
86 super(app) |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
87 this.title = title; |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
88 this.message = message; |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
89 } |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
90 onOpen() { |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
91 this.contentEl.createEl('h2', {text: this.title}); |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
92 this.contentEl.createEl('p', {text: this.message}); |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
93 } |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
94 }; |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
95 |
0 | 96 export default class RememberFileStatePlugin extends Plugin { |
97 settings: RememberFileStatePluginSettings; | |
98 data: RememberFileStatePluginData; | |
99 | |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
100 // Don't restore state on the next file being opened. |
0 | 101 private _suppressNextFileOpen: boolean = false; |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
102 // 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
|
103 private _nextUniqueViewId: number = 0; |
0 | 104 |
28
fbaf7c7126be
Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents:
27
diff
changeset
|
105 // Remember last open file in each view. |
fbaf7c7126be
Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents:
27
diff
changeset
|
106 private _lastOpenFiles: Record<string, string> = {}; |
fbaf7c7126be
Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents:
27
diff
changeset
|
107 |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
108 // Functions to unregister any monkey-patched view hooks on plugin unload. |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
109 private _viewUninstallers: Record<string, Function> = {}; |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
110 // Functions to unregister any global callbacks on plugin unload. |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
111 private _globalUninstallers: Function[] = []; |
0 | 112 |
113 async onload() { | |
50
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
114 // Enable this for troubleshooting. |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
115 const enableLogfile: boolean = false; |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
116 if (enableLogfile) { |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
117 const outLogPath = path.join(os.tmpdir(), 'obsidian-remember-file-state.log'); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
118 this.setupLogFile(outLogPath); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
119 } |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
120 |
35
42ff65e35f4f
More standardized logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
29
diff
changeset
|
121 console.log("RememberFileState: loading plugin"); |
0 | 122 |
123 await this.loadSettings(); | |
124 | |
125 this.data = Object.assign({}, DEFAULT_DATA); | |
126 | |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
127 await this.readStateDatabase(STATE_DB_PATH); |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
128 |
51
e932f1b73133
Pass `this` as the context for various callbacks.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
129 this.registerEvent(this.app.workspace.on('file-open', this.onFileOpen, this)); |
e932f1b73133
Pass `this` as the context for various callbacks.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
130 this.registerEvent(this.app.workspace.on('quit', this.onAppQuit, this)); |
e932f1b73133
Pass `this` as the context for various callbacks.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
131 this.registerEvent(this.app.vault.on('rename', this.onFileRename, this)); |
e932f1b73133
Pass `this` as the context for various callbacks.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
132 this.registerEvent(this.app.vault.on('delete', this.onFileDelete, this)); |
0 | 133 |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
134 this.app.workspace.onLayoutReady(() => { this.onLayoutReady(); }); |
0 | 135 |
136 const _this = this; | |
137 var uninstall = around(this.app.workspace, { | |
138 openLinkText: function(next) { | |
139 return async function( | |
140 linktext: string, sourcePath: string, | |
141 newLeaf?: boolean, openViewState?: OpenViewState) { | |
142 // When opening a link, we don't want to restore the | |
143 // scroll position/selection/etc because there's a | |
144 // good chance we want to show the file back at the | |
145 // top, or we're going straight to a specific block. | |
146 _this._suppressNextFileOpen = true; | |
147 return await next.call( | |
148 this, linktext, sourcePath, newLeaf, openViewState); | |
149 }; | |
150 } | |
151 }); | |
152 this._globalUninstallers.push(uninstall); | |
153 | |
154 this.addSettingTab(new RememberFileStatePluginSettingTab(this.app, this)); | |
27
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
155 |
29
66cada11efb8
Fix typescript warnings
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
156 if ((this.app.vault as any).getConfig('legacyEditor') !== false) { |
27
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
157 new WarningModal( |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
158 this.app, |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
159 "Legacy Editor Not Supported", |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
160 "The 'Remember File State' plugin works only with the new editor. Please turn off 'Legacy Editor' in the options." |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
161 ).open(); |
3d0ac176118f
Show warning message if using the plugin with the legacy editor
Ludovic Chabant <ludovic@chabant.com>
parents:
23
diff
changeset
|
162 } |
0 | 163 } |
164 | |
165 onunload() { | |
52
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
166 console.log("RememberFileState: unloading plugin"); |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
167 |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
168 // Unregister unload callbacks on all views. |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
169 this.unregisterAllViews(); |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
170 |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
171 // Forget which files are opened in which views. |
28
fbaf7c7126be
Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents:
27
diff
changeset
|
172 this._lastOpenFiles = {}; |
0 | 173 |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
174 // Run global unhooks. |
0 | 175 this._globalUninstallers.forEach((cb) => cb()); |
176 } | |
177 | |
178 async loadSettings() { | |
179 this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); | |
180 } | |
181 | |
182 async saveSettings() { | |
183 await this.saveData(this.settings); | |
184 } | |
185 | |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
186 private readonly onLayoutReady = function() { |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
187 this.app.workspace.getLeavesOfType("markdown").forEach( |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
188 (leaf: WorkspaceLeaf) => { |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
189 var view = leaf.view as MarkdownView; |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
190 |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
191 // On startup, assign unique IDs to views and register the |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
192 // unload callback to remember their state. |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
193 this.registerOnUnloadFile(view); |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
194 |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
195 // Also remember which file is opened in which view. |
44
fae202d7b3de
Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents:
43
diff
changeset
|
196 const viewId = this.getUniqueViewId(view as unknown as ViewWithID); |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
197 if (viewId != undefined) { |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
198 this._lastOpenFiles[viewId] = view.file.path; |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
199 } |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
200 |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
201 // Restore state for each opened pane on startup. |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
202 const existingFile = this.data.rememberedFiles[view.file.path]; |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
203 if (existingFile) { |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
204 const savedStateData = existingFile.stateData; |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
205 console.debug("RememberFileState: restoring saved state for:", view.file.path, savedStateData); |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
206 this.restoreState(savedStateData, view); |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
207 } |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
208 }); |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
209 } |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
210 |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
211 private readonly registerOnUnloadFile = function(view: MarkdownView) { |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
212 var filePath = view.file.path; |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
213 var viewId = this.getUniqueViewId(view as unknown as ViewWithID, true); |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
214 if (viewId in this._viewUninstallers) { |
0 | 215 return; |
216 } | |
217 | |
41
aa9bc7754c5d
Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents:
40
diff
changeset
|
218 console.debug(`RememberFileState: registering callback on view ${viewId}`, filePath); |
0 | 219 const _this = this; |
220 var uninstall = around(view, { | |
221 onUnloadFile: function(next) { | |
222 return async function (unloaded: TFile) { | |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
223 _this.rememberFileState(this, unloaded); |
0 | 224 return await next.call(this, unloaded); |
225 }; | |
226 } | |
227 }); | |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
228 this._viewUninstallers[viewId] = uninstall; |
0 | 229 |
230 view.register(() => { | |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
231 // 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
|
232 // 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
|
233 // do nothing if we don't find it. |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
234 // @ts-ignore |
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
235 var plugin: RememberFileStatePlugin = 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
|
236 if (plugin) { |
41
aa9bc7754c5d
Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents:
40
diff
changeset
|
237 console.debug(`RememberFileState: unregistering view ${viewId} callback`, filePath); |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
238 delete plugin._viewUninstallers[viewId]; |
28
fbaf7c7126be
Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents:
27
diff
changeset
|
239 delete plugin._lastOpenFiles[viewId]; |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
240 uninstall(); |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
241 } else { |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
242 console.debug( |
41
aa9bc7754c5d
Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents:
40
diff
changeset
|
243 "RememberFileState: plugin was unloaded, ignoring unregister"); |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
244 } |
0 | 245 }); |
246 } | |
247 | |
52
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
248 private readonly unregisterAllViews = function() { |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
249 // Run view uninstallers on all current views. |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
250 var numViews: number = 0; |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
251 this.app.workspace.getLeavesOfType("markdown").forEach( |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
252 (leaf: WorkspaceLeaf) => { |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
253 const filePath = (leaf.view as MarkdownView).file.path; |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
254 const viewId = this.getUniqueViewId(leaf.view as ViewWithID); |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
255 if (viewId != undefined) { |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
256 var uninstaller = this._viewUninstallers[viewId]; |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
257 if (uninstaller) { |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
258 console.debug(`RememberFileState: uninstalling hooks for view ${viewId}`, filePath); |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
259 uninstaller(leaf.view); |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
260 ++numViews; |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
261 } else { |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
262 console.debug("RememberFileState: found markdown view without an uninstaller!", filePath); |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
263 } |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
264 // Clear the ID so we don't get confused if the plugin |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
265 // is re-enabled later. |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
266 this.clearUniqueViewId(leaf.view as ViewWithID); |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
267 } else { |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
268 console.debug("RememberFileState: found markdown view without an ID!", filePath); |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
269 } |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
270 }); |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
271 console.debug(`RememberFileState: unregistered ${numViews} view callbacks`); |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
272 this._viewUninstallers = {}; |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
273 } |
586f857a98dd
Move unregistering of all views into a reusable function.
Ludovic Chabant <ludovic@chabant.com>
parents:
51
diff
changeset
|
274 |
0 | 275 private readonly onFileOpen = async ( |
276 openedFile: TFile | |
277 ): Promise<void> => { | |
278 // If `openedFile` is null, it's because the last pane was closed | |
279 // and there is now an empty pane. | |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
280 if (!openedFile) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
281 return; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
282 } |
0 | 283 |
44
fae202d7b3de
Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents:
43
diff
changeset
|
284 var shouldSuppressThis: boolean = this._suppressNextFileOpen; |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
285 this._suppressNextFileOpen = false; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
286 if (shouldSuppressThis) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
287 console.debug("RememberFileState: not restoring file state because of explicit suppression"); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
288 return; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
289 } |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
290 |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
291 // Check that the file is handled by a markdown editor, which is the |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
292 // only editor we support for now. |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
293 var activeView: MarkdownView = this.app.workspace.getActiveViewOfType(MarkdownView); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
294 if (!activeView) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
295 console.debug("RememberFileState: not restoring file state, it's not a markdown view"); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
296 return; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
297 } |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
298 |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
299 this.registerOnUnloadFile(activeView); |
28
fbaf7c7126be
Don't restore file state if we're just switching to another pane
Ludovic Chabant <ludovic@chabant.com>
parents:
27
diff
changeset
|
300 |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
301 // Check if this is a genuine file open, and not returning to pane that |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
302 // already had this file opened in it. |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
303 var isRealFileOpen = true; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
304 const viewId = this.getUniqueViewId(activeView as unknown as ViewWithID); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
305 if (viewId != undefined) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
306 const lastOpenFileInView = this._lastOpenFiles[viewId]; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
307 isRealFileOpen = (lastOpenFileInView != openedFile.path); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
308 this._lastOpenFiles[viewId] = openedFile.path; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
309 } |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
310 if (!isRealFileOpen) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
311 console.debug("RememberFileState: not restoring file state, that file was already open in this pane."); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
312 return; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
313 } |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
314 |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
315 // Restore the state! |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
316 try { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
317 const existingFile = this.data.rememberedFiles[openedFile.path]; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
318 if (existingFile) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
319 const savedStateData = existingFile.stateData; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
320 console.debug("RememberFileState: restoring saved state for:", openedFile.path, savedStateData); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
321 this.restoreState(savedStateData, activeView); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
322 } else { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
323 // If we don't have any saved state for this file, let's see if |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
324 // it's opened in another pane. If so, restore that. |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
325 const otherPaneState = this.findFileStateFromOtherPane(openedFile, activeView); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
326 if (otherPaneState) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
327 console.debug("RememberFileState: restoring other pane state for:", openedFile.path, otherPaneState); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
328 this.restoreState(otherPaneState, activeView); |
7
b1cb0474bb18
Fix possible crash when an opened file isn't a markdown file
Ludovic Chabant <ludovic@chabant.com>
parents:
6
diff
changeset
|
329 } |
0 | 330 } |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
331 } catch (err) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
332 console.error("RememberFileState: couldn't restore file state: ", err); |
0 | 333 } |
334 } | |
335 | |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
336 private readonly rememberFileState = async (view: MarkdownView, file?: TFile): Promise<void> => { |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
337 const stateData = this.getState(view); |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
338 |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
339 if (file === undefined) { |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
340 file = view.file; |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
341 } |
8
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
342 var existingFile = this.data.rememberedFiles[file.path]; |
0 | 343 if (existingFile) { |
344 existingFile.lastSavedTime = Date.now(); | |
345 existingFile.stateData = stateData; | |
346 } else { | |
347 let newFileState = { | |
348 path: file.path, | |
349 lastSavedTime: Date.now(), | |
350 stateData: stateData | |
351 }; | |
8
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
352 this.data.rememberedFiles[file.path] = newFileState; |
0 | 353 |
36 | 354 // If we need to keep the number of remembered files under a maximum, |
0 | 355 // do it now. |
356 this.forgetExcessFiles(); | |
357 } | |
41
aa9bc7754c5d
Fix typos in debug log messages
Ludovic Chabant <ludovic@chabant.com>
parents:
40
diff
changeset
|
358 console.debug("RememberFileState: remembered state for:", file.path, stateData); |
0 | 359 } |
360 | |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
361 private readonly getState = function(view: MarkdownView) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
362 // Save scrolling position (Obsidian API only gives vertical position). |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
363 const scrollInfo = {top: view.currentMode.getScroll(), left: 0}; |
37
8be02002ed66
Use Obsidian's view APIs for scrolling state
Ludovic Chabant <ludovic@chabant.com>
parents:
36
diff
changeset
|
364 |
44
fae202d7b3de
Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents:
43
diff
changeset
|
365 // Save current selection. CodeMirror returns a JSON object (not a |
fae202d7b3de
Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents:
43
diff
changeset
|
366 // JSON string!) when we call toJSON. |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
367 // If state selection is undefined, we have a legacy editor. Just ignore that part. |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
368 const cm6editor = view.editor as EditorWithCM6; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
369 const stateSelection: EditorSelection = cm6editor.cm.state.selection; |
44
fae202d7b3de
Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents:
43
diff
changeset
|
370 const stateSelectionJSON = (stateSelection !== undefined) ? stateSelection.toJSON() : undefined; |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
371 |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
372 const stateData = {'scrollInfo': scrollInfo, 'selection': stateSelectionJSON}; |
37
8be02002ed66
Use Obsidian's view APIs for scrolling state
Ludovic Chabant <ludovic@chabant.com>
parents:
36
diff
changeset
|
373 |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
374 return stateData; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
375 } |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
376 |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
377 private readonly restoreState = function(stateData: StateData, view: MarkdownView) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
378 // Restore scrolling position (Obsidian API only allows setting vertical position). |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
379 view.currentMode.applyScroll(stateData.scrollInfo.top); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
380 |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
381 // Restore last known selection, if any. |
44
fae202d7b3de
Fix Typescript warnings and errors
Ludovic Chabant <ludovic@chabant.com>
parents:
43
diff
changeset
|
382 if (stateData.selection !== undefined) { |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
383 const cm6editor = view.editor as EditorWithCM6; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
384 var transaction = cm6editor.cm.state.update({ |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
385 selection: EditorSelection.fromJSON(stateData.selection)}) |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
386 |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
387 cm6editor.cm.dispatch(transaction); |
0 | 388 } |
389 } | |
22
f7e0926c2500
Don't restore state on a file that's already open in another pane.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
390 |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
391 private readonly findFileStateFromOtherPane = function(file: TFile, activeView: MarkdownView) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
392 var otherView = null; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
393 this.app.workspace.getLeavesOfType("markdown").every( |
22
f7e0926c2500
Don't restore state on a file that's already open in another pane.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
394 (leaf: WorkspaceLeaf) => { |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
395 var curView = leaf.view as MarkdownView; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
396 if (curView != activeView && |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
397 curView.file.path == file.path && |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
398 this.getUniqueViewId(curView) >= 0 // Skip views that have never been activated. |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
399 ) { |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
400 otherView = curView; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
401 return false; // Stop iterating leaves. |
22
f7e0926c2500
Don't restore state on a file that's already open in another pane.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
402 } |
40
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
403 return true; |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
404 }, |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
405 this // thisArg |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
406 ); |
96e86650043b
Fix issues with files opened in multiple panes.
Ludovic Chabant <ludovic@chabant.com>
parents:
37
diff
changeset
|
407 return otherView ? this.getState(otherView) : null; |
22
f7e0926c2500
Don't restore state on a file that's already open in another pane.
Ludovic Chabant <ludovic@chabant.com>
parents:
21
diff
changeset
|
408 } |
0 | 409 |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
410 private readonly forgetExcessFiles = function() { |
0 | 411 const keepMax = this.settings.rememberMaxFiles; |
412 if (keepMax <= 0) { | |
413 return; | |
414 } | |
415 | |
8
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
416 // Sort newer files first, older files last. |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
417 var filesData: RememberedFileState[] = Object.values(this.data.rememberedFiles); |
8
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
418 filesData.sort((a, b) => { |
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
419 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
|
420 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
|
421 return 0; |
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
422 }); |
0 | 423 |
8
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
424 // Remove older files past the limit. |
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
425 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
|
426 var fileData = filesData[i]; |
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
427 delete this.data.rememberedFiles[fileData.path]; |
0 | 428 } |
429 } | |
430 | |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
431 private readonly getUniqueViewId = function(view: ViewWithID, autocreateId: boolean = false) { |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
432 if (view.__uniqueId == undefined) { |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
433 if (!autocreateId) { |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
434 return -1; |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
435 } |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
436 view.__uniqueId = (this._nextUniqueViewId++); |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
437 return view.__uniqueId; |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
438 } |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
439 return view.__uniqueId; |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
440 } |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
441 |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
442 private readonly clearUniqueViewId = function(view: ViewWithID) { |
6
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
443 delete view["__uniqueId"]; |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
444 } |
114d7e6d2633
Fix various issues around keeping references to editor objects
Ludovic Chabant <ludovic@chabant.com>
parents:
2
diff
changeset
|
445 |
0 | 446 private readonly onFileRename = async ( |
447 file: TAbstractFile, | |
448 oldPath: string, | |
449 ): Promise<void> => { | |
21
815b93d13e0f
Improve typescript compliance
Ludovic Chabant <ludovic@chabant.com>
parents:
16
diff
changeset
|
450 const existingFile: RememberedFileState = this.data.rememberedFiles[oldPath]; |
0 | 451 if (existingFile) { |
452 existingFile.path = file.path; | |
8
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
453 delete this.data.rememberedFiles[oldPath]; |
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
454 this.data.rememberedFiles[file.path] = existingFile; |
0 | 455 } |
456 }; | |
457 | |
458 private readonly onFileDelete = async ( | |
459 file: TAbstractFile, | |
460 ): Promise<void> => { | |
8
ec6c48a07b03
Make the plugin data into a dictionary
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
461 delete this.data.rememberedFiles[file.path]; |
0 | 462 }; |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
463 |
54
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
464 private readonly onAppQuit = function(tasks: Tasks) { |
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
465 this.unregisterAllViews(); |
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
466 this.rememberAllOpenedFileStates(); |
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
467 this.writeStateDatabase(STATE_DB_PATH); |
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
468 console.log("RememberFileState: done with app-quit cleanup."); |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
469 } |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
470 |
54
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
471 private readonly rememberAllOpenedFileStates = function() { |
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
472 console.log("RememberFileState: remembering all opened file states..."); |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
473 this.app.workspace.getLeavesOfType("markdown").forEach( |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
474 (leaf: WorkspaceLeaf) => { |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
475 const view = leaf.view as MarkdownView; |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
476 this.rememberFileState(view); |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
477 } |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
478 ); |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
479 } |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
480 |
54
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
481 private readonly writeStateDatabase = function(path: string) { |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
482 const fs = this.app.vault.adapter; |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
483 const jsonDb = JSON.stringify(this.data); |
54
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
484 console.log("RememberFileState: writing state database..."); |
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
485 fs.write(path, jsonDb) |
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
486 .then(() => { console.log("RememberFileState: wrote state database."); }); |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
487 } |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
488 |
54
06504ceb3283
Make all shutdown logic synchronous.
Ludovic Chabant <ludovic@chabant.com>
parents:
53
diff
changeset
|
489 private readonly readStateDatabase = async function(path: string): Promise<void> { |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
490 const fs = this.app.vault.adapter; |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
491 if (await fs.exists(path)) { |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
492 const jsonDb = await fs.read(path); |
53
f2e066bbe343
Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
493 try |
f2e066bbe343
Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
494 { |
f2e066bbe343
Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
495 this.data = JSON.parse(jsonDb); |
f2e066bbe343
Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
496 const numLoaded = Object.keys(this.data.rememberedFiles).length; |
f2e066bbe343
Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
497 console.debug(`RememberFileState: read ${numLoaded} record from state database.`); |
f2e066bbe343
Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
498 } catch (err) { |
f2e066bbe343
Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
499 console.error("RememberFileState: error loading state database:", err); |
f2e066bbe343
Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
500 console.error(jsonDb); |
f2e066bbe343
Handle errors around reading the state database file.
Ludovic Chabant <ludovic@chabant.com>
parents:
52
diff
changeset
|
501 } |
43
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
502 } |
7e981d54a055
Support state persistence between sessions
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
503 } |
50
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
504 |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
505 private readonly setupLogFile = function(outLogPath: string) { |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
506 console.log("RememberFileState: setting up log file: ", outLogPath); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
507 |
55
388eb78ef4b7
Typescript compliance.
Ludovic Chabant <ludovic@chabant.com>
parents:
54
diff
changeset
|
508 const makeWrapper = function(origFunc: () => void) { |
388eb78ef4b7
Typescript compliance.
Ludovic Chabant <ludovic@chabant.com>
parents:
54
diff
changeset
|
509 return function () { |
50
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
510 origFunc.apply(console, arguments); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
511 |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
512 var text: string = ""; |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
513 for (var i: number = 0; i < arguments.length; i++) { |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
514 if (i > 0) text += " "; |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
515 text += arguments[i].toString(); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
516 } |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
517 text += "\n"; |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
518 fs.appendFileSync(outLogPath, text); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
519 }; |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
520 }; |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
521 console.log = makeWrapper(console.log); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
522 console.debug = makeWrapper(console.debug); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
523 console.info = makeWrapper(console.info); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
524 console.warn = makeWrapper(console.warn); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
525 console.error = makeWrapper(console.error); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
526 |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
527 const banner: string = "\n\nDebug log start\n===============\n"; |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
528 fs.appendFileSync(outLogPath, banner); |
1fe2cd2c603f
Add optional file logging.
Ludovic Chabant <ludovic@chabant.com>
parents:
44
diff
changeset
|
529 } |
0 | 530 } |
531 |