diff --git a/alt.html b/alt.html index d7e1f8dc..9882fb21 100644 --- a/alt.html +++ b/alt.html @@ -6,13 +6,18 @@ -
1
-
2
+ + + +
0,00,1
1,01,1
diff --git a/d3.alt.js b/d3.alt.js index 9243269f..ef52e890 100644 --- a/d3.alt.js +++ b/d3.alt.js @@ -1,6 +1,9 @@ (function(_) { - var d3 = _.d3 = d3_selection([document]); + var d3_root = [[document]], + d3 = _.d3 = d3_selection(d3_root); + + d3_root[0].data = []; d3.ns = { prefix: { @@ -10,11 +13,6 @@ xml: "http://www.w3.org/XML/1998/namespace", xmlns: "http://www.w3.org/2000/xmlns/" }, - - resolve: function(prefix) { - return d3.ns.prefix[prefix] || null; - }, - qualify: function(name) { var i = name.indexOf(":"); return i < 0 ? name : { @@ -24,57 +22,76 @@ } }; - function d3_selection(nodes, denodes) { - var i, - n = nodes.length; + function d3_array(psuedoarray) { + return Array.prototype.slice.call(psuedoarray); + } - // TODO attr(name, function) - // TODO style(name, function, priority) - // TODO text(function) - // TODO html(function) + function d3_blend(arrays) { + return Array.prototype.concat.apply([], arrays); + } - // TODO select(node) - // TODO select(function) - // TODO selectAll(node[]) - // TODO selectAll(function) - - // TODO append(node) - // TODO append(function)? - // TODO remove(node)? - // TODO remove(function)? - - // TODO event - // TODO on? - - // TODO data - // TODO enter - // TODO exit - - // TODO transition - // TODO delay - // TODO duration - // TODO easing + function d3_selection(groups, deselect) { + var nodes = d3_blend(groups); + // TODO select(node)? + // TODO select(function)? nodes.select = function(query) { - var select = []; - i = -1; while (++i < n) select.push(nodes[i].querySelector(query)); - return d3_selection(select, nodes); + return d3_selection(groups.map(function(group) { + var subgroup = group.map(function(node) { + return node.querySelector(query); + }); + subgroup.data = group.data; + return subgroup; + }), nodes); }; + // TODO selectAll(node[])? + // TODO selectAll(function)? nodes.selectAll = function(query) { - var all = [], - select; - i = -1; while (++i < n) { - select = nodes[i].querySelectorAll(query); - j = -1; m = select.length; while (++j < m) all.push(select[j]); - } - return d3_selection(all, nodes); + return d3_selection(d3_blend(groups.map(function(group) { + return group.map(function(node) { + var subgroup = d3_array(node.querySelectorAll(query)); + subgroup.data = [node.__data__].concat(group.data); + return subgroup; + }); + })), nodes); }; nodes.deselect = function() { - return denodes; + return deselect; }; + // TODO data(function) + // TODO data(null) + // TODO key + // TODO enter + // TODO exit + nodes.data = function(data) { + if (arguments.length < 1) { + return nodes.map(function(node) { + return node.__data__; + }); + } + if (typeof data == "function") { + for (var i = 0, n = groups.length; i < n; i++) { + var group = groups[i], + groupData = data.apply(nodes, group.data); + for (var j = 0, m = group.length; j < m; j++) { + group[j].__data__ = groupData[j]; + } + } + } else { + for (var i = 0, n = groups.length; i < n; i++) { + var group = groups[i]; + for (var j = 0, m = group.length; j < m; j++) { + group[j].__data__ = data[j]; + } + } + } + return nodes; + }; + + // TODO attr(name, function) nodes.attr = function(name, value) { name = d3.ns.qualify(name); if (arguments.length < 2) { @@ -82,55 +99,89 @@ ? function(e) { return e.getAttributeNS(name.space, name.local); } : function(e) { return e.getAttribute(name); }); } - i = -1; if (name.local) { if (value == null) { - while (++i < n) nodes[i].removeAttributeNS(name.space, name.local); + for (var i = 0, n = nodes.length; i < n; i++) { + nodes[i].removeAttributeNS(name.space, name.local); + } } else { - while (++i < n) nodes[i].setAttributeNS(name.space, name.local, value); + for (var i = 0, n = nodes.length; i < n; i++) { + nodes[i].setAttributeNS(name.space, name.local, value); + } } } else { if (value == null) { - while (++i < n) nodes[i].removeAttribute(name); + for (var i = 0, n = nodes.length; i < n; i++) { + nodes[i].removeAttribute(name); + } } else { - while (++i < n) nodes[i].setAttribute(name, value); + for (var i = 0, n = nodes.length; i < n; i++) { + nodes[i].setAttribute(name, value); + } } } return nodes; }; + // TODO style(name, function, priority) nodes.style = function(name, value, priority) { if (arguments.length < 2) { return nodes.map(function(e) { return window.getComputedStyle(e, null).getPropertyValue(name); }); } - i = -1; while (++i < n) nodes[i].style.setProperty(name, value, priority); + if (arguments.length < 3) priority = null; + for (var i = 0, n = nodes.length; i < n; i++) { + nodes[i].style.setProperty(name, value, priority); + } return nodes; }; + // TODO text(function) nodes.text = function(value) { if (arguments.length < 1) { return nodes.map(function(e) { return e.textContent; }); } - i = -1; while (++i < n) { - var node = nodes[i]; - while (node.lastChild) node.removeChild(node.lastChild); - node.appendChild(document.createTextNode(value)); + if (typeof value == "function") { + for (var i = 0, n = groups.length; i < n; i++) { + var group = groups[i], + data = group.data; + data.unshift(null); + for (var j = 0, m = group.length; j < m; j++) { + var node = group[j]; + data[0] = node.__data__; + while (node.lastChild) node.removeChild(node.lastChild); + node.appendChild(document.createTextNode(value.apply(nodes, data))); + } + data.shift(); + } + } else { + for (var i = 0, n = nodes.length; i < n; i++) { + var node = nodes[i]; + while (node.lastChild) node.removeChild(node.lastChild); + node.appendChild(document.createTextNode(value)); + } } + return nodes; }; + // TODO html(function) nodes.html = function(value) { if (arguments.length < 1) { return nodes.map(function(e) { return e.innerHTML; }); } - i = -1; while (++i < n) nodes[i].innerHTML = value; + for (var i = 0, n = nodes.length; i < n; i++) { + nodes[i].innerHTML = value; + } + return nodes; }; + // TODO append(node) + // TODO append(function)? nodes.append = function(name) { var children; name = d3.ns.qualify(name); @@ -146,14 +197,26 @@ return d3_selection(children, nodes); }; + // TODO remove(node)? + // TODO remove(function)? nodes.remove = function() { - i = -1; while (++i < n) { + for (var i = 0, n = nodes.length; i < n; i++) { var node = nodes[i]; node.parentNode.removeChild(node); } return nodes.deselect(); }; + // TODO event + // TODO on? + + // TODO filter, slice? or d3.selectAll(node[])? + + // TODO transition + // TODO delay + // TODO duration + // TODO easing + return nodes; }