UNPKG

alpaca

Version:

Alpaca provides the easiest and fastest way to generate interactive forms for the web and mobile devices. It runs simply as HTML5 or more elaborately using Bootstrap, jQuery Mobile or jQuery UI. Alpaca uses Handlebars to process JSON schema and provide

110 lines (92 loc) 2.54 kB
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; });