105 lines
2.4 KiB
JavaScript
105 lines
2.4 KiB
JavaScript
/**
|
|
* SCEditor AutoSave Plugin
|
|
* http://www.sceditor.com/
|
|
*
|
|
* Copyright (C) 2017, Sam Clarke (samclarke.com)
|
|
*
|
|
* SCEditor is licensed under the MIT license:
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
*
|
|
* @author Sam Clarke
|
|
*/
|
|
(function (sceditor) {
|
|
'use strict';
|
|
|
|
var defaultKey = 'sce-autodraft-' + location.pathname + location.search;
|
|
|
|
function clear(key) {
|
|
localStorage.removeItem(key || defaultKey);
|
|
}
|
|
|
|
sceditor.plugins.autosave = function () {
|
|
var base = this;
|
|
var editor;
|
|
var storageKey = defaultKey;
|
|
// 86400000 = 24 hrs (24 * 60 * 60 * 1000)
|
|
var expires = 86400000;
|
|
var saveHandler = function (value) {
|
|
localStorage.setItem(storageKey, JSON.stringify(value));
|
|
};
|
|
var loadHandler = function () {
|
|
return JSON.parse(localStorage.getItem(storageKey));
|
|
};
|
|
|
|
function gc() {
|
|
for (var i = 0; i < localStorage.length; i++) {
|
|
var key = localStorage.key(i);
|
|
|
|
if (/^sce\-autodraft\-/.test(key)) {
|
|
var item = JSON.parse(localStorage.getItem(storageKey));
|
|
if (item && item.time < Date.now() - expires) {
|
|
clear(key);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
base.init = function () {
|
|
editor = this;
|
|
var opts = editor.opts && editor.opts.autosave || {};
|
|
|
|
saveHandler = opts.save || saveHandler;
|
|
loadHandler = opts.load || loadHandler;
|
|
storageKey = opts.storageKey || storageKey;
|
|
expires = opts.expires || expires;
|
|
|
|
gc();
|
|
};
|
|
|
|
base.signalReady = function () {
|
|
// Add submit event listener to clear autosave
|
|
var parent = editor.getContentAreaContainer();
|
|
while (parent) {
|
|
if (/form/i.test(parent.nodeName)) {
|
|
parent.addEventListener(
|
|
'submit', clear.bind(null, storageKey), true
|
|
);
|
|
break;
|
|
}
|
|
|
|
parent = parent.parentNode;
|
|
}
|
|
|
|
var state = loadHandler();
|
|
if (state) {
|
|
editor.sourceMode(state.sourceMode);
|
|
editor.val(state.value, false);
|
|
editor.focus();
|
|
|
|
if (state.sourceMode) {
|
|
editor.sourceEditorCaret(state.caret);
|
|
} else {
|
|
editor.getRangeHelper().restoreRange();
|
|
}
|
|
}
|
|
|
|
saveHandler({
|
|
caret: this.sourceEditorCaret(),
|
|
sourceMode: this.sourceMode(),
|
|
value: editor.val(null, false),
|
|
time: Date.now()
|
|
});
|
|
};
|
|
|
|
base.signalValuechangedEvent = function (e) {
|
|
saveHandler({
|
|
caret: this.sourceEditorCaret(),
|
|
sourceMode: this.sourceMode(),
|
|
value: e.detail.rawValue,
|
|
time: Date.now()
|
|
});
|
|
};
|
|
};
|
|
|
|
sceditor.plugins.autosave.clear = clear;
|
|
}(sceditor));
|