mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #230 - Marko v3: Special case class attribute to allow object or array expression
This commit is contained in:
parent
58dad19ede
commit
b87019a90f
@ -79,21 +79,16 @@ function generateCodeForExpressionAttr(name, value, escape, codegen) {
|
|||||||
}
|
}
|
||||||
codegen.addWriteLiteral('"');
|
codegen.addWriteLiteral('"');
|
||||||
} else {
|
} else {
|
||||||
if (name === 'style') {
|
if (name === 'class') {
|
||||||
// let builder = codegen.builder;
|
// let builder = codegen.builder;
|
||||||
// let valueWithEscaping = handleEscaping(value);
|
// let valueWithEscaping = handleEscaping(value);
|
||||||
let styleAttr = codegen.addStaticVar('styleAttr', '__helpers.sa');
|
let classAttrVar = codegen.addStaticVar('classAttr', '__helpers.ca');
|
||||||
|
codegen.addWrite(codegen.builder.functionCall(classAttrVar, [value]));
|
||||||
if (escape === false || isNoEscapeXml(value)) {
|
} else if (name === 'style') {
|
||||||
escape = false;
|
// let builder = codegen.builder;
|
||||||
}
|
// let valueWithEscaping = handleEscaping(value);
|
||||||
|
let styleAttrVar = codegen.addStaticVar('styleAttr', '__helpers.sa');
|
||||||
let styleAttrArgs = [value];
|
codegen.addWrite(codegen.builder.functionCall(styleAttrVar, [value]));
|
||||||
|
|
||||||
if (escape === false) {
|
|
||||||
styleAttrArgs.push(codegen.builder.literal(false));
|
|
||||||
}
|
|
||||||
codegen.addWrite(codegen.builder.functionCall(styleAttr, styleAttrArgs));
|
|
||||||
} else {
|
} else {
|
||||||
// let builder = codegen.builder;
|
// let builder = codegen.builder;
|
||||||
// let valueWithEscaping = handleEscaping(value);
|
// let valueWithEscaping = handleEscaping(value);
|
||||||
|
|||||||
@ -21,7 +21,8 @@ var runtime = require('./'); // Circular dependency, but that is okay
|
|||||||
var attr = require('raptor-util/attr');
|
var attr = require('raptor-util/attr');
|
||||||
var attrs = require('raptor-util/attrs');
|
var attrs = require('raptor-util/attrs');
|
||||||
var isArray = Array.isArray;
|
var isArray = Array.isArray;
|
||||||
var STYLE = 'style';
|
var STYLE_ATTR = 'style';
|
||||||
|
var CLASS_ATTR = 'class';
|
||||||
|
|
||||||
function notEmpty(o) {
|
function notEmpty(o) {
|
||||||
if (o == null) {
|
if (o == null) {
|
||||||
@ -35,6 +36,17 @@ function notEmpty(o) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function classListArray(classList) {
|
||||||
|
var classNames = [];
|
||||||
|
for (var i=0, len=classList.length; i<len; i++) {
|
||||||
|
var cur = classList[i];
|
||||||
|
if (cur) {
|
||||||
|
classNames.push(cur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return classNames.join(' ');
|
||||||
|
}
|
||||||
|
|
||||||
function createDeferredRenderer(handler) {
|
function createDeferredRenderer(handler) {
|
||||||
function deferredRenderer(input, out) {
|
function deferredRenderer(input, out) {
|
||||||
deferredRenderer.renderer(input, out);
|
deferredRenderer.renderer(input, out);
|
||||||
@ -187,30 +199,62 @@ module.exports = {
|
|||||||
* sa('color: red; font-weight: bold') ==> ' style="color: red; font-weight: bold"'
|
* sa('color: red; font-weight: bold') ==> ' style="color: red; font-weight: bold"'
|
||||||
* sa({color: 'red', 'font-weight': 'bold'}) ==> ' style="color: red; font-weight: bold"'
|
* sa({color: 'red', 'font-weight': 'bold'}) ==> ' style="color: red; font-weight: bold"'
|
||||||
*/
|
*/
|
||||||
sa: function(style, escape) {
|
sa: function(style) {
|
||||||
if (!style) {
|
if (!style) {
|
||||||
return;
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
escape = escape !== false;
|
|
||||||
|
|
||||||
if (typeof style === 'string') {
|
if (typeof style === 'string') {
|
||||||
return attr(STYLE, style, escape);
|
return attr(STYLE_ATTR, style, false);
|
||||||
} else if (typeof style === 'object') {
|
} else if (typeof style === 'object') {
|
||||||
var parts = [];
|
var parts = [];
|
||||||
for (var name in style) {
|
for (var name in style) {
|
||||||
if (style.hasOwnProperty(name)) {
|
if (style.hasOwnProperty(name)) {
|
||||||
var value = style[name];
|
var value = style[name];
|
||||||
if (value) {
|
if (value) {
|
||||||
parts.push(name + ':' + (escape ? escapeXmlAttr(value) : value));
|
parts.push(name + ':' + value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return parts ? attr(STYLE, parts.join(';'), false) : '';
|
return parts ? attr(STYLE_ATTR, parts.join(';'), false) : '';
|
||||||
} else {
|
} else {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal helper method to handle the "class" attribute. The value can either
|
||||||
|
* be a string, an array or an object. For example:
|
||||||
|
*
|
||||||
|
* ca('foo bar') ==> ' class="foo bar"'
|
||||||
|
* ca({foo: true, bar: false, baz: true}) ==> ' class="foo baz"'
|
||||||
|
* ca(['foo', 'bar']) ==> ' class="foo bar"'
|
||||||
|
*/
|
||||||
|
ca: function(classNames) {
|
||||||
|
if (!classNames) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof classNames === 'string') {
|
||||||
|
return attr(CLASS_ATTR, classNames, false);
|
||||||
|
} else if (isArray(classNames)) {
|
||||||
|
return attr(CLASS_ATTR, classListArray(classNames), false);
|
||||||
|
} else if (typeof classNames === 'object') {
|
||||||
|
var classList = [];
|
||||||
|
for (var name in classNames) {
|
||||||
|
if (classNames.hasOwnProperty(name)) {
|
||||||
|
var value = classNames[name];
|
||||||
|
if (value) {
|
||||||
|
classList.push(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return attr(CLASS_ATTR, classListArray(classList), false);
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads a template
|
* Loads a template
|
||||||
*/
|
*/
|
||||||
@ -307,14 +351,6 @@ module.exports = {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
cl: function() {
|
cl: function() {
|
||||||
var args = arguments;
|
return classListArray(arguments);
|
||||||
var classNames = [];
|
|
||||||
for (var i=0, len=args.length; i<len; i++) {
|
|
||||||
var cur = args[i];
|
|
||||||
if (cur) {
|
|
||||||
classNames.push(cur);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return classNames.join(' ');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
1
test/fixtures/render/autotest/class-attr-array/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/class-attr-array/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<div class="a c"></div>
|
||||||
1
test/fixtures/render/autotest/class-attr-array/template.marko
vendored
Normal file
1
test/fixtures/render/autotest/class-attr-array/template.marko
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
div class=['a', null, 'c']
|
||||||
1
test/fixtures/render/autotest/class-attr-array/test.js
vendored
Normal file
1
test/fixtures/render/autotest/class-attr-array/test.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
exports.templateData = {};
|
||||||
1
test/fixtures/render/autotest/class-attr-object/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/class-attr-object/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<div class="a c"></div>
|
||||||
1
test/fixtures/render/autotest/class-attr-object/template.marko
vendored
Normal file
1
test/fixtures/render/autotest/class-attr-object/template.marko
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
div class={a: true, b: false, c: true}
|
||||||
1
test/fixtures/render/autotest/class-attr-object/test.js
vendored
Normal file
1
test/fixtures/render/autotest/class-attr-object/test.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
exports.templateData = {};
|
||||||
1
test/fixtures/render/autotest/class-attr-string/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/class-attr-string/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<div class="a c"></div>
|
||||||
1
test/fixtures/render/autotest/class-attr-string/template.marko
vendored
Normal file
1
test/fixtures/render/autotest/class-attr-string/template.marko
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
div class='a c'
|
||||||
1
test/fixtures/render/autotest/class-attr-string/test.js
vendored
Normal file
1
test/fixtures/render/autotest/class-attr-string/test.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
exports.templateData = {};
|
||||||
@ -1 +0,0 @@
|
|||||||
<div style="color:<evil>"></div>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
div style=data.style
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
exports.templateData = {
|
|
||||||
style: {
|
|
||||||
color: '<evil>'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@ -1 +0,0 @@
|
|||||||
<div style="color:<evil>"></div>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
div style="$!{data.style}"
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
exports.templateData = {
|
|
||||||
style: {
|
|
||||||
color: '<evil>'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Loading…
x
Reference in New Issue
Block a user