Download extensions/sd-model-organizer/javascript/tinymce/plugins/autosave/plugin.js from dikdimon/ext: direct link, hf CLI and curl.
- Browser
- Download file 7.52 kB
-
https://huggingface.co/dikdimon/ext/resolve/main/extensions/sd-model-organizer/javascript/tinymce/plugins/autosave/plugin.js
- Command line
-
hf download hf://dikdimon/ext/extensions/sd-model-organizer/javascript/tinymce/plugins/autosave/plugin.js
-
curl -L -o plugin.js https://huggingface.co/dikdimon/ext/resolve/main/extensions/sd-model-organizer/javascript/tinymce/plugins/autosave/plugin.js
7.52 kB
| /** | |
| * TinyMCE version 6.4.1 (2023-03-29) | |
| */ | |
| (function () { | |
| 'use strict'; | |
| var global$4 = tinymce.util.Tools.resolve('tinymce.PluginManager'); | |
| const hasProto = (v, constructor, predicate) => { | |
| var _a; | |
| if (predicate(v, constructor.prototype)) { | |
| return true; | |
| } else { | |
| return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; | |
| } | |
| }; | |
| const typeOf = x => { | |
| const t = typeof x; | |
| if (x === null) { | |
| return 'null'; | |
| } else if (t === 'object' && Array.isArray(x)) { | |
| return 'array'; | |
| } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { | |
| return 'string'; | |
| } else { | |
| return t; | |
| } | |
| }; | |
| const isType = type => value => typeOf(value) === type; | |
| const eq = t => a => t === a; | |
| const isString = isType('string'); | |
| const isUndefined = eq(undefined); | |
| var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); | |
| var global$2 = tinymce.util.Tools.resolve('tinymce.util.LocalStorage'); | |
| var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); | |
| const fireRestoreDraft = editor => editor.dispatch('RestoreDraft'); | |
| const fireStoreDraft = editor => editor.dispatch('StoreDraft'); | |
| const fireRemoveDraft = editor => editor.dispatch('RemoveDraft'); | |
| const parse = timeString => { | |
| const multiples = { | |
| s: 1000, | |
| m: 60000 | |
| }; | |
| const parsedTime = /^(\d+)([ms]?)$/.exec(timeString); | |
| return (parsedTime && parsedTime[2] ? multiples[parsedTime[2]] : 1) * parseInt(timeString, 10); | |
| }; | |
| const option = name => editor => editor.options.get(name); | |
| const register$1 = editor => { | |
| const registerOption = editor.options.register; | |
| const timeProcessor = value => { | |
| const valid = isString(value); | |
| if (valid) { | |
| return { | |
| value: parse(value), | |
| valid | |
| }; | |
| } else { | |
| return { | |
| valid: false, | |
| message: 'Must be a string.' | |
| }; | |
| } | |
| }; | |
| registerOption('autosave_ask_before_unload', { | |
| processor: 'boolean', | |
| default: true | |
| }); | |
| registerOption('autosave_prefix', { | |
| processor: 'string', | |
| default: 'tinymce-autosave-{path}{query}{hash}-{id}-' | |
| }); | |
| registerOption('autosave_restore_when_empty', { | |
| processor: 'boolean', | |
| default: false | |
| }); | |
| registerOption('autosave_interval', { | |
| processor: timeProcessor, | |
| default: '30s' | |
| }); | |
| registerOption('autosave_retention', { | |
| processor: timeProcessor, | |
| default: '20m' | |
| }); | |
| }; | |
| const shouldAskBeforeUnload = option('autosave_ask_before_unload'); | |
| const shouldRestoreWhenEmpty = option('autosave_restore_when_empty'); | |
| const getAutoSaveInterval = option('autosave_interval'); | |
| const getAutoSaveRetention = option('autosave_retention'); | |
| const getAutoSavePrefix = editor => { | |
| const location = document.location; | |
| return editor.options.get('autosave_prefix').replace(/{path}/g, location.pathname).replace(/{query}/g, location.search).replace(/{hash}/g, location.hash).replace(/{id}/g, editor.id); | |
| }; | |
| const isEmpty = (editor, html) => { | |
| if (isUndefined(html)) { | |
| return editor.dom.isEmpty(editor.getBody()); | |
| } else { | |
| const trimmedHtml = global$1.trim(html); | |
| if (trimmedHtml === '') { | |
| return true; | |
| } else { | |
| const fragment = new DOMParser().parseFromString(trimmedHtml, 'text/html'); | |
| return editor.dom.isEmpty(fragment); | |
| } | |
| } | |
| }; | |
| const hasDraft = editor => { | |
| var _a; | |
| const time = parseInt((_a = global$2.getItem(getAutoSavePrefix(editor) + 'time')) !== null && _a !== void 0 ? _a : '0', 10) || 0; | |
| if (new Date().getTime() - time > getAutoSaveRetention(editor)) { | |
| removeDraft(editor, false); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| const removeDraft = (editor, fire) => { | |
| const prefix = getAutoSavePrefix(editor); | |
| global$2.removeItem(prefix + 'draft'); | |
| global$2.removeItem(prefix + 'time'); | |
| if (fire !== false) { | |
| fireRemoveDraft(editor); | |
| } | |
| }; | |
| const storeDraft = editor => { | |
| const prefix = getAutoSavePrefix(editor); | |
| if (!isEmpty(editor) && editor.isDirty()) { | |
| global$2.setItem(prefix + 'draft', editor.getContent({ | |
| format: 'raw', | |
| no_events: true | |
| })); | |
| global$2.setItem(prefix + 'time', new Date().getTime().toString()); | |
| fireStoreDraft(editor); | |
| } | |
| }; | |
| const restoreDraft = editor => { | |
| var _a; | |
| const prefix = getAutoSavePrefix(editor); | |
| if (hasDraft(editor)) { | |
| editor.setContent((_a = global$2.getItem(prefix + 'draft')) !== null && _a !== void 0 ? _a : '', { format: 'raw' }); | |
| fireRestoreDraft(editor); | |
| } | |
| }; | |
| const startStoreDraft = editor => { | |
| const interval = getAutoSaveInterval(editor); | |
| global$3.setEditorInterval(editor, () => { | |
| storeDraft(editor); | |
| }, interval); | |
| }; | |
| const restoreLastDraft = editor => { | |
| editor.undoManager.transact(() => { | |
| restoreDraft(editor); | |
| removeDraft(editor); | |
| }); | |
| editor.focus(); | |
| }; | |
| const get = editor => ({ | |
| hasDraft: () => hasDraft(editor), | |
| storeDraft: () => storeDraft(editor), | |
| restoreDraft: () => restoreDraft(editor), | |
| removeDraft: fire => removeDraft(editor, fire), | |
| isEmpty: html => isEmpty(editor, html) | |
| }); | |
| var global = tinymce.util.Tools.resolve('tinymce.EditorManager'); | |
| const setup = editor => { | |
| editor.editorManager.on('BeforeUnload', e => { | |
| let msg; | |
| global$1.each(global.get(), editor => { | |
| if (editor.plugins.autosave) { | |
| editor.plugins.autosave.storeDraft(); | |
| } | |
| if (!msg && editor.isDirty() && shouldAskBeforeUnload(editor)) { | |
| msg = editor.translate('You have unsaved changes are you sure you want to navigate away?'); | |
| } | |
| }); | |
| if (msg) { | |
| e.preventDefault(); | |
| e.returnValue = msg; | |
| } | |
| }); | |
| }; | |
| const makeSetupHandler = editor => api => { | |
| api.setEnabled(hasDraft(editor)); | |
| const editorEventCallback = () => api.setEnabled(hasDraft(editor)); | |
| editor.on('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); | |
| return () => editor.off('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); | |
| }; | |
| const register = editor => { | |
| startStoreDraft(editor); | |
| const onAction = () => { | |
| restoreLastDraft(editor); | |
| }; | |
| editor.ui.registry.addButton('restoredraft', { | |
| tooltip: 'Restore last draft', | |
| icon: 'restore-draft', | |
| onAction, | |
| onSetup: makeSetupHandler(editor) | |
| }); | |
| editor.ui.registry.addMenuItem('restoredraft', { | |
| text: 'Restore last draft', | |
| icon: 'restore-draft', | |
| onAction, | |
| onSetup: makeSetupHandler(editor) | |
| }); | |
| }; | |
| var Plugin = () => { | |
| global$4.add('autosave', editor => { | |
| register$1(editor); | |
| setup(editor); | |
| register(editor); | |
| editor.on('init', () => { | |
| if (shouldRestoreWhenEmpty(editor) && editor.dom.isEmpty(editor.getBody())) { | |
| restoreDraft(editor); | |
| } | |
| }); | |
| return get(editor); | |
| }); | |
| }; | |
| Plugin(); | |
| })(); | |