Skip to content

Commit

Permalink
Fixes marko-js#137 - adds support for dynamic HTML tag names
Browse files Browse the repository at this point in the history
  • Loading branch information
patrick-steele-idem committed Aug 28, 2015
1 parent 59433cf commit fef06ca
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 5 deletions.
24 changes: 19 additions & 5 deletions compiler/ElementNode.js
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,13 @@ ElementNode.prototype = {

var _this = this;

template.text('<' + name);
if (template.isExpression(name)) {
template.text('<');
template.write(name);
} else {
template.text('<' + name);
}

this.forEachAttributeAnyNS(function (attr) {
var prefix = attr.prefix;
if (!prefix && attr.namespace) {
Expand Down Expand Up @@ -291,11 +297,19 @@ ElementNode.prototype = {
},
generateAfterCode: function (template) {
var name = this.prefix ? this.prefix + ':' + this.localName : this.localName;
if (this.hasChildren()) {
template.text('</' + name + '>');


if (template.isExpression(name)) {
template.text('</');
template.write(name);
template.text('>');
} else {
if (!this.startTagOnly && !this.allowSelfClosing) {
template.text('></' + name + '>');
if (this.hasChildren()) {
template.text('</' + name + '>');
} else {
if (!this.startTagOnly && !this.allowSelfClosing) {
template.text('></' + name + '>');
}
}
}
},
Expand Down
35 changes: 35 additions & 0 deletions taglibs/html/HtmlElementNode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright 2011 eBay Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';

function HtmlElementNode(props) {
HtmlElementNode.$super.call(this);
if (props) {
this.setProperties(props);
}
}
HtmlElementNode.nodeType = 'element';

HtmlElementNode.prototype = {
doGenerateCode: function (template) {
this.removeAttribute('tag-name');
this.localName = this.getProperty('tagName');
HtmlElementNode.$super.prototype.doGenerateCode.call(this, template);
},

};

module.exports = HtmlElementNode;
7 changes: 7 additions & 0 deletions taglibs/html/marko-taglib.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@
},
"node-class": "./DocTypeNode"
},
"html-element": {
"@tag-name": "string",
"@*": {
"ignore": true
},
"node-class": "./HtmlElementNode"
},
"*": {
"transformer": "./html-tag-transformer"
},
Expand Down
1 change: 1 addition & 0 deletions test/fixtures/templates/dynamic-tag-name/expected.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<hello-world class="my-class" foo="bar">My nested content</hello-world>
4 changes: 4 additions & 0 deletions test/fixtures/templates/dynamic-tag-name/template.marko
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<html-element tag-name="hello-${data.myTagName}" class="my-class" foo="bar">
My nested content
</html-element>
<html-element tag-name="img" src="foo.jpg" self-closing="true"/>
3 changes: 3 additions & 0 deletions test/fixtures/templates/dynamic-tag-name/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
exports.templateData = {
myTagName: 'world'
};

0 comments on commit fef06ca

Please sign in to comment.