Fixes #541 - Fixed handling of placeholders in string attribute value

This commit is contained in:
Patrick Steele-Idem 2017-01-19 15:04:38 -07:00
parent d91fc9efa8
commit 271b726ecc
12 changed files with 33 additions and 19 deletions

View File

@ -49,6 +49,7 @@ function flattenAttrConcats(node) {
function generateCodeForExpressionAttr(name, value, escape, codegen) { function generateCodeForExpressionAttr(name, value, escape, codegen) {
var flattenedConcats = flattenAttrConcats(value); var flattenedConcats = flattenAttrConcats(value);
var hasLiteral = false; var hasLiteral = false;
var builder = codegen.builder; var builder = codegen.builder;
var finalNodes = []; var finalNodes = [];
@ -64,7 +65,7 @@ function generateCodeForExpressionAttr(name, value, escape, codegen) {
for (let i=0; i<flattenedConcats.length; i++) { for (let i=0; i<flattenedConcats.length; i++) {
if (flattenedConcats[i].type === 'Literal') { if (flattenedConcats[i].type === 'Literal' || flattenedConcats[i].type === 'AttributePlaceholder') {
hasLiteral = true; hasLiteral = true;
break; break;
} }

View File

@ -65,6 +65,8 @@ class HtmlElementVDOM extends Node {
} else if (typeof literalValue === 'number') { } else if (typeof literalValue === 'number') {
value.value = literalValue.toString(); value.value = literalValue.toString();
} }
} else if (value.type === 'AttributePlaceholder') {
value = codegen.builder.functionCall(context.helper('str'), [value]);
} }
attributesArg[name] = value; attributesArg[name] = value;

View File

@ -1,15 +1,15 @@
var marko_template = module.exports = require("marko/html").t(__filename), var marko_template = module.exports = require("marko/html").t(__filename),
marko_helpers = require("marko/runtime/html/helpers"), marko_helpers = require("marko/runtime/html/helpers"),
marko_classAttr = marko_helpers.ca, marko_classAttr = marko_helpers.ca,
marko_attr = marko_helpers.a, marko_str = marko_helpers.s,
marko_escapeXmlAttr = marko_helpers.xa, marko_escapeXmlAttr = marko_helpers.xa;
marko_str = marko_helpers.s;
function render(data, out) { function render(data, out) {
out.w("<div" + out.w("<div" +
marko_classAttr(data.className) + marko_classAttr(data.className) +
marko_attr("class2", data.className, false) + " class2=\"" +
" foo=\"a" + marko_str(data.className) +
"\" foo=\"a" +
marko_escapeXmlAttr(data.foo) + marko_escapeXmlAttr(data.foo) +
"b\" bar=\"a " + "b\" bar=\"a " +
marko_escapeXmlAttr(data.foo) + marko_escapeXmlAttr(data.foo) +

View File

@ -1,10 +1,10 @@
<input type="checkbox" checked="${data.checked}"> <input type="checkbox" checked=data.checked>
<button disabled>Button</button> <button disabled>Button</button>
<select> <select>
<option value="${option.value}" <option value="${option.value}"
selected="${option.selected}" selected=option.selected
for(option in data.options)> for(option in data.options)>
${option.value} ${option.value}

View File

@ -1 +1 @@
<img alt="${data.myAlt || true}"> <img alt=(data.myAlt || true)>

View File

@ -0,0 +1 @@
<div data-foo="Frank"></div><div data-foo='{"name":"Frank"}'></div>

View File

@ -0,0 +1,9 @@
var foo = {
name: 'Frank',
toString: function() {
return this.name;
}
};
<div data-foo="${foo}"/>
<div data-foo=foo/>

View File

@ -0,0 +1 @@
exports.templateData = {};

View File

@ -2,14 +2,14 @@
<div class="tabs"> <div class="tabs">
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
<li class="${tab.liClass}" for(tab in tabs)> <li class=tab.liClass for(tab in tabs)>
<a href="#${tab.id}" data-toggle="tab"> <a href="#${tab.id}" data-toggle="tab">
${tab.title} ${tab.title}
</a> </a>
</li> </li>
</ul> </ul>
<div class="tab-content"> <div class="tab-content">
<div id="${tab.id}" class="${tab.divClass}" for(tab in tabs)> <div id=tab.id class=tab.divClass for(tab in tabs)>
<invoke tab.renderBody(out) if(tab.renderBody) /> <invoke tab.renderBody(out) if(tab.renderBody) />
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
<div class="tabs"> <div class="tabs">
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
<li class="${tab.liClass}" for(tab in tabs)> <li class=tab.liClass for(tab in tabs)>
<a href="#${tab.id}" data-toggle="tab"> <a href="#${tab.id}" data-toggle="tab">
${tab.title} ${tab.title}
</a> </a>