From fc82ef0cf03bbc5c35739933d31a893c3df86d1a Mon Sep 17 00:00:00 2001 From: Charlie Duong Date: Wed, 16 Nov 2016 13:53:51 -0500 Subject: [PATCH] Deprecated w-on* attributes (#434) Added support for on*() attributes. --- README.md | 2 +- compiler/Builder.js | 5 ++++ compiler/Parser.js | 20 +------------ .../util/replacePlaceholderEscapeFuncs.js | 19 ++++++++++++ docs/widgets/get-started.md | 10 +++---- docs/widgets/overview.md | 12 ++++---- docs/widgets/taglib-api.md | 4 +-- .../forEachAttribute/expected.json | 1 + .../template.marko | 2 +- .../update-manager-next-tick/template.marko | 2 +- .../template.marko | 4 +-- .../widget-custom-events/template.marko | 4 +-- .../widget-destroy-legacy/template.marko | 4 +-- .../app-legacy-button/template.marko | 2 +- .../template.marko | 4 +-- .../template.marko | 2 +- .../app-legacy-button/template.marko | 2 +- .../widget-dom-events/template.marko | 14 ++++----- .../template.marko | 6 ++-- .../template.marko | 6 ++-- .../template.marko | 2 +- .../app-extend-button/template.marko | 2 +- .../app-stateful-button/template.marko | 2 +- .../app-stateful-button/template.marko | 2 +- .../template.marko | 2 +- .../template.marko | 2 +- .../template.marko | 2 +- .../app-stateful-button/template.marko | 2 +- .../app-stateful-button/template.marko | 2 +- .../app-stateful-button/template.marko | 2 +- .../app-stateful-button/template.marko | 2 +- .../widget-stateful-update/template.marko | 2 +- .../widget-stopPropagation/template.marko | 4 +-- .../components/app-foo/template.marko | 2 +- .../app-button-split/template.marko | 2 +- widgets/event-delegation.js | 2 +- .../TransformHelper/handleWidgetEvents.js | 30 +++++++++++++++---- widgets/taglib/marko.json | 14 +++++++++ 38 files changed, 122 insertions(+), 81 deletions(-) create mode 100644 compiler/util/replacePlaceholderEscapeFuncs.js diff --git a/README.md b/README.md index 7149c5b2d..10c7f4ead 100644 --- a/README.md +++ b/README.md @@ -264,7 +264,7 @@ And, here is the corresponding Marko template for the UI component:
You clicked the button ${data.clickCount} ${data.timesMessage}.
- diff --git a/compiler/Builder.js b/compiler/Builder.js index 5267b217c..9736e17ee 100644 --- a/compiler/Builder.js +++ b/compiler/Builder.js @@ -51,6 +51,7 @@ var SequenceExpression = require('./ast/SequenceExpression'); var parseExpression = require('./util/parseExpression'); var parseStatement = require('./util/parseStatement'); var parseJavaScriptArgs = require('./util/parseJavaScriptArgs'); +var replacePlaceholderEscapeFuncs = require('./util/replacePlaceholderEscapeFuncs'); var isValidJavaScriptIdentifier = require('./util/isValidJavaScriptIdentifier'); var DEFAULT_BUILDER; @@ -420,6 +421,10 @@ class Builder { return parsed; } + replacePlaceholderEscapeFuncs(node, context) { + return replacePlaceholderEscapeFuncs(node, context); + } + program(body) { return new Program({body}); } diff --git a/compiler/Parser.js b/compiler/Parser.js index 2b4458042..c43a2ede9 100644 --- a/compiler/Parser.js +++ b/compiler/Parser.js @@ -1,6 +1,6 @@ 'use strict'; var ok = require('assert').ok; -var AttributePlaceholder = require('./ast/AttributePlaceholder'); +var replacePlaceholderEscapeFuncs = require('./util/replacePlaceholderEscapeFuncs'); var COMPILER_ATTRIBUTE_HANDLERS = { 'preserve-whitespace': function(attr, context) { @@ -17,24 +17,6 @@ function isIEConditionalComment(comment) { return ieConditionalCommentRegExp.test(comment); } -function replacePlaceholderEscapeFuncs(node, context) { - var walker = context.createWalker({ - exit: function(node, parent) { - if (node.type === 'FunctionCall' && - node.callee.type === 'Identifier') { - - if (node.callee.name === '$noEscapeXml') { - return new AttributePlaceholder({escape: false, value: node.args[0]}); - } else if (node.callee.name === '$escapeXml') { - return new AttributePlaceholder({escape: true, value: node.args[0]}); - } - } - } - }); - - return walker.walk(node); -} - function mergeShorthandClassNames(el, shorthandClassNames, context) { var builder = context.builder; let classNames = shorthandClassNames.map((className) => { diff --git a/compiler/util/replacePlaceholderEscapeFuncs.js b/compiler/util/replacePlaceholderEscapeFuncs.js new file mode 100644 index 000000000..d6ff8bc0c --- /dev/null +++ b/compiler/util/replacePlaceholderEscapeFuncs.js @@ -0,0 +1,19 @@ +var AttributePlaceholder = require('../ast/AttributePlaceholder'); + +module.exports = function replacePlaceholderEscapeFuncs(node, context) { + var walker = context.createWalker({ + exit: function(node, parent) { + if (node.type === 'FunctionCall' && + node.callee.type === 'Identifier') { + + if (node.callee.name === '$noEscapeXml') { + return new AttributePlaceholder({escape: false, value: node.args[0]}); + } else if (node.callee.name === '$escapeXml') { + return new AttributePlaceholder({escape: true, value: node.args[0]}); + } + } + } + }); + + return walker.walk(node); +}; \ No newline at end of file diff --git a/docs/widgets/get-started.md b/docs/widgets/get-started.md index 310c9f3bb..54804d343 100644 --- a/docs/widgets/get-started.md +++ b/docs/widgets/get-started.md @@ -308,8 +308,8 @@ Listeners can be attached declaratively as shown in the following sample code: ```xml
-
- + +
@@ -406,7 +406,7 @@ Listeners can be attached declaratively as shown in the following sample code: ```xml
+ onBeforeHide("handleOverlayBeforeHide")> Content for overlay @@ -699,7 +699,7 @@ ___src/components/app-hello/template.marko:___ ```xml
+ on-click("handleClick")> Hello ${data.name}!
``` @@ -736,7 +736,7 @@ ___src/components/app-hello/template.marko:___ ```xml
+ on-click("handleClick")> Hello ${data.name}!
``` diff --git a/docs/widgets/overview.md b/docs/widgets/overview.md index 9fa2ba2a9..36eb91392 100644 --- a/docs/widgets/overview.md +++ b/docs/widgets/overview.md @@ -113,7 +113,7 @@ __src/components/app-hello/template.marko__ ```xml
+ onClick("handleClick")> Hello ${data.name}! @@ -154,7 +154,7 @@ __src/components/app-hello/template.marko__ ```xml
Hello ${data.name}! @@ -202,7 +202,7 @@ __src/components/app-hello/template.marko__ ```xml
Hello ${data.name}! @@ -258,17 +258,17 @@ module.exports = require('marko-widgets').defineComponent({
+ onBeforeHide("handleOverlayBeforeHide")> Body content for overlay.
diff --git a/docs/widgets/taglib-api.md b/docs/widgets/taglib-api.md index 47620f56c..5daad84e4 100644 --- a/docs/widgets/taglib-api.md +++ b/docs/widgets/taglib-api.md @@ -85,7 +85,7 @@ NOTE: For DOM events that bubble, efficient DOM event delegation will automatica ```xml
- +
``` @@ -113,7 +113,7 @@ var myButton = this.getEl('myButton'); ```xml
- +
``` diff --git a/test/autotests/taglib-lookup/forEachAttribute/expected.json b/test/autotests/taglib-lookup/forEachAttribute/expected.json index 73645491e..8a3ded573 100644 --- a/test/autotests/taglib-lookup/forEachAttribute/expected.json +++ b/test/autotests/taglib-lookup/forEachAttribute/expected.json @@ -28,5 +28,6 @@ "no-update-if", "no-update-body-if", "w-preserve-attrs", + "on*", "w-on*" ] diff --git a/test/autotests/widgets-browser/update-manager-batch-updates/template.marko b/test/autotests/widgets-browser/update-manager-batch-updates/template.marko index 767822fa1..8a02311be 100644 --- a/test/autotests/widgets-browser/update-manager-batch-updates/template.marko +++ b/test/autotests/widgets-browser/update-manager-batch-updates/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/update-manager-next-tick/template.marko b/test/autotests/widgets-browser/update-manager-next-tick/template.marko index 767822fa1..8a02311be 100644 --- a/test/autotests/widgets-browser/update-manager-next-tick/template.marko +++ b/test/autotests/widgets-browser/update-manager-next-tick/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-custom-events-declarative/template.marko b/test/autotests/widgets-browser/widget-custom-events-declarative/template.marko index 77e0de7a7..4addcbd71 100644 --- a/test/autotests/widgets-browser/widget-custom-events-declarative/template.marko +++ b/test/autotests/widgets-browser/widget-custom-events-declarative/template.marko @@ -5,8 +5,8 @@ - - + +
  • ${color}
  • diff --git a/test/autotests/widgets-browser/widget-custom-events/template.marko b/test/autotests/widgets-browser/widget-custom-events/template.marko index 77e0de7a7..4addcbd71 100644 --- a/test/autotests/widgets-browser/widget-custom-events/template.marko +++ b/test/autotests/widgets-browser/widget-custom-events/template.marko @@ -5,8 +5,8 @@ - - + +
    • ${color}
    • diff --git a/test/autotests/widgets-browser/widget-destroy-legacy/template.marko b/test/autotests/widgets-browser/widget-destroy-legacy/template.marko index 77e0de7a7..4addcbd71 100644 --- a/test/autotests/widgets-browser/widget-destroy-legacy/template.marko +++ b/test/autotests/widgets-browser/widget-destroy-legacy/template.marko @@ -5,8 +5,8 @@ - - + +
      • ${color}
      • diff --git a/test/autotests/widgets-browser/widget-destroy-ref/components/app-legacy-button/template.marko b/test/autotests/widgets-browser/widget-destroy-ref/components/app-legacy-button/template.marko index 296cfcc80..999872c31 100644 --- a/test/autotests/widgets-browser/widget-destroy-ref/components/app-legacy-button/template.marko +++ b/test/autotests/widgets-browser/widget-destroy-ref/components/app-legacy-button/template.marko @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-destroy-unsubscribe-dom-events/template.marko b/test/autotests/widgets-browser/widget-destroy-unsubscribe-dom-events/template.marko index 095e99b30..cb6240b1d 100644 --- a/test/autotests/widgets-browser/widget-destroy-unsubscribe-dom-events/template.marko +++ b/test/autotests/widgets-browser/widget-destroy-unsubscribe-dom-events/template.marko @@ -1,6 +1,6 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-dom-event-listeners-repeated-non-bubbling/template.marko b/test/autotests/widgets-browser/widget-dom-event-listeners-repeated-non-bubbling/template.marko index 1d8e180ab..5ea5da941 100644 --- a/test/autotests/widgets-browser/widget-dom-event-listeners-repeated-non-bubbling/template.marko +++ b/test/autotests/widgets-browser/widget-dom-event-listeners-repeated-non-bubbling/template.marko @@ -1,6 +1,6 @@
          -
        • ${color}
        \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-dom-events/components/app-legacy-button/template.marko b/test/autotests/widgets-browser/widget-dom-events/components/app-legacy-button/template.marko index 296cfcc80..999872c31 100644 --- a/test/autotests/widgets-browser/widget-dom-events/components/app-legacy-button/template.marko +++ b/test/autotests/widgets-browser/widget-dom-events/components/app-legacy-button/template.marko @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-dom-events/template.marko b/test/autotests/widgets-browser/widget-dom-events/template.marko index e90c8dfee..3b860381d 100644 --- a/test/autotests/widgets-browser/widget-dom-events/template.marko +++ b/test/autotests/widgets-browser/widget-dom-events/template.marko @@ -1,20 +1,20 @@
        + onMousemove("handleRootMouseMove") + onClick("handleRootClick")> + onDblclick("handleFooLinkDblClick") + onMouseout("handleFooLinkMouseOut")> - Hello World + Hello World
        \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-event-handler-method-conditional-bubbles/template.marko b/test/autotests/widgets-browser/widget-event-handler-method-conditional-bubbles/template.marko index f500f4f2e..3ec63ad17 100644 --- a/test/autotests/widgets-browser/widget-event-handler-method-conditional-bubbles/template.marko +++ b/test/autotests/widgets-browser/widget-event-handler-method-conditional-bubbles/template.marko @@ -1,5 +1,5 @@
        - - - + + +
        \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-event-handler-method-conditional-direct/template.marko b/test/autotests/widgets-browser/widget-event-handler-method-conditional-direct/template.marko index 1f5a0d2ed..b04f7a8b8 100644 --- a/test/autotests/widgets-browser/widget-event-handler-method-conditional-direct/template.marko +++ b/test/autotests/widgets-browser/widget-event-handler-method-conditional-direct/template.marko @@ -1,5 +1,5 @@
        - - - + + +
        \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-event-handler-method-dynamic/template.marko b/test/autotests/widgets-browser/widget-event-handler-method-dynamic/template.marko index e19493637..79f35ed87 100644 --- a/test/autotests/widgets-browser/widget-event-handler-method-dynamic/template.marko +++ b/test/autotests/widgets-browser/widget-event-handler-method-dynamic/template.marko @@ -1,7 +1,7 @@

        app-macro-events

        - diff --git a/test/autotests/widgets-browser/widget-extend/components/app-extend-button/template.marko b/test/autotests/widgets-browser/widget-extend/components/app-extend-button/template.marko index 311acef20..a62b11c2a 100644 --- a/test/autotests/widgets-browser/widget-extend/components/app-extend-button/template.marko +++ b/test/autotests/widgets-browser/widget-extend/components/app-extend-button/template.marko @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-split-into-multiple-templates/components/app-stateful-button/template.marko b/test/autotests/widgets-browser/widget-split-into-multiple-templates/components/app-stateful-button/template.marko index 767822fa1..8a02311be 100644 --- a/test/autotests/widgets-browser/widget-split-into-multiple-templates/components/app-stateful-button/template.marko +++ b/test/autotests/widgets-browser/widget-split-into-multiple-templates/components/app-stateful-button/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-stateful-copy-state-on-write/template.marko b/test/autotests/widgets-browser/widget-stateful-copy-state-on-write/template.marko index 95b323246..e6232c2aa 100644 --- a/test/autotests/widgets-browser/widget-stateful-copy-state-on-write/template.marko +++ b/test/autotests/widgets-browser/widget-stateful-copy-state-on-write/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-stateful-no-copy-state-on-write-if-same-value/template.marko b/test/autotests/widgets-browser/widget-stateful-no-copy-state-on-write-if-same-value/template.marko index 767822fa1..8a02311be 100644 --- a/test/autotests/widgets-browser/widget-stateful-no-copy-state-on-write-if-same-value/template.marko +++ b/test/autotests/widgets-browser/widget-stateful-no-copy-state-on-write-if-same-value/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-stateful-no-rerender-if-destroyed/template.marko b/test/autotests/widgets-browser/widget-stateful-no-rerender-if-destroyed/template.marko index 767822fa1..8a02311be 100644 --- a/test/autotests/widgets-browser/widget-stateful-no-rerender-if-destroyed/template.marko +++ b/test/autotests/widgets-browser/widget-stateful-no-rerender-if-destroyed/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-stateful-preserve-body/components/app-stateful-button/template.marko b/test/autotests/widgets-browser/widget-stateful-preserve-body/components/app-stateful-button/template.marko index 767822fa1..8a02311be 100644 --- a/test/autotests/widgets-browser/widget-stateful-preserve-body/components/app-stateful-button/template.marko +++ b/test/autotests/widgets-browser/widget-stateful-preserve-body/components/app-stateful-button/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-stateful-reuse-widgets/components/app-stateful-button/template.marko b/test/autotests/widgets-browser/widget-stateful-reuse-widgets/components/app-stateful-button/template.marko index 767822fa1..8a02311be 100644 --- a/test/autotests/widgets-browser/widget-stateful-reuse-widgets/components/app-stateful-button/template.marko +++ b/test/autotests/widgets-browser/widget-stateful-reuse-widgets/components/app-stateful-button/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-stateful-update-handler-no-match/components/app-stateful-button/template.marko b/test/autotests/widgets-browser/widget-stateful-update-handler-no-match/components/app-stateful-button/template.marko index 767822fa1..8a02311be 100644 --- a/test/autotests/widgets-browser/widget-stateful-update-handler-no-match/components/app-stateful-button/template.marko +++ b/test/autotests/widgets-browser/widget-stateful-update-handler-no-match/components/app-stateful-button/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-stateful-update-handler/components/app-stateful-button/template.marko b/test/autotests/widgets-browser/widget-stateful-update-handler/components/app-stateful-button/template.marko index 767822fa1..8a02311be 100644 --- a/test/autotests/widgets-browser/widget-stateful-update-handler/components/app-stateful-button/template.marko +++ b/test/autotests/widgets-browser/widget-stateful-update-handler/components/app-stateful-button/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-stateful-update/template.marko b/test/autotests/widgets-browser/widget-stateful-update/template.marko index 767822fa1..8a02311be 100644 --- a/test/autotests/widgets-browser/widget-stateful-update/template.marko +++ b/test/autotests/widgets-browser/widget-stateful-update/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/test/autotests/widgets-browser/widget-stopPropagation/template.marko b/test/autotests/widgets-browser/widget-stopPropagation/template.marko index 61065cb50..49ecbf361 100644 --- a/test/autotests/widgets-browser/widget-stopPropagation/template.marko +++ b/test/autotests/widgets-browser/widget-stopPropagation/template.marko @@ -1,7 +1,7 @@
        -
        +
        Hello -
        diff --git a/test/autotests/widgets-pages/dom-events/components/app-foo/template.marko b/test/autotests/widgets-pages/dom-events/components/app-foo/template.marko index f58216e1a..57a0b8829 100644 --- a/test/autotests/widgets-pages/dom-events/components/app-foo/template.marko +++ b/test/autotests/widgets-pages/dom-events/components/app-foo/template.marko @@ -1,2 +1,2 @@ div w-bind - button ref="button" w-onMouseMove='handleButtonMouseMove' w-onClick="handleButtonClick" \ No newline at end of file + button ref="button" onMouseMove('handleButtonMouseMove') onClick("handleButtonClick") \ No newline at end of file diff --git a/test/autotests/widgets-pages/split-widget-renderer/components/app-button-split/template.marko b/test/autotests/widgets-pages/split-widget-renderer/components/app-button-split/template.marko index 59eb8579e..a5fca2052 100644 --- a/test/autotests/widgets-pages/split-widget-renderer/components/app-button-split/template.marko +++ b/test/autotests/widgets-pages/split-widget-renderer/components/app-button-split/template.marko @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/widgets/event-delegation.js b/widgets/event-delegation.js index 3b25fdd17..b94075845 100644 --- a/widgets/event-delegation.js +++ b/widgets/event-delegation.js @@ -48,7 +48,7 @@ var attachBubbleEventListeners = function() { var target; // Attributes will have the following form: - // w-on="|" + // on("|") do { if ((target = getEventAttribute(curNode, attrName))) { diff --git a/widgets/taglib/TransformHelper/handleWidgetEvents.js b/widgets/taglib/TransformHelper/handleWidgetEvents.js index 74eb7a1fb..58fbafe5e 100644 --- a/widgets/taglib/TransformHelper/handleWidgetEvents.js +++ b/widgets/taglib/TransformHelper/handleWidgetEvents.js @@ -89,6 +89,7 @@ function addCustomEventListener(transformHelper, eventType, targetMethod) { module.exports = function handleWidgetEvents() { var el = this.el; var builder = this.builder; + var context = this.context; var isCustomTag = el.type !== 'HtmlElement'; // We configured the Marko compiler to attach a flag to nodes that // have one or more attributes that match the "w-on*" pattern. @@ -100,16 +101,35 @@ module.exports = function handleWidgetEvents() { var attrs = el.getAttributes().concat([]); attrs.forEach((attr) => { + var eventType; + var targetMethod; var attrName = attr.name; - if (!attrName || !attrName.startsWith('w-on')) { + var args = attr.argument; + + if (!attrName) { + return; + } + + if (attrName.startsWith('on') && args) { + eventType = attrName.substring(2); // Chop off "on" + try { + var parsedArgs = builder.parseExpression(args); + targetMethod = builder.replacePlaceholderEscapeFuncs(parsedArgs, context); + } catch (err) { + this.addError('Invalid Javascript Expression for "' + attrName + '": ' + err); + } + } else if (attrName.startsWith('w-on')) { + console.warn('"w-on*" attributes are deprecated. Please use "on*()" instead. (' + (el.pos ? context.getPosInfo(el.pos) : context.filename) + ')'); + eventType = attrName.substring(4); // Chop off "w-on" + targetMethod = attr.value; + } + + if (!eventType || !targetMethod) { return; } el.removeAttribute(attrName); - var eventType = attrName.substring(4); // Chop off "w-on" - var targetMethod = attr.value; - if (isCustomTag) { var widgetArgs = this.getWidgetArgs(); if (widgetArgs.getId() == null) { @@ -165,4 +185,4 @@ module.exports = function handleWidgetEvents() { }); } -}; \ No newline at end of file +}; diff --git a/widgets/taglib/marko.json b/widgets/taglib/marko.json index a21b46f12..3db2290f0 100644 --- a/widgets/taglib/marko.json +++ b/widgets/taglib/marko.json @@ -64,6 +64,20 @@ } ] }, + "@on*": { + "pattern": true, + "type": "statement", + "allow-expressions": true, + "preserve-name": true, + "set-flag": "hasWidgetEvents", + "autocomplete": [ + { + "displayText": "on(\"\")", + "snippet": "on${1:Click}(\"handle${2:Button}${1:Click}\")", + "descriptionMoreURL": "http://markojs.com/docs/marko-widgets/get-started/#adding-dom-event-listeners" + } + ] + }, "@w-on*": { "pattern": true, "type": "string",