mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #220 - Support expansion of CSS selector shorthand for tag names
This commit is contained in:
parent
92dccd4978
commit
9c2c99a707
@ -18,7 +18,6 @@ function isIEConditionalComment(comment) {
|
||||
}
|
||||
|
||||
function replacePlaceholderEscapeFuncs(node, context) {
|
||||
|
||||
var walker = context.createWalker({
|
||||
exit: function(node, parent) {
|
||||
if (node.type === 'FunctionCall' &&
|
||||
@ -36,6 +35,39 @@ function replacePlaceholderEscapeFuncs(node, context) {
|
||||
return walker.walk(node);
|
||||
}
|
||||
|
||||
function mergeShorthandClassNames(el, shorthandClassNames, context) {
|
||||
var builder = context.builder;
|
||||
let classNames = shorthandClassNames.map((className) => {
|
||||
return builder.parseExpression(className.value);
|
||||
});
|
||||
|
||||
var classAttr = el.getAttributeValue('class');
|
||||
if (classAttr) {
|
||||
classNames.push(classAttr);
|
||||
}
|
||||
|
||||
let prevClassName;
|
||||
|
||||
var finalClassNames = [];
|
||||
|
||||
for (var i=0; i<classNames.length; i++) {
|
||||
let className = classNames[i];
|
||||
if (prevClassName && className.type === 'Literal' && prevClassName.type === 'Literal') {
|
||||
prevClassName.value += ' ' + className.value;
|
||||
} else {
|
||||
finalClassNames.push(className);
|
||||
}
|
||||
prevClassName = className;
|
||||
}
|
||||
|
||||
if (finalClassNames.length === 1) {
|
||||
el.setAttributeValue('class', finalClassNames[0]);
|
||||
} else {
|
||||
var classListVar = context.addStaticVar('__classList', '__helpers.cl');
|
||||
el.setAttributeValue('class', builder.functionCall(classListVar, finalClassNames));
|
||||
}
|
||||
}
|
||||
|
||||
class Parser {
|
||||
constructor(parserImpl) {
|
||||
ok(parserImpl, '"parserImpl" is required');
|
||||
@ -160,6 +192,17 @@ class Parser {
|
||||
|
||||
var node = this.context.createNodeForEl(elDef);
|
||||
|
||||
if (el.shorthandClassNames) {
|
||||
mergeShorthandClassNames(node, el.shorthandClassNames, context);
|
||||
}
|
||||
|
||||
if (el.shorthandId) {
|
||||
if (node.hasAttribute('id')) {
|
||||
context.addError(node, 'A shorthand ID cannot be used in conjunction with the "id" attribute');
|
||||
} else {
|
||||
node.setAttributeValue('id', builder.parseExpression(el.shorthandId.value));
|
||||
}
|
||||
}
|
||||
|
||||
this.parentNode.appendChild(node);
|
||||
|
||||
|
||||
@ -252,7 +252,7 @@ module.exports = {
|
||||
},
|
||||
|
||||
/**
|
||||
* Merges
|
||||
* Merges object properties
|
||||
* @param {[type]} object [description]
|
||||
* @param {[type]} source [description]
|
||||
* @return {[type]} [description]
|
||||
@ -264,5 +264,24 @@ module.exports = {
|
||||
}
|
||||
}
|
||||
return into;
|
||||
},
|
||||
|
||||
/**
|
||||
* classList(a, b, c, ...)
|
||||
* Joines a list of class names with spaces. Empty class names are omitted.
|
||||
*
|
||||
* classList('a', undefined, 'b') --> 'a b'
|
||||
*
|
||||
*/
|
||||
cl: function() {
|
||||
var args = 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/shorthand-class-merge/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/shorthand-class-merge/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
<div class="foo bar"></div>
|
||||
1
test/fixtures/render/autotest/shorthand-class-merge/template.marko
vendored
Normal file
1
test/fixtures/render/autotest/shorthand-class-merge/template.marko
vendored
Normal file
@ -0,0 +1 @@
|
||||
div.foo class="bar"
|
||||
3
test/fixtures/render/autotest/shorthand-class-merge/test.js
vendored
Normal file
3
test/fixtures/render/autotest/shorthand-class-merge/test.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
exports.templateData = {
|
||||
name: 'Frank'
|
||||
};
|
||||
1
test/fixtures/render/autotest/shorthand-class-merge2/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/shorthand-class-merge2/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
<div class="foo baz"></div>
|
||||
1
test/fixtures/render/autotest/shorthand-class-merge2/template.marko
vendored
Normal file
1
test/fixtures/render/autotest/shorthand-class-merge2/template.marko
vendored
Normal file
@ -0,0 +1 @@
|
||||
div.foo.${data.missing} class="baz"
|
||||
3
test/fixtures/render/autotest/shorthand-class-merge2/test.js
vendored
Normal file
3
test/fixtures/render/autotest/shorthand-class-merge2/test.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
exports.templateData = {
|
||||
name: 'Frank'
|
||||
};
|
||||
1
test/fixtures/render/autotest/shorthand-div-id-dynamic/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/shorthand-div-id-dynamic/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
<div style="color: red;" id="foo-Frank">Hello Frank!</div>
|
||||
2
test/fixtures/render/autotest/shorthand-div-id-dynamic/template.marko
vendored
Normal file
2
test/fixtures/render/autotest/shorthand-div-id-dynamic/template.marko
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
div#foo-${data.name} style="color: red;"
|
||||
- Hello ${data.name}!
|
||||
3
test/fixtures/render/autotest/shorthand-div-id-dynamic/test.js
vendored
Normal file
3
test/fixtures/render/autotest/shorthand-div-id-dynamic/test.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
exports.templateData = {
|
||||
name: 'Frank'
|
||||
};
|
||||
1
test/fixtures/render/autotest/shorthand-div-id/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/shorthand-div-id/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
<div style="color: red;" id="foo">Hello Frank!</div>
|
||||
2
test/fixtures/render/autotest/shorthand-div-id/template.marko
vendored
Normal file
2
test/fixtures/render/autotest/shorthand-div-id/template.marko
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
div#foo style="color: red;"
|
||||
- Hello ${data.name}!
|
||||
3
test/fixtures/render/autotest/shorthand-div-id/test.js
vendored
Normal file
3
test/fixtures/render/autotest/shorthand-div-id/test.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
exports.templateData = {
|
||||
name: 'Frank'
|
||||
};
|
||||
1
test/fixtures/render/autotest/shorthand-div.foo/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/shorthand-div.foo/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
<div style="color: red;" class="foo">Hello Frank!</div>
|
||||
2
test/fixtures/render/autotest/shorthand-div.foo/template.marko
vendored
Normal file
2
test/fixtures/render/autotest/shorthand-div.foo/template.marko
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
div.foo style="color: red;"
|
||||
- Hello ${data.name}!
|
||||
3
test/fixtures/render/autotest/shorthand-div.foo/test.js
vendored
Normal file
3
test/fixtures/render/autotest/shorthand-div.foo/test.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
exports.templateData = {
|
||||
name: 'Frank'
|
||||
};
|
||||
1
test/fixtures/render/autotest/shorthand-id-and-classes/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/shorthand-id-and-classes/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
<div class="bar baz" id="foo"></div>
|
||||
1
test/fixtures/render/autotest/shorthand-id-and-classes/template.marko
vendored
Normal file
1
test/fixtures/render/autotest/shorthand-id-and-classes/template.marko
vendored
Normal file
@ -0,0 +1 @@
|
||||
#foo.bar.baz
|
||||
3
test/fixtures/render/autotest/shorthand-id-and-classes/test.js
vendored
Normal file
3
test/fixtures/render/autotest/shorthand-id-and-classes/test.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
exports.templateData = {
|
||||
name: 'Frank'
|
||||
};
|
||||
1
test/fixtures/render/autotest/shorthand-verbose/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/shorthand-verbose/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
<div class="bar baz" id="foo">Hello Frank!</div>
|
||||
3
test/fixtures/render/autotest/shorthand-verbose/template.marko
vendored
Normal file
3
test/fixtures/render/autotest/shorthand-verbose/template.marko
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
<#foo.bar.baz>
|
||||
Hello ${data.name}!
|
||||
</>
|
||||
3
test/fixtures/render/autotest/shorthand-verbose/test.js
vendored
Normal file
3
test/fixtures/render/autotest/shorthand-verbose/test.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
exports.templateData = {
|
||||
name: 'Frank'
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user