Fixes #137 - adds support for dynamic HTML tag names

This commit is contained in:
Patrick Steele-Idem 2015-08-28 08:56:27 -06:00
parent 59433cfa33
commit fef06cab1f
6 changed files with 69 additions and 5 deletions

View File

@ -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) {
@ -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 + '>');
}
}
}
},

View File

@ -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;

View File

@ -21,6 +21,13 @@
},
"node-class": "./DocTypeNode"
},
"html-element": {
"@tag-name": "string",
"@*": {
"ignore": true
},
"node-class": "./HtmlElementNode"
},
"*": {
"transformer": "./html-tag-transformer"
},

View File

@ -0,0 +1 @@
<hello-world class="my-class" foo="bar">My nested content</hello-world>

View File

@ -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"/>

View File

@ -0,0 +1,3 @@
exports.templateData = {
myTagName: 'world'
};