summernote-webpack
Version:
Super simple WYSIWYG editor
110 lines (92 loc) • 2.54 kB
JavaScript
define(['summernote/base/core/range'], function (range) {
/**
* @class editing.History
*
* Editor History
*
*/
var History = function ($editable) {
var stack = [], stackOffset = -1;
var editable = $editable[0];
var makeSnapshot = function () {
var rng = range.create(editable);
var emptyBookmark = {s: {path: [], offset: 0}, e: {path: [], offset: 0}};
return {
contents: $editable.html(),
bookmark: (rng ? rng.bookmark(editable) : emptyBookmark)
};
};
var applySnapshot = function (snapshot) {
if (snapshot.contents !== null) {
$editable.html(snapshot.contents);
}
if (snapshot.bookmark !== null) {
range.createFromBookmark(editable, snapshot.bookmark).select();
}
};
/**
* @method rewind
* Rewinds the history stack back to the first snapshot taken.
* Leaves the stack intact, so that "Redo" can still be used.
*/
this.rewind = function () {
// Create snap shot if not yet recorded
if ($editable.html() !== stack[stackOffset].contents) {
this.recordUndo();
}
// Return to the first available snapshot.
stackOffset = 0;
// Apply that snapshot.
applySnapshot(stack[stackOffset]);
};
/**
* @method reset
* Resets the history stack completely; reverting to an empty editor.
*/
this.reset = function () {
// Clear the stack.
stack = [];
// Restore stackOffset to its original value.
stackOffset = -1;
// Clear the editable area.
$editable.html('');
// Record our first snapshot (of nothing).
this.recordUndo();
};
/**
* undo
*/
this.undo = function () {
// Create snap shot if not yet recorded
if ($editable.html() !== stack[stackOffset].contents) {
this.recordUndo();
}
if (0 < stackOffset) {
stackOffset--;
applySnapshot(stack[stackOffset]);
}
};
/**
* redo
*/
this.redo = function () {
if (stack.length - 1 > stackOffset) {
stackOffset++;
applySnapshot(stack[stackOffset]);
}
};
/**
* recorded undo
*/
this.recordUndo = function () {
stackOffset++;
// Wash out stack after stackOffset
if (stack.length > stackOffset) {
stack = stack.slice(0, stackOffset);
}
// Create new snapshot and push it to the end
stack.push(makeSnapshot());
};
};
return History;
});