From 5917c2a01e4afa916a360f5f8e3ea34445c5406f Mon Sep 17 00:00:00 2001 From: Colin Clark Date: Fri, 20 Feb 2015 18:56:51 -0500 Subject: [PATCH] Adds support for value expressions in change specifications. --- dist/flocking-all.js | 56 +++++++++++++++++++++++------- dist/flocking-all.min.js | 6 ++-- dist/flocking-no-jquery.js | 56 +++++++++++++++++++++++------- dist/flocking-no-jquery.min.js | 6 ++-- flocking/flocking-core.js | 50 ++++++++++++++++++++------ flocking/flocking-ugens-browser.js | 4 +-- tests/flocking/js/core-tests.js | 39 +++++++++++++++++++++ 7 files changed, 173 insertions(+), 44 deletions(-) diff --git a/dist/flocking-all.js b/dist/flocking-all.js index 3679220a..53be0f2a 100644 --- a/dist/flocking-all.js +++ b/dist/flocking-all.js @@ -1,4 +1,4 @@ -/*! Flocking 0.1.0 (February 16, 2015), Copyright 2015 Colin Clark | flockingjs.org */ +/*! Flocking 0.1.0 (February 20, 2015), Copyright 2015 Colin Clark | flockingjs.org */ /*! * jQuery JavaScript Library v2.1.1 @@ -20469,8 +20469,14 @@ var fluid = fluid || require("infusion"), flock.interpolate.cubic = flock.interpolate.hermite; - flock.warn = function (msg) { - fluid.log(fluid.logLevel.WARN, msg); + flock.log = { + warn: function (msg) { + fluid.log(fluid.logLevel.WARN, msg); + }, + + debug: function (msg) { + fluid.log(fluid.logLevel.INFO, msg); + } }; flock.fail = function (msg) { @@ -20482,7 +20488,7 @@ var fluid = fluid || require("infusion"), }; flock.pathParseError = function (root, path, token) { - var msg = "Error parsing path: " + path + ". Segment '" + token + + var msg = "Error parsing path '" + path + "'. Segment '" + token + "' could not be resolved. Root object was: " + fluid.prettyPrintJSON(root); flock.fail(msg); @@ -20531,8 +20537,8 @@ var fluid = fluid || require("infusion"), root = root[prop]; type = typeof root; if (type !== "object") { - flock.fail("Error while setting a value at path + " + path + - ". A non-container object was found at segment " + prop + ". Value: " + root); + flock.fail("Error while setting a value at path '" + path + + "'. A non-container object was found at segment '" + prop + "'. Value: " + root); return; } @@ -20662,23 +20668,47 @@ var fluid = fluid || require("infusion"), flock.input.getValuesForPathObject(root, path); }; + flock.input.resolveValue = function (root, path, val, target, inputName, previousInput, valueParser) { + // Check to see if the value is actually a "get expression" + // (i.e. an EL path wrapped in ${}) and resolve it if necessary. + if (typeof val === "string") { + var extracted = fluid.extractEL(val, flock.input.valueExpressionSpec); + if (extracted) { + var resolved = flock.input.getValueForPath(root, extracted); + if (resolved === undefined) { + flock.log.debug("The value expression '" + val + "' resolved to undefined. " + + "If this isn't expected, check to ensure that your path is valid."); + } + + return resolved; + } + } + + return flock.input.shouldExpand(inputName, target) && valueParser ? + valueParser(val, path, target, previousInput) : val; + }; + + flock.input.valueExpressionSpec = { + ELstyle: "${}" + }; + flock.input.setValueForPath = function (root, path, val, baseTarget, valueParser) { path = flock.input.expandPath(path); var previousInput = flock.get(root, path), lastDotIdx = path.lastIndexOf("."), inputName = path.slice(lastDotIdx + 1), - target = lastDotIdx > -1 ? flock.get(root, path.slice(0, path.lastIndexOf(".inputs"))) : baseTarget, - newInput = flock.input.shouldExpand(inputName, target) && valueParser ? - valueParser(val, path, target, previousInput) : val; + target = lastDotIdx > -1 ? flock.get(root, path.slice(0, path.lastIndexOf(".inputs"))) : + baseTarget, + resolvedVal = flock.input.resolveValue(root, path, val, target, inputName, previousInput, valueParser); - flock.set(root, path, newInput); + flock.set(root, path, resolvedVal); if (target && target.onInputChanged) { target.onInputChanged(inputName); } - return newInput; + return resolvedVal; }; flock.input.setValuesForPaths = function (root, valueMap, baseTarget, valueParser) { @@ -30082,11 +30112,11 @@ var fluid = fluid || require("infusion"), // TODO: Remove this warning when Safari and Android // fix their MediaElementAudioSourceNode implementations. if (flock.platform.browser.safari) { - flock.warn("MediaElementSourceNode does not work on Safari. " + + flock.log.warn("MediaElementSourceNode does not work on Safari. " + "For more information, see https://bugs.webkit.org/show_bug.cgi?id=84743 " + "and https://bugs.webkit.org/show_bug.cgi?id=125031"); } else if (flock.platform.isAndroid) { - flock.warn("MediaElementSourceNode does not work on Android. " + + flock.log.warn("MediaElementSourceNode does not work on Android. " + "For more information, see https://code.google.com/p/chromium/issues/detail?id=419446"); } }; diff --git a/dist/flocking-all.min.js b/dist/flocking-all.min.js index 16ae4b6a..2c9305a1 100644 --- a/dist/flocking-all.min.js +++ b/dist/flocking-all.min.js @@ -1,4 +1,4 @@ -/*! Flocking 0.1.0 (February 16, 2015), Copyright 2015 Colin Clark | flockingjs.org */ +/*! Flocking 0.1.0 (February 20, 2015), Copyright 2015 Colin Clark | flockingjs.org */ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b=a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(hb.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=ob[a]={};return _.each(a.match(nb)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+Math.random()}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ub,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:tb.test(c)?_.parseJSON(c):c}catch(e){}sb.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Kb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)rb.set(a[c],"globalEval",!b||rb.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(rb.hasData(a)&&(f=rb.access(a),g=rb.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sb.hasData(a)&&(h=sb.access(a),i=_.extend({},h),sb.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&yb.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Ob[a];return c||(c=t(a,b),"none"!==c&&c||(Nb=(Nb||_("