marko
Version:
UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.
152 lines (133 loc) • 3.78 kB
JavaScript
;var domData = require("../../../runtime/components/dom-data");
var componentsByDOMNode = domData._r_;
var keysByDOMNode = domData._p_;
var vElementsByDOMNode = domData._M_;
var vPropsByDOMNode = domData._N_;
var markoUID = window.$MUID || (window.$MUID = { i: 0 });
var runtimeId = markoUID.i++;
var componentLookup = {};
var EMPTY_OBJECT = {};
function getComponentForEl(el, host) {
var node =
typeof el == "string" ?
((host ? host.ownerDocument : host) || document).getElementById(el) :
el;
var component;
var vElement;
while (node) {
if (node.fragment) {
if (node.fragment.endNode === node) {
node = node.fragment.startNode;
} else {
node = node.fragment;
component = componentsByDOMNode.get(node);
}
} else if (vElement = vElementsByDOMNode.get(node)) {
component = vElement._O_;
}
if (component) {
return component;
}
node = node.previousSibling || node.parentNode;
}
}
function destroyComponentForNode(node) {
var componentToDestroy = componentsByDOMNode.get(node.fragment || node);
if (componentToDestroy) {
componentToDestroy._P_();
delete componentLookup[componentToDestroy.id];
}
}
function destroyNodeRecursive(node, component) {
destroyComponentForNode(node);
if (node.nodeType === 1 || node.nodeType === 12) {
var key;
if (component && (key = keysByDOMNode.get(node))) {
if (node === component.L_[key]) {
if (componentsByDOMNode.get(node) && /\[\]$/.test(key)) {
delete component.L_[key][
componentsByDOMNode.get(node).id];
} else {
delete component.L_[key];
}
}
}
var curChild = node.firstChild;
while (curChild && curChild !== node.endNode) {
destroyNodeRecursive(curChild, component);
curChild = curChild.nextSibling;
}
}
}
function nextComponentId() {
// Each component will get an ID that is unique across all loaded
// marko runtimes. This allows multiple instances of marko to be
// loaded in the same window and they should all place nice
// together
return "c" + markoUID.i++;
}
function nextComponentIdProvider() {
return nextComponentId;
}
function attachBubblingEvent(
componentDef,
handlerMethodName,
isOnce,
extraArgs)
{
if (handlerMethodName) {
var componentId = componentDef.id;
if (extraArgs) {
return [handlerMethodName, componentId, isOnce, extraArgs];
} else {
return [handlerMethodName, componentId, isOnce];
}
}
}
function getMarkoPropsFromEl(el) {
var vElement = vElementsByDOMNode.get(el);
var virtualProps;
if (vElement) {
virtualProps = vElement._Q_;
} else {
virtualProps = vPropsByDOMNode.get(el);
if (!virtualProps) {
virtualProps = el.getAttribute("data-marko");
vPropsByDOMNode.set(
el,
virtualProps = virtualProps ? JSON.parse(virtualProps) : EMPTY_OBJECT
);
}
}
return virtualProps;
}
function normalizeComponentKey(key, parentId) {
if (key[0] === "#") {
key = key.replace("#" + parentId + "-", "");
}
return key;
}
function addComponentRootToKeyedElements(
keyedElements,
key,
rootNode,
componentId)
{
if (/\[\]$/.test(key)) {
var repeatedElementsForKey = keyedElements[key] =
keyedElements[key] || {};
repeatedElementsForKey[componentId] = rootNode;
} else {
keyedElements[key] = rootNode;
}
}
exports._R_ = runtimeId;
exports._n_ = componentLookup;
exports.U_ = getComponentForEl;
exports._S_ = destroyComponentForNode;
exports._T_ = destroyNodeRecursive;
exports._U_ = nextComponentIdProvider;
exports._V_ = attachBubblingEvent;
exports._t_ = getMarkoPropsFromEl;
exports._o_ = addComponentRootToKeyedElements;
exports._W_ = normalizeComponentKey;