marko
Version:
UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.
101 lines (83 loc) • 2.58 kB
JavaScript
var hasTextContent = require("./is-text-only");
function VNode() {}
VNode.prototype = {
___VNode: function (finalChildCount, ownerComponent) {
this.___finalChildCount = finalChildCount;
this.___childCount = 0;
this.___firstChildInternal = null;
this.___lastChild = null;
this.___parentNode = null;
this.___nextSiblingInternal = null;
this.___ownerComponent = ownerComponent;
},
get ___firstChild() {
var firstChild = this.___firstChildInternal;
if (firstChild && firstChild.___DocumentFragment) {
var nestedFirstChild = firstChild.___firstChild;
// The first child is a DocumentFragment node.
// If the DocumentFragment node has a first child then we will return that.
// Otherwise, the DocumentFragment node is not *really* the first child and
// we need to skip to its next sibling
return nestedFirstChild || firstChild.___nextSibling;
}
return firstChild;
},
get ___nextSibling() {
var nextSibling = this.___nextSiblingInternal;
if (nextSibling) {
if (nextSibling.___DocumentFragment) {
var firstChild = nextSibling.___firstChild;
return firstChild || nextSibling.___nextSibling;
}
} else {
var parentNode = this.___parentNode;
if (parentNode && parentNode.___DocumentFragment) {
return parentNode.___nextSibling;
}
}
return nextSibling;
},
___appendChild: function (child) {
this.___childCount++;
if (hasTextContent(this.___nodeName)) {
if (child.___Text) {
this.___textContent += child.___nodeValue;
} else {
throw TypeError();
}
} else {
var lastChild = this.___lastChild;
child.___parentNode = this;
if (lastChild) {
lastChild.___nextSiblingInternal = child;
} else {
this.___firstChildInternal = child;
}
this.___lastChild = child;
}
return child;
},
___finishChild: function finishChild() {
if (this.___childCount === this.___finalChildCount && this.___parentNode) {
return this.___parentNode.___finishChild();
} else {
return this;
}
},
// ,toJSON: function() {
// var clone = Object.assign({
// nodeType: this.nodeType
// }, this);
//
// for (var k in clone) {
// if (k.startsWith('_')) {
// delete clone[k];
// }
// }
// delete clone._nextSibling;
// delete clone._lastChild;
// delete clone.parentNode;
// return clone;
// }
};
module.exports = VNode;