append: INSERTION(function(node) { var last = _.last(this.contents()); if(last && last.nodeType === Node.TEXT_NODE && node.nodeType === Node.TEXT_NODE) { last.setText(last.getText() + node.getText()); node.detach(); return last; } else { this._$.append(node.nativeNode); return node; } }),
doc.transaction(function() { var wrapper = params.fragment.startNode.parent().wrapText({ _with: {tagName: 'aside', attrs: {'class': 'gap'}}, offsetStart: params.fragment.startOffset, offsetEnd: params.fragment.endOffset, textNodeIdx: [params.fragment.startNode.getIndex(), params.fragment.endNode.getIndex()] }), last = _.last(wrapper.contents()); return doc.createFragment(doc.CaretFragment, {node: last, offset: last.getText().length}); }, {
execute: function(callback, params) { var metadata = _.last(params.document[dir+'Stack']).metadata, fragment = metadata && metadata.fragment; params.document[dir](); if(fragment) { if(!fragment.isValid()) { fragment.restoreFromPaths(); } if(fragment.isValid()) { callback(fragment); } } callback(); },
getState: function(params) { var allowed = params.document && !!(params.document[dir+'Stack'].length), desc = dir === 'undo' ? gettext('Undo') : gettext('Redo'), descEmpty = dir === 'undo' ? gettext('There is nothing to undo') : gettext('There is nothing to redo'); if(allowed) { var metadata = _.last(params.document[dir+'Stack']).metadata; if(metadata) { desc += ': ' + (metadata.description || gettext('unknown operation')); } } return { allowed: allowed, description: allowed ? desc : descEmpty }; }
extractAllItems: function() { var contents = this.contents(); return this.document.extractItems({item1: contents[0], item2: _.last(contents)}); }