generated from eugenesvk/dummy
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbackup.TabGroupSave🕘.js
More file actions
348 lines (319 loc) · 17.7 KB
/
backup.TabGroupSave🕘.js
File metadata and controls
348 lines (319 loc) · 17.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
@include inc_std.js
@include inc_dbg.js
@include inc_cfg.js
// backup.TabGroupSave🕘, ↑ must be at the very top, before comments; save as 'UTF-8 with BOM'
function OnInit(D) {
D.name = "backup.TabGroupSave🕘";
D.desc = "Periodically save active set of tabs in a tab group to avoid data loss" + "\n"
+"" + "(click ⚙ to configure)";
D.version = "0.3@25-03";
D.url = "";
D.default_enable = true; D.min_version = "12.5"; D.copyright = "es";
setDefaults(D)
var sV=D.vars, sC=D.config, DC=DOpus.Create, Sys=DC.SysInfo, C=new ConfigHelper(D);
var k='Period' ;var v=sV.get(k);C.add(k).val(v).g(' Time' ).des('Save all tabs once per this many minutes. ≝'+v);
var k='MaxHistory' ;var v=sV.get(k);C.add(k).val(v).g(' History').des('Save up to this many versions, each newer one has its index +1 incremented until MaxHistory, then starts from the beginning. ≝'+v);
var k='PrefixDir' ;var v=sV.get(k);C.add(k).val(v).g('Name' ).des('Name of the folder to add a tab group to\n⚠Invalid symbols *:\"\\|<>/?^\n≝'+v);
var k='PrefixDirL' ;var v=sV.get(k);C.add(k).val(v).g('Name' ).des('Name of the Lister sub-folder to add a tab group to\n⚠Invalid symbols *:\"\\|<>/?^\n≝'+v);
var k='PrefixFile' ;var v=sV.get(k);C.add(k).val(v).g('Name' ).des("Saved tab group name (with a time-based #index appended up to MaxHistory).\n⚠Deletes tab groups starting with 'PrefixFile #', so don't pick a name you use in other groups.\n⚠Invalid symbols *:\"\\|<>/?^\n≝"+v);
var k='CloseOthers' ;var v=sV.get(k);C.add(k).val(v).g(' Misc' ).des('Set "Close all other tabs" option. ≝'+v);
var k='DebugOutput' ;var v=sV.get(k);C.add(k).val(v).g(' Debug' ).des('Enable debug output in the "Script log". ≝'+v);
var k='DebugVerbose';var v=sV.get(k);C.add(k).val(v).g(' Debug' ).des('More verbose debug in the "Script log". ≝'+v);
DOpus.KillTimer(345);
DOpus.SetTimer (345, sV.get('Period') * 60 * 1000);
}
function setDefaults(D) {var sV=D.vars;
sV.set('Period' ,10 );
sV.set('MaxHistory' ,5 );
sV.set('PrefixDir' ,'Backup' );
sV.set('PrefixDirL' ,'Lister #' );
sV.set('PrefixFile' ,'TabGroup' );
sV.set('CloseOthers' ,true );
sV.set('DebugOutput' ,false );
sV.set('DebugVerbose' ,false );
sV.set('idx' ,0 );
}
function OnStartup (D) { //StartupData no props docs.dopus.com/doku.php?id=reference:scripting_reference:scripting_objects:startupdata
var sV=Script.vars, sC=Script.config, DC=DOpus.Create;
var min_found = 1; // find at least this many "Empty Tab"s before triggering a restore
if (findTabEmpty(min_found)) {
if (min_found>1) {var mult = "s"} else {var mult = ""};
dbg("⚠ Found ≥" +min_found+ " 'Empty Tab'" +mult+ ", restoring tabs from backup!")
// backup current tabs before restoring just in case
var tabGroups = DOpus.TabGroups;
var listers = DOpus.listers; var i=0;
var ts = new Date(); //Day+Mon (locale-aware) HH:MM
var reg_repl_year = new RegExp('[\\/-]?'+ ts.getFullYear(),"gm");
var hh = ts.getHours (); if (hh < 10) {hh = " "+hh}
var mm = ts.getMinutes(); if (mm < 10) {mm = " "+mm}
var cur_date_time = ts.toLocaleDateString().replace(reg_repl_year,'') +' '+ hh +'꞉'+ mm; //: bugs since these are saved as files
for (var li = new Enumerator(listers); !li.atEnd(); li.moveNext()) {var L = li.item(); i+=1;
var task_name_prefix = 'L'+i+ sC.PrefixFile +' 0Startup';
var task_name_pre_re = new RegExp(task_name_prefix +'.*',"gm");
var task_name = task_name_prefix +' '+ cur_date_time;
var tabGroups = DOpus.TabGroups;
var tg_res;
for (var e = new Enumerator(tabGroups); !e.atEnd(); e.moveNext()) {var tg = e.item();
if ( task_name === tg.name
|| task_name_pre_re.test(tg.name)) {tabGroups.DeleteChild(tg);dbgv("deleted old " + tg.name);break;};
}
tg_res = tabGroups.AddChildGroup(task_name);
if (tg_res) {dbgv("filling up a new group ¦" + task_name + "¦" + " with current Lister tabs ");
tg_res.desc = "backup.TabGroupSave🕘 on " + cur_date_time;
tg_res.closeexisting = sC.CloseOthers;
if (L.dual) { tg_res.dual = true;
var tabList = L.tabsleft; var tg_tabs = tg_res.lefttabs;
for (var e=new Enumerator(tabList);!e.atEnd();e.moveNext()) {var tab = e.item(); tg_tabs.AddTab(tab.path);}
var tabList = L.tabsright; var tg_tabs = tg_res.righttabs;
for (var e=new Enumerator(tabList);!e.atEnd();e.moveNext()) {var tab = e.item(); tg_tabs.AddTab(tab.path);}
} else {
var tabList = L.tabs; var tg_tabs = tg_res.tabs;
if (tabList){for (var e=new Enumerator(tabList);!e.atEnd();e.moveNext()) {var tab = e.item(); tg_tabs.AddTab(tab.path);}}
}
tabGroups.Save();
} else {err("Failed to create a new tab group to save tabs to " + task_name);}
}
// find the latest group to restore from (only 1 lister is supported now)
var i = 1; // use the first lister. TODO: restore all listers?
var task_name_prefix = 'L'+i+ sC.PrefixFile +' 0Startup';
var task_name_pre_re = new RegExp(task_name_prefix +'.*',"gm");
for (var e = new Enumerator(tabGroups); !e.atEnd(); e.moveNext()) {var tg = e.item();
if (task_name_pre_re.test(tg.name)) {
var cmd = DOpus.Create.Command();
cmd.AddLine('GO TABGROUPLOAD "' + tg.name + '" TABCLOSEALL=yes');
var r = cmd.Run(); dbgv("Restoring tab group ‘" + tg.name + "’ status = " + r);
cmd.Clear(); break;
};
}
}
}
function findTabEmpty(min_found) {
var sV=Script.vars, sC=Script.config, DC=DOpus.Create;
var listers = DOpus.listers; var i=0;
var found = 0
for (var li = new Enumerator(listers); !li.atEnd(); li.moveNext()) {var L = li.item(); i+=1;
for (var lr=0;lr<2;lr++) { var tabs = (lr==0) ? L.tabsright : L.tabsleft;
for (var i=0;i<tabs.count;i++) { // no length for a generic collection
dbg("tabs[i].path = " + tabs[i].path);
if ((tabs[i].path+"") == "Empty Tab"); {
found += 1; if (found >= min_found) {return true}
}
}
}
}
if (found >=min_found) {return true}else{return false}
}
function OnScriptConfigChange(configChangeData) { cfgUpdate(configChangeData.changed); }
function OnPeriodicTimer(D) { dbgv('OnPeriodicTimer #' + D.id); //PeriodicTimerData
var dopusCmd = DOpus.NewCommand;
dopusCmd.RunCommand('TabGroupSave');
}
function OnAddCommands(addCmdD) {
var cmd = addCmdD.AddCommand();
cmd.name = 'TabGroupSave';
cmd.method = 'OnTabGroupSave';
cmd.desc = "Save a tab set out of order (the timers won't be affected)";
cmd.label = 'Save a tab set';
// cmd.template = 'fg/so,bg/so';
// cmd.icon = '';
cmd.hide = false;
var cmd = addCmdD.AddCommand();
cmd.name = 'TabGroupLoadLatest';
cmd.method = 'OnTabGroupLoadLatest';
cmd.desc = "Load the latest saved tab group";
cmd.label = 'Load the latest tab set';
// cmd.template = 'fg/so,bg/so';
// cmd.icon = '';
cmd.hide = false;
var cmd = addCmdD.AddCommand();
cmd.name = 'TabGroupLoadLatest';
cmd.method = 'OnTabGroupLoadLatest';
cmd.desc = "Load the latest saved tab group";
cmd.label = 'Load the latest tab set';
// cmd.template = 'fg/so,bg/so';
// cmd.icon = '';
cmd.hide = false;
}
function OnCloseLister(D) { // After a lister has been closed
var dopusCmd = DOpus.NewCommand;
dopusCmd.RunCommand('TabGroupSave');
}
function OnTabGroupLoadLatest(scriptCmdData) {
var sV = Script.vars, sC = Script.config, DC = DOpus.Create
, func = scriptCmdData.func // info about the default source/dest of the command, as well as details about how it was invoked
, cmd = func.command // pre-filled Command object that can be used to run commands against the source and destination tabs. =DOpusFactory.Command and setting the source and destination tabs manually
, tab = func.sourcetab //
, args = func.args ;
var tabGroups = DOpus.TabGroups;
var tabGroupsDir;
// Create subdirs if configured
var PrefixDir = sC.PrefixDir
if (sC.PrefixDir) {dbgv("searching in PrefixDir ¦" + PrefixDir +"¦");
var found = false;
for (var e = new Enumerator(tabGroups); !e.atEnd(); e.moveNext()) {var tg = e.item();
if ((tg.folder) && (tg.name === PrefixDir)) {found = true; dbgv("∃ folder = " + tg.name);
tabGroupsDir = tg} }
} else {tabGroupsDir = tabGroups}
var listers = DOpus.listers; var i=0;
for (var li = new Enumerator(listers); !li.atEnd(); li.moveNext()) {var L = li.item(); i+=1;
var LPre = ""; if (!sC.PrefixDirL) {LPre = "L"+i};
var task_name_pre_0 = LPre + sC.PrefixFile +' 00Latest';
var task_name_p0_re = new RegExp(task_name_pre_0 +'.*',"gm");
var task_name_0 = task_name_pre_0;
// Find Lister subdirs
var tabGroupsDirL;
var PrefixDirL = sC.PrefixDirL +" "+ i
if (sC.PrefixDirL) {dbgv("searching in PrefixDirL ¦" + PrefixDirL +"¦");
var found = false;
for (var e = new Enumerator(tabGroupsDir); !e.atEnd(); e.moveNext()) {var tg = e.item();
if ((tg.folder) && (tg.name === PrefixDirL)) {found = true; dbgv("∃ Lister folder = " + tg.name);
tabGroupsDirL = tg}}
} else {tabGroupsDirL = tabGroupsDir}
// Restore tab group
for (var e = new Enumerator(tabGroupsDirL); !e.atEnd(); e.moveNext()) {var tg = e.item();
if (task_name_p0_re .test(tg.name)) {
cmd.RunCommand("Go TABGROUPLOAD \"" + tg.name + "\""); dbgv("restored old " + tg.name);
break;};
}
}
}
function OnTabGroupLoadLatest(scriptCmdData) {
var sV = Script.vars, sC = Script.config, DC = DOpus.Create
, func = scriptCmdData.func // info about the default source/dest of the command, as well as details about how it was invoked
, cmd = func.command // pre-filled Command object that can be used to run commands against the source and destination tabs. =DOpusFactory.Command and setting the source and destination tabs manually
, tab = func.sourcetab //
, args = func.args ;
var tabGroups = DOpus.TabGroups;
var tabGroupsDir;
// Create subdirs if configured
var PrefixDir = sC.PrefixDir
if (sC.PrefixDir) {dbgv("searching in PrefixDir ¦" + PrefixDir +"¦");
var found = false;
for (var e = new Enumerator(tabGroups); !e.atEnd(); e.moveNext()) {var tg = e.item();
if ((tg.folder) && (tg.name === PrefixDir)) {found = true; dbgv("∃ folder = " + tg.name);
tabGroupsDir = tg} }
} else {tabGroupsDir = tabGroups}
var listers = DOpus.listers; var i=0;
for (var li = new Enumerator(listers); !li.atEnd(); li.moveNext()) {var L = li.item(); i+=1;
var LPre = ""; if (!sC.PrefixDirL) {LPre = "L"+i};
var task_name_pre_0 = LPre + sC.PrefixFile +' 00Latest';
var task_name_p0_re = new RegExp(task_name_pre_0 +'.*',"gm");
var task_name_0 = task_name_pre_0;
// Find Lister subdirs
var tabGroupsDirL;
var PrefixDirL = sC.PrefixDirL +" "+ i
if (sC.PrefixDirL) {dbgv("searching in PrefixDirL ¦" + PrefixDirL +"¦");
var found = false;
for (var e = new Enumerator(tabGroupsDir); !e.atEnd(); e.moveNext()) {var tg = e.item();
if ((tg.folder) && (tg.name === PrefixDirL)) {found = true; dbgv("∃ Lister folder = " + tg.name);
tabGroupsDirL = tg}}
} else {tabGroupsDirL = tabGroupsDir}
// Restore tab group
for (var e = new Enumerator(tabGroupsDirL); !e.atEnd(); e.moveNext()) {var tg = e.item();
if (task_name_p0_re .test(tg.name)) {
cmd.RunCommand("Go TABGROUPLOAD \"" + tg.name + "\""); dbgv("restored old " + tg.name);
break;};
}
}
}
function OnTabGroupSave(scriptCmdData) {
var sV = Script.vars, sC = Script.config, DC = DOpus.Create
, func = scriptCmdData.func // info about the default source/dest of the command, as well as details about how it was invoked
, cmd = func.command // pre-filled Command object that can be used to run commands against the source and destination tabs. =DOpusFactory.Command and setting the source and destination tabs manually
, tab = func.sourcetab //
, args = func.args ;
var idx = Math.floor(sV.get('idx') % sC.MaxHistory) + 1;
var pre_idx = ''; if (sC.MaxHistory > 9 && idx < 10) {pre_idx='0'}; //' ' fails, '10' is still sorted before ' 1'
sV.set('idx', idx);
var tabGroups = DOpus.TabGroups;
var tabGroupsDir;
// Create subdirs if configured
var PrefixDir = sC.PrefixDir
if (sC.PrefixDir) {dbgv("saving in PrefixDir ¦" + PrefixDir +"¦");
var found = false;
for (var e = new Enumerator(tabGroups); !e.atEnd(); e.moveNext()) {var tg = e.item();
if ((tg.folder) && (tg.name === PrefixDir)) {found = true; dbgv("∃ folder = " + tg.name);
tabGroupsDir = tg;}; }
if (!found) {dbgv("∄ PrefixDir, creating a new one = " + PrefixDir);
var tg_dir_res = tabGroups.AddChildFolder(PrefixDir);
if (tg_dir_res) {tabGroupsDir = tg_dir_res;
} else {tabGroupsDir = tabGroups ; err("Failed to create a tab group dir ¦" + PrefixDir + "¦, will be saving without one...");}
}
} else {tabGroupsDir = tabGroups}
var listers = DOpus.listers; var i=0;
for (var li = new Enumerator(listers); !li.atEnd(); li.moveNext()) {var L = li.item(); i+=1;
var ts = new Date(); //Day+Mon (locale-aware) HH:MM
var reg_repl_year = new RegExp('[\\/-]?'+ ts.getFullYear(),"gm");
var hh = ts.getHours (); if (hh < 10) {hh = " "+hh}
var mm = ts.getMinutes(); if (mm < 10) {mm = " "+mm}
var cur_date_time = ts.toLocaleDateString().replace(reg_repl_year,'') + hh +'꞉'+ mm; //: bugs since these are saved as files
var LPre = ""; if (!sC.PrefixDirL) {LPre = "L"+i};
var task_name_prefix = LPre + sC.PrefixFile +' '+ pre_idx + idx;
var task_name_pre_no = LPre + sC.PrefixFile +' '+ idx; // delete old tasks when user had <10 max
var task_name_pre_0 = LPre + sC.PrefixFile +' 00Latest';
var task_name_pre_re = new RegExp(task_name_prefix +'.*',"gm");
var task_name_pno_re = new RegExp(task_name_pre_no +'.*',"gm");
var task_name_p0_re = new RegExp(task_name_pre_0 +'.*',"gm");
var task_name = task_name_prefix +' '+ cur_date_time;
var task_name_0 = task_name_pre_0 +' '+ cur_date_time;
var tg_res; var tg0;
// Create Lister subdirs
var tabGroupsDirL;
var PrefixDirL = sC.PrefixDirL +" "+ i
if (sC.PrefixDirL) {dbgv("saving in PrefixDirL ¦" + PrefixDirL +"¦");
var found = false;
for (var e = new Enumerator(tabGroupsDir); !e.atEnd(); e.moveNext()) {var tg = e.item();
if ((tg.folder) && (tg.name === PrefixDirL)) {found = true; dbgv("∃ Lister folder = " + tg.name);
tabGroupsDirL = tg;}; }
if (!found) {dbgv("∄ PrefixDirL, creating a new one = " + PrefixDirL);
var tg_dir_res = tabGroupsDir.AddChildFolder(PrefixDirL);
if (tg_dir_res) {tabGroupsDirL = tg_dir_res ;
} else {tabGroupsDirL = tabGroupsDir; err("Failed to create a tab group dir ¦" + PrefixDirL + "¦, will be saving without one...");}
}
} else {tabGroupsDirL = tabGroupsDir}
// Save tabs in a tab group
var c_del = 0; var del_max = 2; // delete at most 2 groups: latest and old under the same idx
for (var e = new Enumerator(tabGroupsDirL); !e.atEnd(); e.moveNext()) {var tg = e.item();
if ( task_name === tg.name
|| task_name_pre_re.test(tg.name)
|| task_name_pno_re.test(tg.name)
|| task_name_p0_re .test(tg.name)
) {tabGroupsDirL.DeleteChild(tg);dbgv("deleted old " + tg.name);
c_del+=1; if (c_del >= del_max) {break;}};
}
tg_res = tabGroupsDirL.AddChildGroup(task_name );
tg0 = tabGroupsDirL.AddChildGroup(task_name_0);
if (tg_res && tg0) {dbgv("filling up new groups ¦" + task_name + "¦" + " and ¦"+ task_name_0 +"¦ with current Lister tabs ");
tg_res.desc = "backup.TabGroupSave🕘 on " + cur_date_time;
tg0 .desc = "backup.TabGroupSave🕘 on " + cur_date_time;
tg_res.closeexisting = sC.CloseOthers;
tg0 .closeexisting = sC.CloseOthers;
if (L.dual) { tg_res.dual = true; tg0.dual = true;
var tabList = L.tabsleft ; var tg_tabs = tg_res.lefttabs ; var tg0_tabs = tg0.lefttabs ;
for (var e=new Enumerator(tabList);!e.atEnd();e.moveNext()) {var tab = e.item(); tg_tabs.AddTab(tab.path); tg0_tabs.AddTab(tab.path);}
var tabList = L.tabsright; var tg_tabs = tg_res.righttabs; var tg0_tabs = tg0.righttabs;
for (var e=new Enumerator(tabList);!e.atEnd();e.moveNext()) {var tab = e.item(); tg_tabs.AddTab(tab.path); tg0_tabs.AddTab(tab.path);}
} else {
var tabList = L.tabs ; var tg_tabs = tg_res.tabs ; var tg0_tabs = tg0.tabs;
if (tabList){for (var e=new Enumerator(tabList);!e.atEnd();e.moveNext()) {var tab = e.item(); tg_tabs.AddTab(tab.path); tg0_tabs.AddTab(tab.path);}}
}
} else {err("Failed to create a new tab group to save tabs to " + task_name + " and " + task_name_0);}
tabGroups.Save();
}
}
function cfgUpdate(D) { // Read user config to update script vars or set defaults if config is blank
// ConfigChangeData from OnScriptConfigChange
var sV = Script.vars, sC = Script.config, DC = DOpus.Create;
var dbg_out = "cfgUpdate|End|: №" + D.count;
for (var e = new Enumerator(D); !e.atEnd(); e.moveNext()) {var cfgv = e.item();
if (cfgv === 'Period' && sC[cfgv] != sV.get(cfgv)) { dbgv("Updating 🕘timer period")
DOpus.KillTimer(345);
DOpus.SetTimer (345, sC.Period * 60 * 1000);
}
if ({}.hasOwnProperty.call(sC,cfgv)) { //Object.prototype.hasOwnProperty; 'y' in x checks inherited; sC.hasOwnProperty fails
dbg_out += " " + cfgv + "=¦" + sC[cfgv] +"¦ ← ¦"+ sV.get(cfgv) +"¦ ≝¦"+ sV.get(cfgv) +"¦";
sV.set(cfgv, sC[cfgv]);
}
}
dbg(dbg_out);
}