upfront-editable
Version:
Friendly contenteditable API
76 lines (62 loc) • 2.35 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _nodeType = require('./node-type');
var nodeType = _interopRequireWildcard(_nodeType);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// A DOM node iterator.
//
// Has the ability to replace nodes on the fly and continue
// the iteration.
var NodeIterator = function () {
function NodeIterator(root) {
(0, _classCallCheck3.default)(this, NodeIterator);
this.current = this.next = this.root = root;
}
(0, _createClass3.default)(NodeIterator, [{
key: 'getNextTextNode',
value: function getNextTextNode() {
var next = void 0;
while (next = this.getNext()) {
if (next.nodeType === nodeType.textNode && next.data !== '') return next;
}
}
}, {
key: 'getNext',
value: function getNext() {
var n = this.current = this.next;
var child = this.next = undefined;
if (this.current) {
child = n.firstChild;
// Skip the children of elements with the attribute data-editable="remove"
// This prevents text nodes that are not part of the content to be included.
if (child && n.getAttribute('data-editable') !== 'remove') {
this.next = child;
} else {
while (n !== this.root && !(this.next = n.nextSibling)) {
n = n.parentNode;
}
}
}
return this.current;
}
}, {
key: 'replaceCurrent',
value: function replaceCurrent(replacement) {
this.current = replacement;
this.next = undefined;
var n = this.current;
while (n !== this.root && !(this.next = n.nextSibling)) {
n = n.parentNode;
}
}
}]);
return NodeIterator;
}();
exports.default = NodeIterator;