From f90338fbb1fa3bcb4b3cb60faaeb053ac9374bf7 Mon Sep 17 00:00:00 2001 From: diarmidmackenzie Date: Fri, 19 Nov 2021 19:00:34 +0000 Subject: [PATCH 1/2] Support for hyphenated component names --- .../dist/aframe-event-set-component.js | 42 ++++++++++++- .../dist/aframe-event-set-component.min.js | 2 +- .../event-set/examples/basic/index.html | 2 +- .../examples/hyphenated-component/index.html | 56 ++++++++++++++++++ .../examples/hyphenated-component/preview.gif | Bin 0 -> 23513 bytes components/event-set/index.js | 50 +++++++++++++++- 6 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 components/event-set/examples/hyphenated-component/index.html create mode 100644 components/event-set/examples/hyphenated-component/preview.gif diff --git a/components/event-set/dist/aframe-event-set-component.js b/components/event-set/dist/aframe-event-set-component.js index c6ff71a4..77a2e856 100644 --- a/components/event-set/dist/aframe-event-set-component.js +++ b/components/event-set/dist/aframe-event-set-component.js @@ -107,7 +107,47 @@ return /******/ (function(modules) { // webpackBootstrap /* global AFRAME */ + +// AFRAME styleParse has one issue: it trasnforms hyphenated keys to camel-case. +// This is a problem when those keys are component names, as A-Frame component +// names often include hyphens, and are not converted internally to camel case. + var styleParser = AFRAME.utils.styleParser; +var styleParse = function styleParse(value) { + + function dashLowerCase(str) { + return '-' + str[0].toLowerCase(); + } + + function fromCamelCase(str) { + return str.replace(/([A-Z])/g, dashLowerCase); + } + + var data = AFRAME.utils.styleParser.parse(value); + + var key; + var component; + var remainder; + var dashComponent; + var dashKey; + + for (key in data) { + component = key.split('.')[0]; + remainder = key.split('.').slice(1).join('.'); + dashComponent = fromCamelCase(component); + if (component === dashComponent) { + continue; + } + + if (AFRAME.components[dashComponent] && !AFRAME.components[component]) { + dashKey = dashComponent.concat('.', remainder); + data[dashKey] = data[key]; + delete data[key]; + } + } + + return data; +}; if (typeof AFRAME === 'undefined') { throw new Error('Component attempted to register before AFRAME was available.'); @@ -117,7 +157,7 @@ AFRAME.registerComponent('event-set', { schema: { default: '', parse: function parse(value) { - return styleParser.parse(value); + return styleParse(value); } }, diff --git a/components/event-set/dist/aframe-event-set-component.min.js b/components/event-set/dist/aframe-event-set-component.min.js index 7b69f566..9fbc4a74 100644 --- a/components/event-set/dist/aframe-event-set-component.min.js +++ b/components/event-set/dist/aframe-event-set-component.min.js @@ -1 +1 @@ -!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(window,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";var r=AFRAME.utils.styleParser;if("undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");AFRAME.registerComponent("event-set",{schema:{default:"",parse:function(e){return r.parse(e)}},multiple:!0,init:function(){this.eventHandler=null,this.eventName=null},update:function(e){this.removeEventListener(),this.updateEventListener(),this.addEventListener()},remove:function(){this.removeEventListener()},pause:function(){this.removeEventListener()},play:function(){this.addEventListener()},updateEventListener:function(){var e,t,n,r=this,i=this.data,o=this.el;e=i._event||this.id,t=i._target,n=t?o.sceneEl.querySelector(t):o,this.eventName=e;var s=function(){var e;for(e in i)"_event"!==e&&"_target"!==e&&AFRAME.utils.entity.setComponentProperty.call(r,n,e,i[e])};isNaN(i._delay)?this.eventHandler=s:this.eventHandler=function(){setTimeout(s,parseFloat(i._delay))}},addEventListener:function(){this.el.addEventListener(this.eventName,this.eventHandler)},removeEventListener:function(){this.el.removeEventListener(this.eventName,this.eventHandler)}})}])}); \ No newline at end of file +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";AFRAME.utils.styleParser;if("undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");AFRAME.registerComponent("event-set",{schema:{default:"",parse:function(e){return function(e){function t(e){return"-"+e[0].toLowerCase()}var n,r,i,o,s=AFRAME.utils.styleParser.parse(e);for(n in s)r=n.split(".")[0],i=n.split(".").slice(1).join("."),r!==(o=r.replace(/([A-Z])/g,t))&&AFRAME.components[o]&&!AFRAME.components[r]&&(s[o.concat(".",i)]=s[n],delete s[n]);return s}(e)}},multiple:!0,init:function(){this.eventHandler=null,this.eventName=null},update:function(e){this.removeEventListener(),this.updateEventListener(),this.addEventListener()},remove:function(){this.removeEventListener()},pause:function(){this.removeEventListener()},play:function(){this.addEventListener()},updateEventListener:function(){var e,t,n,r=this,i=this.data,o=this.el;e=i._event||this.id,t=i._target,n=t?o.sceneEl.querySelector(t):o,this.eventName=e;var s=function(){var e;for(e in i)"_event"!==e&&"_target"!==e&&AFRAME.utils.entity.setComponentProperty.call(r,n,e,i[e])};isNaN(i._delay)?this.eventHandler=s:this.eventHandler=function(){setTimeout(s,parseFloat(i._delay))}},addEventListener:function(){this.el.addEventListener(this.eventName,this.eventHandler)},removeEventListener:function(){this.el.removeEventListener(this.eventName,this.eventHandler)}})}])})); \ No newline at end of file diff --git a/components/event-set/examples/basic/index.html b/components/event-set/examples/basic/index.html index 2befd3cc..984a9e04 100644 --- a/components/event-set/examples/basic/index.html +++ b/components/event-set/examples/basic/index.html @@ -3,7 +3,7 @@ Cursor - + diff --git a/components/event-set/examples/hyphenated-component/index.html b/components/event-set/examples/hyphenated-component/index.html new file mode 100644 index 00000000..f0a4ae12 --- /dev/null +++ b/components/event-set/examples/hyphenated-component/index.html @@ -0,0 +1,56 @@ + + + + + Cursor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/event-set/examples/hyphenated-component/preview.gif b/components/event-set/examples/hyphenated-component/preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e6daa8568c9dc1c9d40cab027bbbc69aef5302a GIT binary patch literal 23513 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 literal 0 HcmV?d00001 diff --git a/components/event-set/index.js b/components/event-set/index.js index 6d99243f..5a789858 100644 --- a/components/event-set/index.js +++ b/components/event-set/index.js @@ -1,5 +1,53 @@ /* global AFRAME */ + +// AFRAME styleParse has one issue: it transforms hyphenated keys to camel-case. +// This is a problem when those keys are component names, as A-Frame component +// names often include hyphens, and are not converted internally to camel case. + +// To compensate for this, we post-process the data from the parser: +// - analyze the first part of the string, represeting the component +// - if translating this out of camel case to a dashed value gives +// a better match against known A-Frame components, then use the dashed value +// for the component name. + +// This solution is not 100% robust, but good enough for most circumstances. +// - Will not handle component names that have a mix of camel case and dashes +// e.g. example-componentOne +// - Could give incorrect results in case where two components have names that +// only differ by their casing. +// e.g. example-component-two & exampleComponentTwo var styleParser = AFRAME.utils.styleParser; +var styleParse = function(value) { + + function dashLowerCase (str) { return '-' + str[0].toLowerCase(); } + + function fromCamelCase (str) { + return str.replace(/([A-Z])/g, dashLowerCase); + } + + const data = AFRAME.utils.styleParser.parse(value); + + var key; + var component; + var remainder; + var dashComponent; + var dashKey; + + for (key in data) { + component = key.split('.')[0]; + remainder = key.split('.').slice(1).join('.'); + dashComponent = fromCamelCase(component); + if (component === dashComponent) { continue; } + + if (AFRAME.components[dashComponent] && !AFRAME.components[component]) { + dashKey = dashComponent.concat('.', remainder); + data[dashKey] = data[key]; + delete data[key]; + } + } + + return(data); +} if (typeof AFRAME === 'undefined') { throw new Error('Component attempted to register before AFRAME was available.'); @@ -9,7 +57,7 @@ AFRAME.registerComponent('event-set', { schema: { default: '', parse: function (value) { - return styleParser.parse(value); + return styleParse(value); } }, From ad24d6a84b62fc5f101ff4851f4338854ee7cd1f Mon Sep 17 00:00:00 2001 From: diarmidmackenzie Date: Fri, 19 Nov 2021 19:08:39 +0000 Subject: [PATCH 2/2] Delete superfluous line of code. --- .../event-set/dist/aframe-event-set-component.js | 15 +++++++++++++-- .../dist/aframe-event-set-component.min.js | 2 +- components/event-set/index.js | 1 - 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/components/event-set/dist/aframe-event-set-component.js b/components/event-set/dist/aframe-event-set-component.js index 77a2e856..40b2c3f3 100644 --- a/components/event-set/dist/aframe-event-set-component.js +++ b/components/event-set/dist/aframe-event-set-component.js @@ -108,11 +108,22 @@ return /******/ (function(modules) { // webpackBootstrap /* global AFRAME */ -// AFRAME styleParse has one issue: it trasnforms hyphenated keys to camel-case. +// AFRAME styleParse has one issue: it transforms hyphenated keys to camel-case. // This is a problem when those keys are component names, as A-Frame component // names often include hyphens, and are not converted internally to camel case. -var styleParser = AFRAME.utils.styleParser; +// To compensate for this, we post-process the data from the parser: +// - analyze the first part of the string, represeting the component +// - if translating this out of camel case to a dashed value gives +// a better match against known A-Frame components, then use the dashed value +// for the component name. + +// This solution is not 100% robust, but good enough for most circumstances. +// - Will not handle component names that have a mix of camel case and dashes +// e.g. example-componentOne +// - Could give incorrect results in case where two components have names that +// only differ by their casing. +// e.g. example-component-two & exampleComponentTwo var styleParse = function styleParse(value) { function dashLowerCase(str) { diff --git a/components/event-set/dist/aframe-event-set-component.min.js b/components/event-set/dist/aframe-event-set-component.min.js index 9fbc4a74..93102bb0 100644 --- a/components/event-set/dist/aframe-event-set-component.min.js +++ b/components/event-set/dist/aframe-event-set-component.min.js @@ -1 +1 @@ -!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";AFRAME.utils.styleParser;if("undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");AFRAME.registerComponent("event-set",{schema:{default:"",parse:function(e){return function(e){function t(e){return"-"+e[0].toLowerCase()}var n,r,i,o,s=AFRAME.utils.styleParser.parse(e);for(n in s)r=n.split(".")[0],i=n.split(".").slice(1).join("."),r!==(o=r.replace(/([A-Z])/g,t))&&AFRAME.components[o]&&!AFRAME.components[r]&&(s[o.concat(".",i)]=s[n],delete s[n]);return s}(e)}},multiple:!0,init:function(){this.eventHandler=null,this.eventName=null},update:function(e){this.removeEventListener(),this.updateEventListener(),this.addEventListener()},remove:function(){this.removeEventListener()},pause:function(){this.removeEventListener()},play:function(){this.addEventListener()},updateEventListener:function(){var e,t,n,r=this,i=this.data,o=this.el;e=i._event||this.id,t=i._target,n=t?o.sceneEl.querySelector(t):o,this.eventName=e;var s=function(){var e;for(e in i)"_event"!==e&&"_target"!==e&&AFRAME.utils.entity.setComponentProperty.call(r,n,e,i[e])};isNaN(i._delay)?this.eventHandler=s:this.eventHandler=function(){setTimeout(s,parseFloat(i._delay))}},addEventListener:function(){this.el.addEventListener(this.eventName,this.eventHandler)},removeEventListener:function(){this.el.removeEventListener(this.eventName,this.eventHandler)}})}])})); \ No newline at end of file +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";if("undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");AFRAME.registerComponent("event-set",{schema:{default:"",parse:function(e){return function(e){function t(e){return"-"+e[0].toLowerCase()}var n,r,i,o,s=AFRAME.utils.styleParser.parse(e);for(n in s)r=n.split(".")[0],i=n.split(".").slice(1).join("."),r!==(o=r.replace(/([A-Z])/g,t))&&AFRAME.components[o]&&!AFRAME.components[r]&&(s[o.concat(".",i)]=s[n],delete s[n]);return s}(e)}},multiple:!0,init:function(){this.eventHandler=null,this.eventName=null},update:function(e){this.removeEventListener(),this.updateEventListener(),this.addEventListener()},remove:function(){this.removeEventListener()},pause:function(){this.removeEventListener()},play:function(){this.addEventListener()},updateEventListener:function(){var e,t,n,r=this,i=this.data,o=this.el;e=i._event||this.id,t=i._target,n=t?o.sceneEl.querySelector(t):o,this.eventName=e;var s=function(){var e;for(e in i)"_event"!==e&&"_target"!==e&&AFRAME.utils.entity.setComponentProperty.call(r,n,e,i[e])};isNaN(i._delay)?this.eventHandler=s:this.eventHandler=function(){setTimeout(s,parseFloat(i._delay))}},addEventListener:function(){this.el.addEventListener(this.eventName,this.eventHandler)},removeEventListener:function(){this.el.removeEventListener(this.eventName,this.eventHandler)}})}])})); \ No newline at end of file diff --git a/components/event-set/index.js b/components/event-set/index.js index 5a789858..1d3ac17c 100644 --- a/components/event-set/index.js +++ b/components/event-set/index.js @@ -16,7 +16,6 @@ // - Could give incorrect results in case where two components have names that // only differ by their casing. // e.g. example-component-two & exampleComponentTwo -var styleParser = AFRAME.utils.styleParser; var styleParse = function(value) { function dashLowerCase (str) { return '-' + str[0].toLowerCase(); }